
322
第
12
章
尾声:算法原理
不知不觉已经步入了本书的尾声,但这并不意味着关于算法方面的知识介绍已经到了尽
头。更确切地说,本书所介绍的这些技术所面向的问题是无穷无尽的。
本书详细讲解并提供示例的算法达
30
多个,现在我们终于有机会回顾一番了。我们希
望读者能够从始至终地赞同书中的讲解。为了展现本书所涉及内容的广度,我们将总结
书中所有算法背后的原理,以此来展示不同算法之间的相似性。我们不打算通过简单地
汇总各个章节来作为结束,而是将目光放在关键性原理上,这些原理正是最初设计这些
算法的动机。我们还将借此机会总结每种算法所涉及的概念,这样做不仅对这些算法进
行快速汇总,还有助于根据所共享的不同算法来设置索引。
12.1 了解数据
本书提及许多作用于数据之上的通用行为。例如,你也许需要通过对数据进行排序来产
生某个特定的顺序,或者需要搜索数据来寻找某些特殊的信息。数据可能是可以随机访
问的(也就是说,可以在任何时候读取任何一块数据),也有可能只能通过迭代器进行
顺序访问(每次只能处理一个元素)。如果不了解数据的特性,就只能使用一些较为通
用的算法。
通常,输入数据的特性对算法有着至关重要的影响。在第
9
章中,如果知道要计算的线
段交集不包含竖线,就可以很容易地过滤掉许多特例情况。类似地,如果没有任何两点
共享相同的
x
坐标或
y
坐标,就可以简化
Voronoi
图。再如第
6
章中的
Dijkstra
算法
,
如果存在一个边权和为负数的环,那么算法将会陷入死循环。在选择算法前,了解它们
的一些特例和前提假设是有必要的。
正如之前讨论过的,没有哪种算法 ...