performance - 未知算法的大O

标签 performance algorithm time big-o time-complexity

我有一个未知的算法,我需要计算 (Big O) 的时间复杂度。 关于该算法,我唯一知道的是完成给定数量的值需要多长时间。 为了清楚起见,该算法采用一个数字并返回使用该数字时所花费的时间。

如果根据所用时间和给定数字绘制所用时间图,我会根据所用时间和当时给出的数字得出一条近乎直线的曲线。该行非常适合 O(n log n) 的复杂性。问题仍然是即使这条线确实适合,我也无法证明复杂度真的是 n log n。那么我怎样才能证明复杂性呢?

以下是一些值:

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

最佳答案

评论是正确的:你无法证明复杂性,你需要更多的点来根据经验对其建模。您当前数据的图表显示了这一点。

enter image description here

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

enter image description here

如果您认为这是一个 nlogn 关系,您可以简单地将 t 与 nlogn 作图,您应该得到一条直线。回归分析当然是可能的,但如果您查看当前数据,您实际上会从线性回归中得到非常好的直线拟合(如上图第一个图所示),我当然不会在此基础上说它是线性的.

关于performance - 未知算法的大O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22709725/

相关文章:

java - 时间戳在Java中即时

安卓性能 : Adding view programmatically vs setting view to GONE/VISIBLE

javascript - 如何在 v8 中高效实例化 JavaScript 数组文字?

algorithm - 霍夫曼压缩算法

algorithm - 三元搜索的递归关系

java - 如何使用Java获得从现在到过去三个小时之间的任意随机时间

c++ - 访问指针的速度

performance - 编译器优化的函数式代码比命令式代码执行得更好的示例

c++ - 如何在 O(logn) 中查找 STL 中元素的等级

algorithm - 动态(时间索引)最大流量 - Ford-Fulkerson