0916~0919_開學季語言展

AI及機器學習的經脈:演算法新解

  • 9 621
    690

活動訊息

想找書的時候,特別想偷看網友的書櫃... 原來大家都在看這本 ↓↓↓

用閱讀開啟視野,讓書成為照亮你人生的光
【金石堂選書】本月推薦您這些好書👉 快來看看

內容簡介

《AI及機器學習的經脈:演算法新解》同時用函數式方法和傳統方法介紹主要的基本演算法和資料結構,資料結構部分包括二叉樹、紅黑樹、AVL樹、Trie、Patricia、尾碼樹、B樹、二叉堆、二項式堆、斐波那契堆、Pairing堆、佇列、序列等;基本演算法部分包括各種排序演算法、序列搜索演算法,字串匹配演算法(KMP等),深度優先、廣度有限搜索演算法、貪心演算法以及動態規劃。

作者

劉新宇
 
1999年和2001年分別獲得清華大學自動化系學士和碩士學位,之後長期從事軟體研發工作。關注基本演算法和資料結構,尤其是函數式演算法,目前任職於亞馬遜中國倉儲和物流技術團隊。

目錄

前言

第一部分  樹

1章 二叉搜尋樹:資料結構中的“hello world

1.1   定義.

1.2   資料組織

1.3   插入

1.4   檢查.

1.5   搜索

1.6   刪除.

1.7   隨機建置二叉搜尋樹

2章 插入排序的進化.

2.1   簡介

2.2   插入

2.3   改進一:二分尋找

2.4   改進二:使用鏈結串列

2.5   使用二叉搜尋樹的最後改進

2.6   小結

3章 並不複雜的紅黑樹

3.1   紅黑樹的定義

3.2   插入

3.3   刪除

3.4   指令式的紅黑樹演算法

3.5   小結

4AVL

4.1   AVL  樹的定義

4.2   插入

4.3   刪除

4.4   AVL  樹的指令式演算法

4.5   小結.

5章 基數樹:Trie Patricia

5.1   整數Trie

5.2   整數Patricia

5.3   字元Trie

5.4   字元Patricia

5.5   Trie 和Patricia 的應用

5.6   小結

6章 副檔名樹

6.1   副檔名Trie

6.2   副檔名樹

6.3   副檔名樹的應用

6.4   小結

7B樹.

7.1   插入

7.2   刪除

7.3   搜索

7.4   小結

第二部分 堆

8章 二叉堆積

8.1   用陣列實現隱式二叉堆積

8.2   左偏堆積和skew 堆積:顯性的二叉堆積

8.3   延伸堆積

8.4   小結

9章 從吃葡萄到世界盃:選擇排序的進化

9.1   尋找最小元素

9.2   細微改進.

9.3   本質改進

9.4   小結

10章 二項式堆積、費氏堆積和配對堆積

10.1  二項式堆積

10.2  費氏堆積

10.3  配對堆積

10.4  小結

第三部分 佇列和序列

11章 並不簡單的佇列

11.1  單向鏈結串列和循環緩衝區實現的佇列

11.2  純函數式實現.

11.3  小改進:平衡佇列.

11.4  進一步改進:即時佇列

11.5  惰性即時佇列

11.6  小結

12章 序列:最後一塊磚

12.1  二叉隨機存取列表

12.2  二叉隨機存取列表的數值表示

12.3  指令式雙陣列清單

12.4  可連接列表

12.5  手指樹

12.6  小結

第四部分 排序和搜索

13.1  快速排序

13.2  快速排序的效能分析

13.3  工程實作中的改進

13.4  針對最差情況的工程實作

13.5  其他工程實作

13.6  其他

13.7  歸併排序

13.8  原地歸併排序

13.9  自然歸併排序

13.10  自底向上歸併排序.

13.11  平行處理

13.12  小結

14章 搜索

14.1  序列搜索

14.2  解的搜索.

14.3  小結8

附錄列表

參考文獻

索引

序/導讀

前  言
✤ 演算法有用嗎
「演算法有用嗎?」經常有人問我這個問題。很多人在工作中根本不用演算法。偶爾碰到的時候,也不過是使用一些實現好的函數庫。舉例來說,C++ 標準範本函數庫(STL)中有現成的排序、尋找函數;常用的資料結構,如向量(vector)、佇列(queue)、集合(set)也都實現好了。日常工作中了解如何使用這些函數庫似乎就足夠了。
但是,演算法在解決一些「有趣」的問題時會造成關鍵作用。不過,這些問題本身的價值卻是見仁見智。
讓我們用實例來說話吧。接下來的兩道題目,即使是初學程式設計的人,應該也很容易解決。
✤ 最小可用ID,演算法的威力
這道題目來自Richard Bird 所著書中的第1章[1]。現代社會中,有很多服務依賴一種稱為ID的概念。例如身份證就是一種ID,銀行帳戶也是一種ID,電話號碼本質上也是一種ID。假設我們使用非負整數作為某個系統的ID,所有使用者都由一個ID唯一確定。任何時間,這個系統中的有些ID處於使用中的狀態,有些ID則可以分配給新使用者。現在的問題是,怎樣才能找到最小的可分配ID呢?例如下面是目前正在使用的ID:
[18, 4, 8, 9, 16, 1, 14, 7, 19, 3, 0, 5, 2, 11, 6]
最小的可分配ID,也就是不在這個清單中的最小非負整數,即10。
有些程式語言內建了這一線性尋找的實現,例如Python。我們可以直接將這一解法翻譯成下面的程式:
def brute_force(lst):
  i = 0
  while True:
 if  i not in lst:
 return i
   i = i + 1
但是這道題目僅是看上去簡單。在儲存了幾百萬個ID的大型系統中,這個方法的效能很差。對於一個長度為n的ID清單,它需要O(n2 )的時間才能找到最小的可分配ID。在我的電腦上(雙核心2.10 GHz處理器,2 GB憶體),使用這一方法的C語言程式平均要5.4 s才能在10萬個ID 找到答案。當ID的數量上升到100萬時,平均用時則長達8min。
改進一
改進這一解法的關鍵基於這一事實:對於任何n個非負整數x1 , x2 , •••, xn,如果存在小於n的可用整數,必然存在某個xi不在[0, n) 範圍內。否則這些整數一定是0, 1, •••, n −1 的某個排列,這種情況下,最小的可用整數是n。於是我們有以下結論:
minf ree(x1 , x2 , •••, xn) 至n (1)
根據這一結論,我們可以用一個長度為n + 1 的陣列,來標記區間[0, n]內的某個整數是否可用:
 
 
 
其中第2 行將標示陣列中的所有值初始化為False,這一步驟需要O(n) 的時間。接著我們檢查A中的所有元素,只要小於n,就將對應的標記置為True,這一過程也需要O(n)的時間。最後我們線性尋找標示陣列中第一個值為False的位置。整個演算法的效能是線性時間O(n)。

配送方式

  • 台灣
    • 國內宅配:本島、離島
    • 到店取貨:
      金石堂門市 不限金額免運費
      7-11便利商店 ok便利商店 萊爾富便利商店 全家便利商店
  • 海外
    • 國際快遞:全球
    • 港澳店取:
      ok便利商店 順豐 7-11便利商店

詳細資料

詳細資料

    • 語言
    • 中文繁體
    • 裝訂
    • 紙本平裝
    • ISBN
    • 9789863796138
    • 分級
    • 普通級
    • 頁數
    • 704
    • 商品規格
    • 23*17
    • 出版地
    • 台灣
    • 適讀年齡
    • 全齡適讀
    • 注音
    • 級別

商品評價

訂購/退換貨須知

加入金石堂 LINE 官方帳號『完成綁定』,隨時掌握出貨動態:

加入金石堂LINE官方帳號『完成綁定』,隨時掌握出貨動態
金石堂LINE官方帳號綁定教學

提醒您!!
金石堂及銀行均不會請您操作ATM! 如接獲電話要求您前往ATM提款機,請不要聽從指示,以免受騙上當!

退換貨須知:

**提醒您,鑑賞期不等於試用期,退回商品須為全新狀態**

  • 依據「消費者保護法」第19條及行政院消費者保護處公告之「通訊交易解除權合理例外情事適用準則」,以下商品購買後,除商品本身有瑕疵外,將不提供7天的猶豫期:
    1. 易於腐敗、保存期限較短或解約時即將逾期。(如:生鮮食品)
    2. 依消費者要求所為之客製化給付。(客製化商品)
    3. 報紙、期刊或雜誌。(含MOOK、外文雜誌)
    4. 經消費者拆封之影音商品或電腦軟體。
    5. 非以有形媒介提供之數位內容或一經提供即為完成之線上服務,經消費者事先同意始提供。(如:電子書、電子雜誌、下載版軟體、虛擬商品…等)
    6. 已拆封之個人衛生用品。(如:內衣褲、刮鬍刀、除毛刀…等)
  • 若非上列種類商品,均享有到貨7天的猶豫期(含例假日)。
  • 辦理退換貨時,商品(組合商品恕無法接受單獨退貨)必須是您收到商品時的原始狀態(包含商品本體、配件、贈品、保證書、所有附隨資料文件及原廠內外包裝…等),請勿直接使用原廠包裝寄送,或於原廠包裝上黏貼紙張或書寫文字。
  • 退回商品若無法回復原狀,將請您負擔回復原狀所需費用,嚴重時將影響您的退貨權益。
金石堂門市 全家便利商店 ok便利商店 萊爾富便利商店 7-11便利商店
World wide
活動ing