Algorithm 如何通过运行时间计算算法复杂度?
我正在测试排序算法,并尝试使用不同数量的数据。 十万元素 100万元素 多达1000万个元素 我需要通过输出每次排序所用的时间来计算这个算法的复杂度Algorithm 如何通过运行时间计算算法复杂度?,algorithm,sorting,Algorithm,Sorting,我正在测试排序算法,并尝试使用不同数量的数据。 十万元素 100万元素 多达1000万个元素 我需要通过输出每次排序所用的时间来计算这个算法的复杂度 我该怎么做呢?虽然不进行数学分析就无法找到算法的运行时间,但经验测量可以让你合理地了解算法的运行时间,或者更确切地说是程序的运行情况 例如,如果您有n测量值(x1,y1),(x2,y2),…,(xn,yn),其中xi是输入的大小,yi是程序在该大小的输入上的时间,那么您可以绘制函数以查看它是否是多项式。在实践中经常是这样。然而,很难从图中看出指数应
我该怎么做呢?虽然不进行数学分析就无法找到算法的运行时间,但经验测量可以让你合理地了解算法的运行时间,或者更确切地说是程序的运行情况 例如,如果您有
n
测量值(x1,y1),(x2,y2),…,(xn,yn)
,其中xi
是输入的大小,yi
是程序在该大小的输入上的时间,那么您可以绘制函数以查看它是否是多项式。在实践中经常是这样。然而,很难从图中看出指数应该是多少
<找到索引,你可以找到最适合点<>代码>(log席,log i)< />代码的斜率。这是因为如果y=C*x^k+低阶项
,那么由于C*x^k
项占主导地位,我们期望logy=~k*logx+logc
,即,只要“原始”方程是多项式方程,对数方程就是线性方程。(无论何时在中看到线性函数,您的运行时间都是多项式;直线的斜率告诉您多项式的次数。)
这是二次函数y(x)=x^2的曲线图:
下面是相应的日志图:
我们可以看到它是一条斜率为2的直线(实际上,你可以使用,例如,)来计算它。这是预期的,因为logy(x)=2*logx
我使用的代码是:
x = 1:1:100;
y = x.^2;
plot(x, y);
plot(log(x), log(y));
实际上,函数看起来更混乱,斜率只能(或应该)在没有其他可用的情况下作为经验法则使用
我想从运行时度量中了解程序行为还有很多其他技巧。我会给其他人一个分享经验的机会。你真的不能,因为时间也可能取决于输入数据的顺序。如果我能让程序每次都完成排序,会怎么样?我的意思是“基本”步骤。它仍然依赖于数据,例如,如果数据被排序,冒泡排序的范围从O(n)到O(n^2),如果数据被反向排序。您需要为所有测试用例定义输入数据的性质,即使这样,这也只能告诉您这个特定用例的复杂性。如果您担心最坏情况的复杂性,您不能这样做。例如,如果您正在测试某个半幼稚的quicksort版本,您不能指望意外地遇到O(n^2)最坏的情况