字典树Trie的定义和结点结构;基数树radix的定义和结点结构

字典树的定义:

Trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

 

例子:

给定多个字符串,如 {banana,band,apple,apt,bbc,app,ba},那么所构建的一棵TrieTree形状如下:

 

  其中,黄色的节点代表从根节点通往该节点的路径上所经过的节点的字符构成的一个字符串出现在原来的输入文本中,如以d为例,路径上的字符为:b-a-n-d,对应输入的字符串集合中的”band”。TrieTree可以很方便的扩展,当来了新的字符串时,只要把新的字符串按照原本的规则插入到原来的树中,便可以得到新的树。如需要加入新的单词”bat”,那么树的结构只需简单的拓展成如下的形式:

 

  可以看出,TrieTree充分利用字符串与字符串间拥有公共前缀的特性,而这种特性在字符串的检索与词频统计中会发挥重要的作用。

结点结构

 

 

 

 

基数树radix的定义:

  基数树可看做是以二进制位串为关键字的trie 树,是一种多叉树形结构,同时又类似多层索引表,每个中间节点包含指向多个子节点的指针数组,叶子节点包含指向实际的对象的指针(由于对象不具备树节点结构,因此将其父节点看做叶节点)。利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。因此,借助于Radix树,我们可以实现对于长整型数据类型的路由。

结点结构

92 rnh_treetop指向路由树顶端的radix_node结构;

93-94 rnh_addrsizernh_pktsize目前未被使用;

95-110 rnh_addaddrrnh_walktree是七个函数指针,它们所指向的函数将被调用以完成对树的操作;

41-41 rn_mklist是该结点掩码链表的表头;

43 如果rn_b值大于或者等于0,那么该结点为内部结点;否则就是叶子;

44 内部结点的rn_bmask是个单字节的掩码,用于检测相应的比特位是0还是1

45 

48-49 对于叶子而言rn_key指向插口地址结构,rn_mask指向保存掩码的插口地址结构.如果rn_mask为空,则其掩码为隐含的全1(即,该路由指向某个主机而不是某个网络)

 

50-51 当有多个叶子的键值相同时,使用rn_dupedkey指针;

 

52-58 rn_lrn_r是该内部结点的左、右指针;

 

 

 

例子:

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-10-04 21:39  Leon灬k  阅读(359)  评论(0)    收藏  举报