Python中的时间复杂性 - 大O符号

时间:2017-05-05 22:33:23

标签: python algorithm numpy

我的程序输出如下:

[[1000, 1500, 2000, 2500, 3000, 3500, 4000],
[437, 680, 917, 1115, 1476, 1668, 1912]]

这是通过Numpy Library创建的二维数组。在第一行是我传递给函数的N的数量,第二行是以微秒为单位的该函数的时间测量(例如,N = 1000时间= 437,N = 1500时间= 680)。

有没有简单的方法来确定这个功能的复杂性?我知道我可以绘制一个情节,只是看到这个,但我的应用程序需要给我答案(你的功能(可能,当然)O(n)或O(n log n)或O(n ^ 2)) 。

O(n)似乎很明显 - 我只需要为所有数组除N / t并检查它是否是常数,但我不知道如何检查另外两个?

1 个答案:

答案 0 :(得分:1)

可以使用sklearn进行各种花哨的曲线拟合模型评估。但是对于一个简单的方法,测量预期为常数的物体的对数的方差就可以了。也就是说,

  1. 取T / N或T /(N * log(N))或T / N ** 2之比。我们希望这是不变的。
  2. 取该比率的对数,以消除缩放的影响。
  3. 使用np.var计算数据点之间的差异。方差最小的模型获胜。
  4. 对于你的例子:

    import numpy as np
    n = np.array([1000, 1500, 2000, 2500, 3000, 3500, 4000])
    t = np.array([437, 680, 917, 1115, 1476, 1668, 1912])
    print(np.var(np.log(t/n)))              # 0.001545...
    print(np.var(np.log(t/(n*np.log(n)))))  # 0.001348...
    print(np.var(np.log(t/(n**2))))         # 0.18049...
    

    所以它绝对不是二次方的。 N*log(N)比线性更适合。 (尝试其他一些事情,似乎N*sqrt(log(N))是最好的。)