如何通过运行时计算算法的复杂性?

时间:2016-04-06 19:52:36

标签: algorithm sorting

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

我需要通过输出每次排序所花费的时间来计算此算法的复杂性。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

虽然在没有进行数学分析的情况下无法找到算法的运行时间,但经验测量可以让您合理地了解算法的运行时间 - 或者更确切地说是程序---的行为。 / p>

例如,如果您有n个度(x1, y1), (x2, y2), ..., (xn, yn),其中xi是输入的大小,而yi是节目输入的时间大小,然后你可以绘制函数,看它是否是多项式。在实践中它经常是。但是,很难从情节中看出指数应该是什么。

要查找指数,您可以找到最适合点(log xi, log yi)的线的斜率。这是因为如果y=C*x^k+lower order terms,那么由于术语C*x^k占主导地位,我们期望log y =~ k*log x + log C,即,只要“原始”等式是多项式,log-log等式就是线性等式。 (无论何时在log-log plot中看到线性函数,您的运行时间都是多项式的;线的斜率告诉您多项式的次数。)

这是二次函数y(x)=x^2的图: Quadratic function

这是相应的log-log图: The corresponding log-log plot

我们可以看到它是一条斜率为2的线(实际上你会使用例如linear least squares来计算它)。这是因为log y(x) = 2 * log(x)

我使用的代码:

x = 1:1:100;
y = x.^2;
plot(x, y);
plot(log(x), log(y));

在实践中,该功能看起来更加混乱,并且斜坡可以(或应该)仅在没有其他可用的情况下用作经验法则​​。

我想还有许多其他技巧可以从运行时间测量中了解程序行为。我会给别人一个分享经验的机会。