資料結構01 時間複雜度和空間複雜度

2021-09-20 21:55:17 字數 3782 閱讀 1049

什麼是時間複雜度?

什麼是空間複雜度?

遞迴斐波那契數列優化,尾遞迴優化--->迴圈優化

常見時間複雜度

演算法就是計算或解決問題的步驟,用來將輸入資料轉化成輸出結果。

演算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。 時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間

在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。乙個演算法所花費的時間與其中語句的執行次數成正比例,演算法中的基本操作的執行次數,為演算法的時間複雜度。

乙個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。但是,就算是使用同樣的演算法,花費的時間也會根據所用計算機的不同而產生偏差。因此,不適用時間來衡量而使用基本語句的執行次數來衡量時間複雜度。

大o的漸進表示法原則:

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

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

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

舉個例子:

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

void

func1

(int n)

}for

(int k =

0; k <

2* n ;

++ k)

int m =10;

while

(m--

)printf

("%d\n"

, count)

;}

func1 執行的基本操作次數 :

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

使用大o的漸進表示法以後,func1的時間複雜度為:

o(n^2)

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

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

一般不特別說明,討論的時間複雜度均是最差情況下的時間複雜度。

int

binarysearch

(int

*a,int n,

int x)

return-1

;}

假設存在n個元素

第n次查詢

剩餘待查詢元素

1n/2

2n/(2^2)

3n/(2^3)……

kn/(2^k)

最差的情況在,在最後一次才能找到待查詢元素,即:

n/(2^k)=1

語句執行次數為k次

k=log2n

二分查詢的時間複雜度為o(log2n)

long

long

factorial

(int n)

else

}

首先,基本語句次數為:1

然後計算遞迴語句,當n>=2時,計算fac(n-1)*n;

第n次計算

得到結果

1factorial(n)=factorial(n-1)*n

2factorial(n-1)=factorial(n-2)*(n-1)

3factorial(n-2)=factorial(n-3)*(n-2)……

nfactorial(1)=1

得到遞迴語句計算次數為n;

遞迴求階乘的時間複雜度為o(n)

long

long

fib(

int n)

else

}

遞迴語句執行次數:以n=6為例,畫圖詳解:

單語句執行次數:1;

想要計算fib(6),需要計算fib(5)和fib(4);

然後分別計算fib(4)和fib(5);則需要分別計算fib(2),fib(3)和fib(3),fib(4);

逐一計算,計算次數分別為1,2,4,8,

則fac(n)的遞迴語句計算次數為2^0+ 2^1+ 2^2…… 2^(n-3);

根據時間複雜度大o的漸進演算法得,遞迴求斐波那契數的時間複雜度為o(2^n);

遞迴函式的時間複雜度為基本語句單次遞迴次數*每次遞迴的總次數

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度 。空間複雜度不是程式占用了多少bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數。空間複雜度計算規則基本跟時間複雜度類似,也使用大o漸進表示法。

void

bubblesort

(int

*a,int

*b)}

if(exchange ==0)

break;}

}

空間複雜度就是看演算法有無借助輔助空間;

直接在原始資料上排,不需要額外的儲存空間;

陣列不屬於函式開闢空間;

所以氣泡排序的 空間複雜度為o(1);

long

long

fib(

int n)

else

}

遞迴演算法的時間複雜度:遞迴的總次數 * 每次遞迴的數量。

遞迴演算法的空間複雜度:遞迴的深度 * 每次遞迴建立變數的個數。

遞迴斐波那契數列時間複雜度為:o(2^n)

遞迴斐波那契數列空間複雜度為:o(n)

long

long

fib(

long first,

long second,

long n)

return

fib(second, first + second, n -1)

;}

尾遞迴求斐波那契數列時間複雜度為:o(n)

尾遞迴求斐波那契數列空間複雜度為:o(1)

long

long

*fibonacci

(size_t n)

return fibarray ;

}

迴圈演算法求斐波那契數列時間複雜度為:o(n),

迴圈演算法求斐波那契數列空間複雜度為:o(1).

o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n) < o(n!) < o(n^n)

01 時間複雜度 空間複雜度

1 時間頻度 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。2 時間複雜度 若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等於零的常數,則稱f n 是t n 的同數量級函式。記作t n f ...

資料結構和演算法(二) 時間複雜度和空間複雜度

演算法效率的度量方法 事後統計方法 這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同酸防編制的程式執行時間進行比較,從而確定演算法效率的高低。這種方法有很大的缺陷,必須依據演算法事先編制好測試程式,通常需要花費大量時間和精力,如果完了發覺測試的是糟糕的演算法,就會功虧一簣。不同測試環...

資料結構和演算法 02時間複雜度和空間複雜度

高階語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素 1.演算法採用的策略,方案 2.編譯產生的 質量 編譯器 3.問題的輸入規模 輸入量的多少 4.機器執行指令的速度。研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增大量的乙個抽象!一 演算法時間複雜度概念 一般情況下,演算法中基本...