[英]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.