来自 Big O 的 运行 时间的粗略估计

Rough estimate of running time from Big O

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

我需要粗略估计一下以了解是否需要优化或者我可以 继续我的代码....时间限制是 0.6 秒

问题不是关于时间复杂度的计算....这是关于根据时间复杂度

估计运行时间

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

例如,i7 4770K 在 3.9 GHz 下每秒有 1272.73 亿条指令。这通常是一个非常无意义的指标,但由于我们非常粗略地这样做,所以它必须这样做。

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

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

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

举个例子,假设您的基本任务是

void func(){sleep(1)};

现在您知道复杂度为 O(1) 的算法只会产生一次对 func() 的调用,这将花费 1 秒。

查看其他示例:

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

如果不粗略估计任务的执行时间,就不可能给出准确的答案。

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

Big-O 告诉您一种方法如何 缩放 执行 的操作。它不知道执行一个操作需要多长时间。此外,CPU 在并行执行某些操作方面可能好或坏,这使得它变得更加困难。

唯一 判断您是否有性能瓶颈的方法是执行以下操作:

  1. 遵守代码 运行。会不会太久了?
  2. 测量代码运行。会不会太久了?
  3. 缩小测量范围,直到您知道代码的哪一部分是主要瓶颈。
  4. 决定它是否可以改变,你会得到你投入的东西吗?

如果您还知道该代码的 Big-O 评级,您可以使用它来确定瓶颈是否会呈指数级恶化,例如,如果您将要处理的项目数量加倍。

获得 运行ning 时间的最简单方法是使用给定的 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

当然,您必须了解这些测量和估计仅适用于 您的 算法 运行ning 在 您的[=] 上的实现31=] 硬件,无法与其他算法的实施测量或其他硬件上的测量相比较。