掌桥专利:专业的专利平台
掌桥专利
首页

数据排序方法、装置、设备、存储介质及程序产品

文献发布时间:2023-06-19 12:05:39


数据排序方法、装置、设备、存储介质及程序产品

技术领域

本发明涉及数据排序技术领域,尤其涉及一种数据排序方法、装置、设备、存储介质及程序产品。

背景技术

二叉堆(Binary Heap)是一种基于二叉树的数据结构,广泛应用于实现从大量数据中选取最大或最小的N个数据以及优先级队列,即实现数据排序。

现有技术中基于指针链的二叉堆的数据排序方法应用于实现优先级队列如定时器队列时,在原数据中进行待更新数据的增加或删除操作时要定位尾节点,定位尾节点的过程需要根据二叉堆中各节点的子节点指针从根节点一步步定位到尾节点。

然而,上述现有方法中定位尾节点的时间复杂度高,导致进行待更新数据的增加或删除操作的时间复杂度高,即对原数据进行更新及排序操作的时间复杂度高。

发明内容

本发明实施例提供一种数据排序方法、装置、设备、存储介质及程序产品,以解决现有的基于指针链的二叉堆的数据排序方法中,定位尾节点的时间复杂度高,导致进行待更新数据的增加或删除操作的时间复杂度高的技术问题。

第一方面,本发明实施例提供一种数据排序方法,所述方法包括:

获取数据排序更新请求,所述数据排序更新请求中包括:待更新数据和更新类型;

根据数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,当前游标节点为所述二叉堆中第一个叶子节点或半节点,所述二叉堆为根节点在最上层,叶子节点在下层的二叉堆,所述第一个叶子节点为最上层最左侧的叶子节点,所述半节点为只有左子节点的节点;

根据所述更新类型及所述当前游标节点确定所述待更新数据在所述二叉堆中对应的待更新节点;

根据所述待更新节点和所述待更新数据对所述原数据进行更新及排序操作。

在一种可能的实施方式中,所述根据所述更新类型及所述当前游标节点确定所述待更新数据在所述二叉堆中对应的待更新节点,包括:

若确定所述更新类型为增加数据类型,则确定待更新数据对应的待更新节点为当前游标节点的待增加的子节点;

若确定所述更新类型为删除数据类型,则确定待更新数据对应的待更新节点为尾节点,并确定待更新数据对应的待删除节点。

在一种可能的实施方式中,所述若确定待更新节点为游标节点待增加的子节点,则所述根据所述待更新节点和所述待更新数据对所述原数据进行更新及排序操作,包括:

在游标节点增加子节点作为待更新节点,将所述待更新数据添加到待更新节点中,以完成对原数据的更新操作;

根据所述待更新节点中的待更新数据与所述待更新节点对应的父节点中的数据,确定所述待更新节点与所述待更新节点对应的父节点是否需要进行交换操作,若是,则对所述待更新节点对应的父节点及所述待更新节点进行交换操作,以完成对原数据的排序操作。

在一种可能的实施方式中,所述若确定待更新节点为尾节点,则所述根据所述待更新节点和所述待更新数据对所述原数据进行更新及排序操作,包括:

删除尾节点,以完成对原数据的更新操作;

采用所述尾节点替换掉待删除节点,作为新节点;

根据所述新节点中的数据与所述待删除节点对应的子节点中的数据,确定所述新节点与所述待删除节点对应的子节点是否需要进行交换操作,若是,则对所述新节点与所述待删除节点对应的子节点进行交换操作,以完成对原数据的排序操作。

在一种可能的实施方式中,所述循环双向链表中包括所述二叉堆中非游标节点的叶子节点及游标节点,以及所述二叉堆中非游标节点的叶子节点及游标节点对应的当前指向关系;

所述根据所述待更新节点和所述待更新数据对所述原数据进行更新操作之后,还包括:

根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新。

在一种可能的实施方式中,所述二叉堆的节点从左至右,从上至下顺序排列形成节点顺序;

所述二叉堆中非游标节点的叶子节点及游标节点对应的当前指向关系具体包括:

非游标节点及尾节点的叶子节点的左节点指针指向所述叶子节点的上一节点,所述叶子节点的右节点指针指向所述叶子节点的下一节点,所述游标节点的左节点指针指向尾节点,所述游标节点的右节点指针指向所述游标节点的下一节点,所述尾节点的左节点指针指向所述尾节点的上一节点,所述尾节点的右节点指针指向所述游标节点。

在一种可能的实施方式中,所述若所述更新类型为增加数据类型,所述当前游标节点的类型为第一个叶子节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新,包括:

更新待更新节点的左节点指针指向所述待更新节点的上一节点,更新待更新节点的右节点指针指向当前游标节点,更新所述待更新节点的上一节点的右节点指针指向待更新节点,更新当前游标节点的左节点指针指向待更新节点,保持当前游标节点指针的指向不变。

在一种可能的实施方式中,所述若所述更新类型为增加数据类型,所述当前游标节点的类型为半节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新,包括:

更新待更新节点的左节点指针指向所述待更新节点的上一节点,更新待更新节点的右节点指针指向当前游标节点的下一节点,更新所述待更新节点的上一节点的右节点指针指向待更新节点,更新所述当前游标节点的右节点指针指向待更新节点,更新所述当前游标节点为当前游标节点的下一节点,更新更新后的当前游标节点的左节点指针指向待更新节点。

在一种可能的实施方式中,所述若所述更新类型为删除数据类型,所述当前游标节点的类型为第一个叶子节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新,包括:

更新当前游标节点的上一节点的右节点指针指向当前游标节点,更新所述当前游标节点的左节点指针指向所述当前游标节点的上一节点,更新所述当前游标节点为当前游标节点的上一节点,更新所述待更新节点的上一节点的右节点指针指向更新后的当前游标节点。

在一种可能的实施方式中,所述若所述更新类型为删除数据类型,所述当前游标节点的类型为半节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新,包括:

更新当前游标节点的左节点指针指向待更新节点的上一节点,更新待更新节点的上一节点的右节点指针指向当前游标节点,保持当前游标节点指针的指向不变。

第二方面,本发明实施例提供一种数据排序装置,包括:

获取模块,用于获取数据排序更新请求,所述数据排序更新请求中包括:待更新数据和更新类型;

第一确定模块,用于根据数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,当前游标节点为所述二叉堆中第一个叶子节点或半节点,所述二叉堆为根节点在最上层,叶子节点在下层的二叉堆,所述第一个叶子节点为最上层最左侧的叶子节点,所述半节点为只有左子节点的节点;

第二确定模块,用于根据所述更新类型及所述当前游标节点确定所述待更新数据在所述二叉堆中对应的待更新节点;

执行模块,用于根据所述待更新节点和所述待更新数据对所述原数据进行更新及排序操作。

第三方面,本发明实施例提供一种数据排序设备,包括:存储器和至少一个处理器;所述至少一个处理器包括:第一异构处理模块和第二异构处理模块;

所述存储器存储计算机执行指令;

所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如第一方面任一项所述的数据排序方法。

第四方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如第一方面任一项所述的方法。

第五方面,本发明实施例提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现第一方面任一项所述的方法。

本发明实施例提供的数据排序方法、装置、设备、存储介质及程序产品,通过获取包括待更新数据和更新类型的数据排序更新请求,并根据该数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,并根据更新类型及当前游标节点确定待更新数据在二叉堆中对应的待更新节点,根据待更新节点和待更新数据对原数据进行更新及排序操作,能够通过循环双向链表实现对游标节点的快速定位,进而实现对待更新节点的快速定位,降低对原数据进行更新及排序操作的时间复杂度。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种应用场景示意图;

图2为本发明实施例提供的一种数据排序方法的流程示意图;

图3为本发明实施例提供的另一种数据排序方法的流程示意图;

图4为本发明实施例提供的一种游标节点及当前指向关系的更新过程的示意图;

图5为本发明实施例提供的另一种游标节点及当前指向关系的更新过程的示意图;

图6为本发明实施例提供的又一种游标节点及当前指向关系的更新过程的示意图;

图7为本发明实施例提供的再一种游标节点及当前指向关系的更新过程的示意图;

图8为本发明实施例提供的一种数据排序装置的结构示意图;

图9为本发明实施例提供的一种数据排序设备的结构示意图。

具体实施方式

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

二叉堆作为一种基于二叉树的数据结构,是完全二叉树或近似完全二叉树,其广泛应用于实现从大量数据中选取最大或最小的N个数据以及优先级队列,即实现数据排序。二叉堆的实现通常基于指针链,该种方法中通常可以根据跟节点指针直接定位根节点,而二叉堆的其他节点的定位均根据各节点的子节点指针从根节点一步步定位到各节点。

基于指针链的二叉堆的数据排序方法应用于实现优先级队列,例如实现定时器队列时,在进行待更新数据的增加或删除操作时要定位尾节点,而定位尾节点的通常操作是根据二叉堆中各节点的子节点指针从根节点一步步定位到尾节点,该过程中时间复杂度为O(log

为了解决上述问题,本发明实施例设置一指针直接指向当前游标节点,定义当前游标节点为二叉堆中第一个叶子节点或半节点,并基于二叉堆中的所有非游标节点的叶子节点及游标节点构成循环双向链表,该循环双向链表中还包括上述所有非游标节点的叶子节点及游标节点对应的当前指向关系,通过获取数据排序更新请求,该数据排序更新请求中包括:待更新数据和更新类型,根据数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,根据更新类型及当前游标节点确定待更新数据在二叉堆中对应的待更新节点,并根据待更新节点和待更新数据对原数据进行更新及排序操作,能够基于循环双向链表中的当前指向关系进行对当前游标节点的更新,实现对游标节点的快速定位,进而实现对待更新节点的快速定位,降低对原数据进行更新及排序操作的时间复杂度。

图1为本发明实施例提供的一种应用场景示意图。如图1所示,本发明实施例提供的方案可以应用于数据排序设备,该设备获取数据排序更新请求,并对存储于该排序设备的存储有原数据的二叉堆进行处理操作,最终实现对原数据的更新及排序。

图2为本发明实施例提供的一种数据排序方法的流程示意图。本发明实施例中方法的执行主体可以为数据排序设备。如图2所示,本实施例中的方法,可以包括:

步骤201、获取数据排序更新请求,所述数据排序更新请求中包括:待更新数据和更新类型。

本实施例中,更新类型可以为增加数据类型或删除数据类型,待更新数据与更新类型相对应,若更新类型为增加数据类型,则待更新数据为待增加数据,若更新类型为删除数据类型,则待更新数据为待删除数据,相应的,增加数据类型的更新是将待增加数据增加到存储有原数据的二叉堆中,删除数据类型的更新是从存储有原数据的二叉堆中删除待删除数据。

步骤202、根据数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,当前游标节点为所述二叉堆中第一个叶子节点或半节点,所述二叉堆为根节点在最上层,叶子节点在下层的二叉堆,所述第一个叶子节点为最上层最左侧的叶子节点,所述半节点为只有左子节点的节点。

本实施例中,当前游标节点为上述二叉堆中第一个叶子节点或半节点,当前游标节点指针指向当前游标节点,并随当前游标节点的更新而指向更新后的当前游标节点,以使可以在时间复杂度为O(1)的时间内定位当前游标节点,降低定位当前游标节点的时间复杂度。

步骤203、根据所述更新类型及所述当前游标节点确定所述待更新数据在所述二叉堆中对应的待更新节点。

本实施例中,根据更新类型为增加数据类型或删除数据类型,可以确定待更新节点为尾节点的下一空位或尾节点,根据当前游标节点为叶子节点或半节点,可以确定待更新节点为当前游标节点的待增加的左子节点、待增加的右子节点、当前游标节点的上一节点的右子节点或当前游标节点的左子节点。

步骤204、根据所述待更新节点和所述待更新数据对所述原数据进行更新及排序操作。

本实施例中,对原数据进行更新操作,即将待增加数据增加到存储有原数据的二叉堆中,或从存储有原数据的二叉堆中删除待删除数据,为维持二叉堆本身属性,即维持二叉堆最大堆的属性或最小堆的属性,在对原数据进行更新操作后,需要对二叉堆中节点进行排序操作,即对原数据进行排序操作,尤其是对待更新节点以及待更新节点的子节点或父节点进行排序操作。

需要说明的是,上述二叉堆为“正向放置”,即二叉堆的根节点在最上层,叶子节点在下层,此外,二叉堆还可以“侧向放置”以及“反向放置”等,例如,当二叉堆为“侧向放置”时,二叉堆的根节点可以在最左侧,叶子节点在右侧,当二叉堆为“反向放置”时,二叉堆的根节点可以在最下侧,叶子节点在上侧。二叉堆“侧向放置”以及“反向放置”时,对二叉堆的处理方法与二叉堆“正向放置”时的处理方法类似,具体实现过程和原理可以参见二叉堆“正向放置”的实施例,此处不再一一赘述。

本实施例提供的数据排序方法,通过获取包括待更新数据和更新类型的数据排序更新请求,并根据该数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,并根据更新类型及当前游标节点确定待更新数据在二叉堆中对应的待更新节点,根据待更新节点和待更新数据对原数据进行更新及排序操作,能够通过构建循环双向链表实现对游标节点的快速定位,进而实现对待更新节点的快速定位,降低对原数据进行更新及排序操作的时间复杂度。

同时的,循环双向链表中包括二叉堆中非游标节点的叶子节点及游标节点,以及非游标节点的叶子节点及游标节点对应的当前指向关系,为了保证能够及时更新游标节点,以保证对游标节点的快速定位,可选的,还可以对游标节点以及当前指向关系进行更新,具体来说,在所述根据所述待更新节点和所述待更新数据对所述原数据进行更新操作之后,还可以包括:根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新。

具体的,二叉堆的节点从左至右,从上至下顺序排列形成节点顺序;二叉堆中非游标节点的叶子节点及游标节点对应的指向关系具体包括:非游标节点及尾节点的叶子节点的左节点指针指向所述叶子节点的上一节点,叶子节点的右节点指针指向所述叶子节点的下一节点,游标节点的左节点指针指向尾节点,游标节点的右节点指针指向所述游标节点的下一节点,尾节点的左节点指针指向所述尾节点的上一节点,所述尾节点的右节点指针指向所述游标节点。

本实施例提供的数据排序方法,可以在完成对原数据的更新操作之后,及时进行对游标节点的更新,以及对当前指向关系的更新,以保证对游标节点的快速定位,同时维护循环双向链表的正确性。

为及时实现游标节点的更新,以保证可以快速定位游标节点,本发明实施例还将对不同更新类型及不同当前游标节点的类型下当前游标节点的更新及当前指向关系的更新进行进一步描述。

图3为本发明实施例提供的另一种数据排序方法的流程示意图。如图3所示,本实施例是在上述实施例提供的技术方案的基础上,对当前游标节点及当前指向关系进行更新的详细描述。本实施例中的方法,可以包括:

步骤301、获取数据排序更新请求,所述数据排序更新请求中包括:待更新数据和更新类型。

步骤302、根据数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,当前游标节点为所述二叉堆中第一个叶子节点或半节点,所述二叉堆为根节点在最上层,叶子节点在下层的二叉堆,所述第一个叶子节点为最上层最左侧的叶子节点,所述半节点为只有左子节点的节点。

本实施例中步骤301~302的具体实现过程和原理可以参见前述实施例,此处不再赘述。

步骤303、若确定所述更新类型为增加数据类型,则确定待更新数据对应的待更新节点为当前游标节点的待增加的子节点。

步骤304、若确定所述更新类型为删除数据类型,则确定待更新数据对应的待更新节点为尾节点,并确定待更新数据对应的待删除节点。

步骤303~304限定了确定待更新节点的过程。

具体的,当更新类型为增加数据类型,则待更新节点为尾节点的下一空位,而尾节点的下一空位为当前游标节点的待增加的子节点,即当当前游标节点为第一个叶子节点时,当前游标节点无左子节点,则待更新节点为当前游标节点的待增加的左子节点,当当前游标节点为半节点时,当前游标节点有左子节点,则待更新节点为当前游标节点的待增加的右子节点。

可选的,当更新类型为增加数据类型,且二叉堆为空,则待更新节点为根节点。

进一步的,当更新类型为删除数据类型,则待更新节点为尾节点,即当当前游标节点为第一个叶子节点时,当前游标节点无左子节点,则待更新节点为当前游标节点的上一节点的右子节点,当当前游标节点为半节点时,当前游标节点有左子节点,则待更新节点为当前游标节点的左子节点。

可选的,当更新类型为删除数据类型,且二叉堆有且仅有根节点,则待更新节点为上述根节点。

具体的,当更新类型为删除数据类型,待更新数据对应的待删除节点即为二叉堆中待更新数据对应的节点。

步骤305、若确定待更新节点为游标节点待增加的子节点,则在游标节点增加子节点作为待更新节点,将所述待更新数据添加到待更新节点中,以完成对原数据的更新操作。

本实施例中,若待更新节点为游标节点待增加的子节点,则当前更新类型为增加数据类型,根据游标节点确定在游标节点增加左子节点或右子节点作为待更新节点,并将更新数据添加到上述待更新节点中。

步骤306、若所述更新类型为增加数据类型,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新。

其中可选的,执行根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新的步骤,具体可以为:若所述更新类型为增加数据类型,所述当前游标节点的类型为第一个叶子节点,更新待更新节点的左节点指针指向所述待更新节点的上一节点,更新待更新节点的右节点指针指向当前游标节点,更新所述待更新节点的上一节点的右节点指针指向待更新节点,更新当前游标节点的左节点指针指向待更新节点,保持当前游标节点指针的指向不变。此外,更新待更新节点的父节点指针指向当前游标节点。图4为本发明实施例提供的一种游标节点及当前指向关系的更新过程的示意图。如图4所示,空心圆圈表示二叉堆中的节点,实心圆圈表示当前游标节点,为使图示清楚,图4中未示出各节点的父节点指针。

进一步的,可选的,执行根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新的步骤,具体还可以为:若所述更新类型为增加数据类型,所述当前游标节点的类型为半节点,更新待更新节点的左节点指针指向所述待更新节点的上一节点,更新待更新节点的右节点指针指向当前游标节点的下一节点,更新所述待更新节点的上一节点的右节点指针指向待更新节点,更新所述当前游标节点的右节点指针指向待更新节点,更新当前游标节点指针的指向为当前游标节点的下一节点,即更新所述当前游标节点为当前游标节点的下一节点,更新更新后的当前游标节点的左节点指针指向待更新节点。此外,更新待更新节点的父节点指针指向更新前的当前游标节点。图5为本发明实施例提供的另一种游标节点及当前指向关系的更新过程的示意图。如图5所示,空心圆圈表示二叉堆中的节点,实心圆圈表示当前游标节点,为使图示清楚,图5中未示出各节点的父节点指针。

可选的,执行根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新的步骤,具体还可以为:若所述更新类型为增加数据类型,所述二叉堆为空,则待更新节点为根节点,将当前游标节点指针指向待更新节点。

步骤307、根据所述待更新节点中的待更新数据与所述待更新节点对应的父节点中的数据,确定所述待更新节点与所述待更新节点对应的父节点是否需要进行交换操作,若是,则对所述待更新节点对应的父节点及所述待更新节点进行交换操作,以完成对原数据的排序操作。

本实施例中,将待更新节点中的待更新数据与待更新节点对应的父节点中的数据进行比较,确定上述节点是否需要进行交换操作,例如,若二叉堆为最大堆,当待更新节点中的待更新数据大于待更新节点对应的父节点中的数据时,需要对待更新节点对应的父节点及待更新节点进行交换操作,以完成对原数据的排序操作。

进一步的,对待更新节点对应的父节点及待更新节点进行交换操作具体可包括:将待更新节点的左节点指针指向的节点的右节点指针指向一个特殊值,例如0xFFFFFFFFFFFFFFFE,将待更新节点的右节点指针指向的节点的左节点指针指向上述特殊值;更新待更新节点对应的父节点的父节点指针指向待更新节点,更新待更新节点对应的父节点指针指向上述父节点的父节点;若待更新节点对应的父节点的左子节点、右子节点及父节点的指针指向待更新节点对应的父节点,则将上述指针指向待更新节点;更新待更新节点的左节点指针指向、右节点指针指向与待更新节点对应的父节点的左节点指针指向、右节点指针指向相同;将右节点指针指向一个特殊值的节点的右节点指向待更新节点对应的父节点,将左节点指针指向特殊值的节点的左节点指针指向待更新节点对应的父节点。

步骤305~307限定了当待更新节点为游标节点的子节点时对原数据进行更新及排序操作的过程。

步骤308、若确定待更新节点为尾节点,则删除尾节点,以完成对原数据的更新操作。

本实施例中,若待更新节点为尾节点,则当前更新类型为删除数据类型,根据当前游标节点确定尾节点为当前游标节点的上一节点的右子节点或当前游标节点的左子节点,将上述尾节点中的数据暂存在临时变量中,并删除尾节点。

步骤309、若所述更新类型为删除数据类型,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新。

其中可选的,执行根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新的步骤,具体可以为:若所述更新类型为删除数据类型,所述当前游标节点的类型为第一个叶子节点,则更新当前游标节点的上一节点的右节点指针指向当前游标节点,更新所述当前游标节点的左节点指针指向所述当前游标节点的上一节点,更新当前游标节点指针的指向为当前游标节点的上一节点,即更新所述当前游标节点为当前游标节点的上一节点,更新所述待更新节点的上一节点的右节点指针指向更新后的当前游标节点。图6为本发明实施例提供的又一种游标节点及当前指向关系的更新过程的示意图。如图6所示,空心圆圈表示二叉堆中的节点,实心圆圈表示当前游标节点,虚线空心圆圈表示已删除的待更新节点,为使图示清楚,图6中未示出各节点的父节点指针。

需要说明的是,由于通过当前游标节点无法直接确定当前游标节点的上一节点,需要基于循环双向链表对当前游标节点的上一节点进行确定,具体来说,确定当前游标节点的上一节点可以为:删除尾节点后,当前游标节点的左节点指针指向其前驱节点,根据该前驱节点的父节点指针可以确定该前驱节点的父节点,则上述父节点即为当前游标节点的上一节点。

进一步的,可选的,执行根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新的步骤,具体还可以为:若所述更新类型为删除数据类型,所述当前游标节点的类型为半节点,则更新当前游标节点的左节点指针指向待更新节点的上一节点,更新待更新节点的上一节点的右节点指针指向当前游标节点,保持当前游标节点指针的指向不变。图7为本发明实施例提供的再一种游标节点及当前指向关系的更新过程的示意图。如图7所示,空心圆圈表示二叉堆中的节点,实心圆圈表示当前游标节点,虚线空心圆圈表示已删除的待更新节点,为使图示清楚,图7中未示出各节点的父节点指针。

可选的,执行根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新的步骤,具体还可以为:若所述更新类型为删除数据类型,且二叉堆有且仅有根节点,则当前游标节点为上述根节点,待更新节点为上述根节点,清空根节点指针与当前游标节点指针。

步骤310、采用所述尾节点替换掉待删除节点,作为新节点。

本实施例中,采用前述暂存在临时变量中的尾节点的数据替换掉待删除节点中的数据,即采用上述尾节点替换掉待删除节点。若待删除节点的左子节点、右子节点及父节点的指针指向待删除节点,则将上述指针指向新节点,更新新节点的左节点指针指向、右节点指针指向及父节点指针指向分别与待删除节点的左节点指针指向、右节点指针指向及父节点指针指向相同。

步骤311、根据所述新节点中的数据与所述待删除节点对应的子节点中的数据,确定所述新节点与所述待删除节点对应的子节点是否需要进行交换操作,若是,则对所述新节点与所述待删除节点对应的子节点进行交换操作,以完成对原数据的排序操作。

本实施例中,将新节点中的数据与待删除节点对应的子节点中的数据进行比较,确定上述节点是否需要进行交换操作,例如,若二叉堆为最大堆,当新节点中的数据小于待删除节点对应的子节点中的数据时,需要对新节点与待删除节点对应的子节点进行交换操作,以完成对原数据的排序操作。

进一步的,将新节点与所述待删除节点对应的子节点进行交换操作具体可包括:将待删除节点对应的子节点的左节点指针指向的节点的右节点指针指向一个特殊值,例如0xFFFFFFFFFFFFFFFE,将待删除节点对应的子节点的右节点指针指向的节点的左节点指针指向上述特殊值;更新新节点的父节点指针指向待删除节点对应的子节点,更新待删除节点对应的子节点的父节点指针指向新节点的父节点;若新节点的左子节点、右子节点及父节点的指针指向新节点,则将上述指针指向待删除节点对应的子节点;更新待删除节点对应的子节点的左节点指针指向、右节点指针指向与新节点的左节点指针指向、右节点指针指向相同;将右节点指针指向一个特殊值的节点的右节点指向新节点,将左节点指针指向特殊值的节点的左节点指针指向新节点。

需要说明的是,若待删除节点对应的子节点非叶子节点且非半节点,则其左节点指针指向其左子节点,其右节点指针指向其右子节点,若待删除节点对应的子节点为半节点,则其左节点指针指向其左子节点。

步骤308~311限定了当待更新节点为尾节点时对原数据进行更新及排序操作的过程。

本实施例提供的数据排序方法,通过获取数据排序更新请求,根据上述更新请求从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,并根据更新类型确定待更新节点,进而根据待更新节点与待更新数据实现对原数据的更新及排序,同时根据不同更新类型及不同当前游标节点的类型对当前游标节点及当前指向关系进行更新,能够及时对当前游标节点进行更新,以及对当前指向关系进行更新,保证对循环双向链表正确性的维护和对游标节点的快速定位,进而实现对待更新节点的快速定位,降低对原数据进行更新及排序操作的时间复杂度。

图8为本发明实施例提供的一种数据排序装置的结构示意图。如图8所示,本实施例提供的数据排序装置,可以包括:获取模块81、第一确定模块82、第二确定模块83和执行模块84。

获取模块81,用于获取数据排序更新请求,所述数据排序更新请求中包括:待更新数据和更新类型;

第一确定模块82,用于根据数据排序更新请求,从存储有原数据的二叉堆对应的循环双向链表中根据当前游标节点指针的指向确定当前游标节点,当前游标节点为所述二叉堆中第一个叶子节点或半节点,所述二叉堆为根节点在最上层,叶子节点在下层的二叉堆,所述第一个叶子节点为最上层最左侧的叶子节点,所述半节点为只有左子节点的节点;

第二确定模块83,用于根据所述更新类型及所述当前游标节点确定所述待更新数据在所述二叉堆中对应的待更新节点;

执行模块84,用于根据所述待更新节点和所述待更新数据对所述原数据进行更新及排序操作。

在一种可选的实现方式中,所述第二确定模块83具体用于:

若确定所述更新类型为增加数据类型,则确定待更新数据对应的待更新节点为当前游标节点的待增加的子节点;

若确定所述更新类型为删除数据类型,则确定待更新数据对应的待更新节点为尾节点,并确定待更新数据对应的待删除节。

在一种可选的实现方式中,所述执行模块84在确定待更新节点为游标节点待增加的子节点时,具体用于:

在游标节点增加子节点作为待更新节点,将所述待更新数据添加到待更新节点中,以完成对原数据的更新操作;

根据所述待更新节点中的待更新数据与所述待更新节点对应的父节点中的数据,确定所述待更新节点与所述待更新节点对应的父节点是否需要进行交换操作,若是,则对所述待更新节点对应的父节点及所述待更新节点进行交换操作,以完成对原数据的排序操作。

在一种可选的实现方式中,所述执行模块84在确定待更新节点为尾节点时,还具体用于:

删除尾节点,以完成对原数据的更新操作;

采用所述尾节点替换掉待删除节点,作为新节点;

根据所述新节点中的数据与所述待删除节点对应的子节点中的数据,确定所述新节点与所述待删除节点对应的子节点是否需要进行交换操作,若是,则对所述新节点与所述待删除节点对应的子节点进行交换操作,以完成对原数据的排序操作。

在一种可选的实现方式中,所述执行模块84在根据所述待更新节点和所述待更新数据对所述原数据进行更新操作之后,还用于:

根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新。

在一种可选的实现方式中,所述执行模块84在所述更新类型为增加数据类型,所述当前游标节点的类型为第一个叶子节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新时,还用于:

更新待更新节点的左节点指针指向所述待更新节点的上一节点,更新待更新节点的右节点指针指向当前游标节点,更新所述待更新节点的上一节点的右节点指针指向待更新节点,更新当前游标节点的左节点指针指向待更新节点,保持当前游标节点指针的指向不变。

在一种可选的实现方式中,所述执行模块84在所述更新类型为增加数据类型,所述当前游标节点的类型为半节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新时,还用于:

更新待更新节点的左节点指针指向所述待更新节点的上一节点,更新待更新节点的右节点指针指向当前游标节点的下一节点,更新所述待更新节点的上一节点的右节点指针指向待更新节点,更新所述当前游标节点的右节点指针指向待更新节点,更新所述当前游标节点为当前游标节点的下一节点,更新更新后的当前游标节点的左节点指针指向待更新节点。

在一种可选的实现方式中,所述执行模块84在所述更新类型为删除数据类型,所述当前游标节点的类型为第一个叶子节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新时,还用于:

更新当前游标节点的上一节点的右节点指针指向当前游标节点,更新所述当前游标节点的左节点指针指向所述当前游标节点的上一节点,更新所述当前游标节点为当前游标节点的上一节点,更新所述待更新节点的上一节点的右节点指针指向更新后的当前游标节点。

在一种可选的实现方式中,所述执行模块84在所述更新类型为删除数据类型,所述当前游标节点的类型为半节点,则根据更新类型及所述当前游标节点的类型对所述当前游标节点及所述当前指向关系进行更新时,还用于:

更新当前游标节点的左节点指针指向待更新节点的上一节点,更新待更新节点的上一节点的右节点指针指向当前游标节点,保持当前游标节点指针的指向不变。

本实施例提供的数据排序装置,可以执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

图9为本发明实施例提供的一种数据排序设备的结构示意图。如图9所示,本实施例提供的数据排序设备,包括:存储器91和至少一个处理器92;

所述存储器91存储计算机执行指令;

所述至少一个处理器92执行所述存储器91存储的计算机执行指令,使得所述至少一个处理器92执行上述任一实施例所述的数据排序方法。

其中,存储器91和处理器92可以通过总线93连接。

本实施例提供的数据排序设备的具体实现原理和效果可以参见图1-图7所示实施例对应的相关描述和效果,此处不做过多赘述。

本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上述任一实施例所述的方法。

本发明实施例还提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如上述任一实施例所述的方法。

其中,计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本发明旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求书指出。

应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求书来限制。

相关技术
  • 数据排序方法、装置、设备、存储介质及程序产品
  • 数据同步方法、装置、设备、系统、存储介质及程序产品
技术分类

06120113162124