天天看點

資料結構《17》---- Ternary Search Tree

一、 序言

上一篇文章中,給出了 trie 樹的一個實作。可以看到,trie 樹有一個巨大的弊病,記憶體占用過大。

本文給出另一種資料結構來解決上述問題---- ternary search tree (三叉樹)

二、資料結構定義

trie 樹中每個節點包含了 26 個指針,但有很大一部分的指針是 null 指針,是以浪費了大量的資源。

一種改進措施就是,以一棵樹來代替上述的指針數組。

節點定義如下:

一個節點代表了一個字母,左孩子的字母小于目前節點,右孩子的字母大于目前節點。

同時每個節點包含一個标記:指出目前節點是否是單詞的結尾。

如下圖: 

這個圖很容易了解錯。我詳細講解以下。

首先,根節點是 a, 以 a 為開頭的單詞都在 中子樹中;

左子樹表示那些首字母 < a 的單詞集合;

中子樹表示那些首字母 = a 的單詞集合;

右子樹表示那些首字母 > a 的單詞集合;

黃色表示單詞的結尾;

下圖中包含以下單詞: ab abcd abba bcd

資料結構《17》---- Ternary Search Tree

三、與 trie 樹的比較

當建立一個 7000+ 的詞典時,

1. trie 樹共消耗了大約 22383 * 27 * 4 byte = 2.4 m

2. ternary tree 共消耗了 22468 * 14 byte = 0.31m

可以看出,在記憶體占用方面 ternary tree 較 trie 樹有着巨大的優勢。

四、代碼