寫給大家看的算法書

寫給大家看的算法書

《寫給大家看的算法書》是2016年6月電子工業出版社出版的圖書,作者是【日】杉浦賢。

內容簡介

《寫給大家看的算法書》對於理解信息處理的基礎——算法而言,是一本非常優秀的入門讀物。作者採用大量生動的類比,配合簡潔易懂的配圖,深入淺出地講解算法,極大地拉近了讀者與算法的距離。通讀全書,讀者可以了解到計算機編程與算法的基本理念,也能對簡單常用的算法有一個大概的理解。

編輯推薦

《寫給大家看的算法書》 就像是一把金鑰匙,帶你叩開數據時代的大門!

在手忙腳亂中進入數據(DT)時代的我們,有太多要惡補的知識。而算法,作為數據分析處理的基石,是最先需要學習的。市面上的算法專業書籍,對小白而言過於艱深。

《寫給大家看的算法書》恰恰填補了這一空白,從平常的事物入手,用最常見的生活案例、最淺顯直白的語言,結合有趣的漫畫圖,向大家講解了什麼是算法、如何運用。這無疑是編程初學者,IT從業人員以及有興趣學習算法的讀者的福音!

內容提要

算法這個詞對於非計算機從業人士而言,似乎就是晦澀、神秘的代名詞。其實,算法在日常生活中隨處可見。做飯用的菜譜是一種算法、查字典的方法是一種算法、給期中考試分數排名也用到了算法。事實上,算法可以說是這個信息爆炸的時代所依存的重要基石之一。

《寫給大家看的算法書》對於理解信息處理的基礎——算法而言,是一本非常優秀的入門讀物。作者採用大量生動的類比,配合簡潔易懂的配圖,深入淺出地講解算法,極大地拉近了讀者與算法的距離。通讀全書,讀者可以了解到計算機編程與算法的基本理念,也能對簡單常用的算法有一個大概的理解。

目錄

第1 章 什麼是算法 1

1.1 算法其實就在身邊 2

1.2 算法是人類智慧的結晶 4

1.3 了解算法對玩遊戲有幫助嗎 6

1.4 算法有兩個必要條件 8

1.5 要特別了解的重要算法 10

專題1 算法基礎之結構化編程思想 12

第2 章 變數和數組 13

2.1 所謂“數據”,就是各種各樣的信息 14

2.2 數據有不同的類型 16

2.3 最基礎的數據是“值” 18

2.4 裝著“值”的盒子叫作“變數” 20

2.5 要描述算法,變數是不可或缺的 22

2.6 所謂“代入”,指的是把數據賦予變數 24

2.7 不同的變數有不同的名稱 26

2.8 變數命名要能解釋變數裝載的數據 28

2.9 把數據代入變數的賦值語句 30

2.10 把變數中存儲的值代入其他變數 32

2.11 變數也有數據類型 34

2.12 保存大量同一數據類型值的“數組” 36

2.13 數組用“數組名”標記 38

2.14 數組的元素用“下標”管理 40

2.15 什麼時候需要用到“數組”呢 42

2.16 “數組”就像儲物櫃一樣 44

2.17 “二維數組”就像是旅館裡的房間 46

2.18 二維數組的各個元素用兩個下標來管理 48

2.19 字元串就是字元的連續拼合(數組) 50

2.20 獲取字元串長度的兩個方法 52

專題2 常用變數命名 54

第3章 數據結構 55

3.1 為了高效處理大量數據 56

3.2 有哪些常用的數據結構 58

3.3 “堆疊”類似於桌面上堆積的書 60

3.4 “佇列”就像是超市收銀台前排著的佇列 62

3.5 “鍊表”就像用繩子串起來的長串 64

3.6 只能檢索下一個數據的單向鍊表 66

3.7 能檢索上一個或者下一個數據的雙向鍊表 68

3.8 能快速定位第N 個數據的是“數組” 70

3.9 能快速插入、刪除數據的是“鍊表” 72

3.10 像鐘錶一樣數據首尾相連的是“環形緩衝區” 74

3.11 管理有樹幹、樹枝、樹葉一樣關係的數據的是“樹” 76

3.12 一個父節點對應兩個子節點的是“二叉樹” 78

3.13 像筆畫的節點和連線組成的數據結構是“圖” 80

專題3 為什麼數組的起始下標有時是0,有時是1 ? 82

第4章 學習算法基礎 83

4.1 循環處理是算法的基礎 84

4.2 計算1 ~N 的整數的總和 86

4.3 使用數組可以高效地處理大量數據 88

4.4 計算一年的營業額 90

4.5 求班級考試的總分和平均分 92

4.6 求最高分 94

4.7 求最低分 96

4.8 為考試成績排名 98

4.9 求全班學生不同科目考試合計的總分 100

4.10 求“時分秒”形式的時間差 102

4.11 交換兩個變數值的技巧 104

4.12 求兩個數值的最大公約數 106

專題4 2038 年的時候要留心? 108

第5 章 排序算法 109

5.1 排序是指對多個數據排列順序 110

5.2 關於排序算法 112

5.3 使用“木桶”輔助的“桶排序” 114

5.4 每次找出一個最小(最大)值的“選擇排序” 116

5.5 像冒泡一樣進行相鄰數據的交換的“冒泡排序” 118

5.6 向有序數據里正確位置插入數據的“插入排序” 120

5.7 把幾個有序數據合併叫作“歸併” 122

5.8 利用歸併進行排序的算法叫作“歸併排序” 124

5.9 改進了排序效率的“希爾排序” 126

5.10 最快的排序算法“快速排序” 128

專題5 把2 的n 階乘的值記下來吧 130

第6 章 搜尋算法 131

6.1 所謂“搜尋”,就是從數據集合中找到目標數據 132

6.2 從頭開始按順序排除的搜尋叫作“線性搜尋” 134

6.3 可以進行高速搜尋的“二分搜尋” 136

6.4 利用哈希表實現高效搜尋 138

6.5 在字元串中搜尋部分字元串的“字元串搜尋” 140

6.6 高效搜尋字元串的KMP 算法 142

6.7 逆向比較的BM 字元串搜尋算法 144

專題6 在關係型資料庫中使用到的排序和搜尋 146

第7 章 其他算法 147

7.1 用牛頓法求解高次方程 148

7.2 用高斯消元法求解方程組 150

7.3 用梯形面積和來求解定積分的梯形法 152

7.4 計算質數的埃拉托斯特尼篩法 154

7.5 執行時調用自身的遞歸函式 156

專題7 算法和流程圖 158

第8 章 算法和計算機 159

8.1 計算機的數據是用二進制來表示的 160

8.2 讓二進制數更易於閱讀(八進制、十六進制) 162

8.3 二進制轉換成十進制 164

8.4 十進制轉換成二進制 166

8.5 用二進制表示負整數 168

8.6 邏輯或:任意一個為“1”則結果為“1” 170

8.7 邏輯並:同時為“1”則結果為“1” 172

8.8 “或非”:“1”和“0”得到的結果為“1” 174

8.9 “否定”:“1”變為“0”,“0”變為“1” 176

8.10 使用德摩根定律可以管理否定範式 178

精彩節摘

記得有一次,朋友讀書時看見了“維恩圖”一詞,不明白它的意思,於是跑來問我。當時,我大致是這么回答的:“假設有若干個元素,同時還有若干種性質。為了直觀地表現出哪些元素具有哪些性質,我們可以在平面上畫出若干個封閉曲線,每個封閉曲線內的區域代表某種性質,然後把各個元素填寫在正確的區域裡。如果某個元素同時具有兩個或多個性質,那就必須把它填寫在相應的兩個或多個區域的公共部分里。所以,我們要求這些封閉區域必須恰當地相交,使得每種可能的公共部分都存在。”

看見朋友一副茫然的表情,我只好找來紙和筆,舉了一個實際的例子:“如果這三個圓形區域分別代表‘奇數’、‘質數’、‘平方數’,那么1 就該填到這兒,2 就該填到這兒,3 就該填到這兒……”

朋友忽然興奮地說:“喔,我好像懂了!維恩圖的意思是不是就是,當我想知道眼前的一群人是一群什麼樣的人時,我就在地上畫幾個圈,分別表示‘已婚’、‘黨員’、‘上班族’,等等,然後每個人屬於哪些類就站進哪些圈子裡,而且我在地上畫的圈需要保證,不管來了什麼樣的人,他總能找到個地兒站!”

“沒錯沒錯,就是這樣!”我激動地說道,仿佛恍然大悟的是我一樣。

類似的經歷我還遇到過一次,只不過我的位置換了一下。你知道嗎?在現實生活中可能出現某些商品,它的價格升高時,人們的購買量也隨之增加。這樣的商品叫作“吉芬商品”。很有趣吧!很想搞明白這背後的原理吧!第一次聽說這樣的經濟學現象後,我也感到非常好奇,我也很想知道這背後的原理。我在網上查到了很多與此相關的文章,它們的標題大多類似於“吉芬商品背後的直觀解釋”。每篇文章里都出現了同一個生詞,“無差異曲線”。不管閱讀哪篇文章,我都會卡在這個生詞處。什麼是無差異曲線?這看起來似乎是經濟學中的一個非常基本的東西,因為幾乎所有作者在講解時,都會假設讀者已經知道了它的意思。

無奈,我又開始搜尋“無差異曲線”的意思,結果仍然是一頭霧水。大多數地方給出的解釋是這樣的:“一條條從左上方延伸到右下方的曲線,說明消費者的偏好不變時,若其中一種商品的消費增加,另一種商品的消費會如何減少……同一條曲線上面的每一點對應的商品組合是不同的,但是人們從中得到的效用卻是相同的。”對於從沒接觸過經濟學的人來說,這樣的句子簡直如天書一般。

最後,借來一本經濟學教材,研究了裡面的好幾個例子,才讓我茅塞頓開:唉,說得這么麻煩乾什麼,無差異曲線其實就是購買不同數量的A 和B,給人帶來的滿足感的“等高線”嘛!懂得什麼是無差異曲線之後,再看吉芬商品的講解文章時,就完全沒有障礙了。

學習一門新的學科,往往會遇到很多新的概念。不幸的是,專家們對這些概念太過熟悉,很難意識到這會成為初學者理解的障礙;即使意識到了這一點,恐怕一時也很難想到一種真正面向初學者的、簡單直白一語中的的解釋;即使想到了這樣的解釋,綜合考慮文體、篇幅等原因,或許也不會真的寫下來。種種經歷讓我深知,填補這個空白是很有必要的。但是,誰來填補這個空白呢?

幸運的是,現在,編程初學者有了像《寫給大家看的算法書》這樣的書。學習編程變得簡單多了。數組,其實就是一排印有號碼的儲物櫃;堆疊,其實就是桌面上堆積的書……書中充滿了這些生動有趣的比方,它們總能讓我由衷地感嘆:這比方打得實在是太貼切了。

《寫給大家看的算法書》里還會談到一些更基本的問題。為什麼依次執行X ← Y 和Y ← X 不能交換兩個變數的值?這是因為,往變數里代入值的時候,舊的值是會被覆蓋掉的。在專業的程式設計師看來,這幾乎是廢話;但誰能想到,或許恰恰就是這句“廢話”,解答了某個初學者百思不得其解的困惑。你是否讀過很多編程入門讀物,但仍然覺得有門檻?那么,這本書值得你嘗試。

在信息化和大數據的背景下,人們的思維也或多或少地受到了計算機模型的影響,討論問題時“樹”、“節點”、“字元串”等詞常常是張口就來。如果由於學習或者工作的原因,你時不時地會遇到這些陌生的辭彙,相信這本書也會對你有幫助。

數學科普作家 顧森

媒體評論

學習一門新的學科,往往會遇到很多新的概念。不幸的是,專家們對這些概念太過熟悉,很難意識到這會成為初學者理解的障礙;即使意識到了這一點,恐怕一時也很難想到一種真正面向初學者的、簡單直白一語中的的解釋;即使想到了這樣的解釋,綜合考慮文體、篇幅等原因,或許也不會真的寫下來。種種經歷讓我深知,填補這個空白是很有必要的。但是,誰來填補這個空白呢?

幸運的是,現在,編程初學者有了像《寫給大家看的算法書》這樣的書。學習編程變得簡單多了。數組,其實就是一排印有號碼的儲物櫃;堆疊,其實就是桌面上堆積的書……書中充滿了這些生動有趣的比方,它們總能讓我由衷地感嘆:這比方打得實在是太貼切了。

……

在信息化和大數據的背景下,人們的思維也或多或少地受到了計算機模型的影響,討論問題時“樹”、“節點”、“字元串”等詞常常是張口就來。如果由於學習或者工作的原因,你時不時地會遇到這些陌生的辭彙,相信這《寫給大家看的算法書》也會對你有幫助。

——數學科普作家 顧森(Matrix67)

我閱讀的第一本出自日本的計算類技術書籍是歐姆社的《漫畫資料庫》,這種全篇漫畫風格的技術書讓我很是喜歡。來自漫畫大國的《寫給大家看的算法書》,同樣以輕鬆有趣、通俗易懂的漫畫與故事的方式將抽象複雜的算法融會其中。

——啊哈磊,《啊哈C!思考快你一步:用編程輕鬆提升邏輯力》作者

算法源於生活,基於數學,成於計算。作者以獨特的視角,優美的手法,把我們帶入一個不一樣的算法世界,在這裡算法可以如此生動有趣,談笑間算法被剖析得淋漓盡致,讀者更能領會到算法的精妙之處。《寫給大家看的算法書》針對常見的排序、搜尋算法進行了細緻地講解,此外對牛頓法、高斯消元等算法的講解也恰到好處,適合於作為算法的入門讀物。

——游皓麟,高級數據分析師

作為一名產品經理,是應該懂一些技術原理的,這是對研發和職業的尊重。產品經理並不一定會寫代碼,但是一定要知道每個實現背後的原理,這會讓產品經理不至於提很多被研發從內心嘲笑的需求,也可以讓產品經理開闊視野。《寫給大家看的算法書》可以算是一本寫給產品經理看的技術書,值得所有非技術出身的產品經理讀一讀。

——KentZhu,易到用車副總裁

前言

計算機自20 世紀發明以來得到了飛速的發展,在21 世紀的現代社會,不僅僅是個人計算機,智慧型手機、電視、電子照相機、遊戲機等預裝計算機的設備也越來越普及。甚至,捷運的自動刷卡設備、ATM 自動櫃員機、自動販賣機等現代社會生活中不可或缺的機器,如果沒有了計算機,那么機器的控制、顧客的管理、財務的管理、售賣的管理等各種各樣的公司業務全都開展不了。

為了編寫在計算機上可以良好運行的程式,我們必須學習“算法”。本書的主旨就是從基礎開始詳盡地講解算法。為了讓初學者也能充分理解內容,“儘可能通俗易懂”,筆者儘量讓大家在輕鬆學習算法的同時,也可以嘗試理解計算機編程中用到的一些思維方式。

另外,為了讓中學生也能輕鬆閱讀,本書虛構了埃里根博士、小艾、小莉這三個角色,對算法相關的知識進行講解。請把自己想像成小艾或者小莉,嘗試在埃里根博士的算法講座中學習吧。

第1 章 探討了“什麼是算法”這個話題。算法這個辭彙可能大家日常生活中接觸不多,所以乍聽之下會有晦澀艱深的感覺。但簡單來說,算法就是“為解決特定問題需要進行的處理步驟”。本章為講解得更通俗易懂,拿日常生活中的菜譜做類比。

第2 章 主要對描述算法的重要元素“數據”進行講解,包括數據的存、取方法等。另外,本章也對在算法表示問題解決步驟時所必需的“變數”進行講解,本章詳細講解了它作為數據存儲的“盒子”的特徵。

第3 章 講述了對各種不同形式的數據進行管理的“數據結構”這種管理方式。本章還對其中的特例,如“數組”、“鍊表”、“樹”等數據結構各自的優缺點進行了講解。

第4 章 介紹了算法中記述處理步驟的最重要的要素“循環”及使用“循環”進行復用處理的方法。

第5 章 介紹了最重要的算法之一“排序”。本章從低效但簡單的排序處理講起,由淺入深講解複雜但高效的排序處理。

第6 章 介紹了另一類最重要的算法——“搜尋”。本章會講述單純的搜尋、已排序的數據的搜尋,以及字元串的搜尋等。

第7 章 介紹一些解決數學問題的算法。本章主要講解了可以在科學計算領域派上用場的“求解高斯方程”、“求解方程組”及“求定積分的值”等算法。

第8 章 探討了“算法和計算機”這個話題。主要解釋了一些為實現算法需要了解的計算機相關的基礎知識。

通讀本書,如果讀者能夠稍稍消除“算法是什麼呀”這種顧慮,並且產生“原來如此,探究起來,電腦程式就是由一些簡單的處理組合起來的東西啊”這樣的想法的話,那真是筆者的榮幸。另外,如果本書的內容能成為大家以後熟悉計算機後編寫良好、高效的程式的基礎的話,那我真是太開心了。

2012 年11 月 杉浦賢

相關詞條

熱門詞條

聯絡我們