【发布时间】:2013-09-23 14:13:09
【问题描述】:
我正在比较 maxmin 算法实现的复杂性,我以两种方式实现:蛮力方式和分而治之的方式。在我针对 1000000 和 10000000 之间的十个元素输入测试了这两种算法之后。按照以下算法:
下面的蛮力实现:
def maxmin1(vetor):
max,min = vetor[0],vetor[0];
for elem in vetor[1:]:
if elem > max:
max = elem
if elem < min:
min = elem
return (min,max)
分而治之的实现如下:
def maxmin4(vetor,inicio,fim):
if ((fim - inicio) == 1):
return (vetor[inicio], vetor[inicio])
elif ((fim - inicio) == 2):
if( vetor[inicio] < vetor[inicio+1]):
return (vetor[inicio], vetor[inicio+1])
else:
return (vetor[inicio+1], vetor[inicio])
else:
(min_left,max_left) = maxmin4(vetor,inicio,(fim-inicio)/2 + inicio)
(min_right,max_right) = maxmin4(vetor,(fim-inicio)/2 + inicio,fim)
if (max_left < max_right):
max = max_right
else:
max = max_left
if (min_left < min_right):
min = min_left
else:
min = min_right
return (min,max)
结果:
input N time algorithm 1 | time algorithm 2
1000000 | 0.1299650669 | 0.6347620487
2000000 | 0.266600132 | 1.3034451008
3000000 | 0.393116951 | 2.2436430454
4000000 | 0.5371210575 | 2.5098109245
5000000 | 0.6094739437 | 3.4496300221
6000000 | 0.8271648884 | 4.6163318157
7000000 | 1.0598180294 | 4.8950240612
8000000 | 1.053456068 | 5.1900761128
9000000 | 1.1843969822 | 5.6422820091
10000000| 1.361964941 | 6.9290060997
我不明白为什么第一个算法比第二个算法快,因为第一个算法的复杂度为 2(n -1),第二个算法的复杂度为 3n/2 -2,理论上第一个比第二个慢.为什么会这样?
【问题讨论】:
-
什么是 fim 和 inicio
-
@ShivamShah:听起来像是最后一个或顺序,首先,在某种浪漫语言中。也许是葡萄牙语或罗马尼亚语?
-
fim 结束, inicio 开始。它是数组的开始和结束。
-
如果您尝试测试算法复杂度的差异,测试 100K、200K、……、1000K 并不是很有帮助。尝试 100、1000、10000、... 1000K。
-
同时,如果您试图通过减少比较次数来优化线性算法,通过在
minmax1中使用elif而不是第二个if,您可以将它们切入一半,不增加任何费用。但所有这一切都将证明,这些比较实际上并不是你的真正成本,因为改进不到 1%;循环迭代或函数调用比浮点比较花费的时间要长得多。
标签: python arrays algorithm code-analysis