演算法的複雜度分析

2021-08-30 04:14:43 字數 3232 閱讀 9088

**的複雜度分為時間複雜度空間複雜度

資料結構與演算法解決的核心問題就是讓**更「快」、更「省」。具體來說,就是執行的時間盡可能的短,占用的空間盡可能的少。

而**到底有多「快」、有多「省」,需要對應的衡量標準,時間複雜度就作為**有多「快」的衡量標準,空間複雜度就作為有多「省」的衡量標準。

對時間複雜度與空間複雜度的計算分析就是複雜度分析了。

我記得我剛接觸到時間複雜度這個概念時就有這個疑問:明明可以讓**跑一下來看下它具體的執行時間,以此作為它的時間複雜度不好嗎?畢竟這樣的跑出來的結果是最為真實的。

這樣來作為一段**的具體執行時間也是可以的,不過不夠精確,有很大的侷限性。

首先這種直接跑出來的時間非常依賴測試環境,很顯然,高階cpu跑一段**的時間一定是少於普通cpu的。另外,測試結果會受資料規模的影響,在資料量不同的情況下,測試出**執行的時間一定也是不同的,資料量小的情況下是很難測出乙個演算法的效能的。

鑑於此,需要從**本身來分析它的複雜度。從而判斷乙個演算法在時間、空間上的優劣。

我們先來看一下如何判斷一段**的執行時間。

int cal(int n) 

}}

要去除掉環境因素來看一段**的執行時間,那麼首先我們會想到的一定是看一條條語句的執行次數,假定一條語句的執行時間為t

tt,那麼**執行的總時間就是n∗t

n*tn∗

t,nn

n是語句的數量。

當然,這樣的方式並不精確,因為一條語句執行的時間我們並不能精確的估計出,且每條語句的執行時間也不相同。

不過,這種分析法的核心就在於抓住次數這一主要矛盾,忽略每條語句所受環境影響造成的執行時間不同的這一次要矛盾。

接著看上述**:

第2、3、4條語句各執行一次,第5、6條語句各執行n

nn次,第7和第8條語句各執行n

2n^2

n2次。所以,總的語句執行次數為(2n

2+2n

+3

)(2n^2+2n+3)

(2n2+2

n+3)

。假設一條語句執行時間為t,那麼總的執行時間t(n

)=(2

n2+2

n+3)

tt(n)=(2n^2+2n+3)t

t(n)=(

2n2+

2n+3

)t。前面**的總的執行時間t(n

)=(2

n2+2

n+3)

tt(n)=(2n^2+2n+3)t

t(n)=(

2n2+

2n+3

)t,那麼可以看出來,t(n

)t(n)

t(n)

是**中語句執行次數n的函式。用大o複雜度來表示時間複雜度則為t(n

)=o(

n2

)t(n)=o(n^2)

t(n)=o

(n2)

。大o複雜度表示的並不是一段**的真實執行時間,沒有實際的測試環境也得不出它的實際執行時間。大o複雜度實際上表示的是**的執行時間隨資料規模增長的變化趨勢。這也就是為什麼2n2

+2n+

32n^2+2n+3

2n2+2n

+3可以只表示為n

2n^2

n2。因為在n

nn非常大的情況下,常量、係數、低階都是可以忽略不計的。所以說,假設這段**的總執行時間t(n

)=(10

n2+9

n+

100)

tt(n)=(10n^2+9n+100)t

t(n)=(

10n2

+9n+

100)

t,依然可以用大o複雜度表示法表示為t(n

)=o(

n2

)t(n)=o(n^2)

t(n)=o

(n2)

。分析時間複雜度記住三個方法:

只關注迴圈次數最多的一段**

加法法則:總複雜度等於量級最大的那段**的複雜度(多段**)

乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積 o(1

)、o(

n)、o

(n2)

、o(l

ogn)

、o(n

logn

)o(1)、o(n)、o(n^2)、o(logn)、o(nlogn)

o(1)、o

(n)、

o(n2

)、o(

logn

)、o(

nlog

n)o (1

)與o(

n)

o(1)與o(n)

o(1)與o

(n):o(1

)o(1)

o(1)

並不是指一段**中只有乙個語句執行了一次,而是語句的執行次數是常量,與輸入資料規模無關。而o(n

)o(n)

o(n)

指**的執行時間與資料規模n

nn成正比關係。

最好、最壞情況時間複雜度顧名思義就是在最好與最壞的情況下,一段程式所會得到的時間複雜度。

// n 表示陣列 array 的長度

int find(int array, int n, int x)

} return pos;

}

最好時間複雜度:x為array[0],這時的時間複雜度為o(1)。這時就是最好時間複雜度。

最壞時間複雜度:x為array[n],這時的時間複雜度為o(n)。這時就是最壞時間複雜度。

最好和最壞時間複雜度表示的是一段程式在極端情況下會出現的時間複雜度,而平均時間複雜度的引入是為了表示一段程式在平均情況下的時間複雜度。

對於上面的示例**來說,在x處於陣列array之中時,會出現的查詢次數分別為1、2、3、……、n,而x不處於陣列array之中時,會出現的查詢次數為n。

我們假設x處於陣列array之中與不處於array之中的概率相同。那麼我們會得到需要遍歷的元素個數的平均值為3n+

1/

43n+1/4

3n+1/4

,最終的平均時間複雜度為o(n)。

均攤時間複雜度是一種特殊的平均時間複雜度。

對於乙個資料結構進行一組連續操作中,大部分情況下時間複雜度都很低,只有個別情況下時間複雜度比較高,而且這些操作之間存在前後連貫的詩序關係。這時就可以把較高的時間複雜度分攤到較低的時間複雜度。一般情況下均攤時間複雜度就等於最好時間複雜度。

演算法複雜度分析

分析非遞迴演算法效率的通用方案 1.決定用哪個 哪些 引數作為輸入規模的度量 2.找出演算法的基本操作 作為一規律,它總是位於演算法的最內層迴圈中 3.檢查基本操作的執行次數是否只依賴輸入規模。如果它還依賴一些其他的特性,則最差效率 平均效率以及最優效率 如果必要 需要分別研究。4.建立乙個演算法基...

演算法複雜度分析

演算法分析的四個漸進表示法 一般,o裡的,取最小的 一般,裡的,取最大的 一般分析時間複雜度,且常考慮最壞複雜度,常用o分析 三法則 法則一 如果t1 n o f n t2 n0 o g n t1 n t2 n max o f n o g n t1 n t2 n o f n o g n 法則二 如果...

演算法複雜度分析

類別name 名字交換類排序 quicksort 快速排序 交換類排序 bubble sort 氣泡排序 選擇類排序 selection sort 選擇排序 選擇類排序 heapsort 堆排序插入類排序 insertion sort 插入排序 插入類排序 shell sort 希爾排序 bucke...