《算法图解》学习总结

第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.线性规划用于在约束条件下最大限度地改善指定的指标。

 

posted @ 2022-08-03 22:25  罗毅豪  阅读(31)  评论(0编辑  收藏  举报