索引 / 001 ZH-TW
Advanced Data Structures(進階資料結構) cover

電腦科學

電腦科學

Advanced Data Structures(進階資料結構)

Peter Brass

英文原名: Advanced Data Structures

一本研究所程度的教科書,把資料結構當作演算法設計的一個領域,而不是物件導向程式設計的範例。作者介紹大量用於數值集合、區間與字串的結構,並附上複雜度分析、C 語言實作細節與豐富的研究文獻引用。

需要的基礎: 修過大學部資料結構與演算法,熟悉漸近分析,並能以 C 或類似語言撰寫程式。

難度等級
高級
學術層次
研究所
data structuressearch treesheapshashingstring algorithms教科書

01 / 導讀

導讀

引用

Brass, P. (2008). Advanced Data Structures. Cambridge University Press.

章節概要

全書474頁,包含九章正文、一章附錄、500多條參考文獻,以及作者索引與主題索引。Cambridge稱其細緻考察資料結構這一應用演算法專題中的思想、分析與實作,並包含大量C語言程式碼範例。

第1章:Elementary Structures

堆疊、佇列、雙端佇列、節點的動態配置,以及基於陣列的結構的影子副本。這是書中最基礎的內容,為後文使用的基於陣列與基於節點的實作做準備。

第2章:Search Trees

兩種搜尋樹模型、一般性質與變換、搜尋樹的高度,以及基本的尋找、插入與刪除操作。還包括從葉回到根、非唯一鍵、區間查詢、建構最佳搜尋樹、把樹轉換為串列,以及刪除整棵樹。

第3章:Balanced Search Trees

單一家族中最長的一章:高度平衡樹與權重平衡樹、(a, b)樹與B樹、紅黑樹及近似最佳高度的樹、自頂向下再平衡、在已知位置常數時間更新的樹、指狀樹與層連結、部分重建與攤銷分析、伸展樹、跳躍串列,以及平衡樹的合併與分裂。

第4章:Tree Structures for Sets of Intervals

區間樹、線段樹,用於區間聯集、加權區間求和及區間受限最大和查詢的樹,然後是正交範圍樹、高維線段樹、其他構件體系、範圍計數與半群模型,以及kd樹。

第5章:Heaps

從用作堆的平衡搜尋樹與基於陣列的堆開始,然後是堆序樹與半序樹,左偏堆、斜堆、二項堆,鍵的修改,費波那契堆,最佳複雜度的堆,雙端堆與多維堆,以及常數時間更新的堆相關結構。

第6章:Union-Find and Related Structures

用於合併分割中各類的並查集、帶副本的並查集與動態線段樹、串列分裂、有根有向樹上的問題,以及維護線性序。

第7章:Data Structure Transformations

使結構動態化與持久化的通用技術。

第8章:Data Structures for Strings

字典樹與壓縮字典樹、允許查詢出錯的字典、後綴樹與後綴陣列。

第9章:Hash Tables

基本雜湊表與碰撞解決、全域雜湊函數族、完美雜湊函數、雜湊樹、可擴充雜湊,以及成員測試器與布隆過濾器。

第10章:Appendix

指標機與其他計算模型、外部記憶體模型與快取無關演算法、資料結構的命名、線性遞迴的求解,以及成長極慢的函數。

核心概念

第1–3章:基本結構與平衡結構

  • 影子副本與節點配置:基本結構的實作技術。
  • 平衡準則:高度平衡、權重平衡、(a, b)樹與紅黑樹,是讓樹保持較淺的不同方式。
  • 攤銷分析、伸展樹與跳躍串列:取代顯式平衡的自適應與隨機化方法。

第4–6章:區間、堆與並查集

  • 線段樹、區間樹與範圍樹:用於區間及多維點集查詢的結構。
  • 堆的變種:左偏堆、斜堆、二項堆與費波那契堆。
  • 並查集:有效率地合併分割中的各類。

第7–9章:變換、字串與雜湊

  • 動態化與持久化:賦予結構更新能力或保留舊版本的通用變換。
  • 字典樹、後綴樹與後綴陣列:針對字串集合的結構。
  • 全域雜湊與完美雜湊;布隆過濾器:帶保證或近似成員判斷的雜湊類結構。

評析

優點

  • 把資料結構當作演算法課題。 Cambridge稱本書是第一本把這一主題當作重要的演算法課題、而不是用來演示物件導向程式設計的瑣碎材料的書。
  • 廣度超出標準課程。 區間與範圍結構、篇幅很長的堆一章、並查集的各種變體、持久化與動態化、字串結構,以及多種雜湊方案彙集在一冊之中,500多條參考文獻則指向文獻來源。
  • 程式碼與圖示。 Software Engineering Notes上的書評者Igor Gvero稱,本書滿是插圖、圖表與程式碼,力求把電腦科學中最困難的主題之一講清楚;出版社則指出書中有大量C語言程式碼範例。
  • 既可作教材也可作參考書。 SIGACT News的書評認為,它適合作為研究所資料結構課程的主教材或輔助教材,也是實作者案頭的參考書。

局限

  • 入口不均衡。 第1章是入門性的,但從第2章起,目錄中出現攤銷分析、最佳搜尋樹、半群模型、快取無關演算法等以演算法課為前提的術語。
  • 偏重命令式。 程式碼範例以C寫成,面向不可變資料的結構不在目錄之內,因此函數式實作需要另找書籍。
  • 更像參考書而非平緩的序列。 第3章與第5章各列出十幾種變體,讀者可能需要挑選章節閱讀,而不是從頭讀到尾。

在課程中的定位

在本課程中,Brass是研究所程度、以廣度見長的教材。Wengrow的A Common-Sense Guide to Data Structures and Algorithms與Bhargava的Grokking Algorithms是沒有正式電腦科學背景的程式設計師的平緩起點。Goodrich、Tamassia與Goldwasser的Data Structures and Algorithms in Java是第二門課的教材,Morin的Open Data Structures為每種結構給出精確的介面、實作及執行時間上界的證明;二者都是讀Brass之前合適的準備。

Okasaki的Purely Functional Data Structures涉及另一個分支,即帶惰性求值的函數式語言中的持久化結構,與Brass關於持久化的第7章相得益彰。

如何使用本書

本書適合已經接觸過堆疊、佇列、樹、雜湊與漸近分析,並能閱讀C程式碼的讀者。可用於研究所課程、實作者的自學,或在標準函式庫結構不夠用時作為參考。

實用的閱讀方案:

  • 核心: 第2、3章(搜尋樹與主要的平衡樹家族),然後是第5章(堆)與第9章(雜湊表)。
  • 選讀專題: 對幾何或資料庫感興趣讀第4章,需要並查集的圖演算法讀第6章,字串處理讀第8章。
  • 技術: 第7章宜在讀過被其變換的結構之後再讀。
  • 附錄: 在跨章比較複雜度上界之前,先讀討論指標機與其他計算模型的10.1節。

書中的敘述圍繞實作細節展開,所以每章至少用C實作一種結構。