不,经过的运行时间不是衡量效率的标准,因为它因平台而异——说“我的算法在 10 秒内运行”几乎没有关于算法本身的信息。除此之外,您还需要列出同时运行的整个环境规范和其他进程,这将是一团糟。因此,顺序符号(Big Oh、Little Oh、Omega 等)的发展。
效率通常分为两个小节:
- 时间效率。
- 空间效率。
...其中一种算法可能具有极高的时间效率,但在空间方面效率非常低。反之亦然。当缩放它们需要为给定输入执行的指令数量时,算法会根据它们的渐近行为进行分析n
。这是对博士计算机科学家精心研究的领域的一个非常高级的解释——我建议你在这里阅读更多关于它的信息,以获得你会发现的最好的低级解释。
请注意,我附上了 Big Oh 符号的链接——姐妹符号都可以在该 Wikipedia 页面上找到,它通常是一个很好的起点。它也将涉及空间和时间效率的差异。
使用 Big Oh 的时间效率小应用:
考虑 Racket 中的以下递归函数(如果我知道的话,我会在 Python 中使用它——我能做的最好的伪代码):
(define (fn_a input_a)
(cond
[(empty? input_a) empty]
[(empty? (rest input_a)) input_a]
[(> (first input_a) (fn_a (rest input_a))) (cons (first input_a) empty)]
[else (fn_a (rest input_a))]))
...我们看到:empty?
、rest
和都是 O(1) >
。first
我们还注意到,在最坏的情况下,会在offn_a
的第三个条件和第四个条件下调用。然后我们可以将递归关系写为 T(n) = O(1) + 2T(n - 1)。在递归关系图上查看它,我们看到它的顺序为 O(2^n),因为在最坏的情况下,会进行两次递归调用。rest
input_a
fn_a
同样重要的是要注意,根据 Big Oh 的正式定义,说明fn_a
O(3^n) 也是正确的(但没用)。许多算法在分析时都使用 Big Oh 表示,但是使用 Big Theta 来收紧界限会更合适,本质上意味着:相对于给定算法的最低、最准确的顺序。
小心,阅读正式的定义!