一、 序言
上一篇文章中,给出了 trie 树的一个实现。
能够看到,trie 树有一个巨大的弊病,内存占用过大。
本文给出还有一种数据结构来解决上述问题---- Ternary Search Tree (三叉树)
二、数据结构定义
Trie 树中每一个节点包括了 26 个指针,但有非常大一部分的指针是 NULL 指针,因此浪费了大量的资源。
一种改进措施就是,以一棵树来取代上述的指针数组。
节点定义例如以下:
一个节点代表了一个字母,左孩子的字母小于当前节点,右孩子的字母大于当前节点。
同一时候每一个节点包括一个标记:指出当前节点是否是单词的结尾。
例如以下图:
这个图非常easy理解错。
我具体解说下面。
首先,根节点是 A。 以 A 为开头的单词都在 中子树中;
左子树表示那些首字母 < A 的单词集合。
中子树表示那些首字母 = A 的单词集合;
右子树表示那些首字母 > A 的单词集合。
黄色表示单词的结尾。
下图中包括下面单词: AB ABCD ABBA BCD
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hvdWxpbmp1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
三、与 Trie 树的比較
当建立一个 7000+ 的词典时。
1. Trie 树共消耗了大约 22383 * 27 * 4 BYTE = 2.4 M
2. Ternary Tree 共消耗了 22468 * 14 BYTE = 0.31M
能够看出,在内存占用方面 Ternary Tree 较 Trie 树有着巨大的优势。
四、代码