算法中运行时间和执行时间之间的差异



我目前正在读一本名为CLRS 2.2的书,第25页。其中作者将算法的运行时间描述为

算法在特定输入上的运行时间是基元的数量执行的操作或"步骤"。

作者还使用运行时间来分析算法。然后我参考了Narasimha Karumanchi的一本名为《数据结构与算法》的书。他在书中描述了以下内容。

1.7算法分析的目标算法分析的目的是比较算法(或解决方案),主要是运行时间,但也包括其他因素(如内存、开发人员的工作量等)

1.9如何比较算法:为了比较算法,让我们定义一些客观的衡量标准:

执行时间 这不是一个好的衡量标准,因为执行时间是特定于特定计算机的。

执行的语句数 这不是一个好的衡量标准,因为语句的数量各不相同编程语言以及个人程序员的风格。

理想的解决方案 让我们假设我们将给定算法的运行时间表示为一个函数输入大小n(即f(n)),并比较与运行相对应的这些不同函数时间。这种比较与机器时间、编程风格等无关。

正如您从CLRS中看到的,作者将运行时间描述为执行的步数,而在第二本书中,作者表示使用执行的步数来分析算法不是一个好的衡量标准。运行时间也取决于计算机(我的假设),但第二本书的作者说,我们不能考虑分析算法的执行时间,因为它完全取决于计算机。

我想执行时间和运行时间是一样的

所以,

  • 运行时间和执行时间的真正含义或定义是什么?它们是相同的还是不同的
  • 运行时间是否描述了执行的步骤数
  • 运行时间是否取决于计算机

提前感谢。

运行时间执行时间

;运行时间";在C,L,R,S的"算法导论"中[CLRS]实际上不是时间,而是许多步骤。这不是你直观地使用的定义。大多数人会同意";运行";以及";执行";是相同的概念;时间";以时间为单位(如毫秒)表示。因此,虽然我们通常认为这两个术语具有相同的含义,但在CLRS中,它们偏离了这一点,并赋予了";运行时间";。

运行时间是否描述执行的步骤数

这确实意味着在CLRS中。但是CLRS用于";运行时间";是特别的,与您在其他资源中可能遇到的情况不同。

CLRS这里假设一个基元运算(即一个步骤)需要O(1)时间。这通常适用于CPU指令,它占用固定的最大周期数(其中每个周期代表一个时间单位),但在更高级别的语言中可能不适用。例如,有些语言有sort指令。将其作为单个";步骤";会在分析中给出无用的结果。

将算法分解为O(1)步确实有助于分析算法的复杂性计数不同输入的步骤可能只会提示复杂性。最终,算法的复杂性需要基于循环和算法中使用的步骤的已知复杂性的(数学)证明。

运行时间是否取决于计算机?

当然,执行时间可能不同。这就是我们偶尔想要一台新电脑的原因之一。

步数 可能取决于计算机。如果两者都支持相同的编程语言,并且您计算语言中的步骤,则:是。但是,如果你能更彻底地进行计数,并对编译程序实际运行的CPU指令进行计数,那么情况可能会有所不同。例如,一台计算机上的C编译器可能会生成与另一台计算机中的C编译器不同的机器代码,因此一台计算机的CPU指令数量可能会少于另一台,即使它们来自相同的C程序代码。

然而,实际上,这种CPU指令级别的计数与确定算法的复杂性无关。我们通常知道高级语言中每条指令的时间复杂性,这也是决定算法整体复杂性的重要因素。

最新更新