商品參數
| 程序語言的奧妙:算法解讀 |
| | 曾用價 | 45.00 |
| 齣版社 | 科學齣版社 |
| 版次 | 1 |
| 齣版時間 | 2012年07月 |
| 開本 | 32 |
| 作者 | (日)杉浦賢 |
| 裝幀 | 平裝 |
| 頁數 | 162 |
| 字數 | 175000 |
| ISBN編碼 | 9787030346377 |
目錄
目錄
第1章 什麼是算法?
001 烹飪用的食譜就是算法 002
002 算法是古老的智慧 004
003 懂得瞭算法遊戲水平會更高 006
004 算法必須滿足“有效性”和“終止性” 008
005 算法有很多種類 010
COLUMN 算法的基礎—結構化程序設計的思想 012
第2章 變量和數組
006 數據是各種各樣的信息 014
007 所有的數據都有類型 016
008 值是數值、文字等的具體錶現 018
009 變量是放入值的箱子 020
010 變量通過“變量名”區彆 022
011 賦值語句有給變量賦值的能力 024
012 變量到變量的代入,是一個變量中的值被存儲在另一個變量中 026
013 變量也有數據類型 028
014 連續排列的相同數據類型的元素集閤稱為數組 030
015 數組用“數組名”區分 032
016 數組的各元素用元素編號辨彆 034
017 數組是有效存儲相關聯數據的儲物櫃 036
018 二維數組類似賓館的房間 038
019 數組的各元素通過兩個下標標識 040
020 字符串是字符數據的數組 042
021 字符串的字符長度由字符長度變量或“哨兵”管理 044
COLUMN 常用的變量名 046
第3章 數據結構
022 實現對大量數據進行高效管理—數據構造 048
023 數據結構有很多種 050
024 如同嚮上堆書一樣的數據結構是棧 052
025 在收銀颱排隊一樣的數據結構是等待隊列 054
026 用繩子把數據連起來的數據管理方式—鏈錶 056
027 單嚮鏈錶:從一端開始可以遍曆所有數據 058
028 雙嚮鏈錶:從雙嚮開始都可以遍曆所有數據 060
029 查找第N 個元素時數組比較快,鏈錶比較慢 062
030 插入和刪除數據時鏈錶比較快,數組比較慢 064
031 環形緩衝:一旦到達末尾即返迴到開頭 066
032 二叉樹:一個父結點兩個子結點組成的結構 068
033 堆:父結點的值不得比子結點的值大的二叉樹 070
034 哈希錶:數組和鏈錶組閤的一種數據結構 072
035 圖:結點和邊連接的形式 074
COLUMN 從0開始還是從1開始? 076
第4章 基本的算法 077
036 執行循環操作求1~N的和 078
037 使用數組保存數列的值 080
038 用變量求數組元素值的和 082
039 用計數器求數組的有效元素數 084
040 根據數組的各元素和以及元素個數求數組的平均值 086
041 求數組元素的*大值要使用保存*大值的變量 088
042 使用變量保存*小值求數組的*小值 090
043 使用其他的數組存放數組元素的順序 092
044 以秒為單位的時間大小的比較 094
045 求時間差時,將差再錶示成時間形式 096
046 利用臨時變量交換兩個變量的值 098
047 用歐幾裏得相除法求2個數的*大公約數 100
COLUMN 代碼和數據存在哪裏? 102
第5章 排序和搜索 103
048 排序是指按照一定規則對元素對象進行排列擺放 104
049 多種多樣的排序算法 106
050 把數據放於其他數組(桶)來進行排序的“桶排序” 108
051 從數值的低位開始依次重復桶排序的“基數排序” 110
052 選擇*小值(*大值)與排好序的末位交換的“簡單選擇法” 112
053 相鄰數據交換的“簡單交換法”(冒泡排序) 114
054 在已排序數據的正確位置插入數據的“簡單插入法” 116
055 把數據列按照一定間隔分組而進行排序的“希爾排序” 118
056 把多個排序結果的數列閤在一起的“閤並”(歸並) 120
057 利用歸並的算法進行排序的歸並排序 122
058 通過與基準數據比較大小並把數列進行二分的“快速排序” 124
059 利用堆的構造進行排序的“堆排序” 126
060 搜索是從多個數據中找齣目標數據 128
061 從首位元素開始逐個進行比較處理的“綫性查找” 130
062 能夠從排好序的數列中快速找齣數據的“二分查找” 132
063 在給定字符串中查找指定字符串位置的“字符串查找” 134
064 從不一緻字符的位置和局部字符串的結構提高查找效率的KMP法 136
065 從局部字符串的末尾到開頭比較字符的BM法 138
COLUMN 利用關係數據庫進行排序和查找 140
第6章 其他算法 141
066 通過活用微分來求高次方程式解的牛頓法 142
067 聯閤方程組的求解方法是高斯消元法 144
068 根據梯形麵積的計算求定積分值的梯形法 146
069 用於求*短時間、*短距離之類的*優路徑的方法:基於圖的迪傑斯特拉法 148
070 判斷自然數n是否是素數的“埃拉托色尼篩法” 150
071 利用遞歸調用求n的階乘 152
COLUMN 算法和流程圖 154
第7章 算法的復雜度 155
072 算法的復雜度中有時間復雜度和空間復雜度 156
073 時間復雜度通過“運算”、“條件比較”、“代入處理”等操作次數來測量 158
074 算法的復雜度用“O記法”來錶示 160
COLUMN 提高編程能力的方法 162
參考文獻 163
在綫試讀
第1章 什麼是算法?
在編寫計算機程序時,知道各種各樣的算法有助於我們寫齣一個更“優雅”的程序。為瞭創造高效率、正確解決問題的程序,讓我們開始學習吧。
001 烹飪用的食譜就是算法
算法(Algorithm)是利用計算機解決問題的處理步驟。這裏的問題有
1 求*大公約數
2 重新排列信息的順序
3 查找所需信息
等不同的類型。在現代社會,這樣的信息處理是通過計算機進行的,這種處理過程中的處理步驟稱為算法。
如上所述,算法就是解決問題的步驟。仔細觀察,我們可以注意到算法不僅僅用於計算機的數據處理,現實世界中的各種問題也需要結閤算法的概念來解決,其中具有代錶性的就是烹飪中用到的食譜。
食譜是各種美味料理的製作方法,需要用一定的步驟錶示齣來。例如,要做
咖喱雞肉
豬肉燉土豆
等菜品,食譜中記錄著每道菜所需材料的種類和數量,並按步驟準確地描述瞭製作過程。按照這個步驟,誰都能夠做齣標準的咖喱雞肉,並且,根據咖喱雞肉的製作程序,任何人完成的一定是咖喱雞肉,而不會成為蓋澆飯或其他料理。這種“解決問題的處理步驟”(如咖喱雞肉的烹飪食譜)稱為算法。
要點
算法是“解決問題的處理步驟”
烹飪用的食譜也是算法
圖1 什麼是算法
圖2 烹飪用的食譜
002 算法是古老的智慧
烹飪用的食譜雖然也可以說是算法,但是即使按照食譜上的步驟做齣來的料理也不一定是可口的。雖然與食譜上的步驟一緻,但做齣來的菜大傢也許認為並不好吃。如果這樣,這個食譜將被當做“壞食譜”,使用的人也會漸漸變少,自然就會被淘汰。
另一方麵,能做齣每個人都認為可口的食物的食譜,會被多個人反復利用,這樣的食譜就會被認為“好食譜”。“好食譜”通過人們的努力,將進一步成為美味料理的食譜。因此,烹飪用的食譜是為瞭創造美味料理而日積月纍下來的“古老的智慧”。
計算機的算法與其相似。自計算機問世以來,人們已研究齣無數可以用計算機解決的處理問題的方法。在這種情況下,許多研究人員仍在改進算法,並研究有沒有更普遍的處理方法,有沒有更高效的處理方法,有沒有數據量更少的處理方法。這樣細化齣來的好算法,已經在很多計算機程序中被使用瞭。所以,算法也是為創造更“優雅”的程序而積纍的“古老的智慧”。
好的算法本身會成為程序設計的範本。學習算法也在編寫一個良好程序的過程中起到指導作用。
要點
算法是古老智慧的結晶,是程序的範本
學習算法纔能編寫齣高質量的程序
圖1 食譜的改進
圖2 算法的改進
003 懂得瞭算法遊戲水平會更高
學習算法的同時能提高自己的編程能力。一個好的算法是編寫程序的模型,因為它能創造計算機程序,其中還包含瞭程序的精髓。這與遊戲中的“棋譜”是一樣的道理,遊戲中掌握好策略的一方往往能獲勝。
例如,“從畫麵上方開始追擊敵方人物,並用移動炮颱攻擊敵人”等早期在電視遊戲中經常看到的“××式”或“××擊”的戰鬥攻略,如果按照這樣的方法操作,不需要花費很長時間,每次都能輕鬆擊敗敵人,這就是遊戲攻略中的“棋譜”。
“棋譜”是圍棋術語,指“某種棋局下,*好的下棋步驟”,在日本象棋或國際象棋中稱為“棋式”,英文為theory。下圍棋時,如果懂得棋譜,就不需要每次考慮“尋找*好的一步棋”,按照棋譜就可以走齣*好的幾步棋。棋譜是先人們智慧的結果,因此掌握多種棋譜的人
更容易在對弈中獲得勝利。熟練掌握棋譜的人與不懂棋譜的人對弈誰會獲勝,顯而易見。
計算機算法有同樣的道理。學過算法的人寫齣的程序和沒學過算法的人寫齣的程序有明顯的差距。要寫齣既能正確執行又能提高效率的好程序,算法的學習是不可或缺的。
要點
算法的學習類似學習遊戲攻略
算法是編寫好程序的“棋譜”
內容介紹
在我們生活的世界中,各種各樣形形色色的事物和現象,其中都必定包含著科學的成分。在這些成分中,有些是你所熟知的,有些是你未知的,有些是你還一知半解的。麵對未知的世界,好奇的你是不是有很多疑惑、不解和期待呢?!“形形色色的科學”趣味科普叢書,把我們身邊方方麵麵的科學知識活靈活現、生動有趣地展示給你,讓你在暢快閱讀中收獲這些鮮活的科學知識!
21世紀,飛速發展的計算機技術深入到手機、電視、相機、遊戲機等的生活産品中。計算機都是依靠程序來運行的。為瞭編寫齣能夠在計算機上運行良好的程序就必須學習計算機算法的知識。本書用流程圖、程序語言等日常生活中經常齣現的事物為工具,以圖解的形式講解瞭算法的相關知識,即使是不具備計算機知識的初學者,也能夠輕鬆理解。
源代碼的深層律動:精妙算法的結構解析與實踐指南 ——深入理解計算思維的基石,駕馭復雜係統的核心邏輯 本書並非一本探討特定編程語言語法細節的參考手冊,它更像是一份邀請函,邀請有誌於提升自身計算素養的讀者,一同進入算法設計的殿堂,領略數據結構與邏輯推理如何共同構建起現代軟件係統的骨架。我們聚焦的不是“如何用C++或Python實現”,而是“為什麼這個特定的邏輯結構能夠在效率上超越其他所有方案”。 第一部分:計算的本質與思維的重塑 1. 問題的分解與抽象的藝術:從現實到模型的跨越 在正式進入算法細節之前,我們需要建立一套穩健的思維框架。本書首先探討瞭如何識彆一個現實世界的問題(例如物流路徑規劃、資源調度或信息檢索),並將其成功地轉化為一個可被計算解決的數學模型。這部分內容細緻入微地剖析瞭抽象層次的重要性——過高的抽象可能丟失關鍵細節,而過低的抽象則會阻礙通用性的實現。我們將通過一係列經典的“建模失敗案例”來反嚮學習如何構建一個既精確又魯棒的模型。 2. 時間與空間的權衡:效率的度量標準 理解算法的關鍵在於理解其“代價”。我們不會止步於簡單的“快”或“慢”的描述,而是深入講解大O符號($O$ 記號)背後的數學原理和實際意義。書中詳盡地闡述瞭如何分析算法的最壞情況、最好情況和平均情況復雜度,並輔以大量圖例,展示不同階數復雜度(如 $O(log n)$, $O(nsqrt{n})$, $O(2^n)$)在數據集規模擴大時性能的指數級差異。重點在於培養讀者一種“嗅覺”——在設計方案之初,就能預判其性能瓶頸所在。 3. 遞歸的哲學:自我引用的力量 遞歸,作為一種強大的數學歸納工具,在算法設計中占據核心地位。本章不僅演示瞭如何將一個復雜問題分解為規模更小的同類子問題,更著重探討瞭尾遞歸優化、深度限製搜索以及在沒有明確棧結構的限製下,如何通過數學歸納法來證明遞歸算法的正確性與終止性。我們將分析斐波那契數列、漢諾塔問題以及樹的遍曆,揭示遞歸調用棧背後的內存管理和控製流機製。 第二部分:核心數據結構與邏輯構建 4. 綫性結構的精妙延伸:棧、隊列與鏈錶的高級應用 綫性結構看似基礎,實則蘊含瞭解決復雜調度和順序問題的關鍵。本章超越瞭基礎的“後進先齣/先進先齣”定義。我們深入研究瞭雙端隊列(Deque)在滑動窗口最大值問題中的應用,探討瞭循環鏈錶在緩衝區管理中的優勢,以及如何利用棧結構來有效處理錶達式的解析(如逆波蘭錶示法)和代碼塊的嵌套結構。 5. 樹的結構:組織信息與加速檢索 樹形結構是處理層次關係和優化查找效率的利器。我們將細緻剖析二叉搜索樹(BST)的增刪查改操作,並重點分析平衡樹(如 AVL 樹和紅黑樹)的鏇轉與再平衡機製——理解這些操作如何保證瞭 $O(log n)$ 的查找性能。此外,對於B樹和B+樹,我們將探討它們在磁盤I/O效率優化中的獨特地位,這是理解數據庫索引工作原理的必經之路。 6. 圖論基礎:連接與路徑的迷宮 圖是錶示相互關聯實體的最通用模型。本部分詳盡覆蓋瞭圖的錶示方法(鄰接矩陣與鄰接錶),並係統地介紹瞭深度優先搜索(DFS)和廣度優先搜索(BFS)的應用場景,例如拓撲排序和連通分量的識彆。隨後,我們轉嚮優化問題,深入解析瞭Dijkstra算法(單源最短路徑)和Floyd-Warshall算法(所有點對最短路徑),並強調瞭它們在處理負權邊時的局限性及Bellman-Ford算法的應對策略。 第三部分:高效算法的實現範式 7. 排序的演化史:從樸素到極緻 排序算法是算法設計領域最具代錶性的研究對象。本書以比較排序為核心,係統對比瞭歸並排序(基於分治策略的穩定性保證)、快速排序(內省的樞軸選擇策略)和堆排序(利用堆結構實現高效選擇)的內在機製。我們還將探討非比較排序,如基數排序和計數排序,分析它們在特定數據分布下的性能優勢。 8. 貪心策略:局部最優的全局誘惑 貪心算法以其簡潔性和高效性著稱,但並非所有問題都適用。本章通過最小生成樹(Prim和Kruskal算法)和霍夫曼編碼等經典案例,闡釋瞭貪心選擇性質和最優子結構如何協同作用。關鍵在於學習識彆並構建“切入點”,即哪些局部決策能夠保證不會破壞最終解的全局最優性。 9. 動態規劃:記憶化的力量與最優子結構的重構 動態規劃(DP)被譽為解決重疊子問題和最優子結構問題的利器。本書通過最長公共子序列、背包問題(0/1背包與完全背包)以及矩陣鏈乘法等經典案例,詳細拆解瞭“狀態定義”、“狀態轉移方程”和“自底嚮上/自頂嚮下(帶備忘錄)”的實現路徑。重點在於如何將一個看似指數級的遞歸問題,通過狀態的記錄與重用,轉化為多項式時間問題。 10. 復雜性理論的邊界:不可解的領域 最後,本書將視野拓展到計算的邊界。我們探討瞭P類問題、NP類問題以及NP完全問題的概念。通過對旅行商問題(TSP)和可滿足性問題(SAT)的介紹,讀者將理解為什麼有些問題即便運用瞭最高效的算法設計技巧,其求解時間仍然會隨輸入規模呈指數增長。這部分旨在培養一種審慎的工程態度:何時應放棄精確解,轉而尋求近似算法或啓發式方法。 結語:算法是思考的邏輯工具 本書旨在提供一套完整的算法思維工具箱,幫助讀者超越代碼的錶麵語法,直達計算邏輯的核心。掌握這些結構與方法,將使您在麵對任何復雜的工程挑戰時,都能以一種結構化、高效且可被驗證的方式進行思考和設計。