繁体   English   中英

如何求解递归关系 T(n)=T(n/3)+T(n/6)+1

[英]How to solve the recurrence relation T(n)=T(n/3)+T(n/6)+1

我一直在尝试解决下一个递归关系 T(n)=T(n/3)+T(n/6)+1

我不知道从哪里开始。 想过先画个递归树再求解,不知道对不对。

有人可以帮我吗? 谢谢

您有两个不同的小数部分这一事实使这变得困难,因此将它们分开并单独解决。

T(n) = (T(n/6) + 1/2)) + (T(n/3) + 1/2))

您可以使用递归树或替换来解决各个部分。 首先在左半边使用替换:

T(n) = T(n/6) + 1/2
     = T(n/6^2) + 2/2
     = T(n/6^3) + 3/2
     ...
     = T(n/6^i) + i/2

您可以通过让 i = log_6(n)

T(n) = T(n/6^log_6(n)) + log_6(n)/2
     = T(n/n) + log_6(n)/2
     = T(1) + log_6(n)/2

我们选择通过将 i 设置为该值来解决,基于假设您有一个在 T(1) 处具有恒定工作量的基本情况。 因此,递归的左半部分在 O(log_6(n)/2) = O(log(n)) 时间内完成。

你可以类似地证明

T(n) = T(n/3) + 1/2
     = O(log_3(n)/2) = O(log(n))

因此,整个循环是 O(log(n)) + O(log(n)) = O(log(n))。

如果没有为 T(1) 的基本情况指定值,则无法显式解决它。

另一种思考方式是,在算法的每个阶段,您都在做固定数量的工作 (1),然后递归处理已划分的问题。 你可以将一个问题大小为 n 的问题除以 3 的次数是 log_3(n)。 因此,你递归了很多次,在每个 function 调用上做了大量的工作,所以你总共做了 O(log(n)) 的工作。 (总工作量 = 通话次数 * 每次通话的工作量)

相反,如果您的递归是 T(n) = T(n/3) + n,您仍然会递归 log_3(n) 次,但您将在每次调用上做线性工作量,因此总体复杂性将是O(n*log(n))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM