将要讨论的这些算法都是非比较的排序,用到的可能性比较小吧。
Keywords: 最坏情况下界
线性时间排序
先修知识:现在先考虑比较排序。对于一个互异的、适用比较排序的输入数组,我们不需要知道其他的任何信息,只需要观察它们之间的次序信息。只考虑比较操作的话,比较排序可以被抽象为一棵决策树。
这里主要讲快速排序的代码,证明,不同版本以及分析。最后会写一点关于归并排序、堆排序和快速排序的一点感想。这一章相对来说比较简单,知识点的把握没有什么难度。
Keywords: 分治法
期望运行时间
接下来的几章我们会把所有的排序都讲完。
keywords: 维护堆
建堆
优先队列
先修知识: 排序有很多应用。比如银行对数据库中的编号进行排序,专业软件内的图层按次序来排序。
如果输入的数组仅有常数个元素需要在排序过程中储存在原数组之外,那么相关的排序算法就被称为是原址的。堆排、快排都是原址排序算法。决策树模型可以用来研究基于比较的排序算法的性能局限。
这里详细讲讲分治策略(虽然这个明显应该算后面的「分析技术」吧……)第五章概率分析就不讲了,基本都是离散的问题。
Keywords: 最大子数组问题
Strassen
递归式
先修知识:
假想你知道未来三十天的股票价格,你需要写一个算法来求出何时买何时卖来保证收益最大化——显然我们首先可以得到一个数组,每一个index代表天数,每一个value代表与这一天股票价格与前一天的价格差值(第0天是0)。那么我们的问题就可以转化为寻找这个数组的和最大的非空连续子数组。这样的连续子数组被叫做最大子数组。
写在前面:决定还是简要讲下这三章。毕竟算法分析和渐进求解也算是我的弱项:P
Keywords: 数学归纳法
分治法
渐进记号
先修知识:
插入排序,冒泡排序和选择排序。这三种排序实在过于简单,简单到除了应试题以外在实际应用中几乎见不到。虽然在数据量较小的时候其实它们是要比归并更快的(毕竟实际的用时不仅仅只考虑Comparison times),但你可能更倾向于用sort方法搞定一切——除非数据量足够小而你仍然要进行优化,那么这个时候请按这些排序的命名自己边猜边写吧。
同样是搬砖,会用卡车和滑轮的工人明显比徒手挖地基的更值得雇佣(虽然仍然摆脱不了搬砖的命运)作为注重「搬砖方式」的一门学问,算法专注于在结果与问题之间制造「虫洞」。
在粗略翻过《算法导论》后,可以说这本书一点也不 “introduction”。比如,即使我先前上过基础的算法课以及离散数学,也会发现第一部分的“基础知识”中有不少没接触过的知识(不过比什么玄学马尔可夫链还是好多了……)。
这本书把算法分为七个大部分:
- 基础知识
- 排序与顺序统计量
- 基本数据结构
- 魔法级别的分析技术
- 高级数据结构
- 图论
- 一些实际的算法问题(比如,P and NP)
行业标杆《算法导论》确实可以称得上是一本神书……
我打算按上述顺序写个系列,对我认为关键&生疏&困难的算法导论上的知识点进行梳理和总结(不一定像笔记,更像扯淡QVQ)。简单的章节将合并。另外地,一些不在算法导论上的知识(比如快排的多种写法)也会被探讨。同时,考虑到算法导论需要两三门先修课和个人先修知识面的不同,这个系列并不具有阅读普适性:P