時間複雜度 和 空間複雜度 的理解

2021-10-05 12:36:30 字數 1579 閱讀 2813

目錄

時間複雜度

時間複雜度計算

空間複雜度 

空間複雜度計算

常量空間

線性空間

二維空間

遞迴空間 

若存在函式f(n),當n趨於無窮大時,t(n) / f(n)的極限值是不為零的常數,那麼就稱f(n)是t(n)的同數量級函式。記作t(n) = o(f(n)),也稱之為o(f(n)),o為演算法的時間複雜度。

知道了什麼是時間複雜度後,那麼新的問題就來了,我們如何去推導時間複雜度呢?首先我們要遵循下面幾點規則:

示例1:

t(n) = 7n                        # 最高端項為7n,省去係數7,時間複雜度為:t(n) = o(n)

示例2:

t(n) = 7log(n)                # 省去係數7,時間複雜度為:t(n) = o(logn)

示例3:

t(n) = 5       # 只有常數量級,時間複雜度為:t(n) = o(1)

示例4:

t(n) = 2.5n^2 + 2.5n     # 保留最高端項,時間複雜度為:t(n) = o(n^2)

四種時間複雜度排序:o(1) < o(logn) < o(n) < o(n^2)

在執行程式時,我們往往會根據需要儲存一些臨時的中間資料,以便於後續指令可以更方便的執行。

在時間複雜度相同的情況下,演算法占用的記憶體空間越小越好。程式占用空間大小的計算公式為s(n) = o(f(n)),f(n)為演算法所佔儲存空間的函式。

當演算法儲存空間大小固定,和輸入規模沒有直接的關係時,空間複雜度記作o(1)。

def fun(n):

i = 3

當演算法分配的空間是乙個線性的集合【如列表】時,並且集合大小和輸入規模n成正比時,空間複雜度記作o(n)。

def fun(n):

array = [[0] * n]

當演算法分配的空間是乙個二維列表集合,並且集合的長度和寬度都與輸入規模n成正比時,空間複雜度記作o(n^2)。

def fun(n):

matrix = [[0] * n] * n

計算機在執行遞迴程式時,會專門分配一塊記憶體,用來儲存"函式呼叫棧"。

"函式呼叫棧"包括進棧出棧兩種行為。

def fun(n)

if n > 0

fun(n - 1)

假設傳入的值為5,入棧將引數(n = 5)先入棧,接下來再呼叫相同的方法將所有元素全部入棧

method

funn1n

2n3n

4n5當n = 1時,開始出棧,先將引數(n = 1)出棧,以此類推。

通過上述操作,可以看出,執行遞迴操作所需要的記憶體空間和遞迴的深度成正比。純粹的遞迴操作的空間複雜度是線性的,如果遞迴的深度為n,那麼空間複雜度就是o(n)。 

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...