時間複雜度 空間複雜度及二分查詢 斐波那也數分析

2021-08-20 06:40:55 字數 1618 閱讀 9519

時間複雜度時間複雜度實際是乙個函式,該函式計算的是執行基本操作的次數

時間複雜度計算方法

(1)數次數

(2)o()

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

2. 只保留最高項

3. 最高項係數不為1的改為

1注意:選取最壞時間複雜度即選取增長最快的項

遞迴的時間複雜度=遞迴總次數

*每次遞迴中基本操作所執行是次數

空間複雜度函式中建立物件的個數關於問題規模表示式

不是計算實際占用的空間,而是計算整個演算法的輔助空間單元的個數,與問題規模沒有關係(簡單理解就是演算法執行時建立的變數個數(包括臨時變數)

空間可以重用,算遞迴最壞(最深)的一種情況

常用的時間複雜度所耗費的時間從小到大依次是:

o(1)曲線越陡,時間複雜度越大,越不好

分析二分查詢、遞迴實現的斐波那契數列的時間

/空間複雜度

二分查詢

while(left <= right)

int mid=left+(right-left)/2;

if(arr[mid] == n)

printf("找到了

%d: "

, mid);

break;

else

if(arr[mid] < n)

left = mid+1;

else

right = mid-1;

因為二分查詢每次排除掉一半的不適合值,所以對於n個元素的情況:

一次二分剩下:n/2

兩次二分剩下:n/2/2 = n/4

。。。m次二分剩下:

n/(2^m)

在最壞情況下是在排除到只剩下最後乙個值之後得到結果,所以為

n/(2^m)=1;

2^m=n;

所以時間複雜度為:log2(n)

輔助空間單元數是常數。所以空間複雜度是0(1)

遞迴實現的斐波那契數列

int fib_recursion(int n)

if (n <= 2)

return 1;

else

return fib(n - 1) + fib(n - 2);

每一步計算都被分成計算前兩個斐波那契數,以此類推。那麼這就形成了一顆二叉樹,雖然不是滿二叉樹,但是我們分析的是最壞時間複雜度,而且只要估算出來遞迴次數隨n增長的趨勢即可,故可以近似將它看成滿二叉樹,其中的節點數就是計算的次數,也就是複雜度,由公式:節點數

=2^h-1(h

為樹的高度)可得o(

2^n)。

遞迴的時間複雜度是:

遞迴次數

*每次遞迴中執行基本操作的次數,所以時間複雜度是:

o(2^n)

遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。遞迴產生的棧偵是要銷毀的,所以空間也就釋放了,要返回上一層棧偵繼續計算+號後面的數,所以它所需要的空間不是一直累加起來的,之後產生的棧偵空間都小於遞迴最深的那一次所耗費的空間。

遞迴的深度*每次遞迴所需的輔助空間的個數 ,所以空間複雜度是:

o(n)

時間複雜度及空間複雜度

一.時間複雜度 時間複雜度實際就是乙個函式,該函式計算的是執行基本操作的次 數,而不是程式執行時間。1.在實際中通常關注的是演算法的最壞運 況。乙個演算法的最壞情況的執行時間是在任意輸入下的執行時間上界。一般情況下使用o漸進表示法來計算演算法的時間複雜度。2.書寫方式 例1 void test in...

時間複雜度及空間複雜度

程式的時間複雜度指的是程式在執行過程中的運算次數,並為最壞情況下的運算次數 程式的空間複雜度指的是程式在執行過程中需要系統為其變數輔助開闢記憶體的多少 斐波那契序列用遞迴實現 include int fib int n int main 圖示為 從圖中可以看出斐波那契遞迴演算法中求解f n 必須先計...

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...