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

前一篇介绍了快速排序,本篇将重点介绍“大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(log2n)

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

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

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(nlog2n)

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

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

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(n2)

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

举例:选择排序的时间复杂度。(典型的两层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
6) 立方级:O(n3)

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

举例:三层for循环的遍历算法的时间复杂度。

7) k次方级:O(nk)

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

举例:k层for循环的遍历算法的时间复杂度。

8) 指数级:O(2n)

O(2n)表示一个算法的性能将会随着输入数据的每次增加而增大两倍。

举例:斐波那契数列的时间复杂度。

def Fibonacci(n):
    if(n>=2):
        return Fibonacci(n - 1) + Fibonacci(n - 2)
    else:
        return n
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269