如何确定黑盒子是多项式还是指数型

ste*_*del 5 python statistics numpy matplotlib time-complexity

我有一个问题,基本上减少到这个:

  1. 你有一个黑盒功能,接受长度为n的输入.
  2. 您可以测量函数返回答案所需的时间,但您无法确切地看到它的计算方式.
  3. 您必须确定此函数的时间复杂度是多项还是指数.

我这样做的方法是通过函数运行数千个不同长度的随机样本输入,然后在散点图上绘制它们,在y轴上有时间,在x轴上有输入长度.

我有使用numpy绘制的散点图,但现在我如何绘制多项式和指数最佳拟合线?我可以计算哪些指标来确定哪条最佳拟合线最适合?

(问一个类似的问题,但理论上并没有强调计算机科学上的特定语言:https://cs.stackexchange.com/questions/23686/how-to-determine-if-a-black-box-is-polynomial-或指数)

The*_*ant 6

取所有Y值的对数.多项式结果仍将显示对数增长(因为log x^n = n * log x),但指数曲线将转换为适当的直线(log exp(x) = x).

如果你现在用线性LSQ近似得到足够的结果点,那么你可以非常肯定算法是指数的,如果它很好地适合(允许存在一些差异 - 我建议通过检查算法凭经验推导出一些合理的epsilon)你知道!)的复杂性,否则就知道多项式.

您还可以通过检查与回归线的偏差来稍微提高置信度:如果大多数值低于它,那么数据很可能是对数的(即程序以多项式时间运行).