乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面來衡量。所對應的兩個指標分別是「時間複雜度」與「空間複雜度」。
故在正式介紹大o表示法之前,我們先來看看演算法優劣的兩個指標:「時間複雜度」與「空間複雜度」。
時間複雜度是指乙個演算法被執行所需要的計算工作量。它用來度量演算法執行的時間長短。時間複雜度常用大o表示法表示,且不包括這個函式的「低階項」與「首項係數」。
演算法的時間複雜度實質上是乙個數學函式,它定量描述了該演算法的執行時間。常用大o表示法表示。 記做:t(n) = o(f(n))
空間複雜度是指乙個演算法在執行過程中臨時占用儲存空間大小的量度。空間複雜度通常也用大o表示法表示。 記做:s(n)=o(f(n))。
分析乙個演算法所占用的儲存空間大小需要多方面考慮。
比如, 對於遞迴演算法來說,演算法本身所占用的儲存單元較少,但在執行時需要申請額外的堆疊,從而需要占用較多的臨時工作單元。 對於非遞迴演算法來說,演算法本身所占用的儲存單元較多,而在執行時占用的臨時工作單元較少。
對於乙個演算法來說,時間複雜度與空間複雜度往往是互相影響的。追求較好的時間複雜度,往往空間複雜度會差一些。追求較好的空間複雜度,往往時間複雜度會差一些。
演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。而衡量演算法複雜度需要用到大o表示法。
3.1 什麼是大o表示法?
定義:稱乙個函式簡單來說,大o表示法就是乙個由g(n)
是o(f(n))
,當且僅當存在常數c>0
和n0>=1
時,對一切n>n0
均有|g(n)|<=c|f(n)|
成立,也稱函式g(n)
以f(n)
為界。記作g(n)=o(f(n))
。(**360百科)
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)
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
大O表示法
用另乙個 通常更簡單的 函式來描述乙個函式數量級的漸近上界。大o表示法 稱乙個函式g n 是o f n 當且僅當存在常數c 0和n0 1對一切n n0均有 g n c f n 成立,也稱函式g n 以f n 為界或者稱g n 受限於f n 記作g n o f n 定義 如果乙個問題的規模是n,解這一...
大O表示法
大o表示法 汽交按尺寸被分為若干類 微型 小型 中型等等。在不提及具體尺寸的情況下,這些分類可以為我們所涉及到車的大小提供乙個大致慨念。我們同樣也需要一種快捷的方法來評價計算機演算法的效率,在電腦科學中,這種粗略的度量方法被稱作 大o 表示法。在比較演算法時似乎應該說一些類似 演算法a比演算法b快兩...
大o表示法
下面是一些常用的時間複雜度以及簡單的定義 o 1 常量時間 o 1 表示該演算法的執行時間 或執行時占用空間 總是為乙個常量,不論輸入的資料集是大是小。bool isfirstelementnull ilistelements o n o n 表示乙個演算法的效能會隨著輸入資料的大小變化而線性變化。...