快速學習-梅克爾-帕特里夏樹

梅克爾-帕特里夏樹 Merkel-Patricia Tree(MPT)

MPT是什麼

  • Merkel Patricia Tree (MPT),翻譯爲梅克爾-帕特里夏樹
  • MPT 提供了一個基於密碼學驗證的底層數據結構,用來存儲鍵值對(key-value)關係
  • MPT 是完全確定性的,這是指在一顆 MPT 上一組鍵值對是唯一確定的,相同內容的鍵可以保證找到同樣的值,並且有同樣的根哈希(root hash)
  • MPT 的插入、查找、刪除操作的時間複雜度都是O(log(n)),相對於其它基於複雜比較的樹結構(比如紅黑樹),MPT 更容易理解,也更易於編碼實現

從字典樹(Trie)說起

  • 字典樹(Trie)也稱前綴樹(prefix tree),屬於搜索樹,是一種有序的樹數據結構
  • 字典樹用於存儲動態的集合或映射,其中的鍵通常是字符串
    在這裏插入圖片描述

基數樹(Radix Tree)

基數樹又叫壓縮前綴樹(compact prefix tree),是一種空間優化後的字典樹,其中如果一個節點只有唯一的子節點,那麼這個子節點就會與父節點合併存儲
在這裏插入圖片描述

基數樹節點

在一個標準的基數樹裏,每個節點存儲的數據如下:[i0, i1, … in, value]

  • 這裏的 i0,i1,…,in 表示定義好的字母表中的字符,字母表中一共有n+1個字符,這顆樹的基數(radix)就是 n+1
  • value 表示這個節點中最終存儲的值
  • 每一個 i0 到 in 的“槽位”,存儲的或者是null,或者是指向另一節點的指針
  • 用節點的訪問路徑表示 key,用節點的最末位置存儲value,這就實現了一個基本的鍵值對存儲

示例

  • 我們有一個鍵值對{ “dog”: “puppy” },現在希望通過鍵 dog 訪問它的值;我們採用16進制的 Hex 字符作爲字符集
  • 首先我們將 “dog” 轉換成 ASCII 碼,這樣就得到了字符集中的表示 64 6f 67,這就是樹結構中對應的鍵
  • 按照鍵的字母序,即 6->4->6->f->6->7,構建樹中的訪問路徑
  • 從樹的根節點(root)出發,首先讀取索引值(index)爲 6 的插槽中存儲的值,以它爲鍵訪問到對應的子節點
  • 然後取出子節點索引值爲 4 的插槽中的值,以它爲鍵訪問下一層節點,直到訪問完所需要的路徑
  • 最終訪問到的葉子節點,就存儲了我們想要查找的值,即“puppy”
    在這裏插入圖片描述

基數樹的問題

數據校驗

  • 基數樹節點之間的連接方式是指針,一般是用32位或64位的內存地址作爲指針的值,比如C語言就是這麼做的。但這種直接存地址的方式無法提供對數據內容的校驗,而這在區塊鏈這樣的分佈式系統中非常重要。

訪問效率

  • 基數樹的另一個問題是低效。如果我們只想存一個 bytes32 類型的鍵值對,訪問路徑長度就是64(在以太坊定義的 Hex 字符
    集下);每一級訪問的節點都至少需要存儲 16 個字節,這樣就需要至少 1k 字節的額外空間,而且每次查找和刪除都必須完整
    地執行 64 次下探訪問。

梅克爾樹(Merkel Tree)

也被稱作哈希樹(Hash Tree),以數據塊的 hash 值作爲葉子節點存儲值。梅克爾樹的非葉子節點存儲其子節點內容串聯拼接後的 hash 值。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章