目錄
時間複雜度
時間複雜度計算
空間複雜度
空間複雜度計算
常量空間
線性空間
二維空間
遞迴空間
若存在函式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 存在乙個正...