找出程序的时间复杂度
Finding the time complexity of a program
我正在尝试计算下面算法的时间复杂度。
def f()
ans = 0
for i = 1 to n:
for j = 1 to log(i):
ans += 1
print(ans)
问题的link如下:
https://discuss.codechef.com/t/multiple-choice-questions-related-to-testing-knowledge-about-time-and-space-complexity-of-a-program/17976(第 4 题)
答案是O(nlogn)
外循环的复杂度为O(n)
,而内循环的复杂度为log(n)
添加到另一个答案中,您可以将算法的总 运行 时间 T(n) 框定为每个 i 值的内循环 运行s 的次数从 1 到 n。当 i = 1 时内循环 运行s log(1) 次,当 i = 2 时内循环 运行s log(2) 次,依此类推。总 运行 时间然后由总和表示:
T(n) = log(1) + log(2) + log(3) ... + log(n)
一个日志的总和是一个产品的日志:
T(n) = log(1*2*3...*n)
<= log(n^n) (n! <= n^n)
= nlog(n) (log(a^b) = b*log(a))
T(n) <= nlogn
所以 运行-time 并不比 nlog(n) 差:它是 O(nlogn)。
您可以做更多的工作来证明 O(nlogn) 的界限很紧,但这通常是没有必要的。 (如果您证明 T(n) 的上界为 nlogn,下界为 nlogn,则您已显示 紧界。也就是说,您已显示确切的复杂性class,通常用“Big Theta”= Θ 表示法表示。
T(n) = log(1*2*3...*n)
>= log(n/2*(n/2 + 1)*(n/2 + 2)...*n) (throwing away first half of product)
>= log(n/2^(n/2)) (reducing all terms to n/2)
= n/2(log(n/2))
= n/2(logn - 1) (assuming base 2)
T(n) >= n/2(logn - 1) = Θ(nlogn)
因此,由于算法的 运行 时间受 Θ(nlogn) 函数上下限制,其复杂度 class 恰好为 nlogn。
n/2(logn - 1) <= T(n) <= nlogn implies T(n) = Θ(nlogn)
我正在尝试计算下面算法的时间复杂度。
def f()
ans = 0
for i = 1 to n:
for j = 1 to log(i):
ans += 1
print(ans)
问题的link如下: https://discuss.codechef.com/t/multiple-choice-questions-related-to-testing-knowledge-about-time-and-space-complexity-of-a-program/17976(第 4 题)
答案是O(nlogn)
外循环的复杂度为O(n)
,而内循环的复杂度为log(n)
添加到另一个答案中,您可以将算法的总 运行 时间 T(n) 框定为每个 i 值的内循环 运行s 的次数从 1 到 n。当 i = 1 时内循环 运行s log(1) 次,当 i = 2 时内循环 运行s log(2) 次,依此类推。总 运行 时间然后由总和表示:
T(n) = log(1) + log(2) + log(3) ... + log(n)
一个日志的总和是一个产品的日志:
T(n) = log(1*2*3...*n)
<= log(n^n) (n! <= n^n)
= nlog(n) (log(a^b) = b*log(a))
T(n) <= nlogn
所以 运行-time 并不比 nlog(n) 差:它是 O(nlogn)。
您可以做更多的工作来证明 O(nlogn) 的界限很紧,但这通常是没有必要的。 (如果您证明 T(n) 的上界为 nlogn,下界为 nlogn,则您已显示 紧界。也就是说,您已显示确切的复杂性class,通常用“Big Theta”= Θ 表示法表示。
T(n) = log(1*2*3...*n)
>= log(n/2*(n/2 + 1)*(n/2 + 2)...*n) (throwing away first half of product)
>= log(n/2^(n/2)) (reducing all terms to n/2)
= n/2(log(n/2))
= n/2(logn - 1) (assuming base 2)
T(n) >= n/2(logn - 1) = Θ(nlogn)
因此,由于算法的 运行 时间受 Θ(nlogn) 函数上下限制,其复杂度 class 恰好为 nlogn。
n/2(logn - 1) <= T(n) <= nlogn implies T(n) = Θ(nlogn)