時間複雜度講解 斐波那契,二分查詢,氣泡排序分析

2021-10-19 09:00:39 字數 3690 閱讀 7948

演算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。 時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是在乎。但是經過計算機行業的迅速發展,計算機的儲存容量已經達到了很高的程度。所以我們如今已經不需要再特別關注乙個演算法的空間複雜度。

時間複雜度的定義:在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。乙個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。但是我們需要每個演算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間複雜度這個分析方式。乙個演算法所花費的時間與其中語句的執行次數成正比例,演算法中的基本操作的執行次數,為演算法的時間複雜度。

實際中我們計算時間複雜度時,我們其實並不一定要計算精確的執行次數,而只需要大概執行次數,那麼這裡我們使用大o的漸進表示法。

大o符號(big o notation):是用於描述函式漸進行為的數學符號.

推導大o階方法:

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

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

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

// 請計算一下func1基本操作執行了多少次?

void

func1

(int n)

}for

(int k =

0; k <

2* n;

++k)

int m =10;

while

(m--

)printf

("%d\n"

, count)

;// 1次

}

func1 執行的基本操作次數 :

f(n) = n*n + 2 * n + 12

使用大o的漸進表示法以後,fun1的時間複雜度為 o(n^2)

通過上面我們會發現大o的漸進表示法去掉了那些對結果影響不大的項,簡潔明瞭的表示出了執行次數。

另外有些演算法的時間複雜度存在最好、平均和最壞情況:

最壞情況:任意輸入規模的最大執行次數(上界)

平均情況:任意輸入規模的期望執行次數

最好情況:任意輸入規模的最小執行次數(下界)

例如:在乙個長度為n陣列中搜尋乙個資料x

最好情況:1次找到

最壞情況:n次找到

平均情況:n/2次找到

在實際中一般情況關注的是演算法的最壞運**況,所以陣列中搜尋資料時間複雜度為o(n)

(1).

// 計算func2的時間複雜度?

void

func2

(int n)

int m =10;

// 1次

while

(m--

)printf

("%d\n"

, count)

;// 1次

}

func2 執行的基本操作次數 :

f(n) = 2 * n + 13

使用大o的漸進表示法以後,fun1的時間複雜度為 o(n)

(2).

// 計算func3的時間複雜度?

void

func3

(int n,

int m)

for(

int k =

0; k < n;

++k)

printf

("%d\n"

, count)

;// 1次

}

func2 執行的基本操作次數 :

f(n) = m + n + 2

使用大o的漸進表示法以後,fun1的時間複雜度為 o(m + n)

(3).

// 計算func4的時間複雜度?

void

func4

(int n)

printf

("%d\n"

, count)

;}

因為執行次數為常數,由第一條規則:

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

可知時間複雜度為: o(1)

(4).

// 計算bubblesort的時間複雜度?

void

bubblesort

(int

* arr,

int n)}if

(flag ==0)

break;}

}

考慮最壞的情況,資料為降序,將其排為公升序

bubblesort 執行的基本操作次數 :

f(n) = 2 * n^2 + n

使用大o的漸進表示法以後,bubblesort 的時間複雜度為 o(n^2)

考慮最好的情況,資料本來就是公升序,只需要進行最內層迴圈 j 從 0 到 n - 1,進行 n - 1 比較,之後檢查出有序,即可退出整個迴圈

複雜度為 o(n)

(5).

// 計算binarysearch的時間複雜度?

intbinarysearch

(int

* a,

int n,

int x)

return-1

;}

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

一次二分剩下:n/2

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

…m次二分剩下:n/(2^m)

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

n/(2^m)=1;

2^m=n;

m = log2^n

而在資料結構中常常這樣寫lgn,所以時間複雜度為o(lgn);

(6).

// 計算階乘遞迴factorial的時間複雜度?

遞迴演算法的時間複雜度計算方法:

遞迴的次數 * 每次遞迴函式內操作的次數

求n的階乘需要遞迴 n 次,每次遞迴函式內操作 1 次,因此時間複雜度為 o(n)

(7).

// 計算斐波那契遞迴fibonacci的時間複雜度?

若為滿二叉樹,則執行次數為:

2^0 + 2^1 + 2^ 2 + …+ 2^(n - 1) = 2^n - 1

我們可以發現在圖中越靠右的部分越先停止呼叫,因此執行次數會比滿二叉樹的情況少,但當n足夠大時,這些少執行的部分影響微乎其微。

而且我們其實並不一定要計算精確的執行次數,而只需要大概執行次數,由大o的漸進表示法可知時間複雜度為o(2^n)

斐波那契數列時間複雜度

1.時間複雜度 o 2 n 空間複雜度 o n def fib n if n 3 return 1return f n 1 f n 2 推導 時間複雜度 f n f n 1 f n 2 每一層都包含乙個加法操作 例如n 8時,t n 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 1...

斐波那契數與時間複雜度

斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 第一項,第二項的值為1,第三項開始,它的值為前兩項之和。實現非常簡單 簡單的看看這個圖,分析一下,根據fab 1 n 1 fab 1 n 2 如果想要得到斐波那契其數的第五項,首先要...

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

時間複雜度時間複雜度實際是乙個函式,該函式計算的是執行基本操作的次數 時間複雜度計算方法 1 數次數 2 o 1.用常數1取代執行時間中的所有加法常數 2.只保留最高項 3.最高項係數不為1的改為 1注意 選取最壞時間複雜度即選取增長最快的項 遞迴的時間複雜度 遞迴總次數 每次遞迴中基本操作所執行是...