【发布时间】:2013-10-24 17:02:38
【问题描述】:
我在这个函数中有 3 个问题,
Sum = 0
MyFunction (N)
M = 1,000,000
If (N > 1)
For I = 1 to M do
Sum = 0
J = 1
Do
Sum = Sum + J
J = J + 2
While J < N
End For
If (MyFunction(N / 2) % 3 == 0)
Return (2 * MyFunction(N / 2))
Else
Return (4 * MyFunction(N / 2))
End If
Else
Return 1
End If
End MyFunction
第一个问题是:代码的非递归部分的复杂度是多少?
我认为非递归部分是那个循环
For I = 1 to M do
Sum = 0
J = 1
Do
Sum = Sum + J
J = J + 2
While J < N
End For
我的答案是 M * log(n) ,但我的幻灯片说不是 M * log (n) !
我需要解释一下。
第二个问题是:MyFunction之前的代码正确的复现是什么?
当我看到这几行代码时
If (MyFunction(N / 2) % 3 == 0)
Return (2 * MyFunction(N / 2))
Else
Return (4 * MyFunction(N / 2))
End If
我认为是T(n) = T(n/2) + Theta(non-recursive),
因为 if 将执行 2 个调用之一。
这个答案又是错误的。
第三个是:MyFunction的复杂度是多少?
我基于这两个问题的答案是T(n) = T(n/2) + M * lg n
总运行时间为M * lg n。
【问题讨论】:
-
对于您的第一个问题:您应该考虑比例。如果你给函数两倍大
N会发生什么?它的执行时间是两倍还是更少? -
嗯,我没明白你的意思。我说 log n 是因为 do-while 循环,这是错误的吗?
-
do-while循环在复杂性的非递归部分中发挥作用,你做对了那部分。但是为什么你更喜欢log n? do while 循环执行需要多少步? -
它会被执行M次,因为它之前的循环?
-
哦,你的意思是 M 是常数,它只会是 (Theta(lg n) )?
标签: algorithm runtime big-o time-complexity recurrence