演算法中時間複雜度分析

2021-08-16 03:14:56 字數 1824 閱讀 9717

演算法的時間複雜度表示演算法執行所需要的時間

大o表示法 是一種體現演算法時間複雜度的記法,如果用n表示資料規模,那麼o(f(n)表示演算法說需要執行的指令數(消耗的時間)和 f(n) 成正比。大o表示法指出了演算法執行的最低上限。(大o表示法的前邊省略了乙個常數)。

例子:有乙個字元陣列,將陣列中的每乙個字串按照字母排序,再將整個字串陣列按照字典序排序求這個演算法的時間複雜度。

分析:假設每個字串的最大長度是s,字元陣列中一共有n個字串。

* 對於乙個字串來說,進行排序的複雜度是o(s*log s),則整個字元陣列的複雜度是o(n*s*log s)

* 對於整個字串陣列排序的複雜度是o(n*log n),而進行字典排序時每次最多進行s次比較,每次比較都是常數時間,所以複雜度是o(s*n*log n)

* 綜上:整個演算法的複雜度是o(s*n*(log n +log s)

常見的大o階有常數階o(1),線性階o(n),平方階o(n²),對數階o(logn),nlogn階o(nlogn)等等。如果有在有相同規模的n,則只保留最高端,如o(n+n²) = o(n²)。

線性階隨資料規模n線性增長。如下面的**:

for(int i=0;i對數階

接著看如下**:

int number=1;

while(number可以看出上面的**,隨著number每次乘以2後,都會越來越接近n,當number不小於n時就會退出迴圈。假設迴圈的次數為x,則由2^x=n得出x=log₂n,因此得出這個演算法的時間複雜度為o(logn)。

平方階下面的**是迴圈巢狀:

for(int i=0;i需要注意的是內迴圈中int j=i,而不是int j=0。當i=0時,內迴圈執行了n次;i=1時內迴圈執行了n-1次,當i=n-1時執行了1次,我可以推算出總的執行次數為:

n+(n-1)+(n-2)+(n-3)+……+1 = n²/2+n/2

只保留最高端,因此保留n²/2,並且去掉這個項的常數,1/2,最終這段**的時間複雜度為o(n²)。

注意:

1.以下**的複雜度仍為o(n),原因是只進行了30*n次基本操作。

for(int i=0;i2.以下**的複雜度仍為o(n*log n)。

for(int i=1;i以上充分說明,應該時刻關注資料規模,而不是一些形式上的類似。

如下圖所示,該二分查詢只進行了一次遞迴呼叫。每次呼叫的複雜度為o(1),遞迴深度為o(log n),

故整個演算法的複雜度為o(log n)。

一般來說,在遞迴函式中只遞迴一次遞迴呼叫,總體的複雜度為o(每個遞迴函式的時間複雜度*遞迴深度)

此時應該關注的是呼叫次數,如下面**所示:此時可以通過數遞迴樹上的節點。

比如當n=3時,它的遞迴樹如下圖 右半側,更一般的結論如左半側所示。

又比如,在歸併排序中,排序的資料規模都會減少一半,所以遞迴深度時log n,但是每層進行排序的資料規模都是n,所以時間複雜度是o(n*log n).

演算法中時間複雜度分析

常見時間複雜度 最好 最壞 平均情況時間複雜度 int factorial int n return sum 上面是乙個階乘的函式,第二三行消耗兩個unit time,四五行for語句消耗2n個unit time,這個 的總執行時間t n 2n 2 unit time,我們只需要取其中最大量級,其時...

演算法時間複雜度分析

定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 求解演算法的時間複雜度的具體步驟是 1 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。2 計算基本語句的執行次數的數量級 ...

演算法分析時間複雜度

對乙個演算法的分析,很多時候我們更關心演算法執行的時間複雜度。演算法的時間複雜度中,我們關心演算法執行的時間上界。即大o階分析方法。時間複雜度的分類 1 沒有迴圈遞迴的基本都是常數階。2 有一層迴圈的就是線性階。for int i 0 i dosth 3 對數階 一般類似如下 while i i i...