The way of algorithm learning.
这是一篇摘录的文章,不是原创
目录
1、基础必会
2、重点考察
3、不太会考
4、考也不会(大佬除外)
基础必会 常考的基础算法和知识点
暴力算法
1、简单模拟2、简单递推
3、线性枚举
基础排序
1、冒泡排序2、选择排序
3、插入排序
4、计数排序
5、接口调用(sort函数)
6、比较函数cmp()
7、结构体排序
*注:这几个要会手写,不是说考试会考而是这几个是最最最基础的,如果这么基础的你都懒得学,那你算法还不如不学。
基础数据结构
1、顺序表(数组)2、单链表
3、双链表
4、栈
5、队列
6、二叉树
基础搜索
基本搜索算法
深度优先算法dfs求解所有解,n比较小,比如n=10,n=16,n大的话贪心或动态规划
广度优先算法bfs最短方案
基础动态规划
动态规划的基础应用
线性DP记忆化搜索
最大连续子序列(最大子段和)
最长单调子序列(LIS(longest increasing sequence))
最长公共子序列(LCS(longest common sequence))
二维DP、多维DP
注:低维解决不了升维 注:动态规划自己想有难度,建议查阅资料,学知识不丢人
初高中基础数学
加减乘除取模
整除
取整(floor ceil)
解方程 代数方法或数值方法,如二分法、牛顿迭代法。
指数
对数 三角函数
重点考察 国赛重点
国赛常考的进阶算法与知识点
基础优化算法
1、贪心贪心算法是在每一部选择中都采取当先状态下最优的选择,希望通过局部最优达到全局最优。贪心算法的关键是证明贪心策略的正确性,并非所有问题都适合贪心算法。常见的应用有活动选择问题,哈夫曼编码等。
2、哈希
哈希算法时将元素储存到一个特殊的容器中,这个容器可以快速插入和查找、一般时间复杂度为O(1),经典的 梦开始的地方——两位数之和,就可以采用哈希表快速进行统计。
3、前缀和+差分
前缀和是指一个数组中,从第一个元素到第i个元素的和。差分是前缀和的逆运算,用于快速查询区间元素的值。前缀和和差分可以见区间查询的时间复杂度从O(n)降低到O(1)。
4、双指针
双指针是指用两个指针在数组或链表上移动,已解决一些特定的问题。可以分为同相双指针和相向双指针,常用于查找子数组、判断链表是否有环等。双指针可以减低时间复杂度,提高算法效率。
5、滑动窗口
滑动窗口是一种特殊的双指针技术,通过维护一个固定大小的窗口在数组或字符串上移动。可以用于解决一些连续子数组或子字符串的问题,如最大子数组和。滑动窗口的关键是确定窗口大小和移动规则。
6、二分
二分查找是在有序数组中查找某个元素的高效算法,时间复杂度为O(lgn)。二分查找的关键是确定查找区间和中间位置,不断缩小查找范围,二分查找可以应用于很多问题,如查找最小值、最大值等。
进阶排序
更高效的排序算法
1、快速排序2、归并排序
进阶数据结构
1、哈希表2、字符串hash
3、堆
4、并查集
5、树状数组
6、ST表
7、线段树
8、字典树
进阶动态规划
复杂的动态规划问题
1、01背包2、完全背包
3、多重背包
4、分组背包
5、书上分组背包
6、基础树形DP
7、树的重心
8、区间DP
9、数位DP
10、状压DP
图论算法
最短路
(1) Dijkstra(2) Bellman-Ford
(3) Floyed (4) SPFA (5) Dijkstra + Heap
最小生成树
(1) prim(2) kruskal
最近公共祖先
(1) 深度迭代(2) RMQ找最小值找公共祖先
数学
初等数论
整除、素数、素数筛选、最大公约数、最小公倍数、因字数、因子和、因式分解、二分快速幂、线性同余、逆元、欧拉函数、欧拉定理、中国剩余定理、威尔逊定理、卢卡斯定理、证书分块 等等
容斥原理
容斥原理是用于计算多个集合的并集的元素个数的原理。可以通过枚举集合的组合来计算并寄的元素个数。容斥原理在组合数学和算法中有广泛的应用。
二项式定理
通过二项式定理来展开多项式,在组合数学和算法中有重要应用。
不太会考的(但OI和ACM得学啊)
不太常见的排序算法
1、桶排序1、堆排序
1、基数排序
搜索
特殊的搜索算法
1、搜索剪枝2、双向广搜
3、IDA*
4、启发式搜索
图论算法
1、欧拉回环2、拓扑排序
3、二分匹配
4、强连通分量
5、双连通分量
数学
高斯消元Pollard's rho
我要成为大佬!!!
复杂算法与数据结构
1、DP斜率优化2、复杂计算机和
3、概率题
4、博弈
5、AC自动机
6、扩展kmp
7、后缀数组
8、后缀自动机
9、回文自动机
10、最小割最大流
11、最小费用最大流
12、一般图匹配
13、生成函数(步豪!是H(λ))
14、莫比乌斯反演
15、快速傅里叶变换
16、二次互反律