运行时间,复杂性,编译时间和执行时间之间有什么区别?

时间:2016-08-12 20:43:30

标签: algorithm runtime complexity-theory

运行时间,复杂性,编译时间和执行时间之间有什么区别? l运行时间和时间复杂度之间是否存在冲突?它们与执行时间有什么区别?

2 个答案:

答案 0 :(得分:2)

您真正要问的是如何将 Big O Time复杂度转换为运行时。这并不像最初看起来那么容易。

首先仔细看看复杂性,为了让它更容易,让我们使用这个简单的 C ++ 示例:

int fact(int n)
 {
 if (n<=1) return 1;
 return n*fact(n-1);
 }
  1. 时间与空间的复杂性

    (对于初学者,我假设基本变量,因此所有复杂性都与基础相同,以获取更多信息,请参阅下一个项目符号)因此,整个事情将进行n次迭代,暗示O(n)时间复杂度。由于这对于单个辅助结果使用堆栈递归和堆,时间复杂度也是O(n)

  2. 基本复杂性与真实复杂性

    基本复杂性是使用的算法的复杂性。但是当实现到程序中时,由于变量实现, IO 协议等等,复杂性可能会发生变化(更糟)。

    例如,如果我们使用 bigint 而不是int呢?程序是相同的,因此基本复杂性保持O(n) bigints 的问题在于O(1)空间复杂度(更像是O(log(n))),对它们的操作也不再是O(1)。例如,如果(m=log(n))然后(+,-,&,|,^)操作为O(m),则多次更改为O(m^2)。因此,当放在一起时如果使用O(n.log(n).log(n))乘法,时间复杂度将为O(m^2)。空间复杂性也更差O(n.log(n))

    问题在于,大多数新手只使用算法的Base复杂性而不是实现的整体复杂性导致模糊的结果。现在的另一个问题是滥用lib和框架而没有任何背景知识背后的内容。

  3. 计算运行时间

    这种编程中的热量有时被认为是矛盾的。对于任意实现,没有可靠的方法将复杂性转换为运行时。为什么?因为运行时依赖于太多的东西,如:

    1. 展位空间&amp;时间复杂性

      现代架构使用流水线,超级大小,CACHES等。因此,当您遇到空间障碍时,性能可能会发生多次通常会变得更糟。

    2. 硬件平台

      每个平台都不同。管道/缓存大小的配置,其管理策略,延迟等,即使在类似功率 CPU 之间进行比较,也会产生巨大差异。在 HW 平台上,只有 CPU 。每个使用的模块都计数(内存,硬盘 DMA gfx ...)

    3. <强>编译器

      每个编译器都有自己的怪癖,优化和更多导致不同的程序集输出。这可能导致在不同编译器上编译的相同源代码的可执行文件之间存在巨大差异。

    4. <强> OS

      操作系统运行的只是您的应用程序。有服务,中断,维护任务和其他所有影响运行时的进程。

    5. 编程风格

      这也可以做到。大多数编程风格差异通常由编译器优化来抵消,但不是全部。例如,迭代首选项之前的递归会对运行时产生巨大的(通常是负面的)影响。

    6. <强>优化

      如果您在汇编中查看未优化的代码和优化的代码,您将不再能够识别代码。这不应该影响程序的基本复杂性,但如果可以,通常会改变真正的复杂性。

      我也编码了几十年,所以我习惯于自己优化代码。这种偏好有时会误导现代编译器,并导致在极少数情况下导致代码速度变慢。

    7. 那么如何计算运行时?

      你无法做到的最好的就是衡量+估计。

      1. 衡量任务开始时的时间t0
      2. 在任务期间(不时)测量时间

        例如每秒或每1000th次迭代...记住时间t和迭代i。这有时称为经过时间。

      3. 预测剩余时间。

        因此,如果我们有时间复杂度O(n)那么(如果我没有记错的话):

        t(0) = t0
        t(i) = ti ~= t0 + T*i -> T ~= (ti-t0)/i
        t(n) = t0+T*n ~= t0 + (ti-t0)*n/i
        

        您可以在计算过程中平均或更新此时间,以便每次新测量时都会越来越准确。有时最好从最近几次测量[{1}}和t(i)评估运行时间,因为处理能力可能会在一段时间内发生变化。

        在高精度测量时间的同时注意操作系统粒度,请参阅

        如果不加以考虑,可能会误导您的计算。但这只有在你想要测量非常快速的过程时才有意义,而我认为并非如此。

      4. <强> PS。

        这一切都只适用于足够大的t(j),否则复杂性中的废弃物仍然很重要,会对结果的准确性产生负面影响。

        编译时间

        正如其他答案中所提到的,编译器需要处理源代码的时间。这与程序的复杂性无关。这主要受包括递归级别,源代码长度,宏使用和递归,模板使用等的影响。

        通常通过简单重新排序n顺序并避免多个包含,您可以显着改善编译时间。很好的例子是来自Atmel的AVR32框架......经过调整后,编译时间可以提高100倍甚至更多。一旦我看到(过去10多年)一个打印机固件,其中包含300MB的源代码(当时),并且由于包含滥用,编译时间略少于小时...这是疯狂的,因为它是单个代码MCU ...

        希望它有所帮助

答案 1 :(得分:1)

执行时间是程序执行的时间。例如,10秒或10毫秒。

复杂性通常是指算法的渐近行为。简单来说,它表明有效你的算法。在这方面,我们通常使用时间复杂度空间复杂度。时间复杂度渐渐显示算法可以运行的速度,Space Complexity显示算法将使用多少内存。这是使用诸如大O,小o,Theta等的符号的地方。 (看到 TimeComplexity

运行时间可以与执行时间(程序终止所需的时间)互换使用。但是,通常在程序运行时发生某些错误时,通常也会通过运行时错误来引用它。

编译时间是编译程序并将其转换为可执行文件所需的时间。

同时查看RunTime, ExecutionTimeCompileTime