什么是基数树?
基数树是一种多叉搜索树,数据位于叶子节点上,每一个节点有固定的2^n个子节点(n为划分的基大小,当n为1时,为二叉树)。
什么为划分的基?
以一个64位的长整型为例,我们可以将64位的长整数切分为8位一组、4位一组、2位一组甚至1位一组等:
基数树的搜索方法是?
基数树的搜索方法是将索引的数据切片为若干小段(基),然后一小段一小段地向下查找,在有限的树高度内,一定能完成查找。
以上图数据按照8位划分为例:
可以观察到,当一个数据划分的越小块(基越小),会导致树的层数更高,但每个结点的子节点数更少,当一个数据划分的越大块(基越大),树的层数更低,每个结点的子节点数会更多。
特殊的基数树——Trie树
Trie树可以视作特殊的基数树,由于它索引的是字符串,它每个结点只有26个合法的子节点,但是由于字符串的特性,Trie树的层次是不确定的,可能存在特别长的字符串导致树的层次特别高。
基数树的插入和删除
基数树的插入和删除和其他查找树一致,对于插入操作,首先需要查找到插入位置,不存在则创建,对于删除操作,仅需删除叶子节点即可满足要求,可以不必将中间结点删除。
附上一张图源网络的插入过程:
https://juejin.cn/post/6933244263241089037
基数树的应用场景
(1)基数树用于内存管理,在Linux内核中,使用Radix Tree将页面组织起来,方便查找,通过Radix Tree,输入文件内偏移可以快速定位Cache项。参考:https://www.sohu.com/a/290524170_467784
(2)基数树存储公共前缀数据,基数树存储具有大量公共前缀的数据时,可以压缩数据量,如路由表(相同的IP前缀,固定的数据长度 https://github.com/openstat/ip-radix-tree)、内存地址映射(相邻的内存地址前缀相同,固定的数据长度)等场景,均可使用基数树做kv存储。
(3)用作数据库索引。参考:
https://blog.csdn.net/weixin_33699914/article/details/90594289