我了解到一个程序是通过它的复杂性来衡量的 - 我的意思是Big O Notation。 为什么我们不用它的绝对运行时间来测量呢? 谢谢:))
答案 0 :(得分:3)
您使用算法的复杂性而不是绝对运行时间来推理算法,因为程序的绝对运行时间不仅取决于所使用的算法和输入的大小。它还取决于它运行的机器,各种实现细节以及当前正在使用系统资源的其他程序。即使您在同一台计算机上使用相同的输入运行相同的应用程序两次,您也不会得到完全相同的时间。
因此,当给出一个程序时,你不能只是做一个声明,“当使用大小为n的输入运行时,该程序将花费20 * n秒”,因为程序的运行时间取决于比输入大小更多的因素。但是你可以做一个声明,比如“这个程序的运行时间是在O(n)中”,这样会更有用。
答案 1 :(得分:1)
绝对运行时间不是算法如何随不同输入集增长的指标。对于所有实际数据集,O(n * log(n))算法可能比O(n ^ 2)算法慢得多。
答案 2 :(得分:0)
运行时间不会衡量复杂性,只会衡量性能或执行任务所需的时间。 MP3播放器将运行播放歌曲所需的时间长度。在这种情况下,经过的CPU时间可能更有用。
复杂性的一个衡量标准是它如何扩展到更大的输入。这对于规划require硬件非常有用。在所有条件相同的情况下,相对线性地扩展的东西比不能缩放的东西更可取。事情很少是平等的。
复杂性的另一个衡量标准是衡量代码的简单程度。对于具有相对线性性能复杂性的程序,代码复杂度通常更高。复杂的代码维护成本很高,而且更改更有可能引入错误。
所有三种(或四种)措施都是有用的,它们本身都不是非常有用的。这三者结合起来非常有用。
答案 3 :(得分:0)
这个问题可以使用更多的背景。
在编写实际程序时,我们可能会测量程序的运行时间。但是这有很多潜在的问题 1.程序运行的硬件是什么?比较在不同硬件上运行的两个程序实际上没有给出有意义的比较。 2.还有哪些其他软件正在运行?如果还有其他任何东西在运行,它将窃取CPU周期(或运行程序的任何其他资源)。 3.输入是什么?如前所述,对于一个小集合,解决方案可能看起来非常快,但可扩展性突然出现。此外,一些输入比其他输入更容易。如果作为一个人,你递给我一本字典并让我排序,我会把它交给我说完了。给我一套50张随意顺序的卡片(比字典小得多)将花费我更长的时间。 4.起始条件是什么?如果您的程序第一次运行,那么将其从硬盘上移开将占用现代系统上最大的时间。将两个实现与小输入进行比较可能会使它们的差异被掩盖。
Big O符号涵盖了很多这些问题。 1.硬件并不重要,因为一切都通过1次操作O(1)的速度归一化。 2.大O谈论的算法没有其他算法。 3.大O谈论输入如何改变运行时间,而不是输入需要多长时间。它告诉你算法将执行得越差,而不是它在平均或简单输入上的表现。 4.同样,Big O处理算法,而不是物理系统中运行的程序。