Mathematical Analysis of Algorithm (DE Knuth)
主要内容:
本文开头,写了当时主要存在两种算法复杂度分析, type A 是对某一个具体算法的分析, type
B 是对一个问题某类解决方法的复杂度分析。虽然很多人认为 type B 更重要,但 Knuth 认为 type B
是无法取代 type A 的, type A 也很重要。
接下来, Knuth 对两个具体的算法进行了分析。
第一个算法用来解决原位排序的问题。原位排序问题,就是给你两个个一维的数组, x 数组
(x1,x2,...,xn) 和 p 数组,其中 p 数组中的内容是 1 到 n 的一个排列。要求,只能使用 O ( 1 )的额外
空间,也不能改变 p 数组的值,将 x 数组按 (xp(1), xp(2), ..., xp(n)) 排序。
这个算法,大致上是先找到每个环的 leader ,再对环中的元素进行一次置换,这样这个环中的
数据就都处在了正确的位置。算法的正确性,利用离散数学的相关知识,是比较容易证明的,难点在于
对其复杂度的分析。
Knuth 借助两个变量 a 和 b 来对复杂度进行分析。首先, a 是从所在环第一个元素到 j 所需进
行的 p(j) 次数, b 是 p 排列中环的个数。最坏情况是容易构造和分析的, Knuth 用了大量的笔墨对平均
情况进行分析。
首先, Knuth 以特定的规则,将每个 p 排列一一映射成另一个 p 排列。然后将 b 的值与第一类
stirling 数联系起来,由此求到了 b 的平均值以及方差。
a的平均值求法比较复杂。 Knuth 构造了一个变量 y ,对 a 有了另一种描述 a=sum(yij) 。再
次利用离散数学的知识,求得了 a 的平均值和方差。
第二个算法相对比较简单,解决的问题是在一个数组中找到第 t 大的数。该算法类似与快排,先
根据一个轴值 k ,将序列分成两个部分,一半比 k 小,一半比 k 大。
Knuth 用 Cn,t 表示在 n 个元素中找第 t 大所需的比较次数。根据递推式,利用相关数学知识,
最终求到了 Cn,t 的表达式。
收获:
Knuth 的厉害之处除了对数学的灵活运用,还有对模型的构建,他能将问题一步一步转化,将
一开始看起来很难求的 a ,最终求了出来。这里面的技巧值得我们去理解学习。