从Big O粗略估计运行时间

时间:2015-06-03 11:49:28

标签: algorithm big-o time-complexity

如果我的计划的时间复杂度,比如 O(n ^ 2),我该如何表达 以秒为单位的运行时间,对于较大的n,10 ^ 6?

我需要对此进行粗略估计,以了解是否需要进行优化 继续我的代码....时间限制为0.6秒

问题不在于计算时间复杂度......而是从时间复杂度估计运行时间

4 个答案:

答案 0 :(得分:4)

无法根据Big-O评级计算或估算某段代码的运行时间。

Big-O告诉您方法如何扩展 操作。它不知道执行一个操作需要多长时间。另外,CPU在并行执行某些操作时可能是好还是坏,这使得它更难。

方式确定您是否存在性能瓶颈的方法是执行以下操作:

  1. 观察正在运行的代码。这需要太长时间吗?
  2. 测量运行的代码。这需要太长时间吗?
  3. 缩小测量范围,直到您知道代码的哪一部分是主要瓶颈。
  4. 决定是否可以更改它,你会把它放到它里面吗?
  5. 如果你也知道该代码的Big-O评级,那么你可以用它来决定如果你要处理的项目数增加一倍,那么瓶颈是否会以指数方式恶化。

答案 1 :(得分:1)

您需要大致了解一个基本任务需要多少才能估算不同算法的运行任务。

举个例子,让我们想象你的基本任务是

void func(){sleep(1)};

现在您知道O(1)复杂度算法只会调用func(),这将需要1秒。

查看其他示例:

O(1) -> 1 * 1s
O(N) -> N * 1s
O(N2) -> (N^2) * 1s

如果没有粗略估计任务的执行时间,就无法给出准确的答案。

答案 2 :(得分:0)

获得运行时间的最简单方法是使用给定的n对算法进行基准测试(运行几次并使用均值)。如果时间长于您为估计运行时分配的时间,则需要近似。

您可以使用以下公式获得O(n^x)(多项式)复杂度的算法的确切运行时间:c_x * n^x + c_x-1 * n^(x-1) ... + c_1 * n + c_0其中乘数c_x ... c_0可以是任意值。它们取决于算法的具体情况,cpu,调度程序状态以及许多其他内容。

您可以通过运行代码来估算这些乘数,其值n足够小,不会花费更多时间来分配估算和创建统计信息。您可以使用多项式回归模型来估计乘数。通过估算,您可以将乘数应用于上述公式,以使用n的任何值逼近运行时。估算的准确性取决于您收集的统计信息量以及您估算的估算值n与用于统计信息的n值和复杂度的顺序相比(更高)比二次方可能不是很有用)。

多项式回归方法本身超出了这个问题的范围。我建议为它阅读统计学教科书。这是一个tutorial

当然,您必须了解这些测量和估算仅适用于 硬件上运行的算法的实现,并且不能与其他硬件上的其他算法或测量。

答案 3 :(得分:-1)

Big O已经相当粗糙了。不过,这意味着您将执行约10 ^ 12次或一万亿次迭代。

例如,i7 4770K每秒有127,273百万条指令,频率为3.9 GHz。这通常是一个毫无意义的指标,但由于我们非常粗略地这样做,所以必须这样做。

每次迭代一条指令,显然需要大约8秒才能完成。

实际上,每次迭代可能需要几条指令,但也可能有较少的迭代次数(例如n / 2)。如果你给我们一个示例代码,我可以得到一个更好的猜测。