資料結構(二) 演算法複雜度

2021-09-02 23:14:05 字數 1920 閱讀 1110

演算法中執行次數最多的那條語句就是基本語句,測定執行時間就是計算基本語句的執行次數

可以忽略加法常數

與最高此項相乘的常數並不重要

最高次項的指數越大,增長越快

判斷乙個演算法執行效率時,函式中的常數和其他次要項常常可以忽略,更應該關注主項(最高端項)的階數

某個演算法,隨著n增大,它會越來越優於另一演算法,或者越來越差與另一演算法。

我們一般使用o(f(n))來體現演算法的複雜度。

推導大o階的方法

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

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

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

得到的結果就是大o階

常數階

int sum =

0,n =

100;

//執行一次

sum =(1

+n)*n/2;

//執行一次

printf("%d"

,sum);

//執行一次

上面演算法的執行的次數的函式為f(n)=3,根據推導大o階的規則1,我們需要將常數3改為1,則這個演算法的時間複雜度為o(1)。如果sum = (1+n)*n/2這條語句再執行10遍,因為這與問題大小n的值並沒有關係,所以這個演算法的時間複雜度仍舊是o(1),我們可以稱之為常數階。

線性階線性階主要分析迴圈結構的運**況

for

(int i=

0;i)

上面演算法迴圈體中的**執行了n次,因此時間複雜度為o(n)。

對數階

int number=1;

while

(number

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

平方階

//巢狀迴圈

for(

int i=

0;i)}

內層迴圈的時間複雜度在講到線性階時就已經得知是o(n),現在經過外層迴圈n次,那麼這段演算法的時間複雜度則為o(n²)。

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

o(1)像o(n³),過大的n都會使得結果變得不現實。同樣指數階o(2ⁿ)和階乘階o(n!)的等,除非是很小的n值,否則哪怕n只是100,都是噩夢般的執行時間。這種不切實際的演算法複雜度,一般我們都不會去討論它。

——《大話資料結構》

最壞情況和平均情況

類似於時間複雜度的討論,乙個演算法的空間複雜度(space complexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。

乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。

儲存演算法本身所占用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。

如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當乙個演算法的空i司複雜度與n成線性比例關係時,可表示為0(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。

資料結構 演算法複雜度

二 演算法的效能評價 三 真題解析 資料結構的第一章 緒論 包含的最後乙個重要內容是關於演算法的複雜度。這個考點一般會單獨出現在選擇題的前兩道,需要你熟練掌握演算法的基本概念 演算法時間複雜度和空間複雜度的分析判斷等。其次,還會出現在大題的程式設計部分,將演算法複雜度作為乙個限制條件,要求你給出滿足...

資料結構與演算法(二) 複雜度

國慶假期第三天,昨天出去胡吃海喝,和朋友出去逛逛寺廟,然後今天早上又來實驗室,給貓貓鏟臭臭真的臭死我了,一見我就往我身上衝emmmmmmmmmm,今天就把上週就該寫的複雜度分析這塊寫下,因為這塊真的還蠻重要的 我看的是極客時間上乙個老師講的,就是把他講的梳理一下 我覺得複雜度這塊主要就是這些,而且分...

資料結構之演算法複雜度

解決特定問題求解步驟的描述。在計算機中表現為指令的有限序列,每條指令可表示乙個或多個操作。此外,乙個演算法還具有下列5個特性 有窮性,確定性,可行性,輸入,輸出。演算法設計的要求 正確性,可讀性,健壯性,效率與低儲存量需求。what?時間複雜度和空間複雜度 why?可以用度量演算法的好與壞 how?...