第一章引論
引論中心思想:
1、在合理的時間內能夠處理較大的數據量,纔是一個切合實際的算法。
2、寫出一個可以工作的程序並不夠,如果在巨大數據集上運行,那麼運行時間也成了重要問題。
所以學習算法的目之一:對於大量的輸入,估計程序的運行時間,在尚未 具體編碼的情況下比較兩個程序的運行時間。並且改進程序的速度,確定程序瓶頸的方法
補:後面還會看到,如果輸入量不大,而過多設計也是得不償失的,不過不在算法討論範圍內,那可能叫做過度設計
引論中提出的數學概念:
幾何級數:幾何級數是一個數學上的概念,可以表示成
算術級數:又稱等差級數
斐波那契數:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 可證明F(K+1)< (5/3)^(K+1)
數學歸納法:......
如果N整除A-B,那麼我們就說A與B模同餘。無論A還是B被N去除,所得餘數都是相同的。
遞歸簡論:
遞歸的定義:當一個函數用它自己來定義時就稱爲是遞歸的。
C提供的僅僅是遵循遞歸思想的一種企圖,不是所有的數學遞歸函數都能有效的由C的遞歸模擬來實現。
對於數值計算使用遞歸通常不是好主意。
遞歸的基本法則:
1.基準情況
2.不斷推進
3.設計法則
4.合成效益法則:在求解一個問題的同一實例,切勿在不同的遞歸調用中做重複性的工作。
mod操作花消很大:
N%10 = N - [N/10] * 10
引論中心思想原由:
設有一組N個數而要確定其中第K個最大者(選擇問題)。
解法一:冒泡法
就是用冒泡法,把N個數排列起來,取第K個。
該算法就是:想象共有N個氣泡,大的氣泡要往上浮動,由於氣泡是連續的,相臨氣泡做對比,大的氣泡最終到達上面。
然後對剩下的氣泡繼續排序,最終完成了排序。
所以運行時間爲n + (n-1) + (n-2) + .... + 1 = n*(n-1)/2
即時間複雜度O(N^2)
今天仔細寫了一下這個程序,發現一些問題。
根據程序細節,發現一個爲N次的for循環,實際執行次數是2N,判斷N次,加上自增N-1,加上初始值共2N次,每個for循環,係數應該乘以2。
每次冒泡從N個泡,以等差數列遞減,但是遞減過程中是執行了交換操作,每次交換是要執行3次的,所以係數應該乘以3。
綜上,實際計算出來的n*(n-1)/2實際是for循環直接取其執行的次數,而沒有乘以實際的係數。
http://blog.csdn.net/yuzhihui_no1/article/details/44339711#t5有冒泡法詳細說明,我是按照自己理解說明的,以前好象看過一個算法動態圖,但是沒找到。
解法二:
將前K個元素讀入數組,並以遞減的順序排序。接着將剩下的元素讀入,如果有比第K個元素小的,那麼把該元素放在正確的位置上,並擠走第K個元素。
a)先把K個元素排序,假設排序時間爲T1,也可以用冒泡法k*(k-1)/2
b)讀入剩下一個元素,假設正確位置是第一個,則調整數組時間最長,即後面N-1個數整體後移一位,時間爲K
c)繼續插入剩餘的元素,則數組整體調整最長時間爲(N-K )*K
所以運行時間爲 k*(k-1)/2 + (N-K )*K = NK-K^2/2-K/2
至於兩個算法的好壞就應該看K/N的比值了。
實際上相對來說,如果K是有限值,而N是無限值,即K/N 約等於0
那麼第二種算法時間常數接近N
解法三:
第七章有一種方法可以在1S左右給出問題的解。
待補充
雖然前兩個算法能算出結果,但是對於大量數據下,如K=500000下,需要計算若干天才能解決,所以前兩種算法是不切實際的。
這就證明了
對於大量的輸入,估計程序的運行時間,在尚未 具體編碼的情況下比較兩個程序的運行時間。並且改進程序的速度,確定程序瓶頸是算法的考量。
問題2:方格字謎
解法:
可以從(行、列、方向)上逐一組合,並且與單詞表相比較。
如果只給出迷板,單詞表是一本英文字典,則上面的解決方法消耗的時間是可觀的。不過,這樣的問題有可能在數秒內解決的,即使單詞表很大。
待補充(引論挖的坑還真多)
引論數學公式證明:
待補充