迭代法实现均衡树的初始化方法与流程

文档序号:14554874阅读:143来源:国知局
迭代法实现均衡树的初始化方法与流程

本发明涉及一种迭代法实现均衡树的初始化方法。



背景技术:

二叉树是一种重要的非线性数据结构,它是数据元素按照分支关系组织起来的结构,很像自然界中的树那样。一切具有层次关系的问题都可以用树描述,该结构被大量应用于数据的存储和查找中。例如,在网络通讯的数据交换中,需要查找ip地址,来确定转发的情况。而ip地址中存在通配符位,一般在查找的时候遵循最长匹配原则。生成树的存储和查找算法非常符合网络通讯的这种要求,所以该算法被大量应用于网络通信芯片中。

但是,基本的生成树算法中,没有考虑到每项存储数据的被查找的次数的问题。机械的按照能够查找到的原则,将需要查找的表项放在二叉树上。本发明所讨论的所有树均指二叉树。这样,由于树的查找效率与当前表项所处的深度有关,当前查找的表项存放得越深,查找该表项花费的次数和时间周期就越长。若那些被查找概率很大的表项不加判断,被放到非常深的存储位置上,则会浪费很多查找时间,降低该生成树表的查找效率。



技术实现要素:

针对现有技术中的缺陷,本发明的目的是提供一种迭代法实现均衡树的初始化方法,其不仅保证了存储在该二叉树的表项可以按照树的查找算法被正确的查找,并且考虑到了被查找项的被查找概率问题,将被查找概率较高的表项放在了层数较少的存储位置,将被查找概率较低的表项放在了层数较深的存储位置,提高了该树的查找效率。

根据本发明的一个方面,提供一种迭代法实现均衡树的初始化方法,其特征在于,所述迭代法实现均衡树的初始化方法包括以下步骤:

步骤一:将所有的搜索索引对齐后,观察每一列,去除那些全0或者全1的列,若存在没有通配符的列,则找出那些列;否则,找出那些通配符最少的列;

步骤二:若挑出的列只有一个,则就使用该列;否则将挑出的所有的列,依次以该列为基准将搜索索引分组,0为左边组,1为右边组,通配符的该行搜索索引不算;依次计算出左右两组的查找次数之差;选出该差为最小的那列,若该列不止一个,则按照统一规则,选取最靠左或者最靠右的那列作为挑选出的列;将该列列号根节点中,并且以该列为基准,将所有的搜索索引分为两组,该列对应的位为0的搜索索引为左边组,该列对应的位为1的搜索索引为右边组,该列对应列为通配符的搜索索引即放入左边组,也放入右边组;

步骤三:判断该树的拓扑结构是否满足自定义的拓扑结构,若是,则转步骤四;若否,则在该子树的分组中依次重复步骤二;

步骤四:判断目前放在树的拓扑结构的叶子中的搜索索引组是否除了通配符外,剩下的对应列完全相同,若相同,则将该叶子上的所有搜索索引以叶子节点的格式存储;若不同,则将该叶子上的所有搜索索引继续执行步骤二,生成下一子树,当下一子树生成结束后,该叶子以根节点格式存放对应内容。

优选地,所述迭代法实现均衡树的初始化方法主要引入了三个缓冲队列空间:子树缓冲空间、叶子缓冲空间和伪叶子缓冲空间。

优选地,所述迭代法实现均衡树的初始化方法采用先进先出的队列方式。

与现有技术相比,本发明具有如下的有益效果:一,在树结构存储的基础上,不仅满足了树本身最长匹配查找的要求,而且在初始化建立树的分支时,考虑到了查找次数和查找深度的平衡,使得整棵树上的表项和搜索索引的查找效率比普通树要高很多。二,在本发明提出的均衡树初始化代码实现方案中,引入的三个缓冲队列,成功的降低了代码设计的复杂度,通过回环复用的方式,简化了代码设计。使得复杂多变的树结构的生成最终提炼成了分组,入队和出队的三个核心问题。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为子树结构图。

图2为本发明迭代法实现均衡树的初始化方法的流程图。

具体实施方式

下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进。这些都属于本发明的保护范围。

如图2所示,本发明迭代法实现均衡树的初始化方法包括以下步骤:

步骤一:将所有的搜索索引对齐后,观察每一列,去除那些全0或者全1的列,若存在没有通配符的列,则找出那些列;否则,找出那些通配符最少的列。

步骤二:若挑出的列只有一个,则就使用该列;否则将挑出的所有的列,依次以该列为基准将搜索索引分组,0为左边组,1为右边组,通配符的该行搜索索引不算。依次计算出左右两组的查找次数之差。选出该差为最小的那列,若该列不止一个,则按照统一规则,选取最靠左或者最靠右的那列作为挑选出的列。将该列列号根节点中,并且以该列为基准,将所有的搜索索引分为两组,该列对应的位为0的搜索索引为左边组,该列对应的位为1的搜索索引为右边组,该列对应列为通配符的搜索索引即放入左边组,也放入右边组。

步骤三:判断该树的拓扑结构是否满足自定义的拓扑结构,若是,则转步骤四;若否,则在该子树的分组中依次重复步骤二。

步骤四:判断目前放在树的拓扑结构的叶子中的搜索索引组是否除了通配符外,剩下的对应列完全相同,若相同,则将该叶子上的所有搜索索引以叶子节点的格式存储。若不同,则将该叶子上的所有搜索索引继续执行步骤二,生成下一子树,当下一子树生成结束后,该叶子以根节点格式存放对应内容。

如图1所示,这里主要引入了三个缓冲队列空间:子树缓冲空间、叶子缓冲空间和伪叶子缓冲空间。采用先进先出的队列方式,最终当所有空间内容出队清空,则代表一棵树的初始化完成。

这几个空间入队出队的顺序可以为:

顺序一:

优先级1:子树缓冲队列(优先级最高)

优先级2:伪叶子缓冲队列

优先级3:叶子缓冲队列

顺序二:

优先级1:子树缓冲队列(优先级最高)

优先级2:叶子缓冲队列

优先级3:伪叶子缓冲队列

当目前分组完成且优先级1的队列非空时,从优先级1的队列中出队数据执行分组判断;当目前分组完成且优先级1的队列空且优先级2的队列非空时,从优先级2的队列中出队数据执行分组判断(或者将其中的数据写入存储空间);当目前分组完成,且优先级1的队列空,且优先级2的队列空,且优先级3的队列非空时,从优先级3的队列中出队数据执行分组判断(或者将其中的数据写入存储空间)。叶子缓冲队列出队后需要完成的操作为,将出队的数据写入存储空间。子树缓冲队列和伪叶子缓冲队列出队后需要完成的操作为,将出队的数据进行分组判断。

输入搜索索引+表项内容模块:其用于将待生成二叉树的数据输入算法处理相关模块。

挑出分组参照列模块:作为算法处理模块,其用于在输入的一个或多个搜索索引+表项内容中,根据输入的搜索索引,参照算法步骤1和步骤2所描述的原则,挑选出一列,以便于后续对输入数据进行分组。

按照参照列分组:作为算法处理模块,其用于根据已选出的列,参照算法步骤2的原则,将输入数据分为2组。

根据规则判断,将分组数据入队模块:最为算法处理模块,其用于将分组后的数据,先左边组再右边组(或者先右边组再左边组),根据规则在3种缓冲空间中选择一种缓冲空间进行入队操作。规则为:若当前子树的拓扑结构已满足图1所示的一种结构之一,且若当前组的数据可以放入同一叶子中,则将当前组入队叶子缓冲空间;若当前子树拓扑结构已满足图1所示的一种结构之一,且若当前组的数据不能放入同一叶子中,则将当前组入队伪叶子缓冲空间;若当前子树拓扑结构不满足图1所示的一种结构之一,则将当前组入子树缓冲空间。

将表项和搜索索引按照叶子节点格式存储模块作为算法的输出模块,其用于将叶子空间的数据依次出队,并且按照固定的格式,写入正确的空间地址上,该地址存储于根节点格式中。

本发明涉及到以下概念:

搜索索引:用于构建整棵树的存储结构,在查找时使用的索引。为数字加通配符(通配符*,代表0或者1均可)。在使用ip地址作为搜索索引的应用中,搜索索引的长度是固定的,但是,在其它应用中,搜索索引的长度也可以是不固定的,也就是说,每个搜索索引的长度可以不同。

表项内容:代表通过索引查找的结果内容。一般由数字组成。其长度也可以根据需要在一张表中使用不同的表项长度,但是,在一般应用中,在一张表中的表项内容的长度是相同的。

树的拓扑结构:这里指定了9种二叉树的结构,每种结构代表一个子树的拓扑,如图1,浅色的圆圈代表根和节点,深色的圆圈代表叶子。也可以根据自己的需要定义不同的二叉树拓扑结构。

真叶子:在子树的拓扑结构的叶子位置上,并且其中存放的内容为叶子节点的格式,仅存放结果和搜索索引相关的内容。这片叶子上不再向下链接子树的拓扑结构。

伪叶子:在子树的拓扑结构的叶子位置上,但是其中存放的内容为根节点的格式,这片叶子上存放向下链接子树的拓扑结构。

根节点:一棵树或者子树的开始,用于存放树与拓扑结构相关的内容,包括树的拓扑结构,指明每次存放参照搜索索引的位号(该位为0代表向左查,该位为1代表向右查),指明每个叶子节点的存储地址,并指明每个叶子节点是否为真叶子。

叶子节点:用于存放搜索索引以及存放表项内容的地址等相关内容,包括搜索索引的值,以及通配符的位置,链接叶子存放地址。

查找次数的计算:一个分组中所有搜索索引的个数相加,若该搜索索引中含有n个通配符,则该搜索索引的个数按2的n次方计算;否则,该搜索索引个数按1计算。

均衡树生成的原则,优先级较高原则:尽量使得整棵树的所有表项的查找次数之和最小;优先级较低原则:尽量使得整棵树的拓扑结构分布尽量均匀。

这里以verilog硬件代码的实现为例,(还可以使用其它编程语言实现),介绍本发明的实现方案。待生成树的搜索索引+表项的输入,可以采用文发明的方式,使用文本发明输入的方式输入到代码中待处理。三个队列缓冲空间可以使用代码设计一个先进先出的队列,通过例化,重复例化三次。挑出分组列的模块可以设计一个计算查找次数的模块,通过调用和例化该模块,计算出某一列的0和1组的查找次数的差,同理,计算出所有需要比较的不同列的分组后的查找次数之差,再通过比较,找出差最小的最靠左(或者最靠右)那列,作为挑出的列。在出队叶子缓冲队列时,将实现将叶子中的内容写入存储空间。这是所有数据跳出代码循环的出口。也就是说,当所有的数据最终以正确的格式写入存储空间,以供以后最长匹配的查找,整个代码的功能就完成了。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变形或修改,这并不影响本发明的实质内容。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1