|
-- 會員 / 註冊 --
|
|
|
|
常用算法深入學習實錄 ( 簡體 字) |
作者:張子言 等 | 類別:1. -> 程式設計 -> 演算法 |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 36543 詢問書籍請說出此書號!【缺書】 【不接受訂購】 |
出版日:10/1/2013 |
頁數:516 |
光碟數:1 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
【不接受訂購】 | ISBN:9787121213236 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:可以將算法理解為由基本運算及規定的運算順序所構成的完整解題步驟;或者看成按照要求設計好的有限的確切計算序列,并且這樣的步驟和序列可以解決一類問題。對于任何一門編程語言來說,算法都是“程序”的靈魂。正是因為算法如此重要,所以筆者精心編寫了本書,希望通過書中的內容引領廣大讀者一起探討學習算法的奧秘,帶領廣大讀者真正步入程序開發的高級世界。這是一本講解C語言算法核心內容和具體用法的書,可作為C語言初學者的入門教程,同時也可為專業程序開發人士提供一些參考。本書以“講清語法、學以致用”為指導思想,不僅僅將筆墨局限于語法講解上,而且還通過一個個鮮活、典型的小實例來達到學以致用的目的。 算法還重要嗎 我們先不要給算法是否還重要輕易地下一個結論,現在先來看看一種現象:哪種語言是開發者們可以高高興興地用來編程的?在當前的市面中,基本上每個月都會有一些對語言使用程度做的排名。其實,編程語言又能體現出算法的相關價值。也許你掌握了好幾種語言,但隨著工作時間的增加和對技術的深入研究,你會發現:不是具體的技術而是算法這些基本的東西成為技術深入的“軟肋”,特別是在緊要關口,這個“軟肋”往往就會更疼。 到目前為止,筆者認為自己目前工作中創造性東西比以前少了很多。很多算法已經被包裝到了語言和工具中, 作為一個開發者,也就不像以前那樣費力地去學習了。而往往有些算法只適用于本語言或工具,而且只能解決某些問題,移植到別的情況下則無法使用。筆者也是在開始學習C語言后才感到算法適用范圍有所不同。而最為別扭的是,你發現以前在用ASP.NET和Visual Studio開發工具中對于有些問題已經界定好了思路。人都是懶惰的,既然有現成的東西可用,為何要費力去創新?這也就導致了長期使用單一編程環境的開發者視野上比較狹隘。開發者很難有屬于自己的思維方式,這就是有些人說自己做到一定程度后成了熟練“代碼工人”的原因。 Ruby之父松本行弘就曾表示,注重的是算法而不是工具。如果沒有自己的思維方式和編程邏輯,很容易對某種具體的技術或者工具產生依賴性,而這些編程工具和技術往往是國外開發的。假設有一天我們沒有這些現成的工具和技術該怎么辦?豈不是一窮二白了嗎?但是如果有了穩固的算法,思維編程世界里的東西都不可怕。 算法是一種本質的回歸 現實世界的變化真是快,仿佛前天剛剛出了Java,而昨天又出了一個C#,明天和后天還不知道要出一個什么XXX¥¥語言和新技術,于是廣大程序員們就成了那趕潮大軍中的一員。越往后走就會發現:越深入,步伐走得越慢,需要了解的技術就越多,做的東西越深。造成越來越力不從心的原因是“內功”不到位。C、C#、Java只是用來練習“武功”的招式,“內功”則是這些花哨武功招式后的本質。招式可以有很多種,但是如果沒有“內功”,則招式變換再多也只是表面文章罷了,這樣注定成不了一個名副其實的“武林高手”。 本書的內容 本書共分15章,循序漸進、由淺入深地詳細講解算法的核心內容,并通過具體實例的實現過程演練各個知識點的具體用法。本書首先詳細講解算法的基礎知識,剖析了將算法稱為“程序靈魂”的原因。然后詳細講解算法技術的核心內容,主要包括八大算法思想、數據結構、樹、圖、查找、內部排序、外部排序和文件等知識點的具體用法。接下來通過具體實例詳細講解各種算法經典問題的解決方案,主要包括解決經典的數據結構問題、解決數學問題、解決趣味問題、解決圖像問題和解決奧賽問題的具體方案等。全書采用故事性與趣味性相結合的講解方式,還穿插了學習技巧和職場生存法則,講解了程序員所必須掌握的基本素養;并且緊跟時代潮流,講解了算法技術在現實編程項目中的作用和具體用法。 本書特色 本書內容相當豐富,實例內容覆蓋全面。我們的目標是通過一本圖書,提供多本圖書的價值,讀者可以根據自己的需要有選擇地閱讀。在內容的編寫上,本書具有以下特色。 (1)結構合理 從讀者的實際需要出發,科學安排知識結構,內容由淺入深、敘述清楚,具有很強的知識性和實用性,幾乎涵蓋了C語言算法所有的知識點。 (2)易學易懂 本書條理清晰、語言簡潔,可幫助讀者快速掌握每個知識點;每個部分既相互連貫又自成體系,使讀者既可以按照本書編排的章節順序進行學習,也可以根據自己的需求對某一章節進行有針對性的學習。 (3)實用性強 本書徹底摒棄枯燥的理論和簡單的操作,注重實用性和可操作性,詳細講解了各個部分的源碼知識,使讀者在掌握相關的操作技能的同時,還能學習到相應的基礎知識。 (4)案例精講,深入剖析 本書有許多經典示例,使讀者不但對書中的理論知識進行了系統的復習,而且能夠從實戰中輕松掌握各個知識點的綜合運用技巧,為讀者將來更深層次的學習打下堅實的基礎。 (5)附帶教學資源豐富 本書附帶的光盤中包含豐富的教學資源,既有長時間的實例講解視頻,也有實用的知識點講解視頻,還有附贈的綜合實例。通過這些附屬資源,使讀者的學習過程更加便捷。 ■ daima:保存了本書中所有實例的完整源碼。 ■ PPT:為讀者和教研人員設計了精美的PPT文件,供學習和教學使用。 ■ 實例講解視頻:保存了本書中所有實例的講解視頻,講解詳細,便于讀者理解、掌握。 ■ 知識點講解視頻:保存了本書中各知識點的講解視頻,講解細致并深入,便于讀者課余時間學習并掌握。 (6)提供了完善的售后技術支持 為了給讀者營造良好的學習環境,本書的策劃團隊提供了在線論壇www.topchuban.com,為讀者提供服務。讀者可以登錄此網站,與本書作者探討學習中遇到的問題。 讀者對象 ■ 初學C語言的自學者 ■ 大中專院校計算機及相關專業學生 ■ 從事軟件開發的程序員 ■ 編程愛好者 ■ 有一定C基礎的開發者或學生 ■ 相關培訓機構的老師和學員 致謝 參與本書編寫工作的還有管西京、李冬艷、代林峰、黃河、曹臻、白樺、伍杰、劉英田、劉繼虎、王玉芹、程星、朱萬林、楊陽、徐亮等。本團隊在本書的編寫過程中,得到了電子工業出版社工作人員的大力支持,正是各位編輯的求實、耐心和效率才使本書得以快速出版。另外也十分感謝我的家人,在我寫作的時候給予了我巨大的支持。另外,鑒于本團隊水平有限,紕漏和不盡如人意之處在所難免,懇請讀者提出意見或建議,以便修訂并使之更臻完善。
編 者 2013年8月 |
內容簡介:對于任何一門編程語言來說,算法都是程序的“靈魂”。正是因為算法如此重要,所以筆者精心編寫了本書,希望通過書中的內容引領廣大讀者一起探討學習算法的奧秘,帶領廣大讀者真正步入程序開發的高級世界。 本書共分15章,循序漸進、由淺入深地詳細講解算法的核心內容,并通過具體實例的實現過程演練各個知識點的具體用法。本書首先詳細講解算法的基礎知識,剖析了將算法稱為“程序靈魂”的原因。然后詳細講解算法技術的核心內容,主要包括八大算法思想、數據結構、樹、圖、查找、內部排序、外部排序和文件等知識點的具體用法。接下來通過具體實例詳細講解各種算法經典問題的解決方案,主要包括解決經典的數據結構問題、解決數學問題、解決趣味問題、解決圖像問題和解決奧賽問題的具體方案等。另外,書中還講解了算法技術在現實編程項目中的作用和具體用法。 |
目錄:第1章 都說算法是程序的“靈魂” 1 1.1 開始學習算法 1 1.1.1 算法的特征和發展由來 1 1.1.2 何為算法 2 1.2 計算機中的算法 3 1.2.1 認識計算機中的算法 3 1.2.2 為什么是程序的“靈魂” 4 1.3 表示算法的方法 4 1.3.1 用流程圖來表示算法 5 1.3.2 用N-S流程圖來表示算法 6 1.3.3 用計算機語言表示算法 7 1.4 學好算法的秘訣 8 第2章 分析妙趣橫生的算法思想 9 2.1 八大算法思想 9 2.2 比較“笨”的枚舉算法思想 9 2.2.1 枚舉算法基礎 10 2.2.2 實踐演練 10 2.3 聰明一點的遞推算法思想 15 2.3.1 遞推算法基礎 15 2.3.2 實踐演練 15 2.4 充分利用自己的遞歸算法思想 18 2.4.1 遞歸算法基礎 18 2.4.2 實踐演練 18 2.5 各個擊破的分治算法思想 22 2.5.1 分治算法基礎 23 2.5.2 實踐演練 23 2.6 貪心算法思想并不貪婪 29 2.6.1 貪心算法基礎 29 2.6.2 實踐演練 30 2.7 試探法算法思想是一種委婉的做法 35 2.7.1 試探法算法基礎 35 2.7.2 實踐演練 36 2.8 迭代算法 39 2.8.1 迭代算法基礎 40 2.8.2 實踐演練 40 2.9 模擬算法思想 42 2.9.1 模擬算法的思路 42 2.9.2 實踐演練 42 第3章 走在算法的路上之——分析簡單的 數據結構 47 3.1 學習編程的注意事項 47 3.2 什么是線性表 47 3.2.1 線性表的特性 48 3.2.2 順序表操作 49 3.2.3 鏈表操作 60 3.3 守規矩的先進先出的隊列 74 3.3.1 隊列基礎 74 3.3.2 鏈隊列和循環隊列 75 3.3.3 隊列的基本操作 75 3.3.4 隊列的鏈式存儲 76 3.4 后進先出的棧 83 3.4.1 什么是棧 83 3.4.2 棧的基本分類 84 3.4.3 實踐演練 87 第4章 走在算法的路上之——樹 91 4.1 樹引發的關系 91 4.1.1 樹的概念 92 4.1.2 何謂二叉樹 94 4.1.3 二叉樹存儲 96 4.1.4 操作二叉樹 99 4.1.5 遍歷二叉樹 102 4.1.6 測試二叉樹 106 4.1.7 線索二叉樹 113 4.1.8 線索二叉樹的表示 113 4.1.9 實踐演練線索二叉樹的操作 116 4.2 霍夫曼樹 121 4.2.1 霍夫曼樹基礎 121 4.2.2 實踐演練 123 第5章 走在算法的路上之——圖 131 5.1 從哥尼斯堡七橋問題說起 131 5.2 幾個相關概念 132 5.3 存儲結構 136 5.3.1 表示頂點之間相鄰關系的鄰 接矩陣 137 5.3.2 鄰接表 138 5.3.3 合作的產物——十字鏈表 141 5.3.4 實踐演練 143 5.4 遍歷圖 148 5.4.1 深度優先搜索 148 5.4.2 廣度優先搜索 151 5.4.3 遍歷算法的那點事 155 5.4.4 測試圖的遍歷實例 157 5.5 圖的連通性 160 5.5.1 無向圖的連通分量 161 5.5.2 最小生成樹 161 5.5.3 關鍵路徑 165 5.6 尋求最短的路徑 170 5.6.1 求某一頂點到其他各頂點 的最短路徑 170 5.6.2 任意一對頂點間的最短路徑 174 第6章 體驗查找算法帶來的魅力 179 6.1 幾個相關概念 179 6.2 基于線性表的查找法 180 6.2.1 順序查找法 180 6.2.2 折半查找法 183 6.2.3 分塊查找法 186 6.3 基于樹的查找 188 6.3.1 二叉排序樹 188 6.3.2 平衡二叉排序樹 203 6.4 哈希法 209 6.4.1 哈希法基礎 209 6.4.2 處理沖突 211 6.4.3 哈希表的查找過程 212 6.5 索引查找 215 6.5.1 索引查找的過程 215 6.5.2 實踐演練 215 第7章 內部排序 220 7.1 排序基礎 220 7.1.1 排序的目的和過程 220 7.1.2 內部排序與外部排序 221 7.1.3 穩定排序與不穩定排序 221 7.2 霸道的插入排序 222 7.2.1 直接插入排序 222 7.2.2 折半插入排序 225 7.2.3 表插入排序 226 7.2.4 希爾排序 227 7.3 交換類排序法 230 7.3.1 冒泡排序(相鄰比序法) 231 7.3.2 快速排序 232 7.4 選擇類排序法 237 7.4.1 直接選擇排序 237 7.4.2 樹形選擇排序 238 7.4.3 堆排序 239 7.4.4 實踐演練 242 7.5 歸并排序 245 7.5.1 歸并排序思想 245 7.5.2 二路歸并算法的思路 246 7.5.3 實現歸并排序 248 7.5.4 實踐演練 250 7.6 基數排序 253 7.6.1 多關鍵字排序 253 7.6.2 鏈式基數排序 254 第8章 外部排序和文件 258 8.1 外部信息方便了我們的生活 258 8.1.1 磁帶存儲器 258 8.1.2 磁盤存儲器 259 8.2 外部排序的基本方法 261 8.2.1 磁盤排序 261 8.2.2 磁帶排序 266 8.3 什么是文件 268 8.4 文件的組織方式 270 8.4.1 順序文件 270 8.4.2 索引文件 270 8.4.3 ISAM文件 271 8.4.4 VSAM文件 273 8.4.5 散列文件 275 8.4.6 多關鍵字文件 275 第9章 從應聘開始談算法 277 9.1 面試 277 9.1.1 面試前的準備 277 9.1.2 常見的面試錯誤 278 9.2 常見的算法筆試題 279 第10章 經典的數據結構問題 303 10.1 約瑟夫環 303 10.2 大整數運算 306 10.2.1 數組實現大整數運算 306 10.2.2 使用鏈表實現大整數運算 315 10.3 計算機進制轉換 321 10.4 將中序表達式轉換為后序表達式 325 第11章 解決數學問題 331 11.1 最大公約數和最小公倍數 331 11.2 哥德巴赫猜想 333 11.3 完全數 336 11.4 親密數 338 11.5 自守數 340 11.6 方程求解 341 11.6.1 高斯消元法解方程組 342 11.6.2 用二分法解非線性方程 346 11.6.3 用牛頓迭代法解非線性方程 346 11.7 矩陣運算 348 11.8 一元多項式運算 352 11.8.1 一元多項式的加法運算 352 11.8.2 一元多項式的減法運算 357 第12章 解決趣味問題 366 12.1 歌星大獎賽 366 12.2 借書方案 367 12.3 打魚還是曬網 368 12.4 捕魚和分魚 370 12.5 出售金魚 371 12.6 平分七筐魚 372 12.7 繩子的長度和井深 373 12.8 雞兔同籠 375 12.9 漢諾塔 376 12.9.1 遞歸法 376 12.9.2 非遞歸法 378 12.10 馬踏棋盤 380 12.10.1 使用循環查找法 380 12.10.2 使用遞歸法 384 12.10.3 使用棧方法 386 12.11 三色球問題 390 12.12 新郎和新娘問題 391 12.13 計算年齡幾何 394 第13章 解決圖像問題 395 13.1 八皇后問題 395 13.1.1 使用遞歸法 395 13.1.2 使用循環法 398 13.2 生命游戲 401 13.3 黑白棋問題 406 13.4 騎士迷宮問題 415 13.5 迷宮中的所有路徑 422 第14章 算法的經典問題 425 14.1 存錢利息最大化 425 14.2 背包問題 428 14.2.1 使用動態規劃法 429 14.2.2 使用遞歸法 434 14.3 農夫過河 437 14.4 三色旗 440 14.5 取石子 443 14.6 停車場管理 447 14.7 約瑟夫生者死者游戲 456 第15章 解決奧賽問題 459 15.1 孿生素數問題 459 15.2 百錢買百雞問題 461 15.3 馬克思手稿中的數學題 463 15.4 正整數分解為質因數 464 15.5 水仙花數 465 15.6 素數 466 15.6.1 求1000以內的所有素數 466 15.6.2 求1000以內的回文素數 467 15.6.3 求1000以內的平方回文數 469 15.7 階乘 470 15.7.1 使用遞歸法 470 15.7.2 實現大數的階乘 471 15.8 青蛙過河 477 15.9 過河卒 481 15.10 素數組合 484 15.11 校驗碼問題 487 15.12 老師排座位 488 15.13 模擬立體圖 491 15.14 采藥問題 495 15.15 等價表達式問題 497 15.16 購買年貨問題 501 |
序: |
|