这个算法的时间复杂度是Θ(n)吗?

时间:2016-06-06 20:17:08

标签: algorithm loops math time-complexity

我想找到以下算法的时间复杂度

for i=1 to n do
    j=i
    while j<n do
        j=2*j

我做了我的计算,发现T(n) = log(n^n/n!)

但正确的答案应该是T(n) = Θ(n)

我错了吗?或者也许是log(n^n/n!) = Θ(n)

3 个答案:

答案 0 :(得分:10)

问题是你的公式与他们的公式相同。你只需要知道一些数学:

enter image description here

前两个转换只是基本的日志属性,第三个是Stirling's approximation

显然每个人都知道n = Θ(n)

答案 1 :(得分:2)

我不认为萨尔瓦多·达利提出了正确的证据,尽管它很接近。错误在于假设enter image description here作为第一个f旁边的常数可能大于第二个旁边的常数。

正确的是: enter image description here

enter image description here

答案 2 :(得分:1)

复杂性为Θ(n)。确切的运行时间是2n

检查出来:

import math

def get_complexity(n):
    counter = 0

    for i in range(1,n):
        j = i
        while j < n:
            j = 2 * j
            counter += 1

    print('n: %16d\niterations:  %6d\n2n:  %14d \n' % (n, counter, 2*n))


for ten in range(1,5):
    get_complexity(10 ** ten)

输出:

n:               10
counter:         16
2n:              20

n:              100
counter:        194
2n:             200

n:             1000
counter:       1990
2n:            2000

n:            10000
counter:      19990
2n:           20000

n:           100000
counter:     199988
2n:          200000