我正在测试排序算法并尝试使用不同数量的数据。 十万元素 100万元素 多达1000万个元素。
我需要通过输出每次排序所花费的时间来计算此算法的复杂性。
我该怎么做?
答案 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中看到线性函数,您的运行时间都是多项式的;线的斜率告诉您多项式的次数。)
我们可以看到它是一条斜率为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));
在实践中,该功能看起来更加混乱,并且斜坡可以(或应该)仅在没有其他可用的情况下用作经验法则。
我想还有许多其他技巧可以从运行时间测量中了解程序行为。我会给别人一个分享经验的机会。