1. 動態規劃如何去找動態轉移方程
1、最長公共子串
假設兩個字元串為str1和str2,它們的長度分別為n和m。d[i][j]表示str1中前i個字元與str2中前j個字元分別組成的兩個前綴字元串的最長公共長度。這樣就把長度為n的str1和長度為m的str2劃分成長度為i和長度為j的子問題進行求解。狀態轉移方程如下:
dp[0][j] = 0; (0<=j<=m)
dp[i][0] = 0; (0<=i<=n)
dp[i][j] = dp[i-1][j-1] +1; (str1[i] == str2[j])
dp[i][j] = 0; (str1[i] != str2[j])
因為最長公共子串要求必須在原串中是連續的,所以一但某處出現不匹配的情況,此處的值就重置為0。
詳細代碼請看最長公共子串。
2、最長公共子序列
區分一下,最長公共子序列不同於最長公共子串,序列是保持子序列字元串的下標在str1和str2中的下標順序是遞增的,該字元串在原串中並不一定是連續的。同樣的我們可以假設dp[i][j]表示為字元串str1的前i個字元和字元串str2的前j個字元的最長公共子序列的長度。狀態轉移方程如下:
dp[0][j] = 0; (0<=j<=m)
dp[i][0] = 0; (0<=i<=n)
dp[i][j] = dp[i-1][j-1] +1; (str1[i-1] == str2[j-1])
dp[i][j] = max{dp[i][j-1],dp[i-1][j]}; (str1[i-1] != str2[j-1])
詳細代碼請看最長公共子序列。
3、最長遞增子序列(最長遞減子序列)
因為兩者的思路都是一樣的,所以只給出最長遞減子序列的狀態轉移方程。假設有序列{a1,a2,...,an},我們求其最長遞增子序列長度。按照遞推求解的思想,我們用F[i]代表若遞增子序列以ai結束時它的最長長度。當 i 較小,我們容易直接得出其值,如 F[1] = 1。那麼,如何由已經求得的 F[i]值推得後面的值呢?假設,F[1]到F[x-1]的值都已經確定,注意到,以ax 結尾的遞增子序列,除了長度為1的情況,其它情況中,ax都是緊跟在一個由 ai(i < x)組成遞增子序列之後。要求以ax結尾的最長遞增子序列長度,我們依次比較 ax 與其之前所有的 ai(i < x), 若ai小於 ax,則說明ax可以跟在以ai結尾的遞增子序列之後,形成一個新的遞 增子序列。又因為以ai結尾的遞增子序列最長長度已經求得,那麼在這種情況下,由以 ai 結尾的最長遞增子序列再加上 ax 得到的新的序列,其長度也可以確定,取所有這些長度的最大值,我們即能得到 F[x]的值。特殊的,當沒有ai(i < x)小 於ax, 那麼以 ax 結尾的遞增子序列最長長度為1。 即F[x] = max{1,F[i]+1|ai<ax && i<x}。
詳細代碼請看最長遞增子序列。
4、最大子序列和的問題
假設有序列{a1,a2,...,an},求子序列的和最大問題,我們用dp[i]表示以ai結尾的子序列的最大和。
dp[1] = a1; (a1>=0 && i == 1)
dp[i] = dp[i-1]+ai; (ai>=0 && i>=2)
dp[i] = 0; (dp[i-1] + ai <=0 && i>=2)
詳細代碼請看最大子序列的和。
5、數塔問題(動態搜索)
給定一個數組data[n][m]構成一個數塔求從最上面走到最低端經過的路徑和最大。可以假設dp[i][j]表示走到第i行第j列位置處的最大值,那麼可以推出狀態轉移方程:
dp[i][j] = max{dp[i-1][j-1],dp[i-1][j]} + data[i][j];
View Code
6、(01)背包問題
這是一個經典的動態規劃問題,另外在貪心演算法里也有背包問題,至於二者的區別在此就不做介紹了。
假設有N件物品和一個容量為V的背包。第i件物品的體積是v[i],價值是c[i],將哪些物品裝入背包可使價值總和最大?
每一種物品都有兩種可能即放入背包或者不放入背包。可以用dp[i][j]表示第i件物品放入容量為j的背包所得的最大價值,則狀態轉移方程可以推出如下:
dp[i][j]=max{dp[i-1][j-v[i]]+c[i],dp[i-1][j]};
View Code
可以參照動態規劃 - 0-1背包問題的演算法優化、動態規劃-完全背包問題、動態規劃-多重背包問題
7、矩陣連乘(矩陣鏈問題)-參考《演算法導論》
例如矩陣鏈<A1,A2,A3>,它們的維數分別為10*100,100*5,5*50,那麼如果順序相乘即((A1A2)A3),共需10*100*5 + 10*5*50 = 7500次乘法,如果按照(A1(A2A3))順序相乘,卻需做100*5*50 + 10*100*50 = 75000次乘法。兩者之間相差了10倍,所以說矩陣鏈的相乘順序也決定了計算量的大小。
我們用利用動態規劃的方式(dp[i][j]表示第i個矩陣至第j個矩陣這段的最優解,還有對於兩個矩陣A(i,j)*B(j,k)則需要i*j*k次乘法),推出狀態轉移方程:
dp[i][j] = 0; (i ==j,表示只有一個矩陣,計算次數為0)
dp[i][j] = min{dp[i][k] + dp[k+1][j] + p[i-1]*p[k]*p[j]}; (i<j && i<=k<j)
dp[1][n]即為最終求解.
View Code
2. 為什麼有人說弄懂了《演算法導論》的90%,就超越了90%的程序員
其實計算機程序底層核心就是各種數學演算法,剩下就是怎麼用代碼去實現數學,世界上有名的計算機程序大牛幾乎都跟數學權威方面的專家有關。
從另一個角度回答,因為就算看懂百分百,也很難超越另外的百分之十
很多程序員沒讀過演算法導論
其實不管是對於在校生來說還是已經工作的程序員,一般很少都會接觸演算法。
學生的話也只有計算機相關專業的開設了數據結構和演算法相關課程的才需要用到,但如果只是對付期末考試的話也沒啥難度。
但是如果在大學期間接觸到演算法競賽就不一樣了,需要花費比較多的精力。
的確在工資上任何公司都是10%的演算法大佬拿的工資比其他90%的業務開發程序員或者其他的程序員都要高,不過就憑只懂《演算法導論》這本書的話還是不太行的,演算法離不開業務的。就算超越也是超越那10%的演算法工程師里的90%,如果能達到這個境界別說BAT了,微軟谷歌都是可以考慮的。
說這個話在我看來他可能是想賣課,賣完再慢慢告訴你,「學到90%也沒有那麼容易」,或者「在刷我這套題這件事上超越90%的程序員 並不等於收入上超越90%的程序員」。
你多去拼多多參加幾個活動,在文字 游戲 和預期管理上你應該就懂了;要是還不懂,大概你也不是那麼適合做這一行以及演算法導論。
公式:弄懂+一本名著+百分比+超越+百分比+你的群體。
例句:
弄懂sicp的67.9%,你就超越了95%的程序員。
弄懂本草綱目的72%,你就超越了93.7%的中醫。
弄懂冰箱說明書的83%,你就超越了99.9%的冰箱使用者(這也許是最真實的,雖然冰箱說明書不是名著……)
至於為什麼這么說……個人覺得就是對xx東西的一種崇拜,很大程度上是人雲亦雲。
演算法導論是本不會動的書,不同人讀效果不一樣的。不要神化某一本書,參差多態乃幸福本源。不看演算法導論你也可以會演算法,你也可以會數據結構,你也可以進大廠。沒有演算法導論的時候也依然有研究演算法的科學家。你能通過他學會知識很好,但你覺得它晦澀,搞不懂,沒有c的代碼讓你學的不舒服,那就不看他。
人生中見書,書中見人生。讀書有時候不一定是為了學東西,可能更多的是一種享受。就像你沒學看過csapp之前,通過各種課程,學了零零碎碎的知識。忽然有一天你看了csapp,你覺得好過癮啊,好爽啊。你覺得你學習的第一天就看csapp能有這種效果嗎?
好書不會變少只會變多,更何況幫到你的也未必需要是好書。也許一本書只是很普通的書,不嚴謹,還都是大白話,但未必就幫不到你。
學東西莫要搞崇拜。很多程序員學習的時候都不是通過演算法導論這本書學的,可他們依然很傑出。
程序員來回答一下:
1.《演算法導論》這本書理論來說90%程序員也沒弄懂,所以你弄懂了就超過了90%。
2.其實程序員是一個大的行業,IT也是一個大的行業,門外人看著都是一群寫程序的,修電腦的,更有人認為是裝電腦系統的,你被別人交過去裝過系統嗎?
3.程序員架構上來說,嵌入式 協議棧 應用 網路 伺服器 工具 系統 等等等!
4.有一些行業是不需要看演算法導論的,更有一些轉行過來的,應該更不太了解演算法導論。
這本書在美國的大學被稱為clrs, 是標準的本科高年級和研究生入門的演算法課課本。優點是比較全面的講解了常用和基本的演算法,習題質量不錯。問題是動態規劃講的不好,篇幅原因一些近代的演算法沒有概括。總的來說是本不錯的演算法入門教科書。
演算法是計算機科學的核心。計算理論偏數學,編譯原理和操作系統偏硬體,真正計算機科學的核心就是演算法。無論做研究還是搞工程,都是必不可少的。
程序是給人看的,不是給機器。寫給機器的程序誰都可以寫出來,但不是每個程序員都能寫出別人看懂的東西
程序是什麼,程序就是數據結構和演算法,弄懂了超90%的程序員不是很正常嘛
看懂2%就超過了80%,沒必要看那麼多
因為這本書翻譯的很枯燥、也很理解,這種情況下你還理解了90%,說明你有耐心,有恆心,耐得住寂寞。我相信不只是做程序員,做其它行業也會很優秀。
3. 《演算法導論》有什麼好的學習心得
本人沒有讀過這本書,文化水平不夠,就算讀了估計也是不知所雲,這個應該是比較專業的人看的吧,那我只能從網上摘錄些供大家分享。
推薦每學一個演算法,就去各個OJ(Online Judge)找一些相關題目做做,有時理論讓人很無語,分析代碼也是一個不錯的選擇。
4. java數據結構書籍推薦
1. 入門級
針對剛入門的同學,建議不要急著去看那些經典書,像《演算法導論》、《演算法》這些比較經典、權威的書。雖然書很好,但看起來很費勁,如果看不完,效果會很不好。所以建議先看兩本入門級的趣味書:
《大話數據結構》
《演算法圖解》
大話數據結構
將理論講的很有趣,不枯燥。作者結合生活中的例子去對每個數據結構和演算法進行講解,讓人通俗易懂。
演算法圖解
這是一本像小說一樣有趣的演算法入門書,書中有大量的圖解,通俗易懂。
看完上面一本或兩本入門級的書,你就會對數據結構和演算法有個大概認識和學習。但這些入門級的書缺少細節、不夠系統。所以想要深入的學習數據結構和演算法,光看這兩本書肯定是不夠的。
2. 不同語言的教科書
國內外很多大學都是將《數據結構和演算法分析》作為教科書。這本書非常系統、嚴謹、全面,難度適中,很適合對數據結構和演算法有些了解,並且已經掌握了至少一門語言的同學學習。針對不同的語言,分別有:
《數據結構與演算法分析:C語言描述》
《數據結構與演算法分析:C++描述》
《數據結構與演算法分析:java語言描述》
如果你不會C、C++、java,會Python或者JavaScript,可以看:
《數據結構與演算法JavaScript描述》
《數據結構與演算法:Python語言描述》
3. 面試書籍
現在很多大廠的面試都會考演算法題,這里推薦幾本面試演算法書籍:
《劍指offer》
《編程珠璣》
《編程之美》
劍指offer
為面試演算法量身定做的一本書。幾乎包含了所有常見的、經典的面試題,如果能搞懂書裡面的內容,一般公司的演算法面試都應該沒問題。
編程珠璣
這本書豆瓣評分有9分,評分很高。這本書最大的特色是講了很多海量數據的處理技巧。其他演算法書籍很少涉及海量數據。
編程之美
有些作者是微軟工程師,演算法題目較難,比較適合要面試Google、Facebook這樣的公司的人去看。
4. 經典書籍
現在數據結構與演算法最經典的書籍就是:
《演算法導論》
《演算法》
《計算機程序設計藝術》
這三本書非常經典,但都很厚,看起來比較費勁,估計很少有人能全部看完。但如果想更深入地學一遍數據結構和演算法,還是建議去看看。
演算法導論
章節安排不是循序漸進,裡面有各種演算法正確性、復雜度的證明、推導,對數學功底有一定要求,看起來有些費勁。
演算法
偏重講演算法。內容不夠全面,對數據結構方面的知識講的不多,動態規劃這么重要的知識點卻沒有講。
計算機程序設計藝術
這本書包括很多卷,相比於其他書籍有更好的深度、廣度、系統性和全面性。但如果你對數據結構和演算法不是特別感興趣,沒有很好的數學、演算法、計算機基礎,很難把這本書讀完、讀懂。
5. 課外閱讀
有些演算法書籍也比較適合在平時悠閑的時候翻翻看看:
《演算法帝國》
《數學之美》
《演算法之美》
這些書都列舉了大量的列子來解釋說明,非常通俗易懂。
5. 演算法導論 第二版 第三版的區別
第三版比第二版去掉了幾章,例如排序網路之類的冷門演算法,加入了並行演算法等熱門的內容。
動態規劃這一章做了些修改,論述的內容不變,就是選的例子更好一些。
另外第三版更新了一些習題和思考題,所以習題編號肯定有變化。說實話,思考題才是此書最精彩的地方,但是一般人看《演算法導論》,能把前面的演算法描述搞清楚就不錯了,90%的讀者會略過演算法復雜度分析部分,而最後的每一章的思考題部分,99%的讀者都不會去看的。
因為之前看過第二版的大部分,所以我第三版讀起來沒有太多障礙。
如果你能把思考題都解決了,你在簡歷上寫個精通《演算法導論》也是理直氣壯的。
6. 動態規劃 最長公共子序列 過程圖解
首先需要科普一下,最長公共子序列(longest common sequence)和最長公共子串(longest common substring)不是一回事兒。
這里給出一個例子:有兩個母串
cnblogs
belong
比如序列bo, bg, lg在母串cnblogs與belong中都出現過並且出現順序與母串保持一致,我們將其稱為公共子序列。最長公共子序列(Longest Common Subsequence,LCS),顧名思義,是指在所有的子序列中最長的那一個。
子串是要求更嚴格的一種子序列, 要求在母串中連續地出現 。
在上述例子的中,最長公共子序列為blog(cnblogs,belong),最長公共子串為lo(cnblogs, belong)。
給一個圖再解釋一下:
如上圖,給定的字元序列: {a,b,c,d,e,f,g,h},它的子序列示例: {a,c,e,f} 即元素b,d,g,h被去掉後,保持原有的元素序列所得到的結果就是子序列。同理,{a,h},{c,d,e}等都是它的子序列。
它的子串示例:{c,d,e,f} 即連續元素c,d,e,f組成的串是給定序列的子串。同理,{a,b,c,d},{g,h}等都是它的子串。
這個問題說明白後,最長公共子序列(以下都簡稱LCS)就很好理解了。
給定序列s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2},s1和s2的相同子序列,且該子序列的長度最長,即是LCS。
s1和s2的其中一個最長公共子序列是 {3,4,6,7,8}
求解LCS問題,不能使用暴力搜索方法。 一個長度為n的序列擁有 2的n次方個子序列,它的時間復雜度是指數階 ,太恐怖了。解決LCS問題,需要藉助動態規劃的思想。
動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的問題,經分解得到子問題往往不是互相獨立的。若用分治法來解這類問題,則分解得到的子問題數目太多,有些子問題被重復計算了很多次。 為了避免大量的重復計算,節省時間,我們引入一個數組,不管它們是否對最終解有用,把所有子問題的解存於該數組中,這就是動態規劃法所採用的基本方法。
解決LCS問題,需要把原問題分解成若干個子問題,所以需要刻畫LCS的特徵。
設A=「a0,a1,…,am」,B=「b0,b1,…,bn」,且Z=「z0,z1,…,zk」為它們的最長公共子序列。不難證明有以下性質:
如果am=bn,則zk=am=bn,且「z0,z1,…,z(k-1)」是「a0,a1,…,a(m-1)」和「b0,b1,…,b(n-1)」的一個最長公共子序列;
如果am!=bn,則若zk!=am,蘊涵「z0,z1,…,zk」是「a0,a1,…,a(m-1)」和「b0,b1,…,bn」的一個最長公共子序列;
如果am!=bn,則若zk!=bn,蘊涵「z0,z1,…,zk」是「a0,a1,…,am」和「b0,b1,…,b(n-1)」的一個最長公共子序列。
有些同學,一看性質就容易暈菜,所以我給出一個圖來讓這些同學理解一下:
以我在第1小節舉的例子(S1={1,3,4,5,6,7,7,8}和S2={3,5,7,4,8,6,7,8,2}),並結合上圖來說:
假如S1的最後一個元素 與 S2的最後一個元素相等,那麼S1和S2的LCS就等於 {S1減去最後一個元素} 與 {S2減去最後一個元素} 的 LCS 再加上 S1和S2相等的最後一個元素。
假如S1的最後一個元素 與 S2的最後一個元素不等(本例子就是屬於這種情況),那麼S1和S2的LCS就等於 : {S1減去最後一個元素} 與 S2 的LCS, {S2減去最後一個元素} 與 S1 的LCS 中的最大的那個序列。
假設Z=<z1,z2,⋯,zk>是X與Y的LCS, 我們觀察到
如果Xm=Yn,則Zk=Xm=Yn,有Zk−1是Xm−1與Yn−1的LCS;
如果Xm≠Yn,則Zk是Xm與Yn−1的LCS,或者是Xm−1與Yn的LCS。
因此,求解LCS的問題則變成遞歸求解的兩個子問題。但是,上述的遞歸求解的辦法中, 重復的子問題多,效率低下。改進的辦法——用空間換時間,用數組保存中間狀態,方便後面的計算。這就是動態規劃(DP)的核心思想了。
DP求解LCS
用二維數組c[i][j]記錄串x1x2⋯xi與y1y2⋯yj的LCS長度,則可得到狀態轉移方程
以s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2}為例。我們借用《演算法導論》中的推導圖:
圖中的空白格子需要填上相應的數字(這個數字就是c[i,j]的定義,記錄的LCS的長度值)。填的規則依據遞歸公式,簡單來說:如果橫豎(i,j)對應的兩個元素相等,該格子的值 = c[i-1,j-1] + 1。如果不等,取c[i-1,j] 和 c[i,j-1]的最大值。首先初始化該表:
S1的元素3 與 S2的元素5 不等,c[2,2] =max(c[1,2],c[2,1]),圖中c[1,2] 和 c[2,1] 背景色為淺黃色。
繼續填充:
至此,該表填完。根據性質,c[8,9] = S1 和 S2 的 LCS的長度,即為5。
本文S1和S2的最LCS並不是只有1個,本文並不是著重講輸出兩個序列的所有LCS,只是介紹如何通過上表,輸出其中一個LCS。
我們根據遞歸公式構建了上表,我們將從最後一個元素c[8][9]倒推出S1和S2的LCS。
c[8][9] = 5,且S1[8] != S2[9],所以倒推回去,c[8][9]的值來源於c[8][8]的值(因為c[8][8] > c[7][9])。
c[8][8] = 5, 且S1[8] = S2[8], 所以倒推回去,c[8][8]的值來源於 c[7][7]。
以此類推,如果遇到S1[i] != S2[j] ,且c[i-1][j] = c[i][j-1] 這種存在分支的情況,這里請都選擇一個方向(之後遇到這樣的情況,也選擇相同的方向)。
這就是倒推回去的路徑,棕色方格為相等元素,即LCS = {3,4,6,7,8},這是其中一個結果。
如果如果遇到S1[i] != S2[j] ,且c[i-1][j] = c[i][j-1] 這種存在分支的情況,選擇另一個方向,會得到另一個結果。
即LCS ={3,5,7,7,8}。
構建c[i][j]表需要Θ(mn),輸出1個LCS的序列需要Θ(m+n)。
參考:
https://blog.csdn.net/hrn1216/article/details/51534607
https://blog.csdn.net/u012102306/article/details/53184446
7. 計算機科學的「兩本聖經」是什麼
第一本:《演算法導論》原書名——《Introction to Algorithms》,
第二本:高德納(Donald E.Knuth)的《計算機程序設計藝術》(《The Art Of Computer Programming》)
計算機科學是一門包含各種各樣與計算和信息處理相關主題的系統學科,從抽象的演算法分析、形式化語法等等,到更具體的主題如編程語言、程序設計、軟體和硬體等。計算機科學分為理論計算機科學和實驗計算機科學兩個部分。
(7)演算法導論動態規劃擴展閱讀:
研究課題
①、計算機程序能做什麼和不能做什麼(可計算性);
②、如何使程序更高效的執行特定任務(演算法和復雜性理論);
③、程序如何存取不同類型的數據(數據結構和資料庫);
④、程序如何顯得更具有智能(人工智慧);
⑤、人類如何與程序溝通(人機互動和人機界面)。
相關獎項
計算機科學領域的最高榮譽是ACM設立的圖靈獎,被譽為是計算機科學的諾貝爾獎。它的獲得者都是本領域最為出色的科學家和先驅。華人中首獲圖靈獎的是姚期智先生.他於2000年以其對計算理論做出的諸多「根本性的、意義重大的」貢獻而獲得這一崇高榮譽。
專業介紹
培養目標
本專業培養德、智、體全面發展,具有計算機應用技術的基礎理論知識,具備計算機及相關設備的維護與維修、行業應用軟體、平面圖像處理、廣告設計製作、動畫製作、計算機網路及網站建設與管理、資料庫管理與維護等應用能力和操作能力的高等技術應用性人才。
計算機應用基礎、計算機組裝與維護、計算機區域網絡的建設與管理、網路工程、操作系統、伺服器、資料庫的開發與應用、網站建設與網頁設計、C/C++語言、Visual Basic語言、平面設計、3D圖形設計、多媒體設計、專業英語。
就業方向
畢業生主要面向交通系統各單位、交通信息化與電子政務建設與應用部門、各類計算機專業化公司、廣告設計製作公司、汽車營銷技術服務等從事IT行業工作。
參考資料:網路-計算機科學
8. 計算機科學的「兩本聖經」是什麼
科曼的《演算法導論》和高德納的《計算機程序設計藝術》被稱為計算機科學的兩本經典著作,被業界戲稱為「兩本聖經」
科曼的《演算法導論》這本書深入淺出,全面地介紹了計算機演算法。對每一個演算法的分析既易於理解又十分有趣,並保持了數學嚴謹性。涵蓋的內容有:演算法在計算中的作用,概率分析和隨機演算法的介紹。
《演算法導論》書中專門討論了線性規劃,介紹了動態規劃的兩個應用,隨機化和線性規劃技術的近似演算法等,還有有關遞歸求解、快速排序中用到的劃分方法與期望線性時間順序統計演算法,以及對貪心演算法元素的討論。
高德納的《計算機程序設計藝術》這本書結合大量數學知識,分析不同應用領域中的各種演算法,研究演算法的復雜性,即演算法的時間、空間效率,探討各種適用演算法等,其理論和實踐價值得到了全世界計算機工作者的公認。
(8)演算法導論動態規劃擴展閱讀
《演算法導論》自第一版出版以來,已經成為世界范圍內廣泛使用的大學教材和專業人員的標准參考手冊。本書全面論述了演算法的內容,從一定深度上涵蓋了演算法的諸多方面,同時其講授和分析方法又兼顧了各個層次讀者的接受能力。
《演算法導論》所有演算法都是用英文和偽碼描述,使具備初步編程經驗的人也可讀懂。全書講解通俗易懂,且不失深度和數學上的嚴謹性。第二版增加了新的章節,如演算法作用、概率分析與隨機演算法、線性編程等,幾乎對第一版的各個部分都作了大量修訂。
《計算機程序設計藝術》書中引入的許多術語、得到的許多結論都變成了計算機領域的標准術語和被廣泛引用的結果。另外,作者對有關領域的科學發展史也有深入研究,因此本書介紹眾多研究成果的同時,也對其歷史淵源和發展過程做了很好的介紹,這種特色在全球科學著作中是不多見的。
參考資料網路--計算機科學
網路--計算機程序設計藝術
網路--演算法導論
9. 演算法導論的內容簡介
《演算法導論》自第一版出版以來,已經成為世界范圍內廣泛使用的大學教材和專業人員的標准參考手冊。本書全面論述了演算法的內容,從一定深度上涵蓋了演算法的諸多方面,同時其講授和分析方法又兼顧了各個層次讀者的接受能力。各章內容自成體系,可作為獨立單元學習。所有演算法都用英文和偽碼描述,使具備初步編程經驗的人也可讀懂。全書講解通俗易懂,且不失深度和數學上的嚴謹性。第二版增加了新的章節,如演算法作用、概率分析與隨機演算法、線性編程等,幾乎對第一版的各個部分都作了大量修訂。
本書深入淺出,全面地介紹了計算機演算法。對每一個演算法的分析既易於理解又十分有趣,並保持了數學嚴謹性。本書的設計目標全面,適用於多種用途。涵蓋的內容有:演算法在計算中的作用,概率分析和隨機演算法的介紹。本書專門討論了線性規劃,介紹了動態規劃的兩個應用,隨機化和線性規劃技術的近似演算法等,還有有關遞歸求解、快速排序中用到的劃分方法與期望線性時間順序統計演算法,以及對貪心演算法元素的討論。本書還介紹了對強連通子圖演算法正確性的證明,對哈密頓迴路和子集求和問題的NP完全性的證明等內容。全書提供了900多個練習題和思考題以及敘述較為詳細的實例研究。
本書內容豐富,對本科生的數據結構課程和研究生的演算法課程都是很實用的教材。本書在讀者的職業生涯中,也是一本案頭的數學參考書或工程實踐手冊。
10. 為什麼演算法導論中的數組序號是從1開始的
c語言下標從零開始是個錯誤,並且 index 也是一個有誤導性的名詞,它表示的是偏移量,明明應該用 offset。
然後 c 的徒子徒孫都學了它,導致現在很多人都誤以為下標應該從 0 開始。
早期蠻荒時代,很多東西都不科學,演算法導論作者致力於與落後文明作斗爭,然而卻遭到了樓主你的不理解,實乃編程屆一大憾事。
我再說一遍,C 是結構化的匯編,下標基 0 是受到了 PDP-11 指令集的影響,更老的語言(比如 Fortran)都是基 1 的。
另外用 0/非 0 代表 false/true 也是 PDP-11 中 TST 指令和 Z 位的行為。
可能是這本書強調演算法的求學思想,所以從一更加符合數學的數組規定。
但是編程的時候,指針這個東西會經常用到,如果用a(o)作為第一個元素 那麼*a+n就等同於a(n) 比較方便
演算法導論上的這個問題呢,我覺得我比較同意樓上的看法,這個書上面的很多的程序並不是可以敲上去直接運行的,他只是偽代碼,思想而已,給人看的,人類的普遍思維是從1開始,那麼書頁就是從1開始了
說編程語言是給機器看而偽代碼是給人看的簡直是逗大家笑吧...編程語言設計出來就是給人看的....
另外從0開始在很多方便都極好....我覺得寫多代碼都能體會到吧..
幫算導洗地:
演算法導論通篇用的是偽代碼 是給人類閱讀理解的 不是設計給機器去運行的
而絕大多數情況下, index 從 1 開始更符合人類直覺(如果你對這點有異議請參考的答案 )
但少數情況下, index 從 0 開始更符合人類直覺。例如書中 hashing 還有 FFT 那塊內容, index 是從 0 開始的。
其實寫幾天 Pascal 你就適應啦。。