如何确定此循环的时间复杂度?

时间:2017-04-20 09:55:36

标签: data-structures

x=1;
While(x<n)
{
x=x + n/100;
}

我试图弄清楚它是o(n)还是o(1)。因为无论我们放在什么地方,我认为循环只会进行10次。

2 个答案:

答案 0 :(得分:0)

假设n = 1.1 然后它将进行10次,如果n = 1.2,则循环将持续17次 如果n = 2,它将持续50次,当n> = 101时,循环将重复100次,即使n = 10 ^ 10000,否则你可以搞清楚

答案 1 :(得分:0)

不幸的是,它是O(n)O(1)是错误的,并且由于它不能是O(1)而立即显而易见,因为它需要不同的迭代次数不同的n值(甚至看n = 1,2,3,4,5),它不能是O(n),因为它不会线性增长。

即使通过一些手动计算,您也可以清楚地看到它不会总是运行10次。检查以下短python程序:

def t(n):
    x = 1
    c = 0
    while x < n:
        c += 1
        x += n/100
    return c

a = []
for i in range(10000):
    a += [i/100 + 1]

with open("out.csv","w") as f:
    for i in a:
        f.write(str(i) + "," + str(t(i)) + "\n")

使用Excel或其他应用程序,您可以轻松地趋势迭代次数以查看以下曲线:

enter image description here

此时立即清楚,所采用的迭代次数在{0:100}范围内是对数的,任何n < 1进行0次迭代,n > 100进行100次操作。因此,虽然Big-O符号不是我最好的主题,但我猜测时间复杂度因此O(log(n))