我正在阅读Algorithms Illuminated: Part 1,问题5.3指出:
让⍺是一些常数,与输入数组长度n无关, 严格在0到1/2之间。假设您达到了大约 每个preceding problem中的均衡拆分 递归调用-因此,只要给递归调用一个数组 长度为k的两个递归调用中的每个传递给子数组 ⍺k和(1-⍺)k之间的长度。连续多少次递归调用 触发基本案例之前会发生什么?等效地,哪个级别 算法的递归树中可以包含叶子?表达你的 回答一个可能的数字d范围,从最小值到 可能需要的最大递归调用数。 [提示: 将对数函数与不同底数相关联的公式是log n = ln n]
答案选择:
- -log(n)/ log(⍺)<= d <= -log(n)/ log(1-⍺)
- 0 <= d <= -log(n)/ log(⍺)
- -log(n)/ log(1-⍺)<= d <= -log(n)/ log(⍺)
- -log(n)/ log(1-2⍺)<= d <= -log(n)/ log(1-⍺)
我的分析
如果⍺<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似乎是正确的。但是,我对减号感到困惑。我不明白递归树的高度如何为负数。另外,我希望有人验证我的分析,如上所示。
有什么想法吗?
答案 0 :(得分:2)
您的分析有一个小错误。
正确的等式应为n * (1 - ⍺) ^ d = 1
,而不是n / (1 - ⍺) ^ d = 1
。
这会添加您要查找的负号。
请记住,⍺
和(1 - ⍺)
都小于1。因此,对数为负。在其上再添加一个负号会导致最小和最大深度的整体正值。