Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何通过运行时间计算算法复杂度?_Algorithm_Sorting - Fatal编程技术网

Algorithm 如何通过运行时间计算算法复杂度?

Algorithm 如何通过运行时间计算算法复杂度?,algorithm,sorting,Algorithm,Sorting,我正在测试排序算法,并尝试使用不同数量的数据。 十万元素 100万元素 多达1000万个元素 我需要通过输出每次排序所用的时间来计算这个算法的复杂度 我该怎么做呢?虽然不进行数学分析就无法找到算法的运行时间,但经验测量可以让你合理地了解算法的运行时间,或者更确切地说是程序的运行情况 例如,如果您有n测量值(x1,y1),(x2,y2),…,(xn,yn),其中xi是输入的大小,yi是程序在该大小的输入上的时间,那么您可以绘制函数以查看它是否是多项式。在实践中经常是这样。然而,很难从图中看出指数应

我正在测试排序算法,并尝试使用不同数量的数据。 十万元素 100万元素 多达1000万个元素

我需要通过输出每次排序所用的时间来计算这个算法的复杂度


我该怎么做呢?

虽然不进行数学分析就无法找到算法的运行时间,但经验测量可以让你合理地了解算法的运行时间,或者更确切地说是程序的运行情况

例如,如果您有
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)最坏的情况