【发布时间】:2015-12-15 21:36:26
【问题描述】:
我在 python 中运行了 2 个代码,然后测量了完成所需的时间。代码非常简单,只是递归最大值。这里是: 1.
def max22(L, left, right):
if(left>=right):
return L[int(left)]
k = max22(L,left,(left+right-1)//2)
p = max22(L, (right+left+1)//2,right)
return max(k,p)
def max_list22(L):
return max22(L,0,len(L)-1)
def max2(L):
if len(L)==1:
return L[0]
l = max2(L[:len(L)//2])
r = max2(L[len(L)//2:])
return max(l,r)
第一个应该在 O(logn) 中运行 (imo),第二个应该在 O(n*logn) 中运行。 但是,我测量了 n=1000 、 n=2000 和 n=4000 的运行时间, 不知何故,这两种算法的增长似乎都是线性的!这怎么可能?我弄错了复杂性,还是可以? 谢谢。
【问题讨论】:
-
第一个算法不可能是 O(log n),因为它检查每个元素的值
-
为什么你认为第二种算法是O(n logn)?
-
嘿,至于第二个,我的导师告诉我们它是 O(n*logn)。
-
@ScottHunter 因为列表的每个元素都被复制了 O(log n) 次? (但我不确定python中没有使用引用计数等某种优化,那么它可能会更快(但它仍然是O(n log n)))
标签: python algorithm time-complexity complexity-theory