資料結構 二 之演算法基礎

2021-08-07 10:37:41 字數 1567 閱讀 1383

一.為什麼要學習演算法?

先來個簡單的演算法比較:求sum=1+2+3+...+(n-1)+n的結果. 輸入整數n,輸出 sum 

解法一:for迴圈

function

sum(n)

return

s;  

//執行1次

}

解法二:

function

sum(n)

很明顯,解法二要優於解法一。因為解法二需要運算的次數少。我們去衡量乙個演算法的好壞主要是從時間複雜度和空間複雜度來看的,其次才到可讀性,可維護性。那麼接下來講講怎麼來計算時間複雜度與空間複雜度。

二.時間複雜度的計算:

推導大o階來計時間複雜度

規則:1.用常數1取代執行時間中的所有加法常數(即常數階都計為o(1) );

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

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

解法一的執行次數:  f1(n) = 1+n+1+1=n+3 次  時間複雜度記作 t(n) = o( f1(n) )  //n+3直接捨掉常數,變為n ,名為「線性階」

解法二的執行次數: f2(n) = 1次        時間複雜度記作 t(n) = o( f1(1) )  //名為「常數階」

由此可知解法一隨n的增加,執行次數也增加,而解法二始終只需執行一次

對數階:

function

count(n)

return

c; }

也就是說2的多少次冪大於n,就執行了多少次。時間複雜度計做o(logn),名為對數階。

平方階:

function

num(n)

}return

count;

}

以上**執行總次數為n+(n-1)+(n-2)+...+1 = n2/2+n/2 次,用大o推導法去掉相加常數n/2,去掉相乘常數1/2,所以時間複雜度為o(n2)

總結:時間複雜度有多種,這裡是討論常見的階。常用的時間複雜雜耗時的時間從小到大依次為:

o(1) < o(logn) < o(n) < o(nlogn) < o(n2) < o(n3) < o(2n) < o(n!) n)

擴充套件:最壞時間複雜度

例:給出乙個陣列arr,裡面有n個隨機數,找出arr中的指定數字。那麼這個數字有可能出現在陣列中的第乙個位置,時間複雜度為o(1);也可能出現在陣列最後乙個位置,時間複雜度為o(n) ,從概率來說,平均查詢時間應該是n/2次。

最壞時間複雜度從字面上就能理解,時間最長的情況,時間不會更長,情況不會更壞了。通常沒有特殊說明,我們計算的時間複雜度都為最壞時間複雜度。    

三.演算法空間複雜度

演算法的空間複雜度並不是計算實際占用的空間,而是計算整個演算法的輔助空間單元的個數,與問題的規模沒有關係。演算法的空間複雜度s(n)定義為該演算法所耗費空間的數量級。s(n)=o(f(n)) 若演算法執行時所需要的輔助空間相對於輸入資料量n而言是乙個常數,則稱這個演算法的輔助空間為o(1)。通常,我們用時間複雜度來衡量演算法的優略。

資料結構與演算法基礎 二 遞迴

這裡主要講一下運用遞迴的典型的例子 斐波那契數列 和 漢諾塔問題 遞迴 指在乙個方法 函式 的內部呼叫該方法本身的程式設計方式 1.斐波那契數列 1 1 2 3 5 8 13 規律 前兩個數之和等於第三個數 1 1 2,1 2 3,3 5 8 實現如下 package makasa1test 用遞迴...

資料結構之基礎

在學習簡單的資料結構之前我們得了解一下資料結構的一些基本概念 一 邏輯結構 集合 資料元素間除 同屬於乙個集合 外,無其他關係 線性結構 乙個對乙個,如線性表,棧,佇列 樹形結構 乙個對多個,如樹 圖形結構 多個對多個,如圖 二 物理結構 物理結構也稱儲存結構,是資料的邏輯結構在計算機儲存內的表示 ...

資料結構及演算法基礎 之棧與佇列(二)

佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。與棧相反,佇列是一種先進先出 first in first out,fifo 的線性表。與棧相同的是,佇列也是一種重要的線性結構,實現乙個佇列同樣需要順序表或鍊錶作為基礎。此前我們用瀏覽器的歷史記錄作為棧的例子讓大家了解她...