基于平衡二叉树的快速查缺方法与流程

文档序号:25213305发布日期:2021-05-28 14:09阅读:69来源:国知局
基于平衡二叉树的快速查缺方法与流程

本发明涉及网络数据技术领域,具体为基于平衡二叉树的快速查缺方法。



背景技术:

在大型网络数据传输场景中,接收端都需要检查收到的数据是否完整,而发送数据一般都会采用分片和并发送的方式,这就会导致接收端收到的数据,并不是连续和完整的,这个时候接收端就需要去遍历检查每一个分片是否到达,对于大数据和分布式文件系统,这种遍历所带来的的性能损耗是比较大的,现有的数据缺失查询,一般都采用遍历的方式,如果有n个分片,其效率是o(n),为此,我们提出基于平衡二叉树的快速查缺方法。



技术实现要素:

本发明的目的在于提供基于平衡二叉树的快速查缺方法,以解决上述背景技术中提出的问题。

为实现上述目的,本发明提供如下技术方案:基于平衡二叉树的快速查缺方法,包括如下步骤:

s1、构建一个64位的整形数组array,每个比特位表示一个分片,比如有512个分片,数组的第一个64位可以表示编号为0~63的分片,数组的第二个64位可以表示编号为64~127的分片,以此类推;

s2、当收到一个分片后,通过计算分片在数组中的位置,并设置相应比特位为1;

s3、通过平衡二叉树规则,将所有叶子节点两两做与运算,并构建其父节点,直至构建出根节点;

s4、构建出根节点后,即可从根节点开始,向下查询出哪些叶子节点是有缺失的。

优选的,所述步骤s1中每个节点只显示了64位的最后8位,前面56位都是默认1。

优选的,所述步骤s4中其查询过程为:如果根节点为uint64full(64位整数每一个比特位都是1),则表示所有分片都已经收到,数据完整,查询效率为0(1),否则查询左子树是否为uint64full,然后查询右子树,通过查询四个过程(查询1、查询2、查询3和查询4)即可快速查询到叶子结点3是有缺失的,因为每个节点是64位表示,所以虽然确定叶节点3有缺失,但是还不确定是哪一个比特位是0,为了不遍历64次,将再次对这个查询进行优化。

与现有技术相比,本发明的有益效果是:通过平衡二叉树,以及比特位分块的快速缺失查询,在(n文件或消息分片的数量,m是缺失文件或分片的数量)复杂度的性能下,快速找到哪些分片是缺失的。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本发明平衡二叉树的查缺流程图。

具体实施方式

下面对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参阅图1,本发明的基于平衡二叉树的快速查缺方法,包括如下步骤:

s1、构建一个64位的整形数组array,每个比特位表示一个分片,比如有512个分片,数组的第一个64位可以表示编号为0~63的分片,数组的第二个64位可以表示编号为64~127的分片,以此类推;

s2、当收到一个分片后,通过计算分片在数组中的位置,并设置相应比特位为1;

s3、通过平衡二叉树规则,将所有叶子节点两两做与运算,并构建其父节点,直至构建出根节点;

s4、构建出根节点后,即可从根节点开始,向下查询出哪些叶子节点是有缺失的。

步骤s1中为了方便查看,图1中每个节点只显示了64位的最后8位,前面56位都是默认1。

步骤s4中其查询过程为:如果根节点为uint64full(64位整数每一个比特位都是1),则表示所有分片都已经收到,数据完整,查询效率为0(1),否则查询左子树是否为uint64full,然后查询右子树,通过图1中查询的四个过程(查询1、查询2、查询3和查询4)即可快速查询到叶子结点3是有缺失的,因为每个节点是64位表示,所以虽然确定叶节点3有缺失,但是还不确定是哪一个比特位是0,为了不遍历64次,将再次对这个查询进行优化。

实施例一:

s1、构建一个64位的整形数组array,每个比特位表示一个分片,比如有512个分片,数组的第一个64位可以表示编号为0~63的分片,数组的第二个64位可以表示编号为64~127的分片,以此类推;

s2、当收到一个分片后,通过计算分片在数组中的位置,并设置相应比特位为1,其计算公式为:

arrindex=splitno/64

bitindex=splitno%64

array[arrindex]=array[arrindex]|(1<<bitindex)

s3、通过平衡二叉树规则,将所有叶子节点两两做与运算,并构建其父节点,直至构建出根节点;

s4、构建出根节点后,即可从根节点开始,向下查询出哪些叶子节点是有缺失的。

步骤s1中为了方便查看,图1中每个节点只显示了64位的最后8位,前面56位都是默认1。

步骤s4中其查询过程为:如果根节点为uint64full(64位整数每一个比特位都是1),则表示所有分片都已经收到,数据完整,查询效率为0(1),否则查询左子树是否为uint64full,然后查询右子树,通过图1中查询的四个过程(查询1、查询2、查询3和查询4)即可快速查询到叶子结点3是有缺失的,因为每个节点是64位表示,所以虽然确定叶节点3有缺失,但是还不确定是哪一个比特位是0,为了不遍历64次,将再次对这个查询进行优化。

本发明缺失索引映射表为:

上述图表为:构建一个0~65535的查询表,并且每个表项包含这个值哪些比特位上是0,比如key为0的索引值,其所有比特位都是0,则其value为(0,1,2…15),key为65534的索引值,其只有最后一个比特位是0,则其value为(0),通过快速缺失位置查询,就能知道一个16位的整数,哪些比特位是缺失的。

在步骤s4中,已经查询到叶子节点3有缺失,但是还不知道是哪个比特位缺失,将这个叶子节点划分为4个16位的整数,通过上述缺失索引映射表查询这4个16位整数,发现前面三个都完整,第四个整数值为65533,其缺失位置是:(1)。

再通过公式:

missingindex=64*(leafindex-1)+16*(splitindex-1)+mapindex

计算出缺失位置为64*(3-1)+16*(4-1)+1=177,即分片号为177的数据丢失。

首选将n个分片映射为64位数组,从而产生n/64个叶子节点再构建一颗平衡二叉树,在缺失位置查询的时候,通过二叉树搜索快速找到缺失叶子节点,再通过快速缺失映射表,将64位整数划分为4个16位整数,进行键值查询效率为0(1),所以查询效率即为平衡二叉树查询叶子子节点的效率为:0(logn/64),因此,如果要检查一个数据是否完整,只需要判断根节点是否为64位整形最大值即可,无需遍历所有分片。

以上所述仅为本发明的实施方式而已,并不用于限制本发明。对于本领域技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原理的内所作的任何修改、等同替换、改进等,均应包括在本发明的权利要求范围之内。

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