複雜度和空間複雜度百科

2021-10-07 10:05:30 字數 2482 閱讀 1513

通過字面意思可以知道

表示方法

我們一般用「大o符號表示法」來表示時間複雜度:t(n) = o(f(n))

n是影響複雜度變化的因子,f(n)是複雜度具體的演算法。

評價乙個演算法的效率主要是看它的時間複雜度和空間複雜度情況。

可能有的開發者接觸時間複雜度和空間複雜度的優化不太多(尤其是客戶端),但在服務端的應用是比較廣泛的。在巨大併發量的情況下,小部分時間複雜度或空間複雜度上的優化都能帶來巨大的效能提公升,是非常有必要了解的。

常見的時間複雜度量級如下:

1. 常數階o(1)

int a =1;

int b =2;

int c =

3;

大o符號表示法並不是用於來真實代表演算法的執行時間的,它是用來表示**執行時間的增長變化趨勢的。

如上**即使成千上萬,其演算法並未邊長,其時間複雜度仍為o(1)。

線性階o(n)

for

(i =

1; i <= n; i++

)

n為幾,則for內部**塊就需要執行多少次,所以它的時間複雜度其實是o(n)。

3. 對數階o(logn)

int i =1;

while

(i < n)

可以看到每次迴圈的時候 i 都會乘2,那麼總共迴圈的次數就是log2n,因此這個**的時間複雜度為o(log2n)。

這裡的底數對於研究程式執行效率不重要,寫**時要考慮的是資料規模n對程式執行效率的影響,常數部分則忽略,所以成了o(logn)

同樣的,如果不同時間複雜度的倍數關係為常數,那也可以近似認為兩者為同一量級的時間複雜度。

4. 線性對數階o(nlogn)

for

(m =

1; m < n; m++

)}

線性對數階o(nlogn) 其實非常容易理解,將時間複雜度為o(logn)的**迴圈n遍的話,那麼它的時間複雜度就是 n * o(logn),也就是了o(nlogn)。

5. 平方階o(n²)

for

(x =

1; i <= n; x++

)}

把 o(n) 的**再巢狀迴圈一遍,它的時間複雜度就是 o(n²) 了。

6.立方階o(n³)、k次方階o(n^k)

參考上面的o(n²) 去理解就好了,o(n³)相當於三層n迴圈,其它的類似。

時間複雜度分析

通常用t(n)表示**執行時間,n表示資料規模大小,f(n)表示**執行綜合次數。

在o(n)例子中執行次數為2n,如果沒行執行時間t,則執行時間2nt,可以表示f(n)=2nt,

在o(n²)例子中執行次數為2n,如果沒行執行時間t,則執行時間2nt,可以表示f(n)=(2n²+n)t。

**的執行時間 t(n)與每行**的執行次數 n 成正比,人們把這個規律總結成這麼乙個公式:t(n) = o(f(n))。大o時間複雜度並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢。所以,也叫作漸進時間複雜度,簡稱時間複雜度。

當n變得越來越大時,公式中的低階,常量,係數三部分影響不了其增長趨勢,所以可以直接忽略他們,只記錄乙個最大的量級就可以了,所以兩個例子實際他們的時間複雜度應該記為:t(n)=o(n) ,t(n)=o(n*n)

1. 空間 o(1)

如果演算法執行所需要的臨時空間不隨著某個變數n的大小而變化,即此演算法空間複雜度為乙個常量,可表示為 o(1)。

int i =1;

int j =2;

++i;

j++;

int m = i + j;

2. 空間 o(n)

int

arr =

newint

[n]

分配空間只和n有關

假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

需要注意的是,排序演算法是否為穩定的是由具體演算法決定的,不穩定的演算法在某種條件下可以變為穩定的演算法,而穩定的演算法在某種條件下也可以變為不穩定的演算法。

如下氣泡排序中將條件修改為if (arr[j] >= arr[j + 1]),則穩定性將從穩定變為不穩定。

if

(arr[j]

> arr[j +1]

){

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

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

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

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

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

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