【问题标题】:How to calculate run time complexity (`"O(m)"`) when given a real runtime?给定实际运行时如何计算运行时间复杂度(`"O(m)"`)?
【发布时间】:2013-11-14 16:36:06
【问题描述】:

我试着尽快问一下:

我有一个算法,作为一个函数,我们称之为f

void f(int[1..N]) {
   // algorithm goes here
}

现在,我有 real runtime 用于 N 输入。

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

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

换句话说,我知道f 将为参数N 运行多少毫秒。

根据这些信息,我如何计算f(N) 的运行时间复杂度,即f = O(N)

【问题讨论】:

  • 时间复杂度是一种概念工具,可帮助您思考算法。我不确定尝试使用计时器(如果可能的话)确定它是否有用。
  • @Wilbert 我需要在我的作业中这样做
  • @Wilbert - 如果您有 2 个黑盒算法(例如 lib 函数),并且您想渐近地发现哪个更好。

标签: performance algorithm runtime time-complexity asymptotic-complexity


【解决方案1】:

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

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

N     time(ms)
4       12
8       24
16      48

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

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

N     time(ms)
4       16
8       64
16      256

在这种情况下,将 n 加倍会使运行时间翻两番,因此复杂度必须为 O(n2)。

如果时间完全没有变化,你的复杂度是 O(1)

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

【讨论】:

  • 请注意:您不会从实际程序中获得接近完美的数字。也是常数因素。
  • @millimoose 是的,我同意 :) 但这真的取决于测量工具的准确度。
  • 如果有人想了解更多关于这个主题的信息,通常称为“曲线拟合”。
  • @slider 我以为是挂钟时间,我猜为了分配的目的,它可能是一个计数器。
  • @sdasdadas 我认为更重要的一点是,期望人们为可能介绍算法复杂性的内容进行非平凡的曲线拟合似乎很奇怪。 (或者完全用曲线拟合来处理现实世界的性能问题。这不是一个非常实用的工具。)同样通过维基,“曲线拟合”并不是真正“找出这些背后的任意函数数据点”,而是“找到一些近似这些数据点的函数,不一定与生成它们的函数类型相同”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多