一文帶你搞懂演算法時間複雜度

2021-08-20 18:28:50 字數 1496 閱讀 3100

乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。

前面提到的時間頻度t(n)中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律,為此我們引入時間複雜度的概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式,記作t(n)=o(f(n)),它稱為演算法的漸進時間複雜度,簡稱時間複雜度。

推導大o階,我們可以按照如下的規則來進行推導,得到的結果就是大o表示法: 

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

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

3.如果最高端項存在且不是1,則去除與這個項相乘的常數。

先舉了例子,如下所示。

int

sum = 0,n = 100; //執行一次

sum = (1+n)*n/2; //執行一次

system.out.println (sum); //執行一次

線性階主要要分析迴圈結構的運**況,如下所示。

for(int i=0;i1)的演算法

...}

接著看如下**:

int number=1;

while(number2;

//時間複雜度為o(1)的演算法

...}

下面的**是迴圈巢狀:

for(int i=0;ifor(int j=0;j1)的演算法

...

}}

for(int i=0;ifor(int j=i;j1)的演算法

...

}}

logn

√nnlogn

n²2ⁿn!5

221025

32120103

3301001024

3628800505

7250

2500

約10^15

約3.0*10^64

1006

10600

10000

約10^30

約9.3*10^157

1000931

9000

1000 000

約10^300

約4.0*10^2567

o(1)

一文搞懂演算法的時間複雜度與空間複雜度

一般情況下,演算法的基本操作重複執行的次數是模組n的某一函式f n 因此,演算法的時間複雜度記做 t n o f n 隨著模組n的增大,演算法執行的時間增長率f n 的增長率成正比,所以f n 越小,演算法的時間複雜度越低,演算法的效率越高。時間複雜度是總運算次數表示式中受n的變化影響最大的那一項 ...

一文搞定時間複雜度和空間複雜度

寫在前面 博主是一位普普通通的19屆雙非軟工在讀生,平時最大的愛好就是聽聽歌,逛逛b站。博主很喜歡的一句話花開堪折直須折,莫待無花空折枝 博主的理解是頭一次為人,就應該做自己想做的事,做自己不後悔的事,做自己以後不會留有遺憾的事,做自己覺得有意義的事,不浪費這大好的青春年華。博主寫部落格目的是記錄所...

一文帶你搞懂Spring核心

容錯 減少延遲 提高效能 可用性負載均衡 總而言之,其實目的只有乙個,使用者體驗 分布式系統是由使用分發中介軟體連線的自治計算機組成的網路。它們有助於共享不同的資源和功能,為使用者提供單一且整合的連貫網路。1 在伺服器 虛擬機器 上安裝zookeeper 我這裡使用docker安裝 1 去docke...