一、什麼是演算法?
演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個步驟。
二、資料結構演算法的關係
資料結構與演算法有著千絲萬縷的關係,如果單單學習資料結構,會不知道有什麼用處,但如果我們再把相應的
演算法一起來講,你就會發現,甚至開始感慨:計算機界的前輩們的確是一些很牛很牛的人。
三、兩種演算法的比較
計算1+2+3+...+100的和
高斯演算法
四、演算法的定義
演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。
五、演算法的特徵
1.輸入輸出 零個或多個輸入,有乙個或多個輸出
2.有窮性 演算法在執行有限的步驟之後,自動結束而不會出現無限迴圈,並且每個步驟在可接受時間內完成
3.確定性 演算法的每一步驟都具有確定的含義,不會出現二義性。
4.可行性 演算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成。
六、演算法設計的要求
1.正確性 演算法至少應該具有輸入、輸出和加工處理無歧義性,能正確反映問題的需求,能夠得到問題的正確答案。
a)演算法程式沒有語法錯誤
b)演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果
c)演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果
d)演算法程式對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果
2.可讀性
演算法設計的另乙個目的是為了便於閱讀、理解和交流
3.健壯性
當輸入資料不合法時,演算法也能夠做出相關處理,而不是產生異常或莫名奇妙的結果。
4.時間效率高和儲存量低
時間效率指的是演算法的執行時間,對於同意問題,如果有多種演算法能夠解決,執行時間短的演算法效率高,執行時間長的
效率低,儲存量需求指的是演算法在執行過程中需要的最大儲存空間,主要指演算法程式執行時所占用的記憶體或外部硬碟空間
七、演算法效率的度量方法
1.事後統計方法
這種方法主要是通過設計好的測試程式和資料,利用計算計時器對不同演算法編制的程式的執行時間比較,從而確定演算法
效率的高低、
缺點:必須依據演算法事先編制好程式,這個通常需要花費大量的時間和精力。
時間比較依賴計算機硬體和軟體等環境因素、
演算法的測試資料設計困難,並且程式執行時間往往和測試資料的規模有很大關係
2.事前分析估算方法
在計算機程式編制前,依據統計方法對演算法進行估算
乙個高階程式語言編寫的程式在計算機上消耗時間的取決於下列因素:
1.演算法採用的策略、方法。
2.便宜產生的**質量
3.問題的輸入規模
4.機器執行指令的速度
乙個程式的執行時間,依賴於演算法的好壞和問題的輸入規模,所謂問題的規模是指輸入量的多少。
我們來看一下1+2+3+...+100的演算法
第一種
第二種
顯然,第一種演算法,執行了1+(n+1)+n+1次=2n+3次;而第二種演算法,是1+1+1=3次,事實上兩個演算法的第一條
和最後一條是一樣的,所以我們關注的**其實是中間的那部分,我們把迴圈看作乙個整體,忽略頭尾迴圈的判斷開銷
那麼這兩個演算法其實是n次和1次的差距,演算法的好壞顯而易見。
我們在看延伸的例子
這個例子,i從1到100,每次都要讓j迴圈100次,而當中的x++和sum=sum+x其實就是1+2+3+...+10000,也就是
100的2次方次,所以這個演算法當中,迴圈部分的**整體需要執行n的2次方次,顯然這個演算法的執行次數對於同樣輸入
規模n=100,要多餘前面兩種演算法,這個演算法的執行時間隨著n的增長也將遠遠多於前面兩個。
此時你會看到,測定運算時間最可靠的方法就是計算執行時間有消耗的基本操作的執行次數,執行時間與這個計數成正比
可以從問題描述中得到啟示,同樣問題的輸入規模是n,求和算算你發的第一種,求1+2+...+n需要一段**執行n次,那麼
這個問題的輸入規模使得運算元量是f(n)=n,顯然執行100次的同一段**過模式運算10次的10倍,而第二種無論n為多少,
執行次數都是1,即f(n)=1,第三種,運算100次是運算10次的100倍,因為他是f(n)=n的2次方。
八、函式的漸進增長
2n+3和3n+1
2n+3解釋為先有乙個n次迴圈,執行完之後,再有一次n次迴圈,最後有三次賦值或運算
函式的漸進增長:給定兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的n>n,f(n)總是比g(n)大,那麼我們說f(n)
的漸進增長漸進快於g(n),我們可以忽略這些加法常數
4n+8和2n的2次方+1
與最高次項相乘的常數並不重要
2n的2次方+3n+1和2n的3次方+3n+1
最高次項的指數大的,函式隨著n的增長,結果也會變得增長特別快
2n的2次方和3n+1和2n的2次方+3n+1
判斷乙個演算法的效率時,函式中的常數和其他次要項常常可以忽略,而更應該關注主項最高端項的階數
九、演算法時間複雜度
在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定
t(n)的數量級,演算法的時間複雜度,也就是演算法的時間量度,記作:t(n)=o(f(n)),他表示隨著問題規模n的
增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱為時間複雜度。其中
f(n)是問題規模n的某個函式。
這樣用大寫o()來體現演算法時間複雜度的記法,我們稱為大o記法。一般情況下,隨著n的增大,t(n)增長的最慢的演算法為
最優演算法。
顯然之前的三個求和例子的時間複雜度分別為o(n) 線性階 ,o(1) 常數階,o(n2) 平方階。
1.推導大o階方法
資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 演算法
程式設計 資料結構 演算法 演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示乙個或多個操作。演算法的特性 輸入 輸出 0個或多個輸入,至少乙個輸出,輸出可以是列印輸出或者返回乙個值 有 窮 性 演算法在執行有限步驟後,自動結束而不會出現無限迴圈,並且每乙...