随机快速排序递归深度

时间:2018-11-16 08:09:48

标签: algorithm recursion quicksort

我正在阅读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(⍺)<= d <= -log(n)/ log(1-⍺)
  2.   
  3. 0 <= d <= -log(n)/ log(⍺)
  4.   
  5. -log(n)/ log(1-⍺)<= d <= -log(n)/ log(⍺)
  6.   
  7. -log(n)/ log(1-2⍺)<= d <= -log(n)/ log(1-⍺)
  8.   

我的分析

如果⍺<1/2,则1-⍺>⍺,因此子数组长度为(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似乎是正确的。但是,我对减号感到困惑。我不明白递归树的高度如何为负数。另外,我希望有人验证我的分析,如上所示。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的分析有一个小错误。

正确的等式应为n * (1 - ⍺) ^ d = 1,而不是n / (1 - ⍺) ^ d = 1。 这会添加您要查找的负号。

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