【问题标题】:Recursion with Logarithmic Time complexity具有对数时间复杂度的递归
【发布时间】:2014-09-07 04:23:59
【问题描述】:

这是一道作业题。不期待解决方案..只是在寻找正确方向的推动力!

设计一个具有对数时间复杂度的快速算法来计算三元组 (N(n),N(n-1),N(n-2))。编写一个递归函数,在输入 n>3 时返回上述三元组。对于足够大的 n,与计算 N(n) 的明显方法相比,该例程总共应该使用更少的操作。

给定:

N(0) = 0
N(1) = N(2) = N(3) = 1
N(n) = N(n-1) + N(n-3)
N(2k) = N(k)N(k) + 2N(k)N(k−2) + N(k−1)N(k−1) and
N(2k−1) = N(k)N(k) + 2N(k−1)N(k−2)

** 显而易见的方法是计算序列 N(0), N(1).. N(n) 中的值,因此能够使用预先计算的值。这需要 O(n)。

【问题讨论】:

  • 我的第一反应是看看memoizing it是否足够。
  • 我编辑了问题以澄清。如前所述,我也开始使用 Memoization。但是,很明显,它在(时间)成本上永远不会低于线性。
  • Memoization 不会计算直到 n 的所有值。它的计算量要少得多,我的第一反应是检查所需值的数量是否是 n 的对数。
  • 我和几个同学谈过了。我听说记忆化不是预期的。斐波那契数有一种矩阵求幂方法。当然,它可以在这种情况下使用吗?如果是,任何指针?
  • 记忆化可能不是预期的,但它确实有效。我列出了另一种解决问题的方法,无需记忆即可执行相同的计算。我看不出有任何直接的方法可以对此应用矩阵求幂,因为您没有处理先前值的线性组合。

标签: recursion time-complexity


【解决方案1】:

记住它。递归调用都落在许多对数间隔的集群中,您可以证明这些集群的最大大小的简单界限。因为这是作业,所以我把证明留给你。

(或者,您可以编写一个函数,通过一次递归调用来计算整个集群的值,以获取下一个较低集群的值。这可能是他们想到的方法。)

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2018-08-18
    相关资源
    最近更新 更多