【发布时间】: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 的对数。
-
我和几个同学谈过了。我听说记忆化不是预期的。斐波那契数有一种矩阵求幂方法。当然,它可以在这种情况下使用吗?如果是,任何指针?
-
记忆化可能不是预期的,但它确实有效。我列出了另一种解决问题的方法,无需记忆即可执行相同的计算。我看不出有任何直接的方法可以对此应用矩阵求幂,因为您没有处理先前值的线性组合。