我如何估计功能的增长?

时间:2013-09-22 16:45:06

标签: algorithm time-complexity curve-fitting estimation

假设我有这方面的信息:

   N   seconds

  216      0.00
 1296      0.48
 7776     89.73
46656  16480.96

我如何估计这个函数的增长?

经验增长的顺序是什么?

我如何估计经验增长的顺序?

任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:1)

绘制数据是一个良好的开端;如果你在线性尺度和日志尺度上绘制它,你可能能够区分多项式增长函数和指数增长函数。

为了快速估计复杂程度,计算时间增长率。从命令

dc -e '46656 7776/ 16480.96 89.73/  7776 1296/ 89.73 0.48/f'

输出

186
6
183
6

或python命令

python -c 'print 46656/7776, 16481/90, 7776/1296, 90/0.48'

输出

6 183 6 187.5
可以看出,随着问题规模增加6倍,执行时间增加了180倍以上,根据经验提出了O(n³)复杂度。 ( empirical 发现是基于观察而不是理论的结果。将曲线拟合到黑盒函数,其中没有过程信息,只有输入和输出的知识,是经验的。)

更一般地, multiple regression 包可用于研究可能的曲线拟合函数。假设 x 是输入, y = f(x)是观察到的输出。多元回归的想法是计算额外的输入值,例如x²,x³,ln x,x·(ln x),等,然后找到最适合 y 这是输入值的线性组合。

作为粗略的近似,人们还可以编写一个程序来计算各种函数 g 的比率 y / g(x)以及每个 x,y 值对。以下是应用于问题中所示数据的此技术示例:

import math
Ns=(216,1296,7776,46656)
times=(0.00,0.48,89.73,16480.96)
for x,y in zip(Ns,times):
    print '{:5} {:8.2f} {:8.2} {:10.3} {:10.3} {:10.3} {:10.3}'.format(x, y, y/x, y/x**2, y/x**3, y/(x**2.92), y/(x**2 * math.log(x)**8))

产生

  216     0.00      0.0        0.0        0.0        0.0        0.0
 1296     0.48  0.00037   2.86e-07   2.21e-10   3.91e-10   4.11e-14
 7776    89.73    0.012   1.48e-06   1.91e-10   3.91e-10   3.58e-14
46656 16480.96     0.35   7.57e-06   1.62e-10   3.84e-10   4.24e-14

上述python程序中的最后两个函数,即 g(x)= x 2.92 g(x)=x²·(ln x)包含⁸,以说明您可以测试相当复杂的功能。但请注意,这种技术有点特别。

答案 1 :(得分:0)

一种方法是使用任何电子表格软件(如Excel)为您拥有的所有数据点生成图表。绘制N vs Seconds将为您提供一个很好的估计时间(秒)随着输入大小(N)的增加而增加,为您提供有关其是否具有线性增长或指数增长或其他内容的信息。这里的要求是你应该有足够的数据点来确定观察到的增长。

现在,如果您可以访问该方法的代码,您可以查看代码并查找其复杂性,这将清楚地表示其增长