算法小专栏:谈谈大O表示法

栏目: 编程工具 · 发布时间: 5年前

内容简介:级别: ★☆☆☆☆标签:「算法」「大O表示法」「算法复杂度」作者:MrLiuQ

级别: ★☆☆☆☆

标签:「算法」「大O表示法」「算法复杂度」

作者:MrLiuQ

审校:QiShare团队

前一篇介绍了快速排序,本篇将重点介绍“大O表示法”。

阅读本文你将收获:

  • 时间复杂度的概念。
  • 空间复杂度的概念。
  • 大O表示法

一个算法的优劣主要从算法的 执行时间 和所需要占用的 存储空间 两个方面来衡量。所对应的两个指标分别是“ 时间复杂度 ”与“ 空间复杂度 ”。

故在正式介绍大O表示法之前,我们先来看看算法优劣的两个指标:“ 时间复杂度 ”与“ 空间复杂度 ”。

一、时间复杂度

时间复杂度 是指 一个算法被执行所需要的计算工作量 。它用来度量算法执行的时间长短。

时间复杂度常用大O表示法表示,且不包括这个函数的 “低阶项”“首项系数”

算法的时间复杂度实质上是一个 数学函数 ,它定量描述了该算法的运行时间。常用大O表示法表示。 记做:T(n) = O(f(n))

二、空间复杂度

空间复杂度 是指 一个算法在运行过程中临时占用存储空间大小的量度

空间复杂度通常也用大O表示法表示。 记做:S(n)=O(f(n))。

分析一个算法所占用的存储空间大小需要多方面考虑。

比如, 对于递归算法来说,算法本身所占用的存储单元较少,但在运行时需要申请额外的 堆栈 ,从而需要占用较多的临时工作单元。 对于非递归算法来说,算法本身所占用的存储单元较多,而在运行时占用的临时工作单元较少。

三、大O表示法

对于一个算法来说,时间复杂度与空间复杂度往往是互相影响的。追求较好的时间复杂度,往往空间复杂度会差一些。追求较好的空间复杂度,往往时间复杂度会差一些。

算法的时间复杂度和空间复杂度合称为算法的复杂度。而衡量算法复杂度需要用到大O表示法。

3.1 什么是大O表示法?

定义:称一个函数 g(n)O(f(n)) ,当且仅当存在常数 c>0n0>=1 时,对一切 n>n0 均有 |g(n)|<=c|f(n)| 成立,也称函数 g(n)f(n) 为界。记作 g(n)=O(f(n)) 。(来源360百科)

简单来说,大O表示法就是一个由 n 表示的函数( n 代表输入量),通过不断扩大 n 的值,来渐进反应算法的复杂度。

是不是有点难理解?接下来让我们看几个常见实例就会了然于心。

3.2 大O表示法的几种常见实例

下面从性能的角度, 由高到低 的介绍几种大O表示法常见实例:

1) 常数级:O(1)

O(1)表示该算法的执行时间(或执行时占用空间)总是为一个常量,不论输入的数据集是大是小。

例如:取数组第一个元素的时间复杂度:

def getFirstElement(arr):
    return arr[0]
复制代码

2) 对数级:O(log 2 n)

O(log 2 n)表示每次循环,所要处理的数据量减半。

例如:二分查找的时间复杂度。

def binary_search(list, item):
    low = 0
    high = len(list) - 1

    while low <= high:
        mid = (low + high) / 2
        if list[mid] == item:
            return mid
        if list[mid] > item:
            high = mid - 1
        else:
            low = mid + 1
    return None
复制代码

3) 线性级:O(n)

O(N)表示一个算法的性能会随着输入数据的大小变化而线性变化。

例如:简单查找的时间复杂度。

def easy_search(list, item):
    for index in range(len(list)):
        if list[index] == item:
            return index
    return None
复制代码

4) 线性对数级:O(nlog 2 n)

O(nlog 2 n)表示一个算法的性能会随着输入数据的大小变化而线性对数级变化。

例如:快速 排序 的时间复杂度。

def quickSort(arr):
    if len(arr) < 2:
        return arr
    else:
        pivot = arr[0]
        less = [i for i in arr[1:] if i <= pivot]
        greater = [i for i in arr[1:] if i > pivot]

        return quickSort(less) + [pivot] + quickSort(greater)
复制代码

5) 平方级:O(n 2 )

O(n 2 )表示一个算法的性能会随着输入数据的大小变化而发生平方级变化。

举例:选择排序的时间复杂度。(典型的两层for循环遍历)

def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr
复制代码

以上所述就是小编给大家介绍的《算法小专栏:谈谈大O表示法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

超越门户

超越门户

吴晨光 / 中国人民大学出版社 / 2015-4-17 / 39.80

在这个PC端影响力下降、人们对手机的依赖与日俱增的时代,这种探索的意义非同寻常,可以说是试图树立新媒体时代的行业标准。 ——陈彤(小米内容投资与运营副总裁、新浪网前总编辑、资深网络媒体人) 我将对此书的阅读,视作对往日岁月的怀念,它提醒我,自己曾 投身于多么富有蓬勃朝气和探索精神的事业。而对这种事业的原则、逻辑和方法的继承和继续学习,对于互联网时代的企业形象塑造 ,同样有融会变通的参考......一起来看看 《超越门户》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器