資料結構系列 初識演算法 一

2021-10-05 05:50:45 字數 3436 閱讀 4337

簡單來說:"演算法"就是描述解決問題的方法。(能更有效的處理資料,提高資料運算效率。資料的運算是定義在資料的邏輯結構上,但運算的具體實現要在儲存結構上進行。)

比如:1+2+3+…+n=?平常隨便乙個for迴圈就可以解決這個問題,但是如果n==1000、10000、100000

等,必然要改變變數型別,否則會溢位。

對於給定的問題,是可以有多種演算法來解決的。如果你要問我有沒有通用的演算法?不好意思,我會向你要"包治百病"的藥。

問題千奇百怪,不論大問題、小問題,只有適合它的演算法,才是最優解。

對於演算法的定義上面有說:是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。就像上面舉的列子,for迴圈就是乙個解決"1+2+3+…+n"這個問題演算法。當然能解決這個問題的演算法有很多,for迴圈也不是最優解。

"資料結構"只是靜態的描述了"資料元素"之間的關係,高效的程式需要在"資料結構"的基礎上設計和選擇演算法,演算法圍繞資料結構操作。

就跟羅密歐與朱麗葉、梁山伯與祝英台,二者互相關聯,缺一不可。一種資料結構如果脫離了演算法,那還有什麼用呢?

1、輸入:可以有0個或者多個輸入,輸入引數是必要的(列印日誌除外)。

2、輸出:至少有乙個或者多個輸出,一定需要輸出,不輸出的話要這個演算法有什麼用?輸出形式

可以列印輸出、也是可以返回乙個或多個值等。

3、有窮性:在演算法執行有限的步驟後,會自動結束而不是出現無限迴圈。即:每個步驟在可接受

的時間內完成。

4、確定性:每乙個步驟都具有確定的含義,不會出現二義性。任何條件下,只有一條執行路徑。

5、可行性:每一步都必須是可行的,並且每一步都能夠通過執行有限次數完成。

1、正確性:演算法至少應該有輸入、輸出、無歧義性,能正確反映問題的需求、得到問題的正確答

案。正確有4個維次:

1、程式沒有語法錯誤。

2、程式對於幾組合法輸入資料能夠產生滿足要求的輸出結果。

3、程式對於幾組非法輸入資料能夠得出滿足規格說明的結果。

4、程式對於精心選擇、甚至刁難的測試資料都有滿足要求的輸出結果。

如果只有維次1的演算法,稱不上是乙個好的演算法。因為只解決了眼下問題,並不是長

久之計。

維次4是最難的,因為不可能去逐一驗證所有輸入都得到正確的結果,外界的不確定

性比較大。

總結:證明乙個演算法在這4個維次上都是正確的,代價比較大。一般情況把"維次3"作

為乙個演算法是否正確的衡量標準,也就是說"合法"或"不合法"的資料都能得到我們要

求輸出的結果。

2、可讀性:便於閱讀、理解和交流。晦澀難懂的演算法易於隱藏較多的錯誤而難以除錯。

寫**的目的一方面是讓計算機執行,另乙個方面就是為了便於他人閱讀。時間長

了,可能自己都不知道自己寫了什麼。可讀性也是衡量演算法好壞的乙個標準。

3、健壯性:當輸入資料不合法時,演算法也能做出相應處理,而不是產生異常或莫名其妙的結果。

4、時間效率高和儲存量低:對於同乙個問題,如果有多個演算法能夠解決,執行時間短的演算法效率

高,時間長的效率低。演算法執行時所占用的記憶體或外部儲存小的儲存

量低,反之儲存量大。

就好比花最少的錢、用最短的時間,辦最大的事。演算法也是一樣。

總結:乙個好的演算法就應該具有:正確性、可讀性、健壯性、高效率和低儲存的特徵。

在設計要求中提到了演算法要提高效率,也就是說降低執行的時間。那怎樣才能度量乙個演算法的執

行時間?下面分為兩種度量方法。

1、事後統計方法:利用系統計時,對不同演算法"編制的程式"執行時間進行比較,從而確定演算法效率的高低。當然這種依靠系統計時來確定演算法效率,也是有下面幾種缺陷的:

1、依賴於計算機系統的硬體和軟體等環境的因素。比如cpu、作業系統、編譯器、執行框架等等

都會影響結果,相同的機器不同的運存都是外部環境影響測試的因素。

2、需要實現編好程式,時間和精力花費的比較多。

3、與測試資料的規模有關,如果資料比較少那麼演算法之間差異基本為0,資料量打的話差異就會

體現出來。所以為了比較演算法,用多少資料來進行測試是乙個很難判斷的問題。

2、事前分析估算方法:在程式編制前,依據統計方法對演算法進行估算。

乙個程式在計算機上執行所消耗的時間取決於下面幾個因素:

1、演算法採用的策略、方法

2、編譯產生的**質量

3、問題的輸入規模

4、機器執行指令的速度

從這四個因素來看,第2個是軟體來支援,第4個是看硬體效能,第1個是演算法好壞的根本。如果拋開計算機的硬體、軟體相關的因素。乙個程式的執行時間,都依賴於"演算法的好壞"和"問題輸入的規模"來決定。

例:還是由上面說的乙個特定問題 1+2+3+…+n=? 來舉例

int i,sum = 0,n = 100;			執行1次

for(i = 1;i < = n; i++)

system.out.println(sum); 執行1次

這個for迴圈總共執行了2n+3次

int i,sum = 0,n = 100; 執行1次

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

system.out.println(sum); 執行1次

這兩種演算法可已看出 2n+3 和 3次,如果忽略開頭和結尾以及迴圈判斷的開銷,sum = sum + i; 和 sum = (1 + n) *n/2; 的對比。那麼n次和1次的差距就可以看出來了。

總結:通過案例發現,測試執行時間最可靠的方法就是——>計算對執行時間有消耗的基本操作的次數,執行時間和計數成正比。無需關心在什麼效能的計算機中、程式的設計語言是什麼,所以只用關心所實現的演算法即可。這樣可以不計那些迴圈索引、變數宣告、列印結果等等的一系列操作。

通過兩個同樣的問題看出,輸入規模是n,第一種求和演算法中的**需要執行n次,也就是輸入規模有多大,執行就有多少次。sum = sum + i 即:f(n)=n。

第二種演算法,無論輸入規模有多大,執行次數只有一次。 sum=(1 + n) * n/2 即:f(n)=1。

在分析演算法的執行時間時,重要的是把基本操作的數量與輸入規模關聯起來。 當輸入n的值越來越大,時間效率上面的差異也就越來越大。

資料結構系列1 演算法初識

主要研究問題 核心 時間與空間複雜度 使用大o記號 這個為最壞的情況,是演算法的上界,忽略常數係數 時間 基本操作次數 會變指令條數 空間 占用記憶體位元組數 區別 空間可以再利用 時間空間可以互換 hash表 常見時間複雜度分析方法 1.輸入輸出 確定演算法的下界 2.數迴圈次數 迴圈次數相乘,通...

初識演算法 資料結構

需求驅動 what why how 所有的學習從需求開始,學習任何知識要想事半功倍,一定要先搞清楚它存在的意義和價值 目錄 1 什麼是演算法?2 演算法好壞的評判標準 2.1 時間複雜度 流程決定 2.2 額外空間複雜度 流程決定 2.3 常數項時間 實現細節決定 what 總而言之 演算法就是解決...

資料結構與演算法初識

目錄首先明確的一點就是電腦科學不僅僅是對計算機的研究,雖然計算機在科學發展的過程中發揮了重大的作用,但是它只是乙個工具,乙個沒有靈魂的工具而已。所謂的電腦科學實際上是對問題 解決問題以及解決問題的 過程中產生產生的解決方案的研究。例如給定乙個問題,計算機科學家的目標是開發乙個演算法來處理該問題,最終...