试图理解Θ(n2)和Θ(n)之间在运行时方面的差异

时间:2014-07-07 14:43:14

标签: python performance python-2.7 time big-o

我试图了解Θ(n2)和Θ(n)之间的差异。我从我的教科书wiki开始,阅读herehere,然后尝试为初学者理解创建以下简单示例。比较Python 2.7中此代码段的运行时间时,我会在计时option #1时注释掉option #2,并在计时option #2时注释掉option #1:< / p>

import timeit

start = timeit.default_timer()

a = []
a.extend(range(1, 10))

b = []
b.extend(range(1, 10))

c = []
c.extend(range(1, 100))

# option 1
for x in a:
    for y in b:
        print("-")
# option 2
# for x in c:
#   print ("-")

stop = timeit.default_timer()

print stop - start

每一行都是每次投放的输出,为了清晰起见,我预先设置了#1 -#2 -

#1 - 0.000207901000977
#1 - 0.000203132629395
#1 - 0.000202178955078
#1 - 0.000203847885132
#1 - 0.000203847885132

#2 - 0.000240087509155
#2 - 0.000240087509155
#2 - 0.0142140388489
#2 - 0.000237941741943
#2 - 0.000246047973633

两个选项都打印- 100次。我假设Θ(n2)比Θ(n)慢,即使有一个微不足道的情况,然而,option #1,Θ(n2),优于option #2和Θ(n)。

2 个答案:

答案 0 :(得分:1)

您没有将O(N 2 )算法与O(N)算法进行比较。

两种算法基本上都是O(N);你正在执行print次N次。但是在第一个选项中,你在外循环中取N的平方根,在内循环中取相同的平方根,创建一个O(sqrt(N)* sqrt(N))== O(N)算法。

除非只改变N的值,否则永远不能比较两种算法的时间。 通常您可以查看算法的输入。例如,排序查看要排序的元素数量,最佳排序算法将采用NlogN步骤对这样的列表进行排序。您试图比较输出; print()总共执行了N次。

换句话说,如果选项1以 N 作为输入,则在O(N 2 )时间运行(打印N 2 次),然后选项2接受 M 输入,在O(M)时间运行,但 M = N * N 。因此,第二个选项在O(N 2 )时间以及中运行,但您只是以不同方式生成N 2 重复。 / p>

时间差异太接近于呼叫,可以归结为I / O等待(您正在写入终端)。

答案 1 :(得分:1)

主要问题是你实际上有三个输入要考虑而不是一个。选项A是O(A * B),而选项B是O(C),其中A是a的长度,B是b的大小,C是c的大小。这意味着你无法真正直接比较这两种算法。

您选择的输入值意味着O(a)= O(b)和O(c)= O(a * b)恰好会导致在这种情况下具有相同的性能和复杂性。

您可以将此转换为单个输入问题,其中选项A为O((sqrt N)^ 2)= O(N),选项B为O(N),添加C = N和A = B =约束SQRT(N)。