【问题标题】:Randomized quicksort recursion depth随机快速排序递归深度
【发布时间】:2018-11-16 08:09:47
【问题描述】:

我正在阅读Algorithms Illuminated: Part 1,问题 5.3 状态:

令 ⍺ 为某个常数,与输入数组长度 n 无关, 严格在 0 到 1/2 之间。假设你达到了大约 从preceding problem 在每个 递归调用 - 所以每当递归调用被赋予一个数组 长度 k,它的两个递归调用中的每一个都传递一个子数组 ⍺k 和 (1 - ⍺)k 之间的长度。多少次连续递归调用 可以在触发基本情况之前发生吗?等效地,哪个级别 算法的递归树可以包含叶子吗?表达你的 答案是一系列可能的数字 d,从最小值到 可能需要的最大递归调用数。 [提示: 将具有不同基数的对数函数联系起来的公式是 log n = ln n]

答案选择:

  1. -log(n)/log(⍺)
  2. 0
  3. -log(n)/log(1 - ⍺)
  4. -log(n)/log(1 - 2⍺)

我的分析:

如果 ⍺ ⍺,则子数组长度为 (1 - ⍺)n 的分支将具有更大的递归深度。

n / (1 - ⍺)^d = 1
Taking log[base(1 - ⍺)] on both sides
log[base(1 - ⍺)](n) = d
By log rule
d = log(n)/log(1 - ⍺)

最好的情况应该是log(n)/log(⍺),因此答案 1 似乎是正确的。但是,我对减号感到困惑;我不明白递归树的高度怎么可能是负数。另外,我希望有人验证我的分析,如上所示。

有什么想法吗?

【问题讨论】:

    标签: algorithm recursion quicksort


    【解决方案1】:

    您的分析有一个小错误。

    正确的公式是n * (1 - ⍺) ^ d = 1 而不是n / (1 - ⍺) ^ d = 1。 这会添加您正在寻找的负号。

    请记住,(1 - ⍺) 都小于 1。因此,对数是负数。在其上再添加一个负号会导致最小和最大深度的总体正值。

    【讨论】:

    • 为什么 n * (1 - ⍺) ^ d = 1?
    • @ParvizPirizade 在每个递归级别,大小为 k 的数组被拆分为 ⍺k 和 (1-⍺)k。为了递归结束,大小必须达到基本情况 1。所以 n * (1-⍺) * (1-⍺)..d times = 1