本人亲手整理,用html一个字一个字敲的Orz,看在我那么不容易的份上就点个关注吧(后续会根据更新的文章不断的加上超链接来便于大家查询、观看)ps.文末附oi知识表
算法思想
- 模拟
- 搜索 (Search) 枚举(穷举) / 遍历 / 剪枝 / 产生式系统(估价函数)/双向BFS/记忆化搜索
- 查找(字典):折半查找(二分法) / 树形查找(二叉排序树) / Hash
- 递推或归纳(To 数学方法) > 递推式 > DP
- 分治(Divided and Conquer) > 二分答案
- 贪心 (Greedy)
实现技巧
- 循环
- 递推(顺/逆) > 博弈 > DP
- 递归(栈/DFS)
- 滚动数组
- 幂
- x ^ y = exp(y*ln(x))
- x ^ (1/n) = exp(1/n*ln(x))
数学方法
- 数论:质数 / 因数 / 约数个数(种数)/ 最大公约数 / 最小公倍数 / 回文数/扩展欧几里得/快速幂/线性筛法/逆元/欧拉函数……
- 进制转换(注意负进制)
- 高精度运算(考得不多)
- 排列组合:全排列、二项式定理
- 经典递推关系:
- Fibonacci
- fib(1)=1 ;fib(2)=1
- fib(n)=fib(n-1)+fib(n-2)
- 通项:设g5=sqrt(5) 则fib(n)=(1/g5)*( ((1+g5)/2)^n-((1-g5)/2)^n )
- Catalan数 :Catalan(n)=C(n,2*n)/(n+1)
- 高斯消元(省选内容)
数据结构(Data Structure)
- 物理结构
- 数组 > 二维平面/字符串(Ansistring)及其操作
- 指针 > 链表 (单链表 / 双向链表 / 环状链表)
- 抽象数据结构(Abstract Data Type)
- 初级ADT
- 集合
- 线性结构
- 栈(LIFO表)
- 后缀表达式
- 进出站序列问题(Catalan 枚举 > 归纳)
- DFS
- 队列(FIFO表)
- BFS
- 求和广义线性表
- 非线性结构
- 树(多是二叉)
- 树的遍历:前/中/后(递归实现)
- 最优二叉树(哈夫曼树Huffman tree)(贪心)
- 二叉堆
- 树规(树形DP)
- Trie树(字典树)
- 图(graph)
- 图的遍历:
- DFS
- BFS
- 最小生成树:(贪心)
- Prim:边稠密
- Kruskal: 边稀疏(排序 + 并查集)
- 最短路径算法:
- Dijkstra(单源 O(n2) BFS )
- Floyed(所有点间 O(n3) )
- Bellman-Ford(负权环)
- SPFA
- 拓扑序列
- 关键路径(AOV网)
- 无向图传递闭包、有向图强连通分量SCC
- 路、回路
- 二分图匹配
- LCA、RMQ
- 高级ADT
- 集合型
- 并查集(disjoint-set)
- 字典型
- 哈希(hash)
- 树型
- 二叉堆(Heap) > Treap
- Binary Search Tree(BST)
- 线段树、树状数组、树链剖分......
排序算法
- O(n2)
- 直接插入排序(Inserting Sort)
- 直接选择排序(Choosing Sort)
- 冒泡排序(Bubble Sort)
- O(nlongn)
- 堆排(Heap Sort)
- 快排(Quick Sort)
- 归并(Merge Sort)
- O(n)
- 基数排序(Radix Sort)
- 计数排序(Counting Sort)
- 桶排序(Bucket Sort)
动态规划(Dynamic programming)
- 注意事项
- 状态转移方程+边界条件
- 合适的实现方法(To 实现技巧)
- 经典题目
- 最长不下降(上升)序列
- 最大子段和 & 最大M子段和
- 最长公共子序列(LCS)
- 区间DP(链,环)
- 背包问题
- 01背包-可重复(DP)
- 01背包-不可重复(DP)
- 完全背包
- 部分背包(贪心)
- 状压DP
- DP的简单优化(滚动数组、数据结构优化、队列优化)
博弈问题
- 关键字:必胜态 / 必败态
- 递推找规律
- 归纳法
另附一张OI知识表(Ctrl+滚轮手动放大)