algorithm - 我如何估计功能的增长?

标签 algorithm time-complexity curve-fitting estimation

<分区>

假设我有这个信息:

   N   seconds

  216      0.00
 1296      0.48
 7776     89.73
46656  16480.96

我如何估算此函数的增长?

经验增长顺序是什么?

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

任何帮助将不胜感激!

最佳答案

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

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

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³)。 ( empirical 的发现是基于观察而不是理论。将曲线拟合到黑盒函数,其中您没有过程信息,只有输入和输出的知识,是经验性的。)

更一般地说, multiple regression 包可用于研究可能的曲线拟合函数。假设 x 是输入,y = f(x) 是观察到的输出。多元回归的思想是计算额外的输入值,例如 x²、x³、ln x、x·(ln x)、 等,然后找到最适合 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.92g(x)=x²·(ln x) ⁸,用于说明您可以测试相当复杂的函数。但请注意,这种技术有点特别。

关于algorithm - 我如何估计功能的增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18946229/

相关文章:

java - 从二维数组中删除/删除重复项

algorithm - 压缩 GPS 点

theory - 并行性的限制(工作面试问题)

python - 使用时间模块测试复杂性

python - 将 3d sigmoid 拟合到数据

java - 如何制作一个可以根据时间戳保存 100 个最近的 record_values 的数据结构?

algorithm - 盒子背面剔除

algorithm - 最小生成树的运行时间? (原始方法)

python - python中的非线性曲线拟合程序

python - 适合 Python 的傅里叶级数