[C++] [算法] [Linux] radix tree

今天看Linux内核代码时,看到了radix tree,从书上大概地了解了radix tree的一些基本知识,包括它的结构和操作。由于Linux内核代码不容易看懂,因此,打算自己家先实现一下radix tree,然后再看内核中的代码,由于懒得去查radix tree的标准表示方式,所以,这里radix tree的结构与Linux内核使用的类似。

首先,简单说一下radix tree的结构。

radix tree的叶节点是存放在树中的数据,内节点包含子节点的指针,每个内节点的孩子个数固定,Linux内核一般设置为64,也就是内节点包含64个指针,内节点还包括本节点的有效孩子个数以及所在的层次,这里为了简单,并没有包含Linux内核内节点那么多数据。

radix tree的使用主要是提高查询效率,因此,这里说一下radix tree的查询操作:

每个内节点包含的指针个数是pow(2, n),好处是可以通过提取索引值的n位来得到该层的索引。由于这里采用的是pow(2, 6),因此,每层的索引值是6位。比如下图中的索引值131,转换成16进制就是0x00000083,内节点中存放的有当前节点所在的层次(从下往上计算),那么,提取第二层的索引值是2,因此取第二层的slot[2]转到第一层,然后提取第一层的索引值,是3,因此,提取第一层的slot[3],由于这是第一层了,于是,遍历结束,所得到的slot[3]就是希望查询的数据的指针。

《深入理解Linux内核》上关于radix tree的图示:

[C++] [算法] [Linux] radix tree_第1张图片

看了图应该很好理解了,直接贴代码吧,由于时间有限,没有对代码进行严格的测试,只测试了插入和查找操作,因此,代码有可能会有问题:

#include 
#include 
#include 
#include 
using namespace std;

typedef unsigned int u_int;

//常量定义
const u_int RADIX_TREE_SLOTS = 64; //一个内节点包含的最多的孩子个数
const u_int RADIX_MAX_LEVEL = 5; //最大的层数
const u_int radix_level[RADIX_MAX_LEVEL + 1] = { 0x00000000,
	                                             0x0000003F,
	                                             0x00000FC0,
	                                             0x0003F000,
	                                             0x00FC0000,
	         

你可能感兴趣的:(Linux,C++,c++)