一种基于二分边界值计算的非平衡二叉树构造方法与流程

文档序号:17078519发布日期:2019-03-08 23:59阅读:390来源:国知局
一种基于二分边界值计算的非平衡二叉树构造方法与流程

本发明涉及计算机系统软件编程领域,特别是计算机基本数据结构中一种基于二分边界值计算的非平衡二叉树构造方法。



背景技术:

在计算机软件编程领域,二叉树是一种常用的数据结构,用于通过键值对数据进行快速检索。常见的有avl树、红黑树(rbtree)以及二元的基数树(radixtree),其中avl树和红黑树在构造过程中插入新增结点后都需要通过旋转操作重新调整其他结点的位置以达到左子树和右子树的结点数量分布和深度平衡或近似平衡,删除结点时也需要重新调整。虽然调整平衡对于后续的检索操作能显著提升检索速度,但在结点数量总规模较大且需要频繁增加和删除结点的应用场景中这两种二叉树会因为频繁进行调整而导致开销过大使性能下降。在实际应用中比如网络应用会使用基数树(radixtree),不管是二元的还是多元的基数树,虽然没有需要重新调整结点导致开销大的问题却需要消耗很多额外的内存来构造搜索路径造成大量内存资源的浪费。



技术实现要素:

本发明的目的是克服现有技术的上述不足而提供一种基于二分边界值计算的非平衡二叉树构造方法,在构造二叉树的过程中通过计算二分边界值来确定新增结点和二叉树中结点之间的关系。

本发明的技术原理是:在向二叉树插入新增结点的过程中,若新增结点与二叉树中结点的键值不相等,则必定能通过二分法将值域空间不断对半分割找到能将两个键值分割到不同区域的二分边界值,从而确定两个结点之间的关系以及插入结点的路径。例如:当新增结点与二叉树中结点的键值不相等时,必然存在一个小的键值a和一个大的键值b。先将整个值域空间对半分割,若a和b都在高半段则继续将高半段对半分割。若a和b都在第二次分割后的低半段则继续将这低半段对半分割,直到能将a和b分割到两个不同的值域空间,这个分割点就是需要计算的二分边界值c。

本发明的技术方案是:根据前面所述原理为了便于计算,将整个值域空间定为2的整数次幂,显然a和b最后被分割到两个不同的值域空间的宽度f也是2的整数次幂。根据二分法分割值域空间的规则,由于a所在值域空间是从一个2倍f宽度的值域空间分割而来的,所以a所在值域空间和b所在值域空间的边界值在整个值域空间中一定是在奇数个f宽度的位置,即这里要计算的二分边界值c=n×f,其中n为奇数,f为2的x次幂,x为整数。在计算机系统中2的x次幂表示为二进制数1左移x个二进制位即f=1<<x。根据前面所述原理二分边界值c使键值a和b同时满足下列条件:

(n﹣1)×f﹤a≦n×f

n×f≦b﹤(n﹢1)×f

a和b是整数且a≠0

根据以上条件以及奇数在计算机二进制数表示法中最低位为1的特点可知将n和n﹣1进行二进制位异或运算的结果等于1。因为键值a有可能等于二分边界值c,需要将键值a减一使得(n﹣1)×f≦a﹣1﹤n×f,以确保a﹣1的第x位一定为0而键值b的第x位一定为1,使得将a﹣1的值与键值b进行二进制位异或运算得到的中间值m最高为1的位是第x位。然后使用从高位到低位的二进制位扫描操作找到中间值m中最高为1的位x,就可算出f=1<<x的值,最后将键值b按系数f取整即可得到二分边界值c。对于a=0的特殊情况,c=0。再根据二分边界值c确定新增结点和二叉树中当前结点之间的关系。

当a<c<b时,先以c为键值创建一个边界结点,若新增结点键值为a,则新增结点是边界结点的左子结点,二叉树中当前结点是边界结点的右子结点。若新增结点键值为b,则新增结点是边界结点的右子结点,二叉树中当前结点是边界结点的左子结点,最后将边界结点插入二叉树中当前结点的位置。

当c=a时,若新增结点键值为a,则二叉树中当前结点是新增结点的右子结点,并将新增结点插入二叉树中当前结点的位置。若新增结点键值为b,则判断二叉树中当前结点的右子结点是否为空,为空则新增结点是二叉树中当前结点的右子结点,不为空则重复上述步骤来确定新增结点和右子结点的关系。

当c=b时,若新增结点键值为b,则二叉树中当前结点是新增结点的左子结点,并将新增结点插入二叉树中当前结点的位置。若新增结点键值为a,则判断二叉树中当前结点的左子结点是否为空,为空则新增结点是二叉树中当前结点的左子结点,不为空则重复上述步骤来确定新增结点和左子结点的关系。

本发明与现有技术相比具有如下特点:发明阐述了一种通过将新增结点与二叉树中结点的键值进行简单整数计算得到二分边界值,再根据二分边界值确定新增结点与二叉树中结点之间的关系来构造二叉树的方法。和现有技术相比,本发明具有简单快速的明显优势,且内存消耗小,更适合频繁添加和删除结点的应用场景。

以下结合附图和具体实施方式对本发明的详细结构作进一步描述。

附图说明

附图1为第一次对整个值域空间对半分割;

附图2为第二次对半个值域空间对半分割;

附图3为第三次分割值域空间找到二分边界值c;

附图4为对键值a减一的二进制值示意图;

附图5为将键值a减一后跟键值b进行异或运算的二进制值示意图;

附图6为对键值b按系数f取整的二进制值示意图;

附图7为二分边界值c满足条件a<c<b时键值a和b对应结点跟边界结点的关系示意图;

附图8为键值a等于二分边界值时跟键值b对应结点的关系示意图;

附图9为键值b等于二分边界值时跟键值a对应结点的关系示意图;

具体实施方式

如附图1、附图2、附图3所示:二分边界值计算的原理来自于对值域空间进行二分法分割所揭示的空间位置关系,在示意图中键值a和b最终被分割到了不同的区域。由图可知键值a所在的区域必定是由一个2f宽度的空间分割而来的,所以不论分割前a和b所在区域在总空间中是在偶数个2f宽度的位置还是在奇数个2f宽度的位置,在分割后a和b所在区域的边界值在总空间中一定是在奇数个f宽度的位置。根据奇数在二进制表示法中的特点,便可利用键值a和b在值域空间中的关系进行二进制位异或运算找到系数f所对应的二进制位,并进一步算出二分边界值c。

如附图4、附图5、附图6所示:进行二分边界值计算的过程中先将键值a减一,然后再与键值b进行二进制位异或运算得到中间值,再用位扫描操作找到系数f所对应的二进制位x等于4,即二进制数值1左移4个二进制位就得到系数f,最后键值b按系数f取整是通过取系数f的补码跟键值b进行二进制位与运算实现的。

如附图7、附图8、附图9所示:根据二分边界值c来确定结点之间的关系。当a<c<b时,需要额外创建一个以c为键值的边界结点,键值a对应的结点是边界结点的左子结点,键值b对应的结点是边界结点的右子结点。当c=a时,键值b对应的结点是a的右子结点。当c=b时,键值a对应的结点是b的左子结点。

本发明涉及到计算机系统中二进制位的运算操作,特别是涉及二进制位扫描的操作,在一些处理器平台上有专门的指令来提供硬件支持以提高性能,例如在intel的x86平台上可以使用bsr指令来快速获得目标值中最高为1的位。对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现该操作。对于没有提供硬件支持的处理器平台,本专业领域的技术人员也能熟练的使用且不限于二分法和查表法来获得目标值中最高为1的位。不能将这些实现上的差异解释为超出本发明的范畴。

名词解释

异或运算:是计算机系统里一种基本的二进制位运算,当异或运算的两个对应二进制位值相同时,运算结果为0,当异或运算的两个对应二进制位值不同时,运算结果为1。

与运算:是计算机系统里一种基本的二进制位运算,当与运算的两个对应二进制位值同为1时,运算结果为1,否则结果为0。

补码:在计算机系统中整数运算的负数形式是以补码来表示的,即整数f的补码等于0减f。

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