2000 年的網路泡沫,並未阻止資訊的爆炸。相反,Web 2.0 的浪潮——部落格、社群網路 (Facebook, 2004)、影音分享 (YouTube, 2005)——帶來了比 1990 年代更恐怖的資料洪流。這些資料不再是靜態的網頁,而是動態的、由全球數十億用戶每分每秒產生的「狀態」:按讚、上傳、評論、紀錄軌跡。
1990 年代末的「分歧 4」(結構 vs. 可擴展性) 在此時激化為一場全面戰爭。「水平擴展」(Scale-Out) 成為唯一的出路,催生了「NoSQL」運動。工程師們意識到,B+ 樹那種精緻、複雜、追求「ACID 強一致性」的結構,已經無法應付這場混亂。他們需要更簡單、更粗暴、更具彈性的新結構。與此同時,正是這股資料洪流,灌溉了人工智慧的種子。沉寂了數十年的「神經網路」藉由「大數據」和「強大算力」(GPU) 重生,開啟了「深度學習」的革命。這群 AI 科學家們也需要全新的結構,但他們的目的不同:他們需要的不是「儲存」,而是「表達」,是能讓機器「理解」這個世界的資料形狀。於是,資料結構的演化,再次分裂成兩條偉大的航道。
一、 大數據航道 (I):為「速度」而生的妥協
1. LSM 樹:向「寫入」的極致妥協
B+ 樹在 1990 年代統治了資料庫,因為它讀取很快。但它有一個致命弱點:寫入很慢。當你 INSERT 一筆新資料時,B+ 樹為了維持平衡,可能需要分裂節點,這個過程牽涉到多次「隨機磁碟 I/O」。在 Web 2.0 時代,系統每秒要處理上百萬次的「按讚」和「發文」,這種「隨機寫入」的瓶頸是無法接受的。
2006 年,Google 發表了奠基性的「Bigtable」論文,其核心思想源自 1996 年的「LSM 樹」(Log-Structured Merge-Tree)。LSM 樹的哲學是**「寫入的成本,越晚支付越好」**。它將「隨機寫入」變成了「循序寫入」:所有新的資料(包含修改和刪除)都只會被「追加」(Append) 到一個位於「記憶體」中的日誌 (MemTable)。記憶體中的寫入是極速的。當 MemTable 滿了,它會被「凍結」並作為一個不可變的「SSTable」(已排序字串表)完整地刷入磁碟。
這是一個天才般的妥協。LSM 樹的「寫入」效能是無敵的,因為它永遠是循序 I/O。它的代價是「讀取」變得更複雜:為了找到一個鍵,系統必須先檢查 MemTable,然後再去檢查磁碟上一層層的 SSTable 檔案。這就是為什麼 LevelDB、Cassandra、RocksDB 這些 NoSQL 資料庫「寫入」極快,但「讀取」效能(尤其是範圍掃描)通常不如 B+ 樹的原因。LSM 樹,是專為「寫入密集型」大數據時代而生的結構。
2. Skip List:用「機率」取代「平衡」
大數據的另一個挑戰是「讀取速度」。當一篇貼文爆紅,或雙 11 的熱門商品被瘋搶時,系統需要的是「記憶體內」的極速快取。這催生了 Redis 這樣的「記憶體鍵值儲存」系統。Redis 需要一個能快速查找、又能快速增刪的「排序」結構,來實作「排行榜」(Sorted Set) 這類功能。
1980 年代的「紅黑樹」似乎是個好選擇?但 Redis 的作者 Salvatore Sanfilippo 卻拒絕了它。為什麼?因為紅黑樹太「複雜」了。它的「旋轉」和「重新著色」邏輯非常難以實作,且在「多執行緒」環境下,為了「上鎖」(Locking) 所付出的效能代價太高。他需要一個更簡單、更務實的方案。
他找到了 1989 年由 William Pugh 發明的「Skip List」(跳躍串列)。Skip List 的結構非常巧妙:它是一個普通的「鏈結串列」,但它在基礎上,增加了很多層「捷徑」(或稱「快速通道」)。一個節點是否要出現在「更高層」的捷徑上,完全由「擲骰子」的機率決定。這使得 Skip List 成為一個「機率型」的資料結構。它在「數學期望」(平均情況)下,提供了與紅黑樹完全相同的 O(\log n) 查找、插入、刪除效能,但它的實作卻比紅黑樹簡單幾個數量級。Redis 的成功,證明了這種「夠用就好」的務實主義,是這個時代的工程顯學。
3. Trie & Bloom Filter:在「空間」與「精確度」上做文章
這個時代還復活了兩個古老的結構,它們的共同點是「在特定場景下極度高效」。第一個是「Trie」(前綴樹)。當你在 Google 搜尋框輸入「資料結」時,系統會立刻提示「資料結構」。Trie 就是實現這種「自動完成」的完美結構。它將字串的「共同前綴」作為路徑,大大壓縮了儲存空間,並能以 O(k)(k 為字串長度)的超高效率查詢是否存在某個前綴。
第二個是「Bloom Filter」(布隆過濾器),一個 1970 年的發明。這是一種「犧牲精確度以換取空間」的機率結構。它就像一個集合,但只佔用極小的空間。它能 100% 準確地判斷「某個元素肯定不存在於集合中」,但它在判斷「某個元素存在」時,有很小的機率會「誤判」(False Positive)。
這有什麼用?用處太大了。Google Chrome 用它來判斷一個網址「是否為惡意網站」,如果 Bloom Filter 說「不存在」,那 100% 安全;如果說「可能存在」,瀏覽器再去向伺服器做一次昂貴的完整檢查。Bigtable 和 Cassandra 則用它來「加速讀取」:在去硬碟上讀取 SSTable 之前,先問一下 Bloom Filter「這個 Key 存在嗎?」,如果答案是「肯定不存在」,系統就省下了一次昂貴的磁碟 I/O。
二、 AI 航道 (II):為「智慧」而生的形狀
1. 陣列的復興:Tensor 與「特徵」的形狀
就在 NoSQL 工程師們與 LSM 樹和 Skip List 搏鬥的同時,另一群 AI 科學家正在「重塑」一個最古老的結構:1950 年代的「陣列」(Array)。在 2012 年 AlexNet 贏得 ImageNet 競賽、引爆深度學習革命後,「陣列」以一個新名字重生了——「Tensor」(張量)。
Tensor 就是一個「多維陣列」。0 維 Tensor 是純量 (Scalar),1 維是向量 (Vector),2 維是矩陣 (Matrix),3 維(例如 [高度][寬度][顏色])就是一張圖片。這個結構本身並不稀奇,稀奇的是它的「用途」。在 AI 時代,Tensor 不再是為了「儲存」資料,而是為了「表示」資料。它是一個「認知結構」。
AI 的核心是「線性代gebra」,而 Tensor 就是線性代gebra的「通用語言」。它將世間萬物(文字、聲音、影像)都轉換為高維空間中的「數字向量」。一個詞(例如「國王」)不再是一個字串,而是一個 300 維的 1D Tensor(詞向量)。這種表示法允許機器進行「數學運算」來理解「語意」(例如,"國王" - "男人" + "女人" = "皇后")。PyTorch 和 TensorFlow 這些 AI 框架,本質上就是極度最佳化的「Tensor 運算函式庫」,它們能在 GPU/TPU 這些專用硬體上高速執行矩陣乘法。
2. 圖的再臨 (I):作為「演算法」的計算圖
「圖」(Graph) 在 1990 年代因為 PageRank 而大放異彩,進入 AI 時代,它迎來了第二次、更深刻的復興。它的第一個新角色,是「計算圖」(Computational Graph)。這是一種「元結構」(Meta-Structure),它描述的不是「資料」,而是「運算流程」本身。
當你在 TensorFlow 中定義一個神經網路時,你其實是在「建造一個圖」。圖中的「頂點」(Node) 是「操作」(例如 +、*、ReLU),而「邊」(Edge) 則是「Tensor」(資料流)。例如 (a * b) + c 會被建成一個有三個輸入、兩個操作頂點的圖。
為什麼要這麼麻煩?因為這個「圖」結構,是 AI 框架得以自動化的關鍵。框架可以自動分析這個圖,來計算「梯度」(即「反向傳播」Backpropagation,這是深度學習的核心),並能智慧地將圖中的運算任務「分散」到多個 CPU 或 GPU 上去執行。計算圖,是 AI 描述「智慧如何運作」的藍圖。
3. 圖的再臨 (II):作為「認知」的圖神經網路
最後,我們迎來了終極的融合:當 AI 模型本身,就是一個「圖」時。這就是「圖神經網路」(Graph Neural Network, GNN)。在 2010 年代中後期,AI 科學家開始意識到,世界上有許多最重要的資料,其「結構」本身就是「圖」:例如 Facebook 的「人際關係圖」、藥物研發的「分子結構圖」、或是你我的「知識圖譜」。
傳統 AI(如 CNN)擅長處理「網格狀」的 Tensor(如圖片),但無法處理這種不規則的「圖」結構。GNN 應運而生。GNN 是一種能「直接在圖上運行」的 AI。它讓每個節點去「查看」它的「鄰居」節點,匯總鄰居的資訊來更新自己的「特徵」(Tensor)。這個過程不斷重複,資訊就在圖上「傳播」開來。
GNN 的出現,是「分歧 5」的完美體現。我們不再是「為了 AI 而重塑資料結構」(如 Tensor),而是「讓 AI 去適應資料結構」(GNN)。在這裡,資料結構(圖)與演算法(GNN)已經合而為一。我們用「圖」來表達世界萬物的「關係」,然後用「GNN」來理解這些「關係」。
最終分歧——從「如何儲存」到「如何理解」
回顧這 70 年的歷史,我們看到了一條清晰的演化路徑。
從 1950 年代到 1990 年代(分歧 1 至 4),資料結構的核心命題始終是**「效率」**。無論是 Array vs. Linked List(靜態 vs. 動態)、BST vs. Hash Table(邏輯 vs. 儲存)、還是 B+ Tree vs. Distributed Hash(結構 vs. 擴展),我們都在問同一個問題:「如何用最快(時間)和最省(空間)的方式,去儲存和取回資料?」我們的度量標準是 O(1)、O(log n) 和 O(n)。
而 2000 年至今,這個命題發生了根本性的「分歧 5」:
- 大數據航道:將「效率」問題推向了「無限規模」的極致。LSM 樹和 Skip List 等結構,是為了在「無限速度」和「無限資料量」的壓力下,找到的一個「務實的妥協」。
- AI 航道:則提出了一個全新的命題——「理解」。我們不再只問「如何儲存」,而是問:「如何用最適當的『形狀』去表示資料,才能讓機器『理解』資料背後的意義?」
這就是「數據結構」與「認知結構」的最終分歧。Tensor 是 AI 理解「特徵」的形狀,Graph 則是 AI 理解「關係」的形狀。我們的度量標準不再是 O(log n),而是 AI 模型的「準確率」(Accuracy) 或「損失值」(Loss)。
資料結構,這門古老的科學,從最初作為演算法的「容器」,演變至今,已經成為了「智慧」本身的骨架。













