融合几种独立结构的混合结构。
===Poptrie ===
本身设计是为了IP地址的压缩存储与快速查询,但是通过合适扩展其思想也可以被用于更广范围的数据存储。
Poptrie主要通过改进trie的思想来提升效率。Tire是通过树形结构来存储数据,主要利用数据之间前缀的重叠来提高存储效率。
其大体实现方法是先将数据分块,每一块对应树的一层,而每一层的节点的最大孩子节点数即为该块数据的可能至的数目,即每一个位置的孩子对应一块数据的一种取值。通过这种方法我们可以将一些数据构造成一棵树。这种方式当数据之间前缀重叠率高时,效果出色,而重叠率低时,可能反而会浪费空间。
Poptire改变之前每个位置都需要记录一个地址的问题,转而通过一个0/1记录该位置的孩子节点性质,同时在维护两个基地址,分别对应孩子节点为叶子节点和中间节点时的首地址,也就是说通过两个地址和一些0/1值代替原先的许多地址。为了能够读取,规定每个节点的所有叶子节点和所有中间节点都是连续存储的,也就是说可以通过指针的移动找到所有孩子节点的地址。在读取时,需要求出当前值对应的位置之前有多少叶子节点,而这可以通过记录的0/1值完成。同时为了进一步提升效率,Poptrie还将相同的叶子节点合并,同时再辅以一些0/1值来记录合并情况。
此外,Poptrie还考虑到在数据重叠性差时Trie树的糟糕反应,决定允许树的边跨越多层,即可以跳过一些层,在极端情况下,即只有一个数据时,可以由根指向表示该数据的叶子节点,避免在中间各层浪费空间。
在相关的论文中,研究人员已经验证在一些情况下,Poptrie处理IP地址数据是较为高效的。
#Hirochika Asai, Ohara Y, Poptrie: A Compressed Trie with Population Count for Fast and Scalable Software IP Routing Table Lookup, sigcomm 2014.
**研究论文:
# Athanassoulis, Manos, and Anastasia Ailamaki. "BF-tree: approximate tree indexing." Proceedings of the VLDB Endowment 7, no. 14 (2014): 1881-1892.