算法简介(续)

83 阅读4分钟

1.3.4 一些常见的大O

运行时间 下面按从快到慢的顺序列出了你经常会遇到的5种大O运行时间。

  • O(log n),也叫对数时间,这样的算法包括二分查找。

  • O(n),也叫线性时间,这样的算法包括简单查找。

  • O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。

  • O(n2 ),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。

  • O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。

    假设你要绘制一个包含16格的网格,且有5种不同的算法可供选择,这些算法的运行时间如 上所示。如果你选择第一种算法,绘制该网格所需的操作数将为4(log 16 = 4)。假设你每秒可执 行10次操作,那么绘制该网格需要0.4秒。如果要绘制一个包含1024格的网格呢?这需要执行10 (log 1024 = 10)次操作,换言之,绘制这样的网格需要1秒。这是使用第一种算法的情况。

    第二种算法更慢,其运行时间为O(n)。即要绘制16个格子,需要执行16次操作;要绘制1024 个格子,需要执行1024次操作。执行这些操作需要多少秒呢?

下面按从快到慢的顺序列出了使用这些算法绘制网格所需的时间:

1.png

还有其他的运行时间,但这5种是最常见的。

这里做了简化,实际上,并不能如此干净利索地将大O运行时间转换为操作数,但就目前而 言,这种准确度足够了。等你学习其他一些算法后,第4章将回过头来再次讨论大O表示法。当 前,我们获得的主要启示如下。

  • 算法的速度指的并非时间,而是操作数的增速。
  • 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度加。
  • 算法的运行时间用大O表示法表示。
  • O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。

1.3.5 旅行商

阅读前一节时,你可能认为根本就没有运行时间为O(n!)的算法。让我来证明你错了!下面 就是一个运行时间极长的算法。这个算法要解决的是计算机科学领域非常著名的旅行商问题,其 计算时间增加得非常快,而有些非常聪明的人都认为没有改进空间。

2.png

有一位旅行商。

他需要前往5个城市。

3.png

这位旅行商(姑且称之为Opus吧)要前往这5个城市,同时要确保旅程最短。为此,可考虑 前往这些城市的各种可能顺序。

4.png

对于每种顺序,他都计算总旅程,再挑选出旅程最短的路线。5个城市有120种不同的排列方 式。因此,在涉及5个城市时,解决这个问题需要执行120次操作。涉及6个城市时,需要执行720 次操作(有720种不同的排列方式)。涉及7个城市时,需要执行5040次操作!

5.png

推而广之,涉及n个城市时,需要执行n!(n的阶乘)次操作才能计算出结果。因此运行时间 为O(n!),即阶乘时间。除非涉及的城市数很少,否则需要执行非常多的操作。如果涉及的城市 数超过100,根本就不能在合理的时间内计算出结果——等你计算出结果,太阳都没了。

这种算法很糟糕!Opus应使用别的算法,可他别无选择。这是计算机科学领域待解的问题之 一。对于这个问题,目前还没有找到更快的算法,有些很聪明的人认为这个问题根本就没有更巧 妙的算法。面对这个问题,我们能做的只是去找出近似答案,更详细的信息请参阅第10章。

最后需要指出的一点是,高水平的读者可研究一下二叉树,这在最后一章做了简要的介绍。

1.4 小结

 二分查找的速度比简单查找快得多。

 O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。

 算法运行时间并不以秒为单位。

 算法运行时间是从其增速的角度度量的。

 算法运行时间用大O表示法表示。