最近看了这本《算法图解》,学到了很多有意思的东西。特来分享一下。

散列表长度调整

填装因子越低,发生冲突的可能性越小,散列表的性能越高。一个不错的经验规则是:一旦填装因子大于0.7,就调整散列表的长度。

广度优先搜索

广度优先搜索(breadth-first search,BFS)是一种位图算法。可以找出两样东西之间的最短距离。

使用这个算法可以做到:

  • 编写国际跳棋AI,计算最少走多少步就可获胜;
  • 编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将
  • READED改为READER需要编辑一个地方;
  • 根据你的人际关系网络找到关系最近的医生。

广度优先搜索有两个步骤:

  1. 使用图来建立问题模型。
  2. 使用广度优先搜索解决问题。

图由节点和边组成,一个节点可能与众多节点直接相连,这些节点被称为邻居。在前面的欠钱图中,Rama是Alex的邻居。Adit不是Alex的邻居,因为他们不直接相连。但Adit既是Rama的邻居,又是Tom的邻居。图用于模拟不同的东西是如何相连的。

广度优先搜索

广度优先搜索是一种用于图的查找算法,可帮助回答两类问题。

  • 第一类问题:从节点A出发,有前往节点B的路径吗?
  • 第二类问题:从节点A出发,前往节点B的哪条路径最短?

广度优先搜索的运行时间为$O(人数 + 边数)$,这通常写作$O(V + E)$,其中V为顶点(vertice)数,E为边数。

MapReduce

有一种特殊的并行算法正越来越流行,它就是分布式算法。在并行算法只需两到四个内核时,完全可以在笔记本电脑上运行它,但如果需要数百个内核呢?在这种情况下,可让算法在多台计算机上运行。MapReduce是一种流行的分布式算法,我们一般在Hadoop上面会使用它。

分布式算法非常适合用于在短时间内完成海量工作,其中的MapReduce基于两个简单的理念:映射(map)函数和归并(reduce)函数。

本书的最后还介绍了很多算法,像狄克斯特拉算法,贪婪算法,K最近邻算法等。不过好多没有领悟出来。这里就不做介绍。