给定一个真正的运行时,如何计算运行时复杂度("O(m)"`)?

Bil*_*lie 2 algorithm performance runtime time-complexity asymptotic-complexity

我试着很快问一下:

我有一个算法,作为一个函数,让我们调用它f:

void f(int[1..N]) {
   // algorithm goes here
}
Run Code Online (Sandbox Code Playgroud)

现在,我有real runtime一个N输入.

请假设该函数time()返回当前系统的时间(以毫秒为单位).

int[1...N] n;
unsigned long start = time(), end; 
f(N); 
end = time();
printf("Real runtime: %ul", end - start);
Run Code Online (Sandbox Code Playgroud)

换句话说,我知道f参数会运行多少毫秒N.

通过这些信息,我如何计算f(N)运行时复杂度,即f = O(N)?

sli*_*der 5

对于不同的N,您将需要多个数据点.

假设你得到这些统计数据:

N     time(ms)
4       12
8       24
16      48
Run Code Online (Sandbox Code Playgroud)

在这种情况下,加倍N会使时间加倍,因此您的复杂度必须为O(N).

但是如果你得到这些统计数据

N     time(ms)
4       16
8       64
16      256
Run Code Online (Sandbox Code Playgroud)

在这种情况下,加倍n会使运行时增加四倍,因此复杂度必须为O(n2).

如果时间没有改变,你的复杂性就是O(1)

同样,不同的数据点可以让你确定满足big(O)的函数.不同N的点数越多,就越能确定该函数.