我试图了解Θ(n2)和Θ(n)之间的差异。我从我的教科书wiki开始,阅读here和here,然后尝试为初学者理解创建以下简单示例。比较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)。
答案 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)。