大O表示法

Posted 大彤小忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大O表示法相关的知识,希望对你有一定的参考价值。

  大O表示法是一种特殊的表示法,指出了算法的速度有多快。

1. 算法的运行时间以不同的速度增加

  对于简单查找算法二分查找算法,假设检查一个元素需要1毫秒,在列表包含100个元素的情况下,简单查找算法必须检查100个元素,因此需要100毫秒;而二分查找算法只需要检查7个元素( l o g 2 100 log_{2}100 log2100大约等于7),因此需要7毫秒就能查找完毕。但对于10亿个元素的列表,进行二分查找大约需要30毫秒( l o g 2 1000   000   000 log_{2}1000 \\ _{}000 \\ _{}000 log21000 000 000大约等于30);而进行简单查找需要10亿毫秒,相当于11天!

  这是因为二分查找和简单查找的运行时间的增速不同。也就是说,随着元素数量的增加,二分查找需要的额外时间并不多,二简单查找需要的额外时间却很多。

  大O表示法指出了算法有多快。例如,假设列表包含n个元素,简单查找需要检查每个元素,因此需要执行n次操作,使用大O表示法,运行时间为 O ( n ) O(n) O(n);二分查找需要执行logn次操作,使用大O表示法,运行时间为 O ( l o g n ) O(logn) O(logn)。值得注意的是,大O表示法指的并非以秒为单位的速度,它让我们能够比较操作数,指出了算法运行时间的增速。

2. 理解不同的大O运行时间

  假如我们要画一个4 × \\times × 4 的网格,它包含16个格子。要绘制这样的网格,有什么好的算法吗?

在这里插入图片描述
  算法1: 以每次画一个的方式画16个格子。大O表示法计算的是操作数,在这个例子中,画一个格子就是一次操作,需要画16个格子,即进行16步,算法的运行时间为 O ( n ) O(n) O(n)

在这里插入图片描述
  算法2: 将纸对折再对折…在这个例子中,将纸对折一次就是一次操作,对折4次就可以得到16个网格,算法的运行时间为 O ( l o g n ) O(logn) O(logn)

在这里插入图片描述

3. 大O表示法指出了最糟情况下的运行时间

  假设使用简单查找在电话簿中找人,简单查找的运行时间为 O ( n ) O(n) O(n),意味着在最糟情况下必须查看电话簿中的每个条目,这可以保证简单查找的运行时间不可能超过 O ( n ) O(n) O(n)

  除了最糟情况下的运行时间之外,还应考虑平均情况的运行时间。

4. 一些常见的大O运行时间

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

  1. O ( l o g n ) O(logn) O(logn),也叫对数时间,这样的算法包括二分查找
  2. O ( n ) O(n) O(n),也叫线性时间,这样的算法包括简单查找
  3. O ( n ∗ l o g n ) O(n*logn) O(nlogn),这样的算法包括快速排序 —— 一种速度较快的排序算法。
  4. O ( n 2 ) O(n^{2}) O(n2),这样的算法包括选择排序 —— 一种速度较慢的排序算法。
  5. O ( n ! ) O(n!) O(n!),这样的算法包括旅行商问题的解决方案 —— 一种非常慢的算法。

在这里插入图片描述
  总结: 1. 算法的速度指的并非时间,而是操作数的增速。
      2. 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么速度增加。
      3. 算法的运行时间用大O表示法表示。
      4. O(logn)比O(n)快,当需要搜索的元素越多时,前者比后者快的越多。

以上是关于大O表示法的主要内容,如果未能解决你的问题,请参考以下文章

大O表示法(Big O nonation)

矩阵大 O 表示法

初级算法:大O表示法

从0到1学算法大O表示法

算法图解之大O表示法

算法复杂度表示(大O表示法)