Algorithm 如何估计函数的增长?

Algorithm 如何估计函数的增长?,algorithm,time-complexity,curve-fitting,estimation,Algorithm,Time Complexity,Curve Fitting,Estimation,假设我有以下信息: N seconds 216 0.00 1296 0.48 7776 89.73 46656 16480.96 如何估计此函数的增长 增长的经验顺序是什么 我如何估计增长的经验顺序 任何帮助都将不胜感激 一种方法是使用任何电子表格软件(如Excel)为所有数据点生成图形。绘制N vs Seconds将为您提供时间(秒)如何随着输入大小(N)的增加而增加的良好估计,并为您提供有关时间是线性增长还是指数增长或其他方面的信息。这里的

假设我有以下信息:

   N   seconds

  216      0.00
 1296      0.48
 7776     89.73
46656  16480.96
如何估计此函数的增长

增长的经验顺序是什么

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


任何帮助都将不胜感激

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


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

绘制数据是一个良好的开端;如果在线性尺度和对数尺度上绘制,则可以区分多项式增长函数和指数增长函数

为了快速估计复杂度的顺序,计算时间比率会增加。从命令

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
我们可以看到,随着问题规模增加六倍,执行时间增加180倍以上,从经验上看,复杂性为O(n³)。(一项发现是基于观察而非理论的。将曲线拟合到黑箱函数是经验性的,在黑箱函数中,你没有过程信息,只知道输入和输出。)

更一般地说,可以使用软件包来研究可能的曲线拟合函数。假设x是一个输入,y=f(x)是一个观察到的输出。多元回归的思想是计算额外的输入值,如x²、x³、lnx、x·(lnx)等,然后找到y的最佳拟合,y是输入值的线性组合

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

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)=x2.92和g(x)=x²·(lnx)⁸, 包含这些函数是为了说明您可以测试相当复杂的函数。但请注意,这种技术有些特殊。

为什么不将其放入电子表格并生成图形?你已经知道它的本质了(线性?指数?)。一旦你得到了质量,就去寻找数量:找到一个接近的公式(可能再次使用电子表格,比如libre office或gnumeric)。但一般来说,您最关心的是它的性质(也可以参阅big-O表示法)。如果您知道函数的代码,您可以分析它以了解其复杂性。如果你不这样做,你可以尝试提出一个非线性回归模型。有很多软件可以派上用场。Excel、R-studio、Statistica等应用程序。获取更多数据点。我画了这个图,虽然它显然不是线性的,但它是什么还不明显。这个问题似乎离题了,因为它是关于数学的。:calculate
log(t2/t1)/log(n2/n1)
。第一行没有用处(不能除以零),但对于接下来的三行,我们得到的两个间隔为~n^2.92和~n^2.91。所以这是一个稳定的n^2.9,不给不受。谢谢你的帮助!你能给我一个Java或Scala命令来估计复杂性的顺序吗?如果我们想估计理论上的增长顺序,答案是正确的。但是什么是经验上的增长顺序?我非常感谢你的帮助,但是你能用Scala、Java或C来说明你的例子吗?对于Java或C,使用数组声明,比如
double Ns={2161296777646656};
和类似
for(i=0;i是键)的循环构造。