本系列部落格是博主在學習資料結構時的筆記,希望與大家一起分享,如有對資料結構感興趣的小夥伴可以加個****一起交流。本系列參考程杰的《大話資料結構》。
講資料結構,不講演算法簡直就是耍流氓。程式設計=資料結構+演算法,會資料結構,應用不到演算法上也是白搭。下面我們來聊一聊什麼是演算法,什麼才能稱得上是乙個好演算法。
演算法的定義:演算法是解決特定問題求解步驟的描述,在計算機中為指令 的有限序列,並且每條指令表示乙個或多個操作。
首先演算法需要有輸入,那麼對應的肯定要有輸出。其次演算法不能陷入死迴圈吧,因此有窮;再次演算法不能存在二義,必須得是確定的;最後該演算法具有可行性。以上是演算法的特性。
在設計演算法的時候要遵循以下幾個原則:
(i)、正確性:1.演算法程式沒有語法錯誤。 2.演算法程式對於合法的輸入資料能夠 產生滿足要求的輸出結果。 3.演算法程式對於非法的輸入資料能夠得出滿 足規格說明的結果。 4.演算法程式對於精心選擇的,甚至刁難的測試資料 都有滿足要求的輸出結果。
(iii)、魯棒性:bug少。輸入不合法時演算法也能作出相應處理。
(iv)、高時間效率、低儲存:時間效率需要通過事前分析進行估算,一般用演算法時間複雜度o來衡量,而這個o計算與執行次數存在關係,因此在計算大o階的時候要弄清楚該段**執行了多少次。
舉幾個例子:
1、該**僅執行1次,因此時間複雜度為o(1);
該**執行了5次,但是對於時間複雜度而言,常數項全部替換為1,因此為o(1);
該**執行n+1次,看最高項,是n,那麼時間複雜度為o(n);
該**執行了logn+1次,那麼這個迴圈的時間複雜度為o(logn)
該**執行了m*n次,時間複雜度為o(mxn)
**執行n+(n-1)+...+2+1共n*(n+1)/2=n^2/2+n/2次,首先看最高項是平方項,然後僅看平方項的數,不看係數1/2,因此時間複雜度為o(n^2);
下面給出常見時間複雜度的**:
【注】在某些特定情況可以以犧牲空間上的開銷來換取時間複雜度的降低。
最後總結,當我們在評估我們演算法的時候,首先必須要保證演算法是正確的,其次需要讓我們的**給同層次的人看也能看的懂,然後是儘量減少演算法的bug數量,最後是在時間成本上能夠有所降低,而且最好占用記憶體不要過高。
資料結構與演算法系列1 什麼是資料結構和演算法
資料結構是計算機儲存,組織資料的方式,就是怎麼儲存資料的意思 資料 是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並給計算機處理的符號集合 資料元素 是組成資料的,有一定意義的基本單位,在計算機中通常作為整體處理,也被稱為記錄 資料項 乙個資料元素可以由若干資料項的組成 資料物件...
資料結構演算法(二)
單調棧給定乙個長度為 n 的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出 1。輸入格式 第一行包含整數 n,表示數列長度。第二行包含 n 個整數,表示整數數列。輸出格式 共一行,包含 n 個整數,其中第 i 個數表示第 i 個數的左邊第乙個比它小的數,如果不存在則輸出 1。資料範圍 1...
資料結構 二 演算法
演算法 是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作 輸入輸出 演算法具有零個或多個輸入。演算法至少有乙個或多個輸出 有窮性 在可接受的時間範圍內結束,不會出現出現迴圈 確定性 不會出現二義性 可行性 每一步都能執行有限次數完成 正確性 沒有語法錯誤 ...