如何解决如何解递推关系 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)。因此,您多次递归,对每个函数调用执行恒定量的工作,因此您总共执行 O(log(n)) 工作。 (总工作量 = 调用次数 * 每次调用的工作量)
如果你的循环次数是 T(n) = T(n/3) + n,你仍然会递归 log_3(n) 次,但你会在每次调用上做线性量的工作,所以整体复杂度为 O(n*log(n))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。