《算法图解》学习总结
第1章 算法简介
1.最多需要猜测的次数与列表长度相同,这被称为线性时间。
2.二分查找的运行时间为对数时间,即O(logn)。
3.大O表示法是一种特殊的表示法,指出了算法的速度有多快。
4.使用大O表示法讨论运行时间时,log指的都是log2。
5.大O表示法让你能够比较操作数,它指出了算法运行时间的增速。
6.大O表示法指出了最糟情况下的运行时间。
7.简单查找的运行时间为O(n),快速排序的运行时间为O(nlogn),选择排序的运行时间为O(n**2),解决旅行商问题的运行时间为O(n!)。
第2章 选择排序
1.数组的读取时间为O(1),即常量时间,插入时间为O(n),删除时间为O(n)。
2.链表的读取时间为O(n),插入时间为O(1),删除时间为O(1)。
第3章 递归
1.每个递归函数都有两部分:基线条件和递归条件。
2.递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
3.调用栈可能很长,这将占用大量的内存,若程序没完没了的运行导致堆栈溢出,则程序终止。
第4章 快速排序
1.快速排序是重要的D&C(Divide&Conquer,分而治之)算法。
2.Haskell等函数式编程语言没有循环,因此你只能使用递归来编写函数。
3.合并排序的运行时间为O(nlogn)。
4.快速排序的常量比合并排序小,因此如果它们的运行时间都为O(nlogn),快速排序的速度将更快。
第5章 散列表
1.散列函数总是将同样的输入映射到相同的索引,将不同的输入映射到不同的索引,只返回有效的索引。
2.散列表数据结构由散列函数和数组创建,由键和值组成。
3.散列表可用于查找(如DNS解析),可以防止重复,可以用作缓存。
4.在平均情况下,散列表执行的各种操作的时间都为O(1),即常量时间。
5.避免冲突的方式:较低的填装因子(散列表包含的元素数 / 位置总数)和良好的散列函数(让数组中的值呈均匀分布)。
6.一旦填装因子大于0.7,就调整散列表的长度为原长度的2倍。
7.SHA函数是一种散列函数。
第6章 广度优先搜索
1.广度优先搜索(Breadth First Search)是一种图算法,用来解决最短路径问题。
2.BFS的运行时间为O(V+E),V是顶点数,E是边数。
第7章 狄克斯特拉算法
1.狄克斯特拉算法只可用于获取有向无环加权图的最短路径,且图内不能有负权边。
2.图内有负权边需要使用贝尔曼-福德算法,非加权图则用广度优先搜索(BFS)算法可得出最短路径。
第8章 贪婪算法
1.贪婪算法是每步都采取最优解,最终得到全局的最优解,可以快速得到问题的近似解。
2.集合有交集、并集和差集运算。
3.旅行商问题和集合覆盖问题有一些共同之处:你需要计算出所有的解,并从中选出最小/最短的那个。这两个问题都属于NP完全问题。
4.对于NP完全问题,还没有找到快速解决方案。
5.面临NP完全问题时,最佳的做法是使用近似算法。
6.贪婪算法易于实现、运行速度快,是不错的近似算法。
7.BFS和狄克斯特拉算法都是贪婪算法。
第9章 动态规划
1.动态规划先解决子问题,再逐步解决大问题。
2.需要在给定约束条件下优化某种指标时,动态规划很有用。
3.问题可分解为离散的子问题时,可使用动态规划来解决。
4.每种动态规划的解决方案都涉及网格,单元格中的值通常就是你要优化的值。
5.每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题。
6.没有放之四海而皆准的计算动态规划解决方案的公式。
第10章 K最近邻算法
1.使用KNN可以进行分类和回归(预测结果)操作,需要考虑最近的邻居。
2.计算两位用户的距离可使用毕达哥拉斯公式。在实际工作中,经常使用余弦相似度。
3.使用KNN时,挑选合适的特征(特征抽取)进行比较至关重要。
4.创建推荐系统是机器学习的一个例子。
5.OCR通过浏览大量的数字图像,将这些数字的特征提取出来,即训练;遇到新图像时,你提取该图像的特征,再找出它最近的邻居都是谁。
6.语音识别和人脸识别也是基于KNN等简单理念的。
7.垃圾邮件过滤器使用一种简单算法——朴素贝叶斯分类器,通过研究句子中的每个单词,看看它在垃圾邮件中出现的概率是多少,从而计算出邮件为垃圾邮件的概率。
8.使用机器学习来预测股票市场的涨跌很难。
9.如果网站有N位用户,使用KNN应考虑sqrt(N)位邻居。
第11章 接下来如何做
1.在二叉查找树中查找节点时,平均运行时间为O(logn),其插入和删除操作的速度也快得多。
2.红黑树是处于平衡状态的特殊二叉查找树。
3.B树是一种特殊的二叉树,数据库常用它来存储数据。
4.一个散列表,将单词映射到包含它的页面,这种数据结构被称为反向索引。常用于创建搜索引擎。
5.给定一首歌曲,傅里叶变换能够将其中的各种频率分离出来,使用傅里叶变换可创建音乐识别软件。
6.在多个内核中并行地执行的算法称为并行算法,快速排序的并行版本所需的时间为O(n)。
7.并行算法速度的提升是非线性的,要考虑并行性管理开销和负载均衡。
8.分布式算法是流行的特殊并行算法。MapReduce是一种流行的分布式算法,我们可通过Hadoop来使用它。
9.分布式算法非常适合在短时间内完成海量工作,其中的MapReduce基于两个简单的理念:映射函数和归并函数。
10.布隆过滤器是一种概率型数据结构,它提供的答案有可能不对,但很可能是正确的。为判断网页以前是否已搜集,可不使用散列表,而使用布隆过滤器。布隆过滤器的优点在于占用的存储空间很少。
11.HyperLogLog一种类似于布隆过滤器的概率型算法,它近似的计算集合中不同的元素数,占用的内存空间少。
12.SHA(Secure Hash Algorithm)函数一种散列函数,可根据字符串生成另一个字符串。SHA可以用于比较两个超大的文件,可以用于存储密码到数据库。
13.SHA实际上是一系列算法:SHA-0、SHA-1、SHA-2和SHA-3,目前2和3暂无缺陷。最安全的散列函数是bcrypt。
14.SHA是局部不敏感的,即修改一个字符,再计算其散列值,结果将截然不同。我们可用局部敏感的散列函数Simhash来判断两个字符串的相似程度,如判断论文的相似度。
15.Deffie-Hellman算法使用公钥和私钥,公钥加密,私钥解密。这一算法及其替代者RSA依然被广泛使用。
16.线性规划用于在约束条件下最大限度地改善指定的指标。