微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何解递推关系 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 举报,一经查实,本站将立刻删除。