算法笔记(40)

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 过滤器

一个很长的二进制向量和一个映射函数:布隆过滤器可以用于检索一个元素是否在一个集合中。优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值