看的第一本算法书,图很多,讲的很详细,不过觉得讲的有点浅,像是专门给还不是程序员的人看的。
二分查找
输入一个有序的列表和一个元素,如果元素包含的列表中返回元素的位置,否则返回null。一般,对于包含n个元素的列表,二分查找需要log2n步,简单查找最多需要n步。
大O表示法,指出了算法运行时间的增速。二分查找表示为O(logn),括号中叫做操作数。
|
|
选择排序
数组预留位置是一种权变措施,可能浪费内存,超过这个值,需要转移。链表元素的内存可以在任何地方,数组是连续内存。链表每个元素存储了下一个元素的位置,链表的优势在插入元素方面,查找元素链表效率低。O(n)叫线性时间,O(1)叫常量时间。删除链表也是优势。数组可以随机访问,链表顺序访问。
选择排序速度不是很快,运行时间为O(n2)。
|
|
递归
递归函数有基线条件和递归条件,基线条件指的是函数不再调用自己,避免无限循环。递归指的是调用自己。
尾递归
|
|
快速排序
分而治之D&C,递归式解决方法。
欧几里得算法
涉及数组的递归基线条件通常是数组为空或只有一个元素。
Haskell,使用递归多,函数式编程。
快速排序比选择排序快,平均运行时间为O(nlogn),也是最佳时间,每次都随机选择一个元素作为基准值就可以。
合并排序或者也叫归并排序 也是O(nlogn)。
|
|
散列表
散列表、散列映射、映射、字典、关联数组,不同的叫法一个概念。应用DNS解析、网页缓存。2个键映射到同一个位置,给这个位置用链表。散列函数将键均匀映射到不同位置,避免冲突。插入删除与链表一样快,查找与数组一样快。填装因子度量的是散列表中的空闲位置,填装因子变大,需要调整长度,通常将数组长度增大一倍。填装因子大于0.7就需要扩增散列表长度。
SHA函数 用作散列函数。
广度优先搜索
最短路径问题,用于图查找。运行时间为O(V+E),V是顶点,E为边数。
队列FIFO,栈LIFO。
有向图,无向图。有依赖关系,叫拓扑排序。
|
|
狄克斯特拉算法
非加权图用广度优先搜索,加权图使用狄克斯特拉算法。环增加权重,不可能是最短路径。狄克斯特拉适用于有向无环图。负权边不能用狄克斯特拉,得用贝尔曼-福德算法。
|
|
贪婪算法
每步都选择最优做法,结果与正确结果接近。集合问题的贪婪算法,O(n2)。NP完全问题,需要计算所有的解,选出最好的。NP只能求近似解,非NP能容易算出解。组合、序列、集合可能是NP完全问题,需要考虑所有情况不能分解,数量多变复杂速度变慢。
|
|
动态规划
求最优解,画网格图。依赖于子问题是离散的。应用,DNA相似性、git、diff、拼写检查等。
K最近邻算法
KNN,分类和回归,分类就是编组,回归是预测。余弦相似度,计算矢量距离。KNN用于机器学习,OCR,人脸识别,语音识别。训练数据。朴素贝叶斯分类器预测垃圾邮件概率。
其他算法
二叉查找树,O(logn),插入删除也快,不能随机访问。B树、红黑树、堆、伸展树。搜索引擎,反向索引。傅里叶变换,压缩音视频,地震预测、DNA分析。并行算法。MapReduce,分布式算法,短时间内完成海量工作。布隆过滤器是概率性数据结构,答案不一定准确,占用存储空间小。SHA,根据字符串返回散列值,比较文件,检查密码,simhash,局部敏感,检查相似程度,如论文查重。RSA加密。