【发布时间】:2020-03-02 20:27:21
【问题描述】:
我为一项任务提出了以下算法。主要是第 23-24 行中的 for 循环让我不确定。
function TOP-DOWN-N(C, n, p)
let N[1...n, 1...C] be a new array initialized to -1 for all indicies
return N(C, n)
function N(C, n)
if N[C,n] >= 0 then
return N[C,n]
if C < 0 or n < 1 then
return 0
elif C = 0 then
return 1
elif C > 0 and i > 0 then
r = 0
for i = 0 to n do
r += N(C-p[n-i], n-(i+1))
N[C,n] = r
return N
【问题讨论】:
-
至于分析,您是正确的,最多 O(nC) 调用可能花费 O(1) 时间以上,但您仍然需要计算花费 O(1) 时间的那些因为可能有很多。
-
花费 O(1) 时间的那些不会改变算法的运行时间将为 O(nC),对吗?我现在用伪代码把它打出来。
-
如果发生循环的地方有 O(nC) 个调用,并且每个调用都有一个 O(n) 次迭代的循环,那么总复杂度应该是 O(n^2 C),应该不是吗?这是假设循环体花费恒定的时间,这不是严格正确的,但是是一种有效的简化,因为已经考虑了从循环内进行的递归调用。但是,循环本身执行 O(n) 次函数调用和 O(n) 次加法。
-
你可能是对的。让我失望的是 - 如果函数调用终止为 N[C,n] >= 0 那么这将不会到达 for 循环。
-
要使
N[C,n] >= 0条件为真,那么它在过去的某个时刻一定是假的,具有相同的C和n值,否则该数组单元将永远不会有已写入。
标签: algorithm time time-complexity dynamic-programming