假设我有这方面的信息:
N seconds
216 0.00
1296 0.48
7776 89.73
46656 16480.96
我如何估计这个函数的增长?
经验增长的顺序是什么?
我如何估计经验增长的顺序?
任何帮助都将不胜感激!
答案 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)的增加而增加,为您提供有关其是否具有线性增长或指数增长或其他内容的信息。这里的要求是你应该有足够的数据点来确定观察到的增长。
现在,如果您可以访问该方法的代码,您可以查看代码并查找其复杂性,这将清楚地表示其增长