我正在阅读CLRS并正在观看Tim Roughgarden在Coursera上的斯坦福大学算法课程。算法的运行时间分析基于将比较阵列中的两个条目的概率。理解起来不是很容易,所以我尝试用其他方式进行分析,但我不确定它是否正确。
基本上我尝试计算每次调用分区子例程时返回的预期枢轴索引。
每次调用分区子例程时,允许 pivot 返回预期的pivot索引。这表明我们可以预期分区子程序将平均分割子数组。使用递归树图示,可以很容易地显示树的深度将是 log(n),并且在树的每个级别上, O(n)为分区子阵列。这是对的吗?
答案 0 :(得分:1)
您的计算是正确的,但解释不是。
数据透视索引的平均值不会直接影响效果分析。
想象一下一个非常糟糕的枢轴选择:它选择第一个或最后一个索引,概率为1/2。在这种情况下:
pivot = 1 * 1/2 + n * 1/2 = (n + 1) / 2 ≈ n / 2
然而,这显然是选择枢轴的最糟糕的策略 - 它将导致二次行为。
您需要的是直接计算算法的运行时间。它将比仅仅是枢轴索引的函数更复杂(我想,实际上太复杂了)。
一个更可行的想法是问自己这样的问题:
显然,pivot的索引并不总是
n/2
。但是,它几乎总是接近于此。它会走多远?或者,更正式地说,枢轴指数的概率大于例如n/4
来自理想值?如果这个概率足够低,我们可以将树的平均深度限制为O(log n)
吗? (我想是的)