查找——图文翔解RadixTree(基数树)
基数树
radix树就是针对这样的稀疏的长整型数据查找,能高速且节省空间地完毕映射。借助于Radix树,我们能够实现对于长整型数据类型的路由。
利用radix树能够依据一个长整型(比方一个长ID)高速查找到其相应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。
radix tree是一种多叉搜索树。树的叶子结点是实际的数据条目。每一个结点有一个固定的、2^n指针指向子结点(每一个指针称为槽slot,n为划分的基的大小)
插入、删除
radix Tree(基数树) 事实上就几乎相同是传统的二叉树。仅仅是在寻找方式上。利用比方一个unsigned int的类型的每个比特位作为树节点的推断。
能够这样说,比方一个数1000101010101010010101010010101010,那么依照Radix 树的插入就是在根节点,假设遇到0。就指向左节点。假设遇到1就指向右节点,在插入过程中构造树节点,在删除过程中删除树节点。假设认为太多的调用Malloc的话,能够採用池化技术。预先分配多个节点。
(使用一个比特位推断。会使树的高度过高,非叶节点过多。故在实际应用中,我们通常是使用多个比特位作为树节点的推断,但多比特位会使节点的子节点槽变多。增大节点的体积,一般选用2个或4个比特位作为树节点就可以)
插入:
我们在插入一个新节点时,我们依据数据的比特位,在树中向下查找,若没有对应结点,则生成对应结点,直到数据的比特位訪问完,则建立叶节点映射对应的对象。
删除:
我们能够“惰性删除”,即沿着路径查找到叶节点后,直接删除叶节点,中间的非叶节点不删除。
应用
Radix树在Linux中的应用:
Linux基数树(radix tree)是将long整数键值与指针相关联的机制,它存储有效率。而且可高速查询,用于整数值与指针的映射(如:IDR机制)、内存管理等。IDR(ID Radix)机制是将对象的身份鉴别号整数值ID与对象指针建立关联表。完毕从ID与指针之间的相互转换。
IDR机制使用radix树状结构作为由id进行索引获取指针的稀疏数组,通过使用位图能够高速分配新的ID,IDR机制避免了使用固定尺寸的数组存放指针。IDR机制的API函数在lib/idr.c中实现。
Linux radix树最广泛的用途是用于内存管理。结构address_space通过radix树跟踪绑定到地址映射上的核心页,该radix树同意内存管理代码高速查找标识为dirty或writeback的页。
其使用的是数据类型unsigned
long的固定长度输入的版本号。每级代表了输入空间固定位数。Linux radix树的API函数在lib/radix-tree.c中实现。(把页指针和描写叙述页状态的结构映射起来。使能高速查询一个页的信息。)
Linux内核利用radix树在文件内偏移高速定位文件缓存页。
Linux(2.6.7) 内核中的分叉为 64(2^6)。树高为 6(64位系统)或者 11(32位系统),用来高速定位 32 位或者 64 位偏移,radix tree 中的每个叶子节点指向文件内相应偏移所相应的Cache项。
【radix树为稀疏树提供了有效的存储,取代固定尺寸数组提供了键值到指针的高速查找。】
后记
Radix树与Trie树的思想有点类似。甚至能够把Trie树看为一个基为26的Radix树。
(也能够把Radix树看做是Tire树的变异)
Trie树一般用于字符串到对象的映射。Radix树一般用于长整数到对象的映射。
trie树主要问题是树的层高。假设要索引的字的拼音非常长非常变态,我们也要建一个非常高非常变态的树么?
radix树能固定层高(对于较长的字符串,能够用数学公式计算出其特征值,再用radix树存储这些特征值)
【相关代码能够參考】
http://www.cnblogs.com/Bozh/archive/2012/04/15/radix.html
posted on 2017-05-22 08:44 wgwyanfs 阅读(17009) 评论(0) 编辑 收藏 举报