CN109815238B - 用严格平衡二叉树实现数据库的动态添加方法及装置 - Google Patents
用严格平衡二叉树实现数据库的动态添加方法及装置 Download PDFInfo
- Publication number
- CN109815238B CN109815238B CN201910051386.1A CN201910051386A CN109815238B CN 109815238 B CN109815238 B CN 109815238B CN 201910051386 A CN201910051386 A CN 201910051386A CN 109815238 B CN109815238 B CN 109815238B
- Authority
- CN
- China
- Prior art keywords
- current
- added
- tree
- record
- binary tree
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 68
- 238000007792 addition Methods 0.000 description 33
- 238000012360 testing method Methods 0.000 description 9
- 238000004891 communication Methods 0.000 description 5
- 239000012634 fragment Substances 0.000 description 4
- 230000001174 ascending effect Effects 0.000 description 3
- 230000003068 static effect Effects 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000012163 sequencing technique Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种用严格平衡二叉树实现数据库的动态添加方法及装置,本发明通过动态构建严格平衡二叉树,再将严格平衡二叉树进行遍历,获得先序序列,后序序列及层次序列,将其分别保存三个不同的外部文件中,获得数据库文件,在查找或添加数据库时,只需要用二叉排序树导入数据库文件,就可以建立相同的严格平衡二叉树,通过严格平衡二叉树建立的数据库比查询速度最快的二分法更充分地利用了内存碎片,比二叉排序树及平衡二叉树具有更快的查询速度,能快速查询出用户需要的数据库记录。
Description
技术领域
本发明涉及数据库管理领域,尤其涉及一种用严格平衡二叉树实现数据库的动态添加方法及装置。
背景技术
二分查找方法比较于二叉排序树和平衡二叉树具有最快的查询速度,但它只适合一个有序的顺序表。如果内存没有一个完全存储顺序表的连续内存空间,则该方法无法使用。但是,内存空间经常被划分不能连在一起的内存区域,虽然任何一个内存区域的空间都小于顺序表,但这些内存区域的空间总和远大于顺序表。因此,为充分利用这些内存碎片,需要将待查询的数据序列导入链式存储结构中。显然,用链表存储这些数据,会降低查询速度。
二叉排序树是一种动态查询结构,虽然它可以充分利用内存碎片,但其查询速度比二分查找方法的速度慢。同样,平衡二叉树是对二叉排序树的改进,但它的查询速度要比二叉排序树快,但其查询速度还是小于二分法的查询速度。虽然严格平衡二叉树的查询速度完全等于二分法的查询速度,但其构造过程是静态的,一旦增加新的节点,则整个严格平衡二叉树要重新构建,从而大大降低数据库的查询效率。
目前数据库的添加方法是:首先,用二叉排序树法将数据中全部记录按关键码升序导入内存的二叉排序树中。通过中序遍历二叉排序树,将得到的关键码升序的记录保存在外部文件中。由关键码升序的记录用二分法构建一个严格平衡的二叉排序树。先序遍历严格平衡二叉排序树,将先序序列保存在外部文件中。在具体的查询之前,只要将该文件的记录导入内存的二叉排序中,则该二叉排序树一定是一个严格平衡的二叉排序树。因此,通过查询严格平衡的二叉排序树可以得到一个与二分法相同的查询速度。
显然,上述过程是一个静态过程,每增加一个节点,严格平衡二叉树需要重新构造,而这大大降低数据库的查询效率。
上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。
发明内容
本发明的主要目的在于提供一种用严格平衡二叉树实现数据库的动态添加方法及装置,旨在解决现有技术中使用严格平衡二叉树对数据库进行静态添加导致数据库查询效率低的技术问题。
为实现上述目的,本发明提供一种用严格平衡二叉树实现数据库的动态添加的方法,所述方法包括以下步骤:
从待添加数据库中读取当前待添加记录;
统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,所述当前严格平衡二叉树用于保存待添加记录;
根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树;
将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库。
优选地,所述根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树,具体包括:
在所述当前左子树节点数与所述当前右子树节点数相同时,判断当前待添加记录值是否小于所述当前严格平衡二叉树的当前根节点记录值;
在所述当前待添加记录值小于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前左子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值大于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前右子树中,获得目标严格平衡二叉树。
优选地,所述根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树,具体包括:
在所述当前左子树节点数大于所述当前右子树节点数时,判断当前待添加记录值是否大于所述当前根节点记录值;
在所述当前待添加记录值大于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前右子树中,获得目标严格平衡二叉树。
优选地,所述在所述当前左子树节点数大于所述当前右子树节点数时,判断当前待添加记录值是否大于所述当前根节点记录值之后,所述方法还包括:
在所述当前待添加记录值小于所述当前根节点记录值时,获取所述当前左子树中的最大节点记录,判断所述当前待添加记录值是否大于所述最大节点记录值;
在所述当前待添加记录值大于所述最大节点记录值时,将所述当前待添加记录替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前右子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值小于所述最大节点记录值时,将所述最大节点记录替换所述当前根节点记录,并将所述当前根节点记录插入所述当前右子树中,将所述当前待添加记录插入到所述当前左子树中,获得目标严格平衡二叉树。
优选地,所述根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树,具体包括:
在所述当前左子树节点数小于所述当前右子树节点数时,判断当前待添加记录值是否小于所述当前根节点记录值;
在所述当前待添加记录值小于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前左子树中,获得目标严格平衡二叉树。
优选地,所述在所述当前左子树节点数小于所述当前右子树节点数时,判断当前待添加记录值是否小于所述当前根节点记录值之后,所述方法还包括:
在所述当前待添加记录值大于所述当前根节点记录值时,获取所述当前右子树中的最小节点记录,判断所述当前待添加记录值是否小于所述最小节点记录值;
在所述当前待添加记录值小于所述最小节点记录值时,将所述当前待添加记录替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前左子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值大于所述最大节点记录值时,将所述最小节点记录替换所述当前根节点记录,并将所述当前根节点记录插入所述当前左子树中,将所述当前待添加记录插入到所述当前右子树中,获得目标严格平衡二叉树。
优选地,所述统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,所述当前严格平衡二叉树用于保存待添加记录之前,所述方法还包括:
判断所述当前严格平衡二叉树是否为空;
在所述当前严格平衡二叉树为空时,建立当前根节点;
将所述当前待添加记录保存到所述当前根节点中,并将所述当前根节点的左孩子节点及右孩子节点设置为空,返回所述从待添加数据库中读取当前待添加记录的步骤。
优选地,所述将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库,具体包括:
将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行先序遍历、后序遍历及层次遍历,获得目标数据库。
优选地,所述将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库之后,所述方法还包括:
用二叉排序树将所述目标数据库导入内存,获得初始严格平衡二叉树;
获取用户输入的待查找关键字;
根据所述待查找关键字对所述初始严格平衡二叉树进行递归或非递归查找,并输出查找结果。
此外,为实现上述目的,本发明还提供一种用严格平衡二叉树实现数据库的动态添加的装置,所述用严格平衡二叉树实现数据库的动态添加的装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的用严格平衡二叉树实现数据库的动态添加的程序,所述用严格平衡二叉树实现数据库的动态添加的程序配置为实现所述的用严格平衡二叉树实现数据库的动态添加的方法的步骤。
本发明通过动态构建严格平衡二叉树,再将严格平衡二叉树进行遍历,获得先序序列,后序序列及层次序列,将其分别保存三个不同的外部文件中,获得数据库文件,在查找或添加数据库时,只需要用二叉排序树导入数据库文件,就可以建立相同的严格平衡二叉树,通过严格平衡二叉树建立的数据库比查询速度最快的二分法更充分地利用了内存碎片,比二叉排序树及平衡二叉树具有更快的查询速度,能快速查询出用户需要的数据库记录。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的用严格平衡二叉树实现数据库的动态添加的装置结构示意图;
图2为本发明用严格平衡二叉树实现数据库的动态添加的方法第一实施例的流程示意图;
图3为本发明第一实施例步骤S30中根据测试关键码序列建立的严格平衡二叉树;
图4为本发明用严格平衡二叉树实现数据库的动态添加的方法第二实施例的流程示意图;
图5为本发明第二实施例中步骤S50中由先序序列构建严格平衡二叉树的过程;
图6为本发明第二实施例中步骤S50中由后序序列构建严格平衡二叉树的过程;
图7为本发明第二实施例中步骤S50中由层次序列构建严格平衡二叉树的过程;
图8为根据测试关键码序列建立的二叉排序树;
图9为根据测试关键码序列建立的平衡二叉树;
图10为在图3中插入关键码66后生成的严格平衡二叉树。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参照图1,图1为本发明实施例方案涉及的硬件运行环境的用严格平衡二叉树实现数据库的动态添加的装置结构示意图。
如图1所示,该用严格平衡二叉树实现数据库的动态添加的装置可以包括:处理器1001,例如CPU,通信总线1002、用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的结构并不构成对用严格平衡二叉树实现数据库的动态添加的装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及用严格平衡二叉树实现数据库的动态添加的程序。
在图1所示的用严格平衡二叉树实现数据库的动态添加的装置中,网络接口1004主要用于与外部网络进行数据通信;用户接口1003主要用于接收用户的输入指令;所述用严格平衡二叉树实现数据库的动态添加的装置通过处理器1001调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加的程序,并执行以下操作:
从待添加数据库中读取当前待添加记录;
统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,所述当前严格平衡二叉树用于保存待添加记录;
根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树;
将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
在所述当前左子树节点数与所述当前右子树节点数相同时,判断当前待添加记录值是否小于所述当前严格平衡二叉树的当前根节点记录值;
在所述当前待添加记录值小于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前左子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值大于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前右子树中,获得目标严格平衡二叉树。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
在所述当前左子树节点数大于所述当前右子树节点数时,判断当前待添加记录值是否大于所述当前根节点记录值;
在所述当前待添加记录值大于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前右子树中,获得目标严格平衡二叉树。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
在所述当前待添加记录值小于所述当前根节点记录值时,获取所述当前左子树中的最大节点记录,判断所述当前待添加记录值是否大于所述最大节点记录值;
在所述当前待添加记录值大于所述最大节点记录值时,将所述当前待添加记录替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前右子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值小于所述最大节点记录值时,将所述最大节点记录替换所述当前根节点记录,并将所述当前根节点记录插入所述当前右子树中,将所述当前待添加记录插入到所述当前左子树中,获得目标严格平衡二叉树。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
在所述当前左子树节点数小于所述当前右子树节点数时,判断当前待添加记录值是否小于所述当前根节点记录值;
在所述当前待添加记录值小于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前左子树中,获得目标严格平衡二叉树。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
在所述当前待添加记录值大于所述当前根节点记录值时,获取所述当前右子树中的最小节点记录,判断所述当前待添加记录值是否小于所述最小节点记录值;
在所述当前待添加记录值小于所述最小节点记录值时,将所述当前待添加记录替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前左子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值大于所述最大节点记录值时,将所述最小节点记录替换所述当前根节点记录,并将所述当前根节点记录插入所述当前左子树中,将所述当前待添加记录插入到所述当前右子树中,获得目标严格平衡二叉树。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
判断所述当前严格平衡二叉树是否为空;
在所述当前严格平衡二叉树为空时,建立当前根节点;
将所述当前待添加记录保存到所述当前根节点中,并将所述当前根节点的左孩子节点及右孩子节点设置为空,返回所述从待添加数据库中读取当前待添加记录的步骤。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行先序遍历、后序遍历及层次遍历,获得目标数据库。
进一步地,处理器1001可以调用存储器1005中存储的用严格平衡二叉树实现数据库的动态添加程序,还执行以下操作:
用二叉排序树将所述目标数据库导入内存,获得初始严格平衡二叉树;
获取用户输入的待查找关键字;
根据所述待查找关键字对所述初始严格平衡二叉树进行递归或非递归查找,并输出查找结果。
本发明通过动态构建严格平衡二叉树,再将严格平衡二叉树进行遍历,获得先序序列,后序序列及层次序列,将其分别保存三个不同的外部文件中,获得数据库文件,在查找或添加数据库时,只需要用二叉排序树导入数据库文件,就可以建立相同的严格平衡二叉树,通过严格平衡二叉树建立的数据库比查询速度最快的二分法更充分地利用了内存碎片,比二叉排序树及平衡二叉树具有更快的查询速度,能快速查询出用户需要的数据库记录。
基于上述硬件结构,提出本发明用严格平衡二叉树实现数据库的动态添加的方法实施例。
参照图2,图2为本发明用严格平衡二叉树实现数据库的动态添加的方法第一实施例的流程示意图。
在第一实施例中,所述用严格平衡二叉树实现数据库的动态添加的方法包括以下步骤:
S10:从待添加数据库中读取当前待添加记录。
需要说明的是,所述待添加数据库可以为关键码无序的数据库,当然也可以是关键码有序的数据库,本实施例对此不加以限制。
设二叉树的数据结构为:typedef struct node*bintree;struct node{int key;待添加数据库中各记录的字段变量定义;bintree lchild,rchild;}。
S20:统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,所述当前严格平衡二叉树用于保存待添加记录。
需要说明的是,统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数之前,所述方法还包括:判断所述当前严格平衡二叉树是否为空;在所述当前严格平衡二叉树为空时,建立当前根节点;将所述当前待添加记录保存到所述当前根节点中,并将所述当前根节点的左孩子节点及右孩子节点设置为空,返回所述从待添加数据库中读取当前待添加记录的步骤。
在具体实现中,若是将待添加数据库添加到新的数据库中,则需要初始化一棵空的严格平衡二叉树T,从待添加数据库中读取当前待添加记录X,如果T为空,则申请一个节点,将记录的内容保存在该节点中,并且使该节点的左右孩子节点为空,若T不为空,则对当前待添加记录X进行动态添加,建立严格平衡二叉树。
S30:根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树。
具体地,所述动态添加规则如下:
1、在所述当前左子树T→lchild节点数lc与所述当前右子树T→rchild节点数rc相同(lc=rc)时,判断当前待添加记录值x.key是否小于所述当前严格平衡二叉树的当前根节点记录值T→key;
在所述当前待添加记录值小于所述当前根节点记录值(x.key<T→key)时,将所述当前待添加记录X递归插入到当前左子树T→lchild中,获得目标严格平衡二叉树;否则,将所述当前待添加记录X递归插入到当前右子树T→rchild中,获得目标严格平衡二叉树。
2、在所述当前左子树节点数大于所述当前右子树节点数(lc>rc)时,判断当前待添加记录值x.key是否大于所述当前根节点记录值T→key;
在所述当前待添加记录值大于所述当前根节点记录值(x.key>T→key)时,将所述当前待添加记录X递归插入到当前右子树T→rchild中,获得目标严格平衡二叉树;
否则,获取所述当前左子树T→lchild中的最大节点记录P,判断所述当前待添加记录值x.key是否大于所述最大节点记录值p.key;
在所述当前待添加记录大于所述最大节点记录(x.key>p→key)时,将所述当前待添加记录X替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前右子树T→rchild中,获得目标严格平衡二叉树;否则,将所述最大节点记录P替换所述当前根节点记录,并将所述当前根节点记录插入所述当前右子树T→rchild中,将所述当前待添加记录X插入到所述当前左子树T→lchild中,获得目标严格平衡二叉树。
3、在所述当前左子树节点数小于所述当前右子树节点数(lc<rc)时,判断当前待添加记录值x.key是否小于所述当前根节点记录值T→key;
在所述当前待添加记录值小于所述当前根节点记录值(x.key<T→key)时,将所述当前待添加记录X递归插入到当前左子树T→lchild中,获得目标严格平衡二叉树;
否则,获取所述当前右子树中的最小节点记录P’,判断所述当前待添加记录值x.key是否小于所述最小节点记录值p’.key;
在所述当前待添加记录值小于所述最小节点记录值(x.key<p’→key)时,将所述当前待添加记录X替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前左子树T→lchild中,获得目标严格平衡二叉树;否则,将所述最小节点记录P’替换所述当前根节点记录,并将所述当前根节点记录插入所述当前左子树T→lchild中,将所述当前待添加记录X插入到所述当前右子树T→rchild中,获得目标严格平衡二叉树。
在具体实现中,当测试环境为:使用VC6.0作为测试工具,在CPU为3.2GHz和内存为1.86GB的个人台式电脑上完成测试,输入的关键码序列[99,33,58,4,12,40,67,55]时,可以得到的严格平衡二叉树如图3所示。
通过上述添加规则实现了严格平衡二叉树的动态添加,即每增加一个节点,直接向该树中添加即可,从而能节省建立严格平衡二叉树的大量时间,大大提高了数据库的查询效率。
S40:将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库。
应理解的是,上述数据读取及添加的过程不断循环,直至待添加数据库中所有的记录读完为止,由此可以建立待添加数据库对应的严格平衡二叉树。
需要说明的是,对最终获得的目标严格平衡二叉树进行先序遍历,后序遍历和层次遍历,并将遍历结果保存在外部文件中,以便查询需要时使用。
具体地,对目标严格平衡二叉树进行先序遍历,并将遍历结果保存在一个外部文件中的递归过程如下:
①如果目标严格平衡二叉树为空,则返回;
②将根节点记录保存外部文件中;
③先序遍历目标严格平衡二叉树的左子树;
④先序遍历目标严格平衡二叉树的右子树。
将图3中的严格平衡二叉树进行先序遍历后,获得的遍历结果为[40,12,4,33,58,55,67,99]。
对严格平衡二叉排序树进行后序遍历,并将遍历结果保存在一个外部文件中的递归过程如下:
①如果目标严格平衡二叉树为空,则返回;
②后序遍历严格平衡二叉树的左子树;
③后序遍历严格平衡二叉树的右子树;
④将根节点记录保存外部文件中。
将图3中的严格平衡二叉树进行后序遍历后,获得的遍历结果为[4,33,12,55,99,67,58,40]。
对严格平衡二叉树进行层次遍历,并将遍历结果保存在一个外部文件中的非递归过程如下:
①目标严格平衡二叉树的根节点入队;
②从对列中取出一个节点;
③将节点保存的信息输出到外部文件中;
④如果该节点存在左孩子节点,则将其左孩子节点入队;
⑤如果该节点存在右孩子节点,则将其右孩子节点入队;
⑥重复步骤②至⑤直到队空为止。
将图3中的严格平衡二叉树进行层次遍历后,获得的遍历结果为[40,12,58,4,33,55,67,99]。
需要说明的是,只要数据库发生变化,就需要进行遍历序列的过程,本实施例中是将先序遍历,后序遍历和层次遍历的遍历结果均保存在外部文件中,当然也可以只将先序遍历、后序遍历或层次遍历中的一种或任意两种遍历方式的组合进行遍历,再将遍历结果进行保存。
本实施例通过动态构建严格平衡二叉树,再将严格平衡二叉树进行遍历,获得先序序列,后序序列及层次序列,将其分别保存三个不同的外部文件中,获得目标数据库,用严格平衡二叉树实现数据库的动态添加,建立的目标数据库比查询速度最快的二分法更充分地利用了内存碎片,比二叉排序树及平衡二叉树具有更快的查询速度,能快速查询出用户需要的数据库记录。
进一步地,参照图4,图4为本发明用严格平衡二叉树实现数据库的动态添加的方法第二实施例的流程示意图。
本实施例中,在步骤S40之后,所述方法还包括:
S50:用二叉排序树将所述目标数据库导入内存,获得初始严格平衡二叉树。
需要说明的是,从先序序列的数据库文件,后序序列的数据库文件和层次序列的数据库文件中任何一个文件读取记录,都可以根据记录的关键码建立一个严格平衡二叉树。
如果数据库文件是一个严格平衡二叉树的先序序列,则将其导入内存二叉排序的过程如下:
①初始化一个空树root,文件指针指向文件首;
②从数据库文件读一个记录X;
③如果root为空,则为root申请一个节点的空间,并在该节点中保持记录X;
④如果root非空且x.key<root→key,则在root的左子树递归插入记录;
⑤如果root非空且x.key>root→key,则在root的右子树递归插入记录;
⑥文件指针后移一个记录的位置;
⑦重复步骤②至⑥,直至文件指针指向文件尾。
在具体实现中,由先序序列[40,12,4,33,58,55,67,99]构建严格平衡二叉树的过程如图5所示,(1)将记录40保存至节点中作为根节点;(2)将记录12递归插入到记录40的左子树中;(3)将记录4递归插入到记录12的左子树中;(4)将记录33递归插入到记录12的右子树中;(5)将记录58递归插入到记录40的右子树中;(6)将记录55递归插入到记录58的左子树中;(7)将记录67递归插入到记录58的右子树中;(8)将记录99递归插入到记录67的右子树中。
如果数据库文件是一个严格平衡二叉树的后序序列,则将其导入内存二叉排序的过程如下:
①初始化一个空树root,文件指针指向文件尾;
②从数据库文件读一个记录X;
③如果root为空,则为root申请一个节点的空间,并在该节点中保持记录X;
④如果root非空且x.key<root→key,则在root的左子树递归插入记录;
⑤如果root非空且x.key>root→key,则在root的右子树递归插入记录;
⑥文件指针前移一个记录的位置;
⑦重复步骤②至⑥,直至文件指针指向文件首。
在具体实现中,由后序序列[4,33,12,55,99,67,58,40]构建严格平衡二叉树的过程如图6所示,(1)将记录40保存至节点中作为根节点;(2)将记录58递归插入到记录40的右子树中;(3)将记录67递归插入到记录58的右子树中;(4)将记录99递归插入到记录67的右子树中;(5)将记录55递归插入到记录58的左子树中;(6)将记录12递归插入到记录40的左子树中;(7)将记录33递归插入到记录12的右子树中;(8)将记录4递归插入到记录12的左子树中。
如果数据库文件是一个严格平衡二叉树的层次序列,则将其导入内存二叉排序的过程如下:
①初始化一个空树root,文件指针指向文件首;
②从数据库文件读一个记录X;
③如果root为空,则为root申请一个节点的空间,并在该节点中保持记录X;
④如果root非空且x.key<root→key,则在root的左子树递归插入记录;
⑤如果root非空且x.key>root→key,则在root的右子树递归插入记录;
⑥文件指针后移一个记录的位置;
⑦重复步骤②至⑦,直至文件指针指向文件尾。
在具体实现中,由层次序列[40,12,58,4,33,55,67,99]构建严格平衡二叉树的过程如图7所示,(1)将记录40保存至节点中作为根节点;(2)将记录12递归插入到记录40左子树中;(3)将记录58递归插入到记录40的右子树中;(4)将记录4递归插入到记录12的左子树中;(5)将记录33递归插入到记录12的右子树中;(6)将记录55递归插入到记录58的左子树中;(7)将记录67递归插入到记录58的右子树中;(8)将记录99递归插入到记录67的右子树中。
通过二叉排序树将目标数据库导入内存建立严格平衡二叉树,极大的节省了建立严格平衡二叉树的时间,提高了数据库的查找效率。
S60:获取用户输入的待查找关键字。
需要说明的是,为方便用户实现数据库的快速查询,在具体实现中用户可以输入待查找关键字。
S70:根据所述待查找关键字对所述初始严格平衡二叉树进行递归或非递归查找,并输出查找结果。
应当理解的是,通过搜索严格平衡二叉树可以提高查询速度,本实施例中的搜索过程与二叉排序树中的搜索过程一样,可以使用递归或非递归方法。
在严格平衡二叉树中递归查找关键码为key的记录过程如下:
①如果T为空,则返回,表示要查找的记录不存在;
②如果T→key=key,则节点T中保存的内容是所要查询的记录;
③如果T→key>key,则在左子树中递归查询关键码为key的记录;
④如果T→key<key,则在右子树中递归查询关键码为key的记录。
在严格平衡二叉树中非递归查找关键码为key的记录过程如下:
①如果T为空,则返回,表示要查询的记录不存在;
②如果T→key=key,则节点T中保存的内容是所要查询的记录;
③如果T→key>key,则在左子树中查询关键码为key的记录;
④如果T→key<key,则在右子树中查询关键码为key的记录。
在具体实现中,当测试环境为:使用VC6.0作为测试工具,在CPU为3.2GHz和内存为1.86GB的个人台式电脑上完成测试,输入的关键码序列[99,33,58,4,12,40,67,55]时,可以得到的二叉排序树如图8所示,可以得到的平衡二叉树如图9所示。
由图8可知,该二叉排序树的平均查找长度为13/4;
由图9可知,该平衡二叉树的平均查找长度为11/4;
由图3可知,该严格平衡二叉树的平均查找长度为21/8;
因此,严格平衡二叉树的平均查找速度最快。
当然,在步骤S50之后,即用二叉排序树将所述目标数据库导入内存,获得初始严格平衡二叉树之后,为方便用户实现数据库的多次动态添加,在具体实现中还可以获取用户输入的待添加关键码,将所述初始严格平衡二叉树作为当前严格平衡二叉树,统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述待添加关键码插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树;将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述获取用户输入的待添加关键码的步骤,直至无所述当前待添加关键码时,对所述目标严格平衡二叉树进行遍历,获得添加后的目标数据库。在具体实现中,当用户输入的待添加关键码为66时,根据动态添加规则,由于图3中严格平衡二叉树的左子树节点数大于右子树节点数,且66大于55,因此将66递归插入到右子树中,获得如图10所示的严格平衡二叉树。
本实施例通过动态构建严格平衡二叉树,再将严格平衡二叉树进行遍历,获得先序序列,后序序列及层次序列,将其分别保存三个不同的外部文件中,获得数据库文件,在查找或添加数据库时,只需要用二叉排序树导入数据库文件,就可以建立相同的严格平衡二叉树,通过严格平衡二叉树建立的数据库比查询速度最快的二分法更充分地利用了内存碎片,比二叉排序树及平衡二叉树具有更快的查询速度,能快速查询出用户需要的数据库记录。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (7)
1.一种用严格平衡二叉树实现数据库的动态添加方法,其特征在于,所述用严格平衡二叉树实现数据库的动态添加方法包括以下步骤:
从待添加数据库中读取当前待添加记录;
统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,所述当前严格平衡二叉树用于保存待添加记录;
根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树;
将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库;
其中,所述根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树,具体包括:
在所述当前左子树节点数与所述当前右子树节点数相同时,判断当前待添加记录值是否小于所述当前严格平衡二叉树的当前根节点记录值;
在所述当前待添加记录值小于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前左子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值大于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前右子树中,获得目标严格平衡二叉树;
所述根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树,具体包括:
在所述当前左子树节点数大于所述当前右子树节点数时,判断当前待添加记录值是否大于所述当前根节点记录值;
在所述当前待添加记录值大于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前右子树中,获得目标严格平衡二叉树;
所述根据所述当前左子树节点数及所述当前右子树节点数基于动态添加规则将所述当前待添加记录插入到所述当前严格平衡二叉树,获得目标严格平衡二叉树,具体包括:
在所述当前左子树节点数小于所述当前右子树节点数时,判断当前待添加记录值是否小于所述当前根节点记录值;
在所述当前待添加记录值小于所述当前根节点记录值时,将所述当前待添加记录递归插入到当前左子树中,获得目标严格平衡二叉树。
2.如权利要求1所述的用严格平衡二叉树实现数据库的动态添加方法,其特征在于,所述在所述当前左子树节点数大于所述当前右子树节点数时,判断当前待添加记录值是否大于所述当前根节点记录值之后,所述方法还包括:
在所述当前待添加记录值小于所述当前根节点记录值时,获取所述当前左子树中的最大节点记录,判断所述当前待添加记录值是否大于所述最大节点记录值;
在所述当前待添加记录值大于所述最大节点记录值时,将所述当前待添加记录替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前右子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值小于所述最大节点记录值时,将所述最大节点记录替换所述当前根节点记录,并将所述当前根节点记录插入所述当前右子树中,将所述当前待添加记录插入到所述当前左子树中,获得目标严格平衡二叉树。
3.如权利要求1所述的用严格平衡二叉树实现数据库的动态添加方法,其特征在于,所述在所述当前左子树节点数小于所述当前右子树节点数时,判断当前待添加记录值是否小于所述当前根节点记录值之后,所述方法还包括:
在所述当前待添加记录值大于所述当前根节点记录值时,获取所述当前右子树中的最小节点记录,判断所述当前待添加记录值是否小于所述最小节点记录值;
在所述当前待添加记录值小于所述最小节点记录值时,将所述当前待添加记录替换所述当前根节点记录,并将所述当前根节点记录插入到所述当前左子树中,获得目标严格平衡二叉树;
在所述当前待添加记录值大于所述最小节点记录值时,将所述最小节点记录替换所述当前根节点记录,并将所述当前根节点记录插入所述当前左子树中,将所述当前待添加记录插入到所述当前右子树中,获得目标严格平衡二叉树。
4.如权利要求1至3中任一项所述的用严格平衡二叉树实现数据库的动态添加方法,其特征在于,所述统计当前严格平衡二叉树的当前左子树节点数及当前右子树节点数,所述当前严格平衡二叉树用于保存待添加记录之前,所述方法还包括:
判断所述当前严格平衡二叉树是否为空;
在所述当前严格平衡二叉树为空时,建立当前根节点;
将所述当前待添加记录保存到所述当前根节点中,并将所述当前根节点的左孩子节点及右孩子节点设置为空,返回所述从待添加数据库中读取当前待添加记录的步骤。
5.如权利要求1至3中任一项所述的用严格平衡二叉树实现数据库的动态添加方法,其特征在于,所述将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库,具体包括:
将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行先序遍历、后序遍历及层次遍历,获得目标数据库。
6.如权利要求5所述的用严格平衡二叉树实现数据库的动态添加方法,其特征在于,所述将所述目标严格平衡二叉树作为当前严格平衡二叉树,并返回所述从待添加数据库中读取当前待添加记录的步骤,直至所述待添加数据库中无所述当前待添加记录时,对所述目标严格平衡二叉树进行遍历,获得目标数据库之后,所述方法还包括:
用二叉排序树将所述目标数据库导入内存,获得初始严格平衡二叉树;
获取用户输入的待查找关键字;
根据所述待查找关键字对所述初始严格平衡二叉树进行递归或非递归查找,并输出查找结果。
7.一种用严格平衡二叉树实现数据库的动态添加的装置,其特征在于,所述装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的用严格平衡二叉树实现数据库的动态添加程序,所述用严格平衡二叉树实现数据库的动态添加程序配置为实现如权利要求1至6中任一项所述的用严格平衡二叉树实现数据库的动态添加方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910051386.1A CN109815238B (zh) | 2019-01-18 | 2019-01-18 | 用严格平衡二叉树实现数据库的动态添加方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910051386.1A CN109815238B (zh) | 2019-01-18 | 2019-01-18 | 用严格平衡二叉树实现数据库的动态添加方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109815238A CN109815238A (zh) | 2019-05-28 |
CN109815238B true CN109815238B (zh) | 2021-09-28 |
Family
ID=66604573
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910051386.1A Expired - Fee Related CN109815238B (zh) | 2019-01-18 | 2019-01-18 | 用严格平衡二叉树实现数据库的动态添加方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109815238B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111026765B (zh) * | 2019-12-16 | 2023-07-14 | 武汉轻工大学 | 严格平衡二叉树的动态处理方法、设备、存储介质及装置 |
CN111475487B (zh) * | 2020-04-09 | 2023-12-22 | 广州创显科教股份有限公司 | 一种基于人工智能的物流配送状态查询方法、系统装置及可读存储介质 |
CN113109642B (zh) * | 2021-03-10 | 2023-12-05 | 中国电力科学研究院有限公司 | 一种用于对电能质量信号数据处理的方法及系统 |
CN113779319B (zh) * | 2021-08-12 | 2023-09-19 | 河海大学 | 一种基于树的高效集合运算系统 |
CN113722016B (zh) * | 2021-09-10 | 2024-08-20 | 拉卡拉支付股份有限公司 | 应用程序配置方法、装置、设备、存储介质及程序产品 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101419630B (zh) * | 2008-12-11 | 2011-03-23 | 中国科学院计算技术研究所 | 一种数据流中Top-k项的挖掘方法及系统 |
CN102521334B (zh) * | 2011-12-07 | 2014-03-12 | 广东工业大学 | 一种基于分类特性和平衡二叉树的数据存储、查询方法 |
US20180095719A1 (en) * | 2016-10-03 | 2018-04-05 | Michael Winestock | Sorted linked list with a midpoint binary tree |
-
2019
- 2019-01-18 CN CN201910051386.1A patent/CN109815238B/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN109815238A (zh) | 2019-05-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109815238B (zh) | 用严格平衡二叉树实现数据库的动态添加方法及装置 | |
CN106598574B (zh) | 页面渲染的方法和装置 | |
US7882109B2 (en) | Computer representation of a data tree structure and the associated encoding/decoding methods | |
JP2003308333A (ja) | 繰り返しを含む順序パターンを用いた検索装置および方法 | |
CN112650766A (zh) | 数据库数据操作的方法、系统及服务器 | |
CN111443901B (zh) | 一种基于Java反射的业务扩展方法及装置 | |
CN111026765B (zh) | 严格平衡二叉树的动态处理方法、设备、存储介质及装置 | |
CN109829073B (zh) | 一种图像搜索的方法及装置 | |
CN111159329A (zh) | 敏感词检测方法、装置、终端设备和计算机可读存储介质 | |
CN111628975A (zh) | 一种组装xml报文的方法及装置 | |
CN109857366B (zh) | 基于外存的插入排序方法、系统、设备及存储介质 | |
CN115687462A (zh) | 菜单构建方法及装置 | |
CN112102840A (zh) | 语义识别方法、装置、终端及存储介质 | |
CN111813744A (zh) | 文件的搜索方法、装置、设备及存储介质 | |
Doerr et al. | The impact of lexicographic parsimony pressure for ORDER/MAJORITY on the run time | |
CN108829872B (zh) | 无损压缩文件的快速处理方法、设备、系统及存储介质 | |
Albert et al. | Longest increasing subsequences in sliding windows | |
Wild | Quicksort is optimal for many equal keys | |
CN107609110B (zh) | 基于分类树的最大多样频繁模式的挖掘方法及装置 | |
Orlin et al. | Directed shortest paths via approximate cost balancing | |
CN113065419B (zh) | 一种基于流量高频内容的模式匹配算法及系统 | |
CN110807092B (zh) | 数据处理方法及装置 | |
CN113609166A (zh) | 搜索方法、装置、计算机设备及计算机可读存储介质 | |
CN111694596A (zh) | 一种webpack环境中的入口路径打包方法以及打包装置 | |
JPH1011469A (ja) | 多段表処理方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20210928 |