筆記 演算法 複雜度

2022-07-30 01:33:11 字數 2920 閱讀 5655

筆記-演算法-複雜度

演算法複雜度用於衡量某一演算法在時間和儲存空間上的開銷;一般情況下主要討論時間開銷;

在分析演算法時間開銷時,語句的執行次數t(n)*單條語句執行時間=總時間;

單條語句執行時間一般設定為乙個常數,而t(n)是關於問題規模n的函式,分析演算法複雜度就是分析t(n)隨n的變化情況並確定t(n)的數量級(在大規模事件中,數量級比具體數字重要得多)。

常用演算法時間複雜度表示方法:t(n)=o(f(n))

這種方法稱之為大o記法。

1、用常數1取代執行時間中的所有加法常數。

2、在修改後的執行次數函式中,只保留最高端項。

3、如果最高端項存在且不是1,則去除與這個專案相乘的常數。得到的結果就是大o階。

時間複雜度包括最壞複雜度和平均複雜度,一般情況下不特別說明,討論的時間複雜度是最壞情況下的時間複雜度。

按數量級遞增排列,常見的時間複雜度有:

常數階對數階

線性階線性對數階

平方階立方階

k次方階

指數階o(1)

o(log2 n )

o(n)

o(nlog2 n)

o(n2 )

o(n3 )

o(nk )

o(2n )

複雜度低 ---->---->---->----> 複雜度高 

隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

下面的更形象說明了不同階數演算法的執行效率。

與時間複雜度類似,空間複雜度是指演算法在計算機內執行時所需儲存空間的度量。記作:

s(n)=o(f(n))

演算法的空間複雜度並不是計算實際占用的空間,而是計算整個演算法的輔助空間單元的個數,與問題的規模沒有關係。演算法的空間複雜度s(n)定義為該演算法所耗費空間的數量級。

若演算法執行時所需要的輔助空間相對於輸入資料量n而言是乙個常數,則稱這個演算法的輔助空間為o(1); 

遞迴演算法的空間複雜度:遞迴深度n*每次遞迴所要的輔助空間,如果每次遞迴所需的輔助空間是常數,則遞迴的空間複雜度是 o(n).

空間複雜度的分析方法:

乙個演算法的空間複雜度s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。

乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。

乙個演算法的空間複雜度只考慮在執行過程中為區域性變數分配的儲存空間的大小,它包括為參數列中形參變數分配的儲存空間和為在函式體中定義的區域性變數分配的儲存空間兩個部分。

演算法的空間複雜度一般也以數量級的形式給出。如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為o(log2n);當乙個演算法的空間複雜度與n成線性比例關係時,可表示為o(n)。若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。

空間複雜度補充

乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小。利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。乙個程式執行時除了需要儲存空間和儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。程式執行時所需儲存空間包括以下兩部分。  

(1)固定部分。這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。

(2)可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。

乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n))  其中n為問題的規模,s(n)表示空間複雜度。

對於乙個演算法,其時間複雜度和空間複雜度往往是相互影響的。當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,當追求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。

另外,演算法的所有效能之間都存在著或多或少的相互影響。因此,當設計乙個演算法(特別是大型演算法)時,要綜合考慮演算法的各項效能,演算法的使用頻率,演算法處理的資料量的大小,演算法描述語言的特性,演算法執行的機器系統環境等各方面因素,才能夠設計出比較好的演算法。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。

常用的演算法的時間複雜度和空間複雜度:

排序法平均時間

最差情形

穩定度額外空間備註

冒泡o(n2 )

o(n2 )

穩定o(1)

n較小時較好 交換

o(n2 )

o(n2 )

不穩定o(1)

n較小時較好 選擇

o(n2 )

o(n2 )

不穩定o(1)

n較小時較好 插入

o(n2 )

o(n2 )

穩定o(1)

大部分已排序時較好 基數

o(logr b)

o(logr b)

穩定o(n)

b是真數(0-9),

r是基數(個十百)

shell

o(nlogn)

o(ns ) 1

不穩定o(1)

s是所選分組 快速

o(nlogn)

o(n2 )

不穩定o(nlogn)

n較大時較好 歸併

o(nlogn)

o(nlogn)

穩定o(1)

n較大時較好 堆

o(nlogn)

o(nlogn)

不穩定o(1)

n較大時較好

穩定的排序:保證,排序關鍵字相同的情況下,物件的相對位置不變

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

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

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

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

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

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