我的程序输出如下:
[[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并检查它是否是常数,但我不知道如何检查另外两个?
答案 0 :(得分:1)
可以使用sklearn
进行各种花哨的曲线拟合和模型评估。但是对于一个简单的方法,测量预期为常数的物体的对数的方差就可以了。也就是说,
np.var
计算数据点之间的差异。方差最小的模型获胜。对于你的例子:
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))
是最好的。)