1 斐波拉契数列,递归,复杂度2的n次方e
二分查找:O(logn)
二叉树的遍历:O(n) 每个节点遍历仅遍历一次
排序的二维矩阵的查找:O(n)
快排:O(nlogn)
2 优先队列
正常入,按优先级出。实现机制:1) 堆(二叉堆,多项式堆,斐波拉契堆),二叉搜索树。
小顶堆:最小的在最上面
3 Hashmap:平均时间复杂度: 查找,删除,插入复杂度O(1)。最差的时间复杂度:O(N).
二叉搜索树:O(logn),元素有序,如果要求元素是有序排列的,可以用这个。
4 二叉搜索树
左子树上所有结点的值均小于它的根结点的值,右子树上都大于根结点的值,左右子树分别为二叉查找树。
5 二叉树的遍历
看根的位置:
前序:根左右;中序:左根右,后序:左右根
6 广度优先搜索
在树/图/ 状态集中寻找特定的节点
7 剪枝
有些节点一看就不用去看的。
8 二分查找
要求: 所查找的数是要在一个有序的数组里,存在上下界线,可以通过索引来访问。链表不适合,数组适合。
9 Trie 树
字典树:又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串,
所以经常被搜索引擎系统用于文本词频统计。优点是最大限度减少无谓的字符串比较,查询效率比哈希表高。
每条边代表一个字母
10 位运算
x 和0异或,得到x,x和x 异或得到0
实战常用的位运算
x &1==1 或者0 是判断奇偶(x%2==1)
x&(x-1) 清零最低位的1 # 求出有多少个二进制的1或0
x&-x得到最低位的1
11 dp
=递归+记忆化:
状态定义:opt[n] ,dp[n],fib[n]
状态转移方程:opt[n]=best_of(opt[n-1,opt[n-2],...)
最优子结构
普通的递归:fib[n]=fib[n-1]+fib[n-2),时间复杂度2的n 次方
bp:把每次的fib[n] 记住,后面使用,时间复杂度O(N),从小到大:
DP vs 回溯 vs 贪心
回溯:重复计算
贪心:永远局部最优
DP-记录局部最优子结构,多种记录值。
12 并查集
树型结构,用于处理一些不交集的合并及查询问题
Find:确定元素属于哪一个子集,可以被用来确定两个元素是否属于同一个子集
Union :将两个子集合并为同一个集合
初始化:它的值等于它自己
13 LRU cache
最近最少使用,双向链表,查询,修改和更新都是O(1)
14 Bloom 过滤器
一个很长的二进制向量和一个映射函数:布隆过滤器可以用于检索一个元素是否在一个集合中。优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难