這是一本零基礎就能讀懂的算法書籍,讀者不需要因為自己沒有語言基礎而畏懼。書籍的第2章便是一個C語言的入門教程,內容非常易懂,并且十分實用,閱讀完這章就可以對本書需要的C語言基礎有一個較好的掌握。本書已經覆蓋了大部分基礎經典算法,不僅可以作為考研機試和PAT的學習教材,對其他的一些算法考試(例如CCF的CSP考試)或者考研初試的數(shù)據(jù)結構科目的學習和理解也很有幫助,甚至僅僅想學習經典算法的讀者也能從本書中學到許多知識,本書還有配套的《算法筆記上機訓練實戰(zhàn)指南》本書的作者是同樣經歷過考研機試和各類算法考試的專家型學長,知曉這類考試中的痛點,以及考生在學習算法時容易產生困惑的地方,因此可以把本書看作是學長為你奉獻的滿滿的經驗干貨,這是*有價值的東西。本書的*個試印版本獻給了浙大考研學子,并令當年的浙大考研機試平均分增加了十多分,收獲了考生的大量好評。但作者并沒有止步于此,經過了半年多時間的內容完善和補充之后,新的版本在新一年的考研機試中再次獲得了考生的一致贊美。*后,在經過精心整理之后,書籍終于定稿,并編撰成書。我們知道,紙質書籍的一個弱點就在于不能像軟件一樣隨時更新內容,但本書采用了與二維碼相結合的方式,使得本書變?yōu)槟軌螂S時更新內容的書籍,讀者也可以隨時從二維碼中找到勘誤。這種作者和讀者能夠相互溝通的方式讓書籍變“活”了,也能夠幫助提升讀者對知識的理解。 本書內容包括:C/C快速入門、入門模擬、算法初步、數(shù)學問題、C標準模板庫(STL)、數(shù)據(jù)結構專題(二章)、搜索專題、圖算法專題、動態(tài)規(guī)劃專題、字符串專題、專題擴展。本書印有二維碼,用來實時更新、補充內容及發(fā)布勘誤的。本書可作為計算機專業(yè)研究生入學考試復試上機、各類算法等級考試(如PAT、CSP等)的輔導書,也可作為“數(shù)據(jù)結構”科目的考研教材及輔導書內容的補充。本書還是學習C語言、數(shù)據(jù)結構與算法的入門輔導書,非常適合零基礎的學習者對經典算法進行學習。 目錄: 前言第1章如何使用本書 11.1本書的基本內容 11.2如何選擇編程語言和編譯器 11.3在線評測系統(tǒng) 21.4常見的評測結果 31.5如何高效地做題 4第2章C/C快速入前言第1章 如何使用本書11.1 本書的基本內容11.2 如何選擇編程語言和編譯器11.3 在線評測系統(tǒng)21.4 常見的評測結果31.5 如何高效地做題4第2章 C/C快速入門52.1 基本數(shù)據(jù)類型72.1.1 變量的定義72.1.2 變量類型72.1.3 強制類型轉換112.1.4 符號常量和const常量122.1.5 運算符142.2 順序結構172.2.1 賦值表達式172.2.2 使用scanf和printf輸入/輸出182.2.3 使用getchar和putchar輸入/輸出字符232.2.4 注釋242.2.5 typedef242.2.6 常用math函數(shù)252.3 選擇結構282.3.1 if語句282.3.2 if語句的嵌套312.3.3 switch語句322.4 循環(huán)結構342.4.1 while語句342.4.2 dowhile語句352.4.3 for語句362.4.4 break和continue語句382.5 數(shù)組392.5.1 一維數(shù)組392.5.2 冒泡排序412.5.3 二維數(shù)組432.5.4 memset——對數(shù)組中每一個元素賦相同的值462.5.5 字符數(shù)組472.5.6 string.h頭文件502.5.7 sscanf與sprintf532.6 函數(shù)552.6.1 函數(shù)的定義552.6.2 再談main函數(shù)582.6.3 以數(shù)組作為函數(shù)參數(shù)582.6.4 函數(shù)的嵌套調用592.6.5 函數(shù)的遞歸調用602.7 指針612.7.1 什么是指針612.7.2 指針變量622.7.3 指針與數(shù)組632.7.4 使用指針變量作為函數(shù)參數(shù)652.7.5 引用682.8 結構體(struct)的使用702.8.1 結構體的定義702.8.2 訪問結構體內的元素712.8.3 結構體的初始化722.9 補充742.9.1 cin與cout742.9.2 浮點數(shù)的比較752.9.3 復雜度782.10 黑盒測試802.10.1 單點測試802.10.2 多點測試80第3章 入門篇(1)——入門模擬853.1 簡單模擬853.2 查找元素873.3 圖形輸出893.4 日期處理913.5 進制轉換933.6 字符串處理95第4章 入門篇(2)——算法初步994.1 排序994.1.1 選擇排序994.1.2 插入排序1004.1.3 排序題與sort函數(shù)的應用1014.2 散列1064.2.1 散列的定義與整數(shù)散列1064.2.2 字符串hash初步1094.3 遞歸1114.3.1 分治1114.3.2 遞歸1124.4 貪心1184.4.1 簡單貪心1184.4.2 區(qū)間貪心1224.5 二分1244.5.1 二分查找1244.5.2 二分法拓展1314.5.3 快速冪1344.6 twopointers1374.6.1 什么是twopointers1374.6.2 歸并排序1394.6.3 快速排序1424.7 其他高效技巧與算法1464.7.1 打表1464.7.2 活用遞推1474.7.3 隨機選擇算法149第5章 入門篇(3)——數(shù)學問題1525.1 簡單數(shù)學1525.2 最大公約數(shù)與最小公倍數(shù)1545.2.1 最大公約數(shù)1545.2.2 最小公倍數(shù)1565.3 分數(shù)的四則運算1565.3.1 分數(shù)的表示和化簡1575.3.2 分數(shù)的四則運算1575.3.3 分數(shù)的輸出1595.4 素數(shù)1595.4.1 素數(shù)的判斷1605.4.2 素數(shù)表的獲取1605.5 質因子分解1655.6 大整數(shù)運算1705.6.1 大整數(shù)的存儲1705.6.2 大整數(shù)的四則運算1715.7 擴展歐幾里得算法1765.8 組合數(shù)1815.8.1 關于n!的一個問題1815.8.2 組合數(shù)的計算183第6章 C標準模板庫(STL)介紹1916.1 vector的常見用法詳解1916.2 set的常見用法詳解1976.3 string的常見用法詳解2026.4 map的常用用法詳解2136.5 queue的常見用法詳解2186.6 priority_queue的常見用法詳解2216.7 stack的常見用法詳解2276.8 pair的常見用法詳解2306.9 algorithm頭文件下的常用函數(shù)2326.9.1 max()、min()和abs()2326.9.2 swap()2336.9.3 reverse()2336.9.4 next_permutation()2346.9.5 fill()2356.9.6 sort()2356.9.7 lower_bound()和upper_bound()242第7章 提高篇(1)——數(shù)據(jù)結構專題(1)2457.1 棧的應用2457.2 隊列的應用2517.3 鏈表處理2537.3.1 鏈表的概念2537.3.2 使用malloc函數(shù)或new運算符為鏈表結點分配內存空間2547.3.3 鏈表的基本操作2567.3.4 靜態(tài)鏈表260第8章 提高篇(2)——搜索專題2698.1 深度優(yōu)先搜索(DFS)2698.2 廣度優(yōu)先搜索(BFS)274第9章 提高篇(3)——數(shù)據(jù)結構專題(2)2839.1 樹與二叉樹2839.1.1 樹的定義與性質2839.1.2 二叉樹的遞歸定義2849.1.3 二叉樹的存儲結構與基本操作2859.2 二叉樹的遍歷2899.2.1 先序遍歷2899.2.2 中序遍歷2909.2.3 后序遍歷2919.2.4 層序遍歷2929.2.5 二叉樹的靜態(tài)實現(xiàn)2989.3 樹的遍歷3029.3.1 樹的靜態(tài)寫法3029.3.2 樹的先根遍歷3039.3.3 樹的層序遍歷3039.3.4 從樹的遍歷看DFS與BFS3049.4 二叉查找樹(BST)3109.4.1 二叉查找樹的定義3109.4.2 二叉查找樹的基本操作3109.4.3 二叉查找樹的性質3149.5 平衡二叉樹(AVL樹)3199.5.1 平衡二叉樹的定義3199.5.2 平衡二叉樹的基本操作3209.6 并查集3289.6.1 并查集的定義3289.6.2 并查集的基本操作3289.6.3 路徑壓縮3309.7 堆3359.7.1 堆的定義與基本操作3359.7.2 堆排序3399.8 哈夫曼樹3429.8.1 哈夫曼樹3429.8.2 哈弗曼編碼345第10章 提高篇(4)——圖算法專題34710.1 圖的定義和相關術語34710.2 圖的存儲34810.2.1 鄰接矩陣34810.2.2 鄰接表34810.3 圖的遍歷35010.3.1 采用深度優(yōu)先搜索(DFS)法遍歷圖35010.3.2 采用廣度優(yōu)先搜索(BFS)法遍歷圖35910.4 最短路徑36710.4.1 Dijkstra算法36710.4.2 Bellman-Ford算法和SPFA算法39110.4.3 Floyd算法39810.5 最小生成樹40010.5.1 最小生成樹及其性質40010.5.2 prim算法40110.5.3 kruskal算法40910.6 拓撲排序41410.6.1 有向無環(huán)圖41410.6.2 拓撲排序41510.7 關鍵路徑41710.7.1 AOV網(wǎng)和AOE網(wǎng)41710.7.2 最長路徑41910.7.3 關鍵路徑419第11章 提高篇(5)——動態(tài)規(guī)劃專題42511.1 動態(tài)規(guī)劃的遞歸寫法和遞推寫法42511.1.1 什么是動態(tài)規(guī)劃42511.1.2 動態(tài)規(guī)劃的遞歸寫法42511.1.3 動態(tài)規(guī)劃的遞推寫法42611.2 最大連續(xù)子序列和42911.3 最長不下降子序列(LIS)43211.4 最長公共子序列(LCS)43411.5 最長回文子串43611.6 DAG最長路43911.7 背包問題44211.7.1 多階段動態(tài)規(guī)劃問題44211.7.2 01背包問題44311.7.3 完全背包問題44611.8 總結447第12章 提高篇(6)——字符串專題44912.1 字符串hash進階44912.2 KMP算法45512.2.1 next數(shù)組45612.2.2 KMP算法45812.2.3 從有限狀態(tài)自動機的角度看待KMP算法463第13章 專題擴展46513.1 分塊思想46513.2 樹狀數(shù)組(BIT)47013.2.1 lowbit運算47013.2.2 樹狀數(shù)組及其應用470參考文獻481前言最初打算寫這本書是在自己剛考完研之后。那段時間,我每天都在浙江大學天勤考研群里給學弟學妹們答疑,在感受著他們的努力與進步的同時,自己仿佛又經歷了一次考研,感最初打算寫這本書是在自己剛考完研之后。那段時間,我每天都在浙江大學天勤考研群里給學弟學妹們答疑,在感受著他們的努力與進步的同時,自己仿佛又經歷了一次考研,感慨頗多。漸漸地,出于興趣,我感覺自己還能為他們做些什么,于是便萌生了寫一些東西的想法。由于浙江大學機試就是PAT考試,因此一開始只是打算把PAT考試題目的題解都寫一遍,但是在寫作過程中慢慢發(fā)現(xiàn),題解本身并不能給人帶來太多的提高,而算法思想的理解和學習才是最為重要的?紤]到當時的算法入門書籍要么偏重于競賽風格,要么偏重于面試風格,因此我便打算寫一本適用于考研機試與PAT的算法書籍,以供考研的學弟學妹們學習。因為浙江機試的考試范圍已經能覆蓋大部分學校的機試范圍,所以對于報考其他學校的同學也同樣適用。第一次試印的版本給當年浙江大學機試的平均分提高了十多分,反響不錯。但我深知書中仍有許多不足,也有許多想要添加的內容沒來得及加進去,因此便又花費了半年時間增加了許多內容。至此,本書已經覆蓋了大部分基礎經典算法,不僅可以作為考研機試和PAT的學習教材,對其他的一些算法考試(例如CCF的CSP考試)或者考研初試的數(shù)據(jù)結構科目的學習和理解也很有幫助,甚至僅僅想學習經典算法的讀者也能從本書中學到許多知識。由于書中很多內容都來源于自己對算法的理解,因此最終把書名定為《算法筆記》。本書希望讓一個C語言零基礎的讀者能很好地進入本書的學習,因此在第2章設置了C語言的入門詳解,使讀者不必因自己不會C語言而有所擔心,并且在對C語言的講解中融入了部分C的特性內容,這樣讀者會更容易書寫順手的代碼。第3~5章是入門部分,其中介紹了一些算法思想和數(shù)學問題,讀者可從中學習到一些基礎但非常重要的算法思想,并培養(yǎng)基本的思維能力和代碼能力。第6章介紹了C標準模板庫(STL)的常用內容和algorithm頭文件下的常用函數(shù),以幫助讀者節(jié)省寫代碼的時間。第7~12章是進階部分,其中介紹了各類經典數(shù)據(jù)結構、圖算法以及較為進階的重要算法,以使讀者對經典算法和數(shù)據(jù)結構有較為深入的學習。第13章補充了一些上面沒有介紹的內容,以幫助讀者拓寬視野。另外,書中印的二維碼,是用來更新或補充書籍內容及發(fā)布本書勘誤的。通過掃描本書的勘誤和內容更新日志二維碼,讀者可以得到實時更新的相應內容。最后,由于編者水平有限,盡管對本書進行了多次校對,書中可能仍有一些待改進的地方,敬請廣大讀者提出寶貴建議!本書的適用范圍• 研究生復試上機考試• PAT甲級、乙級考試• CCF的CSP認證(或其他算法)• 求職面試時的基礎算法考試• 考研初試數(shù)據(jù)結構科目• 經典算法的入門學習
|