本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论
知识点
- 路径压缩
题目
1.5.12 使用路径压缩的 quick-union 算法。根据路径压缩修改 quick-union 算法(请见 1.5.2.3 节),在 find() 方法中添加一个循环来将从 p 到根节点的路径上的每个触点都连接到根节点。给出一列输入,使该方法能够产生一条长度为 4 的路径。注意:该算法的所有操作的均摊成本已知为对数级别。这种改变会对性能产生怎样的影响?
1.5.12 Quick-union with path compression. Modify quick-union (page 224) to include path compression, by adding a loop to union() that links every site on the paths from p and q to the roots of their trees to the root of the new tree. Give a sequence of input pairs that causes this method to produce a path of length 4. Note : The amortized cost per operation for this algorithm is known to be logarithmic.
分析
路径压缩在书中的叙述在英文版231页,如下:
答案
题目
1.5.13 使用路径压缩的加权 quick-union 算法。修改加权 quick-union 算法(算法 1.5),实现如练习 1.5.12 所述的路径压缩。给出一列输入,使该方法能产生一棵高度为 4 的树。注意:该算法的所有操作的均摊成本已知被限制在反 Ackermann 函数的范围之内,且对于实际应用中可能出现的所有 N 值均小于 5。
1.5.13 Weighted quick-union with path compression. Modify weighted quick-union (Algorithm 1.5) to implement path compression, as described in Exercise 1.5.12. Give a sequence of input pairs that causes this method to produce a tree of height 4. Note : The amortized cost per operation for this algorithm is known to be bounded by a function known as the inverse Ackermann function and is less than 5 for any conceivable practical value of N.
分析
题目中的Ackermann,相信大家不一定熟悉,这里我找了些资料:
威廉·阿克曼
威廉·阿克曼,德国数学家,最著名的成果是计算理论的重要例子阿克曼函数。
阿克曼函数
阿克曼函数(Ackermann)是非原始递归函数的例子。它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算。
Ackermann函数定义如下:
若m=0,返回n+1。
若m>0且n=0,返回Ackermann(m-1,1)。
若m>0且n>0,返回Ackermann(m-1,Ackermann(m,n-1))。
单变量反Ackermann函数(简称反Ackermann函数)
α(x)定义为最大的整数m使得Ackermann(m,m)≤x。从上面的讨论中可以看到,因为Ackermann函数的增长很快,所以其反函数α(x)的增长是非常慢的,对所有在实际问题中有意义的x,α(x)≤4,所以在算法时间复杂度分析等问题中,可以把α(x)看成常数。
α(x)出现在使用了按秩合并和路径压缩的并查集算法的时间复杂度中。
我相信就算我贴了这么多,很多人还是对Ackermann函数一知半解,那我们这里再解释一下。首先我们要了解Ackermann函数是“非原始递归函数”。那递归大家都知道,那什么叫做“原始递归”和“非原始递归”呢。