Performance 未知算法的大O

Performance 未知算法的大O,performance,algorithm,time,big-o,time-complexity,Performance,Algorithm,Time,Big O,Time Complexity,我得到了一个未知的算法,我需要计算(大O)的时间复杂度。 关于这个算法,我所知道的唯一一件事是,对于给定数量的值,完成计算需要多长时间。 为了说明这一点,该算法使用一个数字并返回使用该数字所花费的时间 利用所用的时间和给出的数字,我得到了一条几乎是直线的曲线,如果我把所用的时间和给出的数字做一个对比。这一行非常符合O(n logn)的复杂性。问题仍然是,即使这一行确实合适,我也无法证明复杂性真的是nlogn。那么,我如何证明复杂性呢 以下是一些值: time: 0.008 number of

我得到了一个未知的算法,我需要计算(大O)的时间复杂度。 关于这个算法,我所知道的唯一一件事是,对于给定数量的值,完成计算需要多长时间。 为了说明这一点,该算法使用一个数字并返回使用该数字所花费的时间

利用所用的时间和给出的数字,我得到了一条几乎是直线的曲线,如果我把所用的时间和给出的数字做一个对比。这一行非常符合
O(n logn)
的复杂性。问题仍然是,即使这一行确实合适,我也无法证明复杂性真的是
nlogn
。那么,我如何证明复杂性呢

以下是一些值:

time: 0.008  number of elements: 4000
time: 0.100  number of elements: 40000
time: 0.1200 number of elements: 400000
time: 1.4000 number of elements: 4000000

评论是对的:你不能证明复杂性,你需要更多的点来建立经验模型。这通过当前数据的绘图显示

如果你得到了更多的数据,你可以做一件事来调查它,那就是,绘制时间t的对数和元素数n的对数。如果关系的形式为:t=n^p,这将为您提供一条带梯度p的直线,如下面的一些模拟数据所示。黑点表示y=x^2关系,绿色表示y=x,红色表示y=x*log(x)介于两者之间


如果你认为这是一个nlogn关系,你可以简单地用t和nlogn作图,得到一条直线。回归分析当然是可能的,但如果你看看你目前的数据,你实际上从线性回归中得到了一个非常好的直线拟合(如上面第一个图所示),我当然不会说它是线性的。

你不能。如果你有更多的数据点和误差条,你可以确定地估计它。在这种情况下,只有一种方法可以得到时间复杂度。您已经描述了该方法。没有其他明确的方法。然而,可以肯定的是,你可以使用更多的点来确认复杂性确实是O(NlogN)。你的估计值与你的数据一样好,因此你只能说一些关于算法在给定数据类型下的行为,例如O(n logn)给定正态分布的随机数据等。算法需要什么样的输入?它只是一个带有值的列表吗?这些值本身会影响性能吗?你知道算法的作用吗?您应该使用不同的输入值,但长度相同,尝试执行不同的算法。当然你需要更多的样品。。。根据您想要获得的估计的准确性,我尝试分配更多的值,结果曲线仍然以某种方式与nlogn给出的曲线相匹配