CN101657818A - 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质 - Google Patents

配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质 Download PDF

Info

Publication number
CN101657818A
CN101657818A CN200880012277A CN200880012277A CN101657818A CN 101657818 A CN101657818 A CN 101657818A CN 200880012277 A CN200880012277 A CN 200880012277A CN 200880012277 A CN200880012277 A CN 200880012277A CN 101657818 A CN101657818 A CN 101657818A
Authority
CN
China
Prior art keywords
node
tree
array
pairing
retrieval
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.)
Granted
Application number
CN200880012277A
Other languages
English (en)
Other versions
CN101657818B (zh
Inventor
新庄敏男
国分光裕
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Kousokuya Inc
Original Assignee
S Grants Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Priority claimed from JP2007114915A external-priority patent/JP4439013B2/ja
Priority claimed from JP2007132289A external-priority patent/JP4514771B2/ja
Application filed by S Grants Co Ltd filed Critical S Grants Co Ltd
Priority claimed from PCT/JP2008/000983 external-priority patent/WO2008132806A1/ja
Publication of CN101657818A publication Critical patent/CN101657818A/zh
Application granted granted Critical
Publication of CN101657818B publication Critical patent/CN101657818B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1448Management of the data involved in backup or backup restore
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing
    • G06F16/90344Query processing by using string matching techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1458Management of the backup or restore process
    • G06F11/1469Backup restoration techniques

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Quality & Reliability (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

配对节点树由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成。分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的位置信息。叶节点包含由检索对象比特序列构成的索引关键字。按照深度优先搜索顺序保存配对节点树的节点。重复下述处理来复原配对节点树:按照保存顺序读出节点,在堆栈中存储待复原节点的位置的位置信息,在分支节点持续的期间依次复原子节点,如果读出了叶节点则复原叶节点,追溯堆栈而确定下一个待复原的节点。

Description

配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质
技术领域
本发明涉及使用存储比特序列的树状数据结构从比特序列集合中检索期望的比特序列的技术,特别涉及使用了本申请人在日本特愿2006-187827中提出的配对节点树保存/复原方法以及配对节点树的检索处理。
背景技术
近年,社会的信息化不断发展,大规模的数据库在各处被利用起来。为了从这种大规模的数据库中检索记录,通常是将与存储有各记录的地址相对应的记录内的项目作为索引关键字来进行检索,检索出期望的记录。并且,全文检索中的字符串也可视为文档的索引关键字。
而且,由于这些索引关键字利用比特序列来表达,因而数据库的检索可归结于比特序列的检索。
为了高速进行上述比特序列检索,一直以来对存储比特序列的数据结构进行了各种研究。作为这种研究之一,公知的是Patricia树这样的树结构。
图1示出在上述现有的检索处理中使用的Patricia树的一例。Patricia树的节点构成为包含索引关键字、检索关键字的检查比特位置、以及左右的链接指针。虽未作明示,当然在节点内包含有用于对与索引关键字对应的记录进行访问的信息。
在图1的例子中,保持索引关键字“100010”的节点1750a是根节点,其检查比特位置1730a是0。节点1750a的左链接1740a与节点1750b连接,右链接1741a与节点1750f连接。
节点1750b保持的索引关键字是“010011”,检查比特位置1730b是1。节点1750b的左链接1740b与节点1750c连接,右链接1741b与节点1750d连接。节点1750c保持的索引关键字是“000111”,检查比特位置1730c是3。节点1750d保持的索引关键字是“011010”,检查比特位置1730d是2。
从节点1750c开始用实线连接的部分表示节点1750c的左右链接指针,未进行虚线连接的左指针1740c表示该栏是空栏。进行了虚线连接的右指针1741c的虚线的链接目的地表示指针所指示的地址,在这里表示右指针1741c指向节点1750c。
节点1750d的右指针1741d指向节点1750d自身,左链接1740d与节点1750e连接。节点1750e保持的索引关键字是“010010”,检查比特位置1730e是5。节点1750e的左指针1740e指向节点1750b,右指针1741e指向节点1750e。
并且,节点1750f保持的索引关键字是“101011”,检查比特位置1730f是2。节点1750f的左链接1740f与节点1750g连接,右链接1741f与节点1750h连接。
节点1750g保持的索引关键字是“100011”,检查比特位置1730g是5。节点1750g的左指针1740g指向节点1750a,右指针1741g指向节点1750g。
节点1750h保持的索引关键字是“101100”,检查比特位置1730h是3。节点1750h的左指针1740h指向节点1750f,右指针1741h指向节点1750h。
在图1的例子中,形成这样的结构:随着从根节点1750a开始对树进行向下遍历,各节点的检查比特位置增大。
当使用某检索关键字进行检索时,从根节点开始依次检查由各节点所保持的检索关键字的检查比特位置,判断检查比特位置的比特值是1还是0,是1时搜索右链接,是0时搜索左链接。然后,当链接目的地节点的检查比特位置不大于链接源节点的检查比特位置时,即,链接目的地不是下方而是回到上方时(将图1中虚线所示的该后退的链接称为反向链接),对链接目的地节点的索引关键字与检索关键字进行比较。保证了在比较结果是相同时检索成功,在比较结果是不相同时检索失败。
如上所述,在使用Patricia树的检索处理中,有以下等优点:只通过必要比特的检查即可进行检索,以及关键字全体的比较只需一次,然而具有以下等缺点:由于必定有从各节点起的2个链接而使存储容量增大,由于反向链接的存在而使判断处理复杂化,由于反向链接而返回、从开头与索引关键字进行比较而造成的检索处理延迟以及追加删除等数据维护困难。
作为解决Patricia树的这些缺点的技术,例如有下述专利文献1所公开的技术。在下述专利文献1所记载的Patricia树中,通过在连续的区域中存储下位的左右节点来削减指针的存储容量,并通过在各节点中设置表示下一链接是否是反向链接的比特来减轻反向链接的判断处理。
然而,在下述专利文献1所公开的技术中,由于1个节点必定占据索引关键字的区域和指针的区域,将下位的左右节点存储在连续的区域中而采用1个指针,因而对于例如图1所示的Patricia树的最下段部分即左指针1740c、右指针1741h等部分,也必须分配与节点相同容量的存储区域,存储容量的削减效果不怎么好。并且,也没有改善反向链接引起的检索处理的延迟问题,并且很难进行追加删除等处理。
作为解决上述现有检索方法中的问题点的方案,本申请人在日本特愿2006-187827(参照下述专利文献2)中提出了使用配对节点树的比特序列检索,该配对节点树是由根节点、和在相邻的存储区域中配置的分支节点和叶节点或者分支节点之间或叶节点之间的节点对构成的比特序列检索用的树,根节点是表示树的起点的节点,在该树的节点为一个时,根节点为叶节点,在树的节点为两个以上时,根节点为上述分支节点,上述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置和表示作为链接目的地节点对中的一个节点的代表节点的位置的位置信息,上述叶节点包含由检索对象比特序列构成的索引关键字。
在上述申请中,示出了根据给定的索引关键字的集合来生成配对节点树的方法、以及从配对节点树检索单个索引关键字的方法等使用配对节点树的基本检索方法。另外,还说明了利用索引关键字的集合来唯一地规定配对节点树的结构。
并且,在比特序列的检索中,存在求出最小值、最大值或求出某个范围的值等各种检索要求。因此,本申请人在日本特愿2006-293619中提出了求出配对节点树的任意部分树中包含的索引关键字的最大值/最小值的方法以及以升序或降序的方式取出存储在配对节点树中的索引关键字的方法等。
求出索引关键字最大值/最小值的方法是仅链接代表节点或者与代表节点成对的节点(以下,有时称为非代表节点。),直至到达叶节点,对于以升序或降序的方式取出存储在配对节点树中的索引关键字的方法,如后所述,利用了索引关键字在配对节点树中顺序性地配置这一点,反复地在根据上述顺序性变更检索开始节点的同时进行最小值检索或最大值检索。
另外,在上述各申请中还公开了如下的处理:将配对节点树配置在数组中,在搜索路径堆栈依次存入上述提出的各检索处理中从检索开始节点起的树上的搜索路径的节点的数组编号,并使用存入到搜索路径堆栈中的数组编号。
专利文献1:日本特开2001-357070号公报
专利文献2:日本特开2008-015872号公报
专利文献3:日本特开2003-224581号公报
关于上述各申请所提出的配对节点树在存储区域上的配置,如先前所述规定了成对的节点彼此配置在相邻的存储区域,关于在节点对间如何配置没有特别的限制,随应用程序或管理存储区域的存储管理系统而定。
另外,通过存储有该配对节点树的存储区域来规定表示分支节点具有的链接目的地节点对中的一个节点即代表节点的位置的位置信息。
因此,当将配对节点树复制到其它存储区域而进行利用时,即使在保存着节点对之间的配置在存储区域上的相对关系的状态下进行复制,也需要变更分支节点中包含的与上述链接目的地相关的位置信息的值。
另外,在复制目的地的情况中,有时不能在保存着节点对之间的配置在存储区域上的相对关系的状态下进行复制,在保存着相对关系的状态下进行复制未必适当,其必要性通常也未被认可。
如上所述,因此在进行下述复制处理时需要一些转换处理,即,将配对节点树从主存储器存储到外部存储装置中,或者经由通信线路转送到其它计算机的存储装置中。
因此,为了使该转换处理变得容易,考虑不依据配对节点树在存储区域上的配置,定义配对节点树的节点信息的交换形式,并利用该交换形式进行复制处理。
显然例如若转送在配对节点树中存储的索引关键字本身,在接收侧根据转送的索引关键字进行配对节点树的生成处理,则完成了复制处理。但如果这样的话,与其说是配对节点树的转送,不如说是索引关键字的转送,在转送目的地需要再次进行包含下述处理的配对节点树生成处理,即,根据索引关键字彼此间的比较来确定在分支节点中应含有的鉴别比特位置的处理、以及确定应插入新节点的部位的处理。因此,希望创造出不需要确定鉴别比特位置及节点插入部位等处理、能进行更高效的转换处理的方法。
此外,在比特序列检索中,除了与检索关键字完全一致的值的检索之外,还有与检索关键字的至少一部分一致的值的检索。作为该例有下述最长一致(或最短一致)检索,即,从最上位比特起有1比特以上与检索关键字一致,检索该一致范围尽可能大(或小)的索引关键字。
最长一致检索可利用于路由表检索以及向上位比特相同的多个地址同时发送数据时的多播地址检索等。另外,最短一致检索可利用于正规表达的字符串检索以及检索对象范围缩小等。因此,希望使这些检索高速化,并提高在各个应用领域中的处理效率。
在上述专利文献3中记载了使采用Patricia树的最长一致检索高速化的技术,但配对节点树是本申请人发明的新数据结构,所以不能使用现有的最长一致检索方法。
另外,对于上述配对节点树,在规定数组元素的容量后,当想利用不能完全存储到该容量的存储区域内的长索引关键字时,希望将与该索引关键字对应的叶节点高效地插入配对节点树。另外,在索引关键字长的情况下,还希望以不对分支节点分配过剩存储区域的方式有效利用存储区域。
发明内容
因此,本发明第1目的是提供高效的保存方法以及复原方法,即,与配对节点树在存储区域上的具体配置无关、将配对节点树转换成配对节点树节点信息的交换形式而保存到某一存储区域的保存方法、以及与该保存方法对应的从所述交换形式向配对节点树进行逆转换的复原方法。
另外,本发明第2目的是提供将配对节点树作为检索对象进行最长一致/最短一致检索的方法。
此外,本发明第3目的是提供对配对节点树的结构进行改良并对这样改良后的配对节点树进行检索的方法、将与指定的索引关键字对应的节点插入该配对节点树的方法、以及将与指定的索引关键字对应的节点从该配对节点树删除的方法,以使无需预先确定索引关键字的长度,即使在利用较长索引关键字的情况下也能够有效地利用存储区域。
根据本发明第1实施方式的保存方法,将配对节点树的树结构转换成节点信息序列而进行保存。即,将配对节点树的节点内容依次写入保存用存储区域。该存储区域可以是数组。
此时,应用先前提出的以升序或降序的方式取出在配对节点树中存储的索引关键字的方法,将从反复进行最小值检索或最大值检索时搜索到的节点(即从检索开始节点到最小值或最大值的链接路径的节点)、和开始下一最小值检索或最大值检索的检索开始节点的内容、按照搜索到该节点的顺序写到保存用存储区域中。
将通过上述保存方法进行的依次搜索配对节点树的节点的操作称为节点巡回或路径巡回,将检索开始节点称为巡回开始节点,则本发明的保存方法的具体算法如下所述。
以升序或降序的方式取出索引关键字的方法可适用于配对节点树的任意部分树,同样,在保存中也可适用于任意部分树,因此,首先将待保存的部分树的根节点指定为巡回开始节点。
接着,从巡回开始节点仅链接节点对中的代表节点或非代表节点而巡回至叶节点,同时针对从巡回开始节点到叶节点的所述路径上的各节点,将表示该节点的位置的位置信息依次存储在堆栈中,并将该节点的内容依次保存在其它存储区域中。
接着,反复进行所述堆栈的出栈动作,直到取得代表节点或非代表节点的位置信息,从该堆栈读出该位置信息,将与读出了该位置信息的所述代表节点或所述非代表节点形成节点对的非代表节点或代表节点指定为新的所述巡回开始节点,反复所述节点的巡回和保存。
通过以上处理,配对节点树的各节点按照节点巡回顺序存储在保存用存储区域中。此时,在复原配对节点树时,通常分支节点的代表节点的位置信息被复原到与保存前的存储区域不同的区域中,所以在复原时不具有意义,因此针对分支节点可仅保存节点类别和鉴别比特位置。
根据本发明第1实施方式的复原方法的一个方式,可提供根据存储在保存用存储区域中的节点信息(保存信息)来复原配对节点树的复原方法。
该复原是与配对节点树在存储区域上的配置无关,将作为转换成配对节点树的节点信息的交换形式后的节点信息序列的数据结构逆转换成配对节点树的数据结构。按照保存的顺序对各节点进行复原。
在该复原方法中,从所述保存信息中依次读出节点,按照读出的顺序复原节点。
在待复原的配对节点树的根节点轮到被复原时,取得该根节点用的存储区域,将读出的节点内容存储在该存储区域中,由此复原该根节点。
另外,在读出的节点是分支节点的期间,依次将在所述保存信息中处于该分支节点的下一顺位的子节点,在与该子节点成对的节点用存储区域内取得,同时取得该子节点用的存储区域,将所读出的该子节点的内容存储在所述存储区域内,由此来进行复原,在该复原方法中反复进行以下动作:如果读出了叶节点,则向着根节点对复原中的所述配对节点树的树结构进行追溯,搜索已取得但没有存储节点内容的存储区域,将搜索到的该存储区域确定为应该存储下一个待复原节点的内容的存储区域。
另外,根据本发明第1实施方式的复原方法的另一方式,采用传输介质来取代构成所述保存用存储区域的存储介质,在发送侧巡回配对节点树而顺次取出节点,经由传输介质发送所取出的节点,在接收侧将接收到的节点作为复原节点,将配对节点树复原到接收侧的存储区域中。
另外,本发明第2实施方式的采用了配对节点树的最长一致检索方法具有以下步骤:检索步骤,将所述配对节点树的所述根节点作为所述检索开始节点,将指定的最长一致检索关键字作为所述检索关键字,一边存储从所述根节点起的路径,一边进行所述检索来取得所述检索结果关键字;差分比特位置取得步骤,对所述最长一致检索关键字和所述检索结果关键字的比特序列进行比较,取得作为比特值不一致的不一致比特的位置中最上位位置的差分比特位置;以及最长一致节点设定步骤,该最长一致节点设定步骤是在所述差分比特位置为比特序列的最上位以外的位置时,参照所存储的所述路径来设定最长一致节点的最长一致节点设定步骤,在所述根节点是所述叶节点的情况下、或者所述根节点是所述分支节点且该根节点的所述鉴别比特位置是比所述差分比特位置更下位的位置的情况下,将所述根节点设定为所述最长一致节点,在其它情况下,取得作为所述路径上的节点、接在所述鉴别比特位置比所述差分比特位置更上位的所述分支节点中的、所述鉴别比特位置为最下位的所述分支节点之后而在所述检索步骤中存储的所述分支节点或所述叶节点,作为所述最长一致节点。
本发明第2实施方式的采用了配对节点树的最短一致检索方法具有:除了采用最短一致检索关键字取代上述最长一致检索关键字以外与上述相同的检索步骤以及差分比特位置取得步骤;以及最短一致节点设定步骤,该最短一致节点设定步骤是在所述差分比特位置为比特序列的最上位以外的位置时,参照所存储的所述路径来设定最短一致节点的最短一致节点设定步骤,所述路径包含所述根节点、和该根节点链接目的地的所述节点对中的一个所述分支节点即第一节点,在所述根节点的所述鉴别比特位置是比所述差分比特位置更上位的位置的情况下,取得所述第一节点的链接目的地的所述节点对中没有存储在所述路径中的节点即第二节点,作为所述最短一致节点。
此外,根据本发明第3实施方式,提供具有以下数据结构的配对节点树,采用该配对节点树进行索引关键字检索。另外,根据本发明第3实施方式,提供了对该配对节点树进行与指定的索引关键字对应的叶节点的插入及删除的方法。
本发明第3实施方式的配对节点树的分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的第一位置信息,与此相对,叶节点包含表示存储有由检索对象比特序列构成的索引关键字的存储区域的位置的第二位置信息。
本发明第3实施方式的采用了配对节点树的检索通过将配对节点树的任意节点作为检索开始节点,从而将所述配对节点树的以所述检索开始节点为根节点的任意部分树作为检索对象,执行基于所述检索关键字的检索,该检索是通过依次反复下述动作直至到达所述叶节点为止来进行的,即,在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与其相邻的存储区域中所配置的节点,这一点与在先申请所公开的一样,但不同点在于,取得所述叶节点中包含的所述第二位置信息所表示的存储区域中存储的索引关键字,作为检索结果关键字。
在本发明第3实施方式中,为了在所述配对节点树中插入包含表示如下存储区域的位置的信息的叶节点,其中该存储区域存储由指定为插入关键字的新比特序列构成的索引关键字,首先,将所述根节点作为所述检索开始节点,将所述插入关键字作为所述检索关键字,一边存储从所述根节点到与所述检索结果关键字对应的所述叶节点的路径,一边执行所述检索。然后,在所述插入关键字与所述检索结果关键字之间进行大小比较和比特序列比较。根据在比特序列比较中成为不同比特值的开头比特位置与所述路径上的分支节点的鉴别比特位置之间的相对位置关系,来确定由待插入的所述叶节点和另一个节点构成的节点对的插入位置。此外,根据所述大小关系来确定将待插入的所述叶节点设为待插入的所述节点对的哪个节点。并且,在所述叶节点中存储表示存储所述插入关键字的存储区域的位置的信息,作为所述第二位置信息。
在本发明第3实施方式中,为了从所述配对节点树中删除包含表示如下存储区域的位置的信息的叶节点,其中该存储区域存储由指定为删除关键字的期望比特序列构成的索引关键字,首先,将所述根节点作为所述检索开始节点,将所述删除关键字作为所述检索关键字,执行所述检索。然后,将与对应于所述检索结果关键字的所述叶节点成对的另一个节点存储在该节点对的链接源的分支节点中。
本发明第1实施方式的配对节点树保存方法是按照深度优先搜索顺序来保存作为保存对象的构成配对节点树的部分树的节点的方法。因此,按照与原始配对节点树具体怎样配置在存储区域上无关的顺序(深度优先搜索顺序)来保存节点。经过这样的保存/复原处理,使重新利用配对节点树变得容易。
另外,所述保存方法以及复原方法是不包含基于节点中包含的鉴别比特位置及索引关键字值的判断等的复杂处理的简单方法。即,根据本发明第1实施方式,通过利用配对节点树的结构特征,能够以简单的处理高效地实施配对节点树的保存/复原处理。
另外,根据本发明第2实施方式,能够将配对节点树作为检索对象来进行最长一致/最短一致检索。由此,能够在需要进行最长一致/最短一致检索的各种应用领域中采用配对节点树。配对节点树构成为使检索高速化,所以采用了配对节点树的最长一致/最短一致检索是高速的。由此,实现在各种应用领域中最长一致/最短一致检索处理的高速化。
此外,本发明第3实施方式的配对节点树具有可高速检索的结构,延续了在先申请的配对节点树的、可低成本地执行节点插入及删除这样的特征。另外,所述在先申请的配对节点树具有需要存储容量较小的特征,但本发明第3实施方式的配对节点树改良了结构,使得能够更有效地利用存储区域。
根据本发明第3实施方式,从节点存储区域分离出索引关键字存储区域。由此,即使预先规定了节点存储容量,也并非根据该存储容量来直接限制可利用的索引关键字的长度。另外,即使在利用较长索引关键字的情况下,各节点所需的存储容量也不会与其成比例地增加,所以即使在对各节点分配了相同大小的存储区域的方式中,也不会浪费存储区域。
附图说明
图1是示出在现有检索中采用的Patricia树一例的图。
图2A是说明存储在数组中的配对节点树的结构例的图。
图2B是概念性地示出配对节点树的树结构的图。
图3是说明硬件结构例的图。
图4是说明本发明的检索处理的流程图。
图5是说明求出存储在配对节点树中的索引关键字的最小值的处理的流程图。
图6是说明求出存储在配对节点树中的索引关键字的最大值的处理的流程图。
图7是说明以升序的方式取出存储在配对节点树中的索引关键字的处理的流程图。
图8是说明以降序的方式取出存储在配对节点树中的索引关键字的处理的流程图。
图9A是示出作为插入处理前级的检索处理的处理流程的图。
图9B是说明准备用于待插入节点对的数组元素的处理的处理流程图。
图9C是示出求得插入节点对的位置并写入节点对的各节点的内容来完成插入处理的处理流程的图。
图9D是说明包含根节点插入处理在内的、追加索引关键字时的整个节点插入处理的处理流程图。
图10A是示出本发明第1实施方式的保存处理的流程图。
图10B是示出本发明第1实施方式的保存节点的处理的流程图。
图11是利用配对节点树来说明保存处理的图。
图12是说明随着保存处理而变化的搜索路径堆栈和节点保存数组的状态的图。
图13是示出本发明第1实施方式的复原处理的流程图。
图14是利用配对节点树来说明复原处理的图。
图15是说明随着复原处理而变化的搜索路径堆栈和节点保存数组的状态的图。
图16是示出本发明第2实施方式的最长一致检索处理的流程图。
图17是示出本发明第2实施方式的最短一致检索处理的流程图。
图18是示出取得最长一致节点的处理的流程图。
图19是示出取得最短一致节点的处理的流程图。
图20是示出取得差分比特位置的处理的流程图。
图21是利用配对节点树来说明最长一致检索的一例的图。
图22是利用配对节点树来说明最短一致检索的一例的图。
图23A是说明本发明第3实施方式的存储在数组中的配对节点树的结构例的图。
图23B是概念性地示出本发明第3实施方式的配对节点树的树结构的图。
图23C是说明本发明第3实施方式的硬件结构例的图。
图24是示出本发明第3实施方式的检索处理的流程图。
图25是示出本发明第3实施方式的作为插入处理前级的检索处理的处理流程的图。
图26是说明本发明第3实施方式的插入处理中的准备用于待插入节点对的数组元素的处理流程的图。
图27是示出本发明第3实施方式的求出插入节点对的位置并写入节点对的各节点的内容来完成插入处理的处理流程的图。
图28是说明本发明第3实施方式的包含根节点插入处理在内的整个叶节点插入处理的处理流程的图。
图29是示出本发明第3实施方式的作为删除处理前级的检索处理的处理流程的图。
图30是说明本发明第3实施方式的删除处理后级的处理流程的图。
图31A是说明本发明第3实施方式的删除处理前的配对节点树和删除关键字″011010″的图。
图31B是说明本发明第3实施方式的删除处理后的配对节点树的图。
图32A是说明本发明第3实施方式的插入处理前的配对节点树和插入关键字″0011″的图。
图32B是说明本发明第3实施方式的插入处理后的配对节点树的图。
具体实施方式
首先,关于本申请人在之前的上述申请中提出的作为本发明前提的配对节点树,说明将配对节点树存储在数组中的例子。分支节点保持的表示链接目的地位置的数据也可以是存储装置的地址信息,不过通过使用由可存储分支节点或叶节点中的所占区域的存储容量更大一方的数组元素构成的数组,可以用数组编号来表示节点位置,这样可以削减位置信息的信息量。
图2A是说明存储在数组中的配对节点树的结构例的图。
参照图2A,节点101配置在数组100的数组编号为10的数组元素内。节点101由节点类别102、鉴别比特位置103以及代表节点编号104构成。节点类别102是0,表示节点101是分支节点。在鉴别比特位置103中存储有1。在代表节点编号104中存储有链接目的地节点对的代表节点的数组编号20。另外,以下为了简化说明,有时把存储在代表节点编号中的数组编号称为代表节点编号。并且,有时利用赋予给该节点的标号或赋予给节点对的标号来表示存储在代表节点编号中的数组编号。
在数组编号20的数组元素中存储有节点对111的代表节点即节点[0]112。然后在相邻的下一数组元素(数组编号20+1)中存储有与代表节点成对的节点[1]113。在节点[0]112的节点类别114中存储有0,在鉴别比特位置115中存储有3,在代表节点编号116中存储有30。并且,在节点[1]113的节点类别117中存储有1,表示节点[1]113是叶节点。在索引关键字118中存储有“0001”。与之前针对Patricia树描述的一样,当然在叶节点内包含有对与索引关键字对应的记录进行访问的信息,然而省略说明。
另外,有时用节点[0]表示代表节点,用节点[1]表示与其成对的节点。此外,有时将存储在某个数组编号的数组元素中的节点称为该数组编号的节点,将存储有节点的数组元素的数组编号称为节点的数组编号。
省略了由存储在数组编号30和31的数组元素中的节点122和节点123构成的节点对121的内容。
分别赋予给存储有节点[0]112、节点[1]113、节点122以及节点123的数组元素的0或1表示在使用检索关键字进行检索的情况下链接到节点对的哪个节点。链接到位于前级分支节点的鉴别比特位置上的检索关键字的比特值0或1与代表节点编号相加所得到的数组编号的节点上。
因此,通过将前级分支节点的代表节点编号与检索关键字的鉴别比特位置的比特值相加,可求出存储有链接目的地节点的数组元素的数组编号。
另外,在上述例子中代表节点编号采用配置有节点对的数组编号中的小的一方,然而显然也可采用大的一方。
图2B是概念性地示出配对节点树的树结构的图。图示的6比特的索引关键字与图1所例示的Patricia树的索引关键字相同。
标号210a所示的是根节点。在图示的例子中,根节点210a作为配置在数组编号220上的节点对201a的代表节点。
作为树结构,在根节点210a之下配置有节点对201b,在节点对201b的下层配置有节点对201c和节点对201f,在节点对201f的下层配置有节点对201h和节点对201g。在节点对201c之下配置有节点对201d,并在节点对201d之下配置有节点对201e。
附在各节点前面的标号0或1与在图2A中所说明的附在数组元素前面的标号相同。根据检索关键字的鉴别比特位置的比特值来搜索树,从而找到检索对象叶节点。
在图示的例子中,根节点210a的节点类别260a是0,表示是分支节点,鉴别比特位置230a示出为0。代表节点编号是220a,该编号是存储了节点对201b的代表节点210b的数组元素的数组编号。
节点对201b由节点210b和211b构成,它们的节点类别260b、261b都是0,表示是分支节点。在节点210b的鉴别比特位置230b上存储有1,在链接目的地的代表节点编号中存储有存储了节点对201c的代表节点210c的数组元素的数组编号220b。
由于在节点210c的节点类别260c中存储有1,因而该节点是叶节点,因此包含索引关键字250c。在索引关键字250c中存储有“000111”。另一方面,节点211c的节点类别261c是0,鉴别比特位置231c是2,在代表节点编号中存储有存储了节点对201d的代表节点210d的数组元素的数组编号221c。
节点210d的节点类别260d是0,鉴别比特位置230d是5,在代表节点编号中存储有存储了节点对201e的代表节点210e的数组元素的数组编号220d。与节点210d成对的节点211d的节点类别261d是1,在索引关键字251d中存储有“011010”。
节点对201e的节点210e、211e的节点类别260e、261e都是1,表示双方都是叶节点,在各自的索引关键字250e、251e中存储有“010010”和“010011”作为索引关键字。
在节点对201b的另一个节点即节点211b的鉴别比特位置231b中存储有2,在链接目的地的代表节点编号中存储有存储了节点对201f的代表节点210f的数组元素的数组编号221b。
节点对201f的节点210f、211f的节点类别260f、261f都是0,双方都是分支节点。在各自的鉴别比特位置230f、231f中存储有5、3。在节点210f的代表节点编号中存储有存储了节点对201g的代表节点210g的数组元素的数组编号220f,在节点211f的代表节点编号中存储有存储了节点对201h的代表节点即节点[0]210h的数组元素的数组编号221f。
节点对201g的节点210g、211g的节点类别260g、261g都是1,表示双方都是叶节点,在各自的索引关键字250g、251g中存储有“100010”和“100011”。
并且同样,节点对201h的代表节点即节点[0]210h和与其成对的节点[1]211h的节点类别260h、261h都是1,表示双方都是叶节点,在各自的索引关键字250h、251h中存储有“101011”和“101100”。
以下,简单说明从上述的树中检索索引关键字“100010”的处理流程。鉴别比特位置从左起为0、1、2、...。
首先,将比特序列“100010”用作检索关键字,从根节点210a开始处理。由于根节点210a的鉴别比特位置230a是0,因而当查看检索关键字“100010”的鉴别比特位置0的比特值时是1。因此,链接到对存储有代表节点编号的数组编号220a加1后的数组编号的数组元素中存储的节点211b。由于在节点211b的鉴别比特位置231b中存储有2,因而当查看检索关键字“100010”的鉴别比特位置2的比特值时是0,因此链接到在存储有代表节点编号的数组编号221b的数组元素中存储的节点210f。
由于在节点210f的鉴别比特位置230f中存储有5,因而当查看检索关键字“100010”的鉴别比特位置5的比特值时是0,因此链接到在存储有代表节点编号的数组编号220f的数组元素中存储的节点210g。
由于节点210g的节点类别260g是1,表示是叶节点,因而当读出索引关键字250g并与检索关键字进行比较时,双方都是“100010”,是致的。这样进行使用配对节点树的检索。
下面,参照图2B说明配对节点树的结构的意义。
配对节点树的结构是由索引关键字的集合规定的。在图2B的例子中,根节点210a的鉴别比特位置是0,这是因为在图2B所例示的索引关键字中有第0比特是0的索引关键字以及第0比特是1的索引关键字。第0比特是0的索引关键字的组被分类在节点210b之下,第0比特是1的索引关键字的组被分类在节点211b之下。
节点211b的鉴别比特位置是2,这反映了索引关键字集合的性质,即:存储在节点211h、210h、211g、210g内的第0比特是1的索引关键字的第1比特全都是0,从第2比特开始才有不同。
以下与第0比特的情况一样,第2比特是1的索引关键字被分类在节点211f侧,第2比特是0的索引关键字被分类在节点210f侧。
然后,由于第2比特是1的索引关键字中存在第3比特不同的索引关键字,因而在节点211f的鉴别比特位置上存储3,由于在第2比特是0的索引关键字中第3比特和第4比特均相同而第5比特不同,因而在节点210f的鉴别比特位置中存储5。
在节点211f的链接目的地中,由于第3比特是1的索引关键字和第3比特是0的索引关键字分别只有一个,因而节点210h、211h成为叶节点,分别在索引关键字250h和251h中存储有“101011”和“101100”。
假设在索引关键字的集合内包含有“101101”或“101110”来取代“101100”,但是到第3比特为止与“101100”相等,因而只是存储在节点211h内的索引关键字改变,树结构自身不会改变。然而,当除了“101100”以外还包含有“101101”时,节点211h成为分支节点,其鉴别比特位置成为5。当所追加的索引关键字是“101110”时,鉴别比特位置为4。
如以上说明的那样,配对节点树的结构是由索引关键字集合中包含的各索引关键字的各比特位置的比特值所确定的。
进而也可以说,对于成为不同比特值的每个比特位置,分支为比特值是“1”的节点和比特值是“0”的节点,所以当使节点“1”侧和树的深度方向优先来搜索叶节点时,在它们中存储的索引关键字成为节点211h的索引关键字251h的“101100”、节点210h的索引关键字250h的“101011”、...、节点210c的索引关键字250c的“000111”,并以降序的方式排序。
即,在配对节点树中,对索引关键字进行排序而将其配置在树上。
当利用检索关键字进行检索时,搜索在配对节点树上配置了索引关键字的根,例如,如果检索关键字是“101100”,则可到达节点211h。并且,根据上述说明还可以想到,即使在将“101101”或“101110”作为检索关键字的情况下,也可以搜索到节点211h,通过与索引关键字251h进行比较可知晓检索失败。
并且,例如在利用“100100”进行检索的情况下,在节点210a、211b、210f的链接路径上不使用检索关键字的第3比特和第4比特、并且由于“100100”的第5比特是0,所以与利用“100010”进行检索的情况同样,到达节点210g。这样,使用与存储在配对节点树中的索引关键字的比特结构对应的鉴别比特位置来进行分支。
图3是说明用于实施本发明的硬件结构例的图。
本发明的检索装置的检索处理和数据维护是通过至少具有中央处理装置302和高速缓冲存储器303的数据处理装置301、使用数据存储装置308来实施的。具有配置有配对节点树的数组309和搜索路径堆栈310的数据存储装置308可使用主存储装置305或外部存储装置306来实现,或者还可使用通过通信装置307连接的配置在远方的装置来实现,该搜索路径堆栈310用于保存如下数组元素的数组编号,即:该数组元素存储有在检索中搜索到的节点。图2A的数组100是数组309的一例。
在图3的例示中,主存储装置305、外部存储装置306以及通信装置307通过一根总线304与数据处理装置301连接,不过连接方法不仅限于此。另外,还可以使主存储装置305位于数据处理装置301内,或可以将搜索路径堆栈310实现为中央处理装置302内的硬件。或者,显然可以根据可使用的硬件环境、索引关键字集合的大小等,选择适当的硬件结构,例如,使数组309位于外部存储装置306内、使搜索路径堆栈310位于主存储装置305内等。
并且,尽管未作特别图示,但为了能在后面的处理中使用处理中途所获得的各种值,当然可以使用与各个处理对应的临时存储装置。
接着,在为了理解本发明所需的范围内,介绍在上述申请中由本申请人提出的采用了配对节点树的基本检索处理、以及求得配对节点树所包含的索引关键字最大值/最小值的处理等应用处理的一部分。
图4是示出在本申请人的申请即上述日本特愿2006-293619中提出的比特序列检索的基本动作的流程图。
首先,在步骤S401中,取得检索开始节点的数组编号。与所取得的数组编号对应的数组元素存储了构成配对节点树的任意节点。在后面说明的各种应用检索中进行检索开始节点的指定。
接着,在步骤S402中,在搜索路径堆栈310中存储所得到的数组编号,在步骤S403中,读出与该数组编号对应的数组元素作为应参照的节点。然后,在步骤S404中,从所读出的节点中取出节点类别,在步骤S405中,判断节点类别是否是分支节点。
在步骤S405的判断中,在所读出的节点是分支节点的情况下进到步骤S406,从节点中取出关于鉴别比特位置的信息,进而,在步骤S407中,从检索关键字中取出与所取出的鉴别比特位置对应的比特值。然后,在步骤S408中,从节点中取出代表节点编号,在步骤S409中,将从检索关键字中取出的比特值与代表节点编号相加,作为新的数组编号,返回步骤S402。
然后,反复进行步骤S402~步骤S409的处理,直到在步骤S405的判断中判断为叶节点而进到步骤S410。在步骤S410中,从叶节点中取出索引关键字,结束处理。
图5是示出在本申请人的申请即上述日本特愿2006-293619中提出的求出存储在配对节点树(包含部分树)中的索引关键字的最小值的处理的流程图。根据如上所述的索引关键字在树上的配置来求出索引关键字的最小值的处理相当于在树上从检索开始节点开始搜索节点[0],直至到达叶节点为止。
首先,从步骤S501中的取得检索开始节点的数组编号、到步骤S505中的判断节点类别的处理分别与上述图4的步骤S401~步骤S405的处理相同。
在步骤S505的节点类别的判断中判断为节点类别是分支节点时,进到步骤S506,从节点中取出数组的代表节点编号,在步骤S507中,对取出的代表节点编号加上值“0”,将其结果作为新的数组编号并返回步骤S502。然后,反复进行步骤S502~步骤S507的处理,直到在步骤S505中判断为该节点是叶节点为止,在步骤S508中,从叶节点中取出索引关键字,结束处理。
在上述图5所示的处理中,为了搜索节点[0],对代表节点编号一律都加上“0”。即,根据图5的处理,链接目的地节点一定为节点对中的节点[0],并分支到储存有较小值的索引关键字的节点一方。由此,能够取出树结构为如上所述排列结构的配对节点树的最小索引关键字。
图6是示出在本申请人的申请即上述日本特愿2006-293619中提出的求出存储在配对节点树(包含部分树)中的索引关键字的最大值的处理的流程图。
求出索引关键字的最大值的处理相当于针对树上的节点中的节点[1]依次进行搜索直至叶节点为止。下面,关于求出任意部分树的最大索引关键字的处理,一边与上述求出最小索引关键字的处理进行比较,一边以不同点为中心进行说明。
图6所示的一系列处理中的步骤S601~步骤S606和步骤S608分别对应于图5的步骤S501~步骤S506和步骤S508,并执行同样的处理。与图5中求出最小值的处理的不同点是,在步骤S607中,对代表节点编号加上值“1”。由此,始终链接到代表节点编号所表示的节点对中的节点[1],并依次反复进行步骤S602~步骤S607的处理,直至到达叶节点为止,由此能够取得索引关键字的最大值。
如图4~图6所示,当执行对与检索关键字一致的索引关键字进行检索的基本动作和索引关键字的最小值/最大值的检索处理时,在搜索路径堆栈310中依次存储所参照的数组的数组编号。
另外,在参照上述图5和图6的索引关键字的最小值/最大值检索处理中,说明了将配对节点树存储在数组中的情况,但显而易见,不是必须将配对节点树存储在数组中,通过仅链接构成节点对的2个节点中的代表节点、或者配置在与代表节点相邻的存储区域中的节点而到达叶节点,也能够进行索引关键字的最小值/最大值检索。
图7是示出在本申请人的申请即上述特愿2006-293619中提出的以升序的方式取出存储在配对节点树中的索引关键字的处理的流程图。以升序的方式取出索引关键字的处理相当于:使构成节点对的节点中的节点[0]侧和树的深度优先,从根节点起依次搜索叶节点,并从各叶节点中取出索引关键字。
首先,在步骤S701中,对检索开始节点的数组编号设定根节点的数组编号,在步骤S702中,执行参照上述图5说明的求出最小索引关键字的处理,在配对节点树所包含的索引关键字中取得最小索引关键字。然后,在步骤S703中,取出所得到的索引关键字,进到步骤S704。
在步骤S704中,参照搜索路径堆栈310,判断堆栈指针是否指向根节点的数组编号。在指针所指的数组编号是根节点以外的情况下,进到步骤S705。然后,在步骤S705中,从搜索路径堆栈310取出指针所指的数组编号后,将指针减1。通过堆栈的出栈(pop)动作来执行在步骤S705中从搜索路径堆栈310取出指针所指的数组编号后将指针减1的动作。以下各实施方式的从堆栈读出数组编号的动作也同样。
在步骤S706中,根据在步骤S705中取出的数组编号来得到表明该数组编号的节点存储在节点对的哪个数组元素中的节点位置。例如,针对节点[0],可通过存储在数组的偶数编号的数组元素中等,来根据数组编号求出节点位置。然后,在步骤S707中判断在步骤S706中得到的节点位置是否是节点[1]侧。在步骤S707中判断为节点[1]侧的情况下,返回步骤S704,并反复进行步骤S704~步骤S707的处理,直到指针所指的数组编号的节点是节点[0]或根节点为止。
在步骤S707中判断为节点[0]侧时,进到步骤S708,对数组编号加1,得到与该节点成对的节点[1]的数组编号。然后,在步骤S709中,对检索开始节点的数组编号设定在步骤S708中得到的节点[1]的数组编号,在步骤S710中,执行求出以检索开始节点作为根节点的部分树的最小索引关键字的处理。步骤S710的处理与步骤S702同样,使用图5所示的最小值检索处理。
当在步骤S710中求出最小索引关键字时,返回步骤S703,取出所求出的索引关键字,并反复进行同样的处理,直到在以后的步骤S704中判断为堆栈指针指向根节点的数组编号为止。
这样,参照搜索路径堆栈310的指针所指的数组编号,针对与存储在搜索路径堆栈310中的数组编号的节点[0]成对的节点[1],将该节点作为检索开始节点,求出该节点属下的最小索引关键字。在步骤S702中求出最小值的阶段,搜索路径堆栈310的指针指向配对节点树的包含最小索引关键字的节点的数组编号。接着,进行搜索路径堆栈310的出栈动作,进行以所取出的数组编号的节点中的节点[1]为检索开始节点而求出以该检索开始节点作为根节点的部分树的索引关键字最小值的处理,并反复进行出栈动作和最小值检索处理,直到搜索路径堆栈310的出栈动作结果为取出了配对节点树的根节点的数组编号为止。
首先通过在步骤S702中进行针对根节点属下的节点求出最小值的处理,由此,在搜索路径堆栈310中依次存储关于链接路径的数组编号。因此,针对将搜索路径堆栈310的指针减1后得到的新指针所指向的数组编号的节点中的节点[0],求出与该节点成对的节点[1],针对节点[1]的属下节点依次进行最小值检索的处理,从而以升序的方式取出索引关键字。
图8是示出以降序的方式取出存储在配对节点树中的索引关键字的处理的流程图。以降序的方式取出索引关键字的处理相当于:使构成节点对的节点中的节点[1]和树的深度优先,从根节点起依次搜索叶节点。这里,与图7的以升序的方式取出索引关键字的处理进行比较,以不同点为中心进行说明。
在上述以升序的方式取出索引关键字的处理中,在图7的步骤S702和步骤S710中求出检索开始节点属下的取最小值的索引关键字,与此相对,在图8的步骤S802和步骤S810中求出的是检索开始节点属下的取最大值的索引关键字。
并且,在图7中,在步骤S703中取出期望的索引关键字后,求出存储在搜索路径堆栈310中的数组编号中节点[0]的数组编号,并将与该节点成对的节点[1]设定为检索开始节点,进行最小值检索处理。与此相对,在图8的降序取出处理中,在步骤S803中取出期望的索引关键字后,求出存储在搜索路径堆栈310中的数组编号中节点[1]的数组编号,并将与该节点成对的节点[0]设定为检索开始节点,进行最大值检索处理。
接着,利用图9A~图9C、图9D来说明在本申请人的申请即上述特愿2006-187827中提出的配对节点树的节点插入处理。图9A~图9C用于说明常规的插入处理,图9D用于说明根节点的插入处理。利用根节点的插入处理和常规的插入处理,可生成配对节点树,所以节点插入处理的说明也是配对节点树的生成处理的说明。
图9A是示出作为插入处理前级的检索处理的处理流程的图,相当于在图4所示的检索处理中将插入关键字作为检索关键字。步骤S901相当于在图4的步骤S401中将检索开始节点作为根节点,步骤S902~步骤S910的处理与图4的步骤S402~步骤S410完全对应,所以省略说明。
在图9A的步骤S911中对插入关键字与索引关键字进行比较,如果等同,则插入关键字已经存在于配对节点树中,所以插入失败,结束处理。如果不等同,则进入下一处理,即图9B的步骤S912以下的处理。
图9B是说明准备用于待插入节点对的数组元素的处理的处理流程图。
在步骤S912中,从数组求得空的节点对,取得该节点对中的应成为代表节点的数组元素的数组编号。
进到步骤S913,对插入关键字与步骤S910中得到的索引关键字的大小进行比较,当插入关键字大时得到值为1的布尔值、当插入关键字小时得到值为0的布尔值。
进到步骤S914,取得将步骤S912中得到的代表节点的数组编号与步骤S913中得到的布尔值相加后得到的数组编号。
进到步骤S915,取得将步骤S912中得到的代表节点的数组编号与步骤S913中得到的布尔值的逻辑非值相加后得到的数组编号。
在步骤S914中得到的数组编号是存储有以插入关键字为索引关键字的叶节点的数组元素的数组编号,在步骤S915中得到的数组编号是存储有与该叶节点成对的分支节点的数组元素的数组编号。
即,根据在前级的检索处理中得到的存储在叶节点中的索引关键字和插入关键字的大小,确定在插入的节点对中的哪个节点中存储保持插入关键字的叶节点。
例如在图2B的配对节点树中插入“011011”的情况下,检索结果的索引关键字为存储在节点211d中的“011010”。通过插入关键字“011011”与存储在节点211d中的索引关键字“011010”的大小比较来求出布尔值,在这里的例子中由于插入关键字大,因而得到布尔值1,在插入节点对的代表节点编号加1后得到的数组元素中,存储保持插入关键字的叶节点。另一方面,把索引关键字“011010”存储在将通过大小比较得到的布尔值进行逻辑反转得到的值与代表节点编号相加后得到的数组编号的数组元素中。
此时,由于索引关键字“011010”与插入关键字“011011”在第5比特不同,因而节点211d成为如下的分支节点:鉴别比特位置为5、代表节点编号为所插入的节点对的代表节点的数组编号。
并且,在图2B的配对节点树中插入“011001”的情况下,检索结果的索引关键字成为存储在节点211d中的“011010”。在该情况下,由于插入关键字小,因而得到布尔值0,在插入节点对的代表节点编号加上0后得到的数组元素中存储保持插入关键字的叶节点。然后,由于索引关键字“011010”与插入关键字“011001”在第4比特不同,因而节点211d成为如下的分支节点:鉴别比特位置为4、代表节点编号为所插入的节点对的代表节点的数组编号。接着进入图9C的步骤S916以下的处理。
图9C是示出将节点存储在图9B中所准备的数组元素内并求出其插入位置、变更已有节点的内容来完成插入处理的处理流程的图。
步骤S916~步骤S923的处理是求出待插入节点对在配对节点树上的位置的处理,步骤S924以下的处理是对各节点设定数据而完成插入处理的处理。
在步骤S916中,利用例如逻辑“异或”来进行插入关键字与步骤S910中得到的索引关键字之间的比特序列比较,得到差分比特序列。
进到步骤S917,根据在步骤S916中得到的差分比特序列,得到从上位第0比特开始观察到的第一个不一致比特的比特位置。该处理可在例如具有优先编码器(Priority Encoder)的CPU中通过向该CPU输入差分比特序列,来得到不一致的比特位置。并且,也可通过软件方式进行与优先编码器同等的处理,得到第一个不一致比特的比特位置。
然后进到步骤S918,判断搜索路径堆栈的堆栈指针是否指向根节点的数组编号。如果指向根节点的数组编号则转到步骤S924,如果没有指向根节点的数组编号则进到步骤S919。
在步骤S919中,使搜索路径堆栈的堆栈指针后退1,取出存在此处的数组编号。
进到步骤S920,从数组中读出步骤S919中取出的数组编号的数组元素作为节点。
进到步骤S921,从在步骤S920中读出的节点中取出鉴别比特位置。
接着进到步骤S922,判断步骤S921中取出的鉴别比特位置与步骤S917中得到的比特位置相比是否是上位的位置关系。这里所谓上位的位置关系是指比特序列的更左侧的位置,即比特位置的值较小的位置。
在步骤S922的判断结果是否定时,回到步骤S918,重复执行直到步骤S918的判断为肯定或者步骤S922的判断为肯定。当步骤S922的判断为肯定时,在步骤S923中使搜索路径堆栈的堆栈指针前进1,转到步骤S924以下的处理。
在上述步骤S916~步骤S923中说明的处理是这样的处理:为了确定待插入节点对的插入位置,在待插入索引关键字与通过检索得到的索引关键字之间进行比特序列比较,调查在比特序列比较中成为不同比特值的开头(最上位)比特位置与存储在搜索路径堆栈中的分支节点的鉴别比特位置之间的相对位置关系,将鉴别比特位置为上位的分支节点的下一分支节点的链接目的地设为待插入节点对的插入位置。
例如当在图2B的配对节点树中插入“111000”时,检索结果的索引关键字为存储在节点210h中的“101011”。通过插入关键字“111000”与存储在节点210h中的索引关键字“101011”之间的比特序列比较,得到成为不同比特值的最上位的比特位置1。检查所得到的比特位置1与蓄积在搜索路径堆栈中的数组编号的数组元素所存储的分支节点的鉴别比特位置之间的位置关系,并且当依次对搜索路径堆栈进行反向搜索直到鉴别比特位置为上位时,到达根节点210a。在此,使搜索路径堆栈的指针前进1,得到节点211b的数组编号。把插入关键字“111000”插入到节点211b的链接目的地。
并且,即使对搜索路径堆栈进行反向搜索而到达根节点,但与先前求出的在比特序列比较中成为不同比特值的最上位的比特位置相比,根节点的鉴别比特位置也不是上位的比特位置是指以下的情况:在该配对节点树的索引关键字的上位比特中,与根节点的鉴别比特位置相比为上位的比特值全部相等。并且是指如下情况:在待插入的索引关键字中,存在比特值一开始就与根节点的鉴别比特位置的上位比特值不同的索引关键字。因此,待插入节点对成为根节点的直接链接目的地,根节点的鉴别比特位置变成作为与已有索引关键字不同的值的插入关键字的最上位比特的位置。
下面,对步骤S924以下的在各节点中设定数据而完成插入处理的处理进行说明。
在步骤S924中,从搜索路径堆栈中取出堆栈指针所指的数组编号。
在步骤S925中,在步骤S914中得到的数组编号所指定的数组元素的节点类别中写入1(叶节点),在索引关键字中写入插入关键字。
进到步骤S926,从数组中读出在步骤S924中得到的数组编号的数组元素。
然后在步骤S927中,在步骤S915中得到的数组编号的数组元素中写入在步骤S926中读出的内容。
最后在步骤S928中,在步骤S924中得到的数组编号所指定的数组元素的节点类别中写入0(分支节点),在鉴别比特位置中写入在步骤S917中得到的比特位置,在代表节点编号中写入步骤S912中得到的数组编号,结束处理。
在上述图2B的配对节点树中插入“111000”的例子中,在所得到的空节点对的节点[0]中写入节点211b的内容(步骤S927),将节点[1]设为保持插入关键字“111000”的叶节点(步骤S925)。然后,在节点211b的鉴别比特位置中存储在比特序列比较中成为不同比特值的最上位的比特位置1,将存储有所得到的节点对的代表节点的数组元素的数组编号存储在代表节点编号中(步骤S928)。
图9D是说明在本申请人的申请即上述特愿2006-187827中提出的包含根节点插入处理在内的追加索引关键字时整个节点插入处理的处理流程图。
在步骤S101中,对要求得到的配对节点树的根节点的数组编号是否已登记进行判断。如果已登记,则进行使用图9A~图9C中说明的常规的插入处理。
如果步骤S101的判断为未登记,则开始全新的配对节点树的登记、生成。
首先,在步骤S102中,由数组求得空节点对,取得该节点对中的应成为代表节点的数组元素的数组编号。然后在步骤S103中,求出对步骤S102中得到的数组编号加上0后的数组编号(实际上,等于在步骤S102中得到的数组编号)。然后在步骤S104中,针对在步骤S103中得到的数组编号的数组元素,对待插入根节点的节点类别写入1(叶节点),并对索引关键字写入插入关键字,在步骤S105,登记在步骤S102中得到的根节点的数组编号,结束处理。
如前所述,显然,当有索引关键字的集合时,从该集合中依次取出索引关键字,反复进行图9D和图9A~图9C的处理,从而可以构建与索引关键字的集合对应的本发明的配对节点树。
以上,说明了构成本发明第1实施方式~第3实施方式的前提的技术,如果有需要,可参照上述专利申请的说明书以及附图记载。
接着,对本发明第1实施方式的配对节点树保存/复原处理进行说明。
图10A和图10B是说明本发明第1实施方式的保存配对节点树的保存处理的流程图。在本实施方式中,使配置在数组309中的配对节点树的构成节点对的节点中的节点[0]侧以及树深度优先,从根节点开始搜索配对节点树的各节点,按照其深度优先搜索顺序,将搜索到的节点保存在后述图11所示的节点保存数组401中。节点保存数组401是本实施方式中用作保存用存储区域的数组。按照深度优先搜索顺序搜索节点与参照图7进行说明的以升序方式取出索引关键字的处理相同,所以图10A与图7类似。
首先,在步骤S1001中,设定根节点的数组编号作为巡回开始节点的数组编号。即,准备要设定巡回开始节点的数组编号的工作区域,在该工作区域中设定根节点的数组编号。
接着,在步骤S1002中执行后述图10B的处理,以仅搜索节点[0]的方式对从巡回开始节点到叶节点的路径进行巡回,将所巡回的节点依次存储在节点保存数组401中。步骤S1001和S1002是与图7的步骤S701和S702类似的处理。
在步骤S1002执行后,进到步骤S1003。步骤S1003~步骤S1009是与图7的步骤S704~步骤S710类似的处理。
在步骤S1003中,参照搜索路径堆栈310,判断堆栈指针是否指向根节点在数组309上的数组编号。在指针所指向的数组309上的数组编号是根节点以外的情况下,进到步骤S1004。然后,在步骤S1004中,从搜索路径堆栈310取出指针所指向的数组309上的数组编号,然后指针减1。即,在步骤S1004中进行出栈动作。
在步骤S1005中,根据在步骤S1004中取出的数组309的数组编号,得到表明该数组编号的节点被存储在节点对的哪个数组元素内的节点位置。然后,在步骤S1006中判断在步骤S1005中得到的节点位置是否是节点[1]侧。当在步骤S1006中判断为是节点[1]侧时,返回步骤S1003,反复步骤S1003~步骤S1006的处理,直至指针所指的数组编号的节点成为节点[0]或根节点。
当在步骤S1006中判断为是节点[0]侧时,进到步骤S1007,对数组编号加1,取得与该节点[0]成对的节点[1]在数组309上的数组编号。然后,在步骤S1008中,把步骤S1007中得到的节点[1]的数组编号设定为巡回开始节点的数组编号,在步骤S1009中,与步骤S1002同样地执行图10B的处理,以仅搜索节点[0]的方式对从巡回开始节点到叶节点的路径进行巡回,将所巡回的节点依次存储在节点保存数组401中。然后返回步骤S1003反复进行同样的处理,直至在以后的步骤S1003中判断为堆栈指针指向根节点在数组309上的数组编号。
此外,图10A的步骤S1002与步骤S1009是相同的处理,所以还可以图示为从步骤S1008返回到步骤S1002。但是,为了便于后面的说明,利用连续编号参照从步骤S1003到步骤S1009较为方便,因此如图10A所示。
接着,参照图10B来说明一边巡回节点一边将节点存储在节点保存数组401中的处理。从图10A的步骤S1002或S1009调用图10B的处理。另外,图10B的处理是参照图5说明的求出索引关键字最小值的处理的应用例。
首先,在步骤S1011中,取得在图10A的步骤S1001或步骤S1008中设定的巡回开始节点的数组编号。该数组编号是数组309的数组编号。接着,在步骤S1012中将得到的数组编号存储在搜索路径堆栈310中,在步骤S1013中,从数组309读出与该数组编号对应的数组元素作为应参照的节点。然后,在步骤S1014中,将读出的节点存储在节点保存数组401中。此外,节点保存数组401从最初的数组元素开始不空开间隔地顺次连续使用。
然后,在步骤S1015中,从读出的节点中取出节点类别,在步骤S1016中,判断节点类别是否是分支节点。
在步骤S1016的判断中,当读出的节点是分支节点时,进到步骤S1017,从节点取出代表节点编号,在步骤S1018中对取出的代表节点编号加上值“0”,将其结果作为新的数组编号,并返回步骤S1012。以后,反复从步骤S1012到步骤S1018的处理,直至在步骤S1016中判断为该节点是叶节点。当在步骤S1016中判断为节点类别是叶节点时,结束处理。
根据图10B的处理与图5的求出索引关键字最小值的处理的相同部分可知,图10B的处理是在以巡回开始节点作为根节点的部分树中对从巡回开始节点到包含最小索引关键字的叶节点的路径进行巡回的处理。并且,从巡回开始节点到叶节点的路径上的节点包含作为路径两端的巡回开始节点和叶节点,依次在搜索路径堆栈310中存储数组编号,在节点保存数组401中存储该节点的内容。
与按升序取出索引关键字的图7所示处理包含了检索最小索引关键字的图5所示处理一样,使节点[0]侧和树深度优先的、按照搜索顺序将节点保存在节点保存数组401中的图10A所示处理包括图10B的处理,即,对从巡回开始节点到以巡回开始节点作为根节点的部分树中包含最小索引关键字的叶节点为止的节点进行搜索。
图11和图12是采用保存图2B所例示的配对节点树的例子来说明图10A和图10B的流程图所示的本实施方式的保存处理的图。以下,参照图11和图12双方来说明通过图10A和图10B的保存处理来保存图2B的配对节点树的流程。
在图11中与表示处理流向的箭头一起示出与图2B相同的配对节点树,还示出了节点保存数组401的最终内容。图12是示出图11的处理各阶段的搜索路径堆栈310的状态以及保存在节点保存数组401中的内容的图。
对节点保存数组401的各数组元素标注与保存在该数组元素中的节点的标号对应的带撇号标号。例如,对保存了节点210a的内容的数组元素标注“210a′”的标号。另外,为了便于说明,利用从0开始的数组编号来参照节点保存数组401的数组元素。该数组编号示出在图11和图12的节点保存数组401的左侧。此外,存储在图12的搜索路径堆栈310中的数组309的数组编号与图11所示的配对节点树相关联。
如图11的步骤S1101的箭头所示,保存处理以根节点210a为巡回开始节点,开始对前往根节点210a属下的包含最小索引关键字的叶节点210c的路径进行巡回。这与图10A的步骤S1001和步骤S1002对应。由此,作为从步骤S1002调用的图10B的步骤S1011~步骤S1018的执行结果,如图12(a)所示,在搜索路径堆栈310中从根节点210a的数组编号220起顺次存储数组编号220a、220b,在节点保存数组401的数组编号为0、1、2的数组元素中分别保存根节点210a、节点210b和节点210c的内容。
接着,执行步骤S1003~步骤S1008。由此,在步骤S1004中从搜索路径堆栈310取得数组编号220b,数组编号220b的节点210c是节点[0],所以从步骤S1006进到步骤S1007,得到数组编号(220b+1),该编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1102所示,将数组编号(220b+1)的节点211c作为巡回开始节点,对前往节点211c属下的包含最小索引关键字的叶节点210e的路径进行巡回。这对应于从图10A的步骤S1009调用图10B的处理而执行的情况。由此,作为图10B的步骤S1011~步骤S1018的执行结果,如图12(b)所示,在搜索路径堆栈310中顺次存储数组编号(220b+1)、221c、220d,在节点保存数组401的数组编号为3、4、5的数组元素中分别保存节点211C、节点210d、节点210e的内容。此外,在图12(b)的节点保存数组401中,与已在步骤S1101中保存的节点对应的数组编号为0~2的部分用细线包围,与在步骤S1102中保存的节点对应的数组编号为3~5的部分用粗线包围。在以下步骤中也同样地表现节点保存数组401。
接着,执行步骤S1003~步骤S1008。由此,在步骤S1004中从搜索路径堆栈310取得数组编号220d,数组编号220d的节点210e是节点[0],所以从步骤S1006进到步骤S1007,得到数组编号(220d+1),该数组编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1103所示,将数组编号(220d+1)的节点211e作为巡回开始节点,从图10A的步骤S1009调用图10B的处理,执行步骤S1011~步骤S1016。节点211e是叶节点,所以如图12(c)所示,作为该处理的结果,仅将数组编号(220d+1)存储在搜索路径堆栈310中,在节点保存数组401中仅保存节点211e的内容作为数组编号6的数组元素。
接着,如下地执行步骤S1003~步骤S1008。即,在步骤S1004中从搜索路径堆栈310取得数组编号(220d+1),数组编号(220d+1)的节点211e是节点[1],所以从步骤S1006返回步骤S1003。然后再次执行步骤S1004的出栈动作,从搜索路径堆栈310取得数组编号221c。数组编号221c的节点210d是节点[0],所以从步骤S1006进到步骤S1007,得到数组编号(221c+1),该数组编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1104所示,将数组编号(221c+1)的节点211d作为巡回开始节点,从图10A的步骤S1009调用图10B的处理,执行步骤S1011~步骤S1016。节点211d也是叶节点,所以如图12(d)所示,作为该处理的结果,仅将数组编号(221c+1)存储在搜索路径堆栈310中,在节点保存数组401中仅保存节点211d的内容作为数组编号7的数组元素。
接着,如下地执行步骤S1003~步骤S1008。即,在步骤S1004中从搜索路径堆栈310取得数组编号(221c+1)。因为数组编号(221c+1)的节点211d是节点[1],所以从步骤S1006返回步骤S1003,再次进行步骤S1004的出栈动作,并从搜索路径堆栈310取得数组编号(220b+1)。数组编号(220b+1)的节点211c也是节点[1],所以再次返回步骤S1003,通过步骤S1004的出栈动作,从搜索路径堆栈310中取得数组编号220a。数组编号220a的节点210b是节点[0],所以从步骤S1006进到步骤S1007,取得数组编号(220a+1),该数组编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1105所示,将数组编号(220a+1)的节点211b作为巡回开始节点,从图10A的步骤S1009调用图10B的处理,执行步骤S1011~步骤S1018,对前往节点211b属下的包含最小索引关键字的叶节点210g的路径进行巡回。结果,如图12(e)所示,在搜索路径堆栈310中顺次存储数组编号(220a+1)、221b和220f,在节点保存数组401的数组编号为8、9、10的数组元素中分别保存节点211b、节点210f和节点210g的内容。
接着,执行步骤S1003~步骤S1008。由此,在步骤S1004中从搜索路径堆栈310取得数组编号220f,数组编号220f的节点210g是节点[0],所以从步骤S1006进到步骤S1007,得到数组编号(220f+1),该数组编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1106所示,将数组编号(220f+1)的节点211g作为巡回开始节点,从图10A的步骤S1009调用图10B的处理,执行步骤S1011~步骤S1016。节点211g是叶节点,所以如图12(f)所示,作为该处理的结果,仅将数组编号(220f+1)存储在搜索路径堆栈310中,在节点保存数组401中仅保存节点211g的内容作为数组编号11的数组元素。
接着,如下地执行步骤S1003~步骤S1008。即,在步骤S1004中从搜索路径堆栈310取得数组编号(220f+1),数组编号(220f+1)的节点211g是节点[1],所以从步骤S1006返回步骤S1003。然后,在步骤S1004中从搜索路径堆栈310取得数组编号221b。数组编号221b的节点210f是节点[0],所以从步骤S1006进到步骤S1007,得到数组编号(221b+1),该数组编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1107所示,将数组编号(221b+1)的节点211f作为巡回开始节点,从图10A的步骤S1009调用图10B的处理,执行步骤S1011~步骤S1018,对前往节点211f属下的包含最小索引关键字的叶节点210h的路径进行巡回。结果,如图12(g)所示,在搜索路径堆栈310中顺次存储数组编号(221b+1)、221f,在节点保存数组401的数组编号为12、13的数组元素中分别保存节点211f、节点210h的内容。
接着,执行步骤S1003~步骤S1008。由此,在步骤S1004中从搜索路径堆栈310取得数组编号221f,数组编号221f的节点210h是节点[0],所以从步骤S1006进到步骤S1007,得到数组编号(221f+1),该数组编号在步骤S1008中被指定为巡回开始节点的数组编号。
然后,如图11的步骤S1108所示,将数组编号(221f+1)的节点211h作为巡回开始节点,从图10A的步骤S1009调用图10B的处理,执行步骤S1011~步骤S1016。节点211h是叶节点,所以如图12(h)所示,作为该处理的结果,仅将数组编号(221f+1)存储在搜索路径堆栈310中,在节点保存数组401中仅保存节点211h的内容作为数组编号14的数组元素。
然后,如下地执行步骤S1003~步骤S1008。即,在步骤S1004中从搜索路径堆栈310取得数组编号(221f+1),数组编号(221f+1)的节点211h是节点[1],所以从步骤S1006返回步骤S1003。然后,在步骤S1004中从搜索路径堆栈310取得数组编号(221b+1),数组编号(221b+1)的节点211f也是节点[1],所以从步骤S1006再次返回步骤S1003。然后,在步骤S1004中取得数组编号(220a+1),数组编号(220a+1)的节点211b也是节点[1],所以从步骤S1006再次返回步骤S1003,这里,堆栈指针指向根节点210a的数组编号220,因此保存处理结束。
通过以上处理,把构成图11所示的配对节点树的节点全部保存在节点保存数组401中。另外,比较图11的节点保存数组401和表示处理顺序的箭头可知,保存节点的顺序是使配对节点树的节点[0]侧和深度方向优先来进行搜索的顺序。
另外众所周知,当以深度优先搜索顺序来排列树结构的节点时,构成任意部分树的节点是以连续的顺序来排列的。例如,以节点211c为根节点的部分树被保存在数组编号为3~7的连续区域内。
图13是说明根据通过上述保存处理而得到的节点保存数组401来复原配对节点树的复原处理的流程图,是复原后的配对节点树存储在数组中的情况下的流程图。存储复原后的配对节点树的数组例如是与图3的数组309同样的数组。以下,利用“309′”的标号来参照存储复原后的配对节点树的数组,数组309′未图示。
根据实施方式,数组309和数组309′可以是相同数组,可以是相同存储装置上的不同数组,也可以是不同存储装置上的不同数组。另外,在以下复原处理的说明中,说明了使用搜索路径堆栈310的情况,但显然也可以采用与先前在配对节点树的检索等中所使用的搜索路径堆栈310不同的搜索路径堆栈来进行复原处理。
在图13中,首先在步骤S1301中从用于存储复原对象配对节点树的节点的数组309′中取得空节点对的代表节点编号,在步骤S1302中,对该代表节点编号加上值“0”,取得节点对中节点[0]的数组编号。然后在步骤S1303中,登记在步骤S1302中得到的数组编号作为根节点的数组编号。通过步骤S1301~步骤S1303的处理,确保待复原配对节点树的根节点的区域,并登记根节点。
接着在步骤S1304中,在搜索路径堆栈310中存储数组编号。如图13所示,步骤S1304在步骤S1303、步骤S1313或步骤S1317之后立即执行。在步骤S1304的上一步骤是步骤S1303时,在步骤S1304中存储到搜索路径堆栈310内的数组编号是在步骤S1302中得到的数组309′的数组编号;在上一步骤是步骤S1313时,在步骤S1304中存储到搜索路径堆栈310内的数组编号是在步骤S1313中得到的数组309′的数组编号;在上一步骤是步骤S1317时,在步骤S1304中存储到搜索路径堆栈310内的数组编号是在步骤S1317中得到的数组309′的数组编号。
接着,在步骤S1305中,取出节点保存数组401的未处理节点中的开头节点的内容,在步骤S1306中,将在步骤S1305中取出的节点内容写入数组309′的、步骤S1304中存储到搜索路径堆栈310内的数组编号所指向的数组元素中。
通过步骤S1304~步骤S1306的处理,复原了一个节点。准确地说,对于叶节点,通过步骤S1304~步骤S1306的处理得以完全复原,对于分支节点,复原了除了通过后续步骤S1310~步骤S1312复原的链接目的地代表节点编号以外的信息(节点类别以及鉴别比特位置)。
接着,进入步骤S1307,判断是否从节点保存数组401中取出了全部节点。如果取出了全部节点则结束复原处理,如果在节点保存数组401中还有未处理节点,则进到步骤S1308。
在步骤S1308中,从步骤S1305中取出的节点中取出节点类别,在步骤S1309中判断该节点类别(在步骤S1306中复原的节点的类别)是否是分支节点。当节点类别是分支节点时进到步骤S1310,如果是叶节点则进到步骤S1314。
在步骤S1310中与步骤S1301同样,从数组309′中取得空节点对的代表节点编号。然后,在步骤S1311中从搜索路径堆栈310取出堆栈指针所指向的数组编号。此外,步骤S1311的处理不是出栈动作,不变更堆栈指针。
接着,在步骤S1312中,对于数组309′的在步骤S1311中取出的数组编号的数组元素的代表节点编号,写入在步骤S1310中得到的代表节点编号。由此,在步骤S1306中复原了一部分的分支节点成为完全复原的状态。
然后,在步骤S1313中取得数组309′的与下一个要复原的节点对应的数组编号。即,对在步骤S1310中得到的代表节点编号加上值0,取得节点[0]在数组309′上的数组编号。在步骤S1313执行后,处理返回步骤S1304。
另一方面,在步骤S1309中判断为是叶节点时,在步骤S1314中,从搜索路径堆栈310取出数组309′的、堆栈指针所指向的数组元素的数组编号,并使堆栈指针减1。
接着,在步骤S1315中,从步骤S1314所取出的数组编号中取得表明将该数组编号的节点存储在节点对的哪个数组元素中的节点位置。
然后,在步骤S1316中判断在步骤S1315中得到的节点位置是否是节点[0]侧。当在步骤S1316中判断为是节点[1]侧时,返回步骤S1314,反复步骤S1314~步骤S1316的处理,直至堆栈指针所指向的数组编号的节点成为节点[0]。
当在步骤S1316中判断为是节点[0]侧时,进到步骤S1317,对在步骤S1314中取出的数组编号加1,得到与该节点成对的节点[1]的数组编号。然后进到步骤S1304。
步骤S1314~步骤S1316是在复原了叶节点之后为了确定下一个要复原的节点而对搜索路径堆栈310进行追溯的步骤。
如以上这样反复同样的处理,直至在步骤S1307中判断为从节点保存数组401取出了全部节点。
即,图13的处理是从开头起顺次逐个复原节点保存数组401所包含的节点的反复处理。并且,1个节点的复原是通过下述方式来进行的,即,确定作为要复原该节点的位置即复原目的地位置的数组309′的数组编号,将该数组编号存储在搜索路径堆栈310中,从节点保存数组401中读出未处理的处于开头的节点内容,并将读出的节点内容写入数组编号所指定的数组元素中。
图14和图15是采用从图11和图12的节点保存数组401将图2B所示原始配对节点树复原到未图示的数组309′上的例子来说明由图13的流程图示出的本实施方式的复原处理的图。以下,参照图14和图15双方来说明通过图13的复原处理在数组309′上复原图2B所示配对节点树的流程。
在图14中与表示处理流向的箭头一起示出复原后配对节点树的结构,还示出了节点保存数组401的内容。图14的节点保存数组401除了左侧所示的步骤编号之外与图11所示的相同。
图14所示的复原后配对节点树与图2B和图11所例示的原始配对节点树具有相同的结构,各叶节点所包含的索引关键字的值也与图2B以及图11相同。但是,在原始配对节点树和复原后配对节点树中,节点的数组编号值一般不同。
因此,在图14中采用了对表示原始节点及代表节点编号的标号标注撇号后的标号。例如,对复原了原始节点210b的节点标注“210b′”的标号。另外,原始节点210b在数组309上的数组编号220a和复原后的节点210b′在数组309′上的数组编号220a′的值可能不同,但相互对应,所以采用了“220a”和“220a′”这样的对应标号。此外,图15的存储在搜索路径堆栈310中的数组309′的数组编号与图14所示的配对节点树相对应。
图15是示出了在图14所示处理的各阶段中搜索路径堆栈310的状态、并且强调示出了节点保存数组401中的在该阶段被处理部分的图。
如图14的步骤S1401的箭头所示,复原处理从通过图13的步骤S1301~步骤S1303来复原根节点210a′而开始。即,从数组309′取得空节点对的代表节点编号220′,取得(220′+0)=220′的数组编号,将该数组编号登记为根节点210a′的数组编号。但是,在该时刻根节点210a′的代表节点编号的值未定,根节点210a′的复原不完全。
接着,在步骤S1309的判断是分支节点的期间,反复从步骤S1304经过步骤S1309和步骤S1310到达步骤S1313的一系列处理。
即,在步骤S1304中将数组编号220′压入(push)搜索路径堆栈310,在步骤S1305中取出节点保存数组401的数组编号0的节点。如图11和图12所说明的那样,该节点是根节点。在步骤S1306中,在数组309′的数组编号220′的数组元素中写入在步骤S1305中取出的节点内容。由此,根节点210a′成为下述状态:在节点类别中存储有表示分支节点的0、在鉴别比特位置中存储有0、在代表节点编号中存储有从节点保存数组401得到的220a的数组编号。
接着,执行步骤S1307~步骤S1309,因为根节点210a′是分支节点,所以进到步骤S1310,从数组309′取得空节点对的代表节点编号220a′。然后在步骤S1311中从搜索路径堆栈310取得数组编号220′,在步骤S1312中,对数组编号220′所指向的根节点210a′的代表节点编号写入在步骤S1310中得到的代表节点编号220a′。结果,根节点210a′的复原结束,根节点210a′成为图14所示的状态。
在下一步骤S1313中,取得(220a′+0)=220a′的数组编号,该数组编号在下一步骤S1304中被压入搜索路径堆栈310。然后,在步骤S1305中取出节点保存数组401的数组编号1的节点,在步骤S1306中,在数组309′的数组编号220a′的数组元素中写入节点类别为0、鉴别比特位置为1、代表节点编号为220b的所得到的节点内容。
与上述同样地执行步骤S1307~步骤S1312来复原节点210b′后,从步骤S1313返回步骤S1304,将数组编号220b′压入搜索路径堆栈310。然后在步骤S1305中取出节点保存数组401的数组编号2的节点。在步骤S1306中,在数组309′的数组编号220b′的数组元素中分别存储表示叶节点的1作为节点类别、存储″000111″作为索引关键字,节点210c′如图14所示被复原。接着,执行步骤S1307~步骤S1309,节点210c′被判断为叶节点。
图15(a)示出该阶段即执行了图14的步骤S1401的阶段的搜索路径堆栈310的状态。另外,到该阶段为止,节点保存数组401中的相当于数组编号0~2的3个节点被复原,所以在图15(a)中用粗线包围节点保存数组401的与这3个节点对应的数组元素,数组编号0~2的数组元素复原完毕,所以在后续的图15(b)~(h)中省略。
接着,执行S1314~步骤S1317。由此,在步骤S1314中从搜索路径堆栈310使数组编号220b′出栈,数组编号220b′的节点210c′是节点[0],所以从步骤S1316进到步骤S1317,取得数组编号(220b′+1)。
并且,如图14的步骤S1402所示,在步骤S1309的判断为分支节点的期间,反复从步骤S1304经过步骤S1309和步骤S1310到达步骤S1313的一系列处理。在此过程中,如下所述地复原节点211c′、节点210d′和节点210e′。
在构成步骤S1402的最初步骤即步骤S1304中,将数组编号(220b′+1)压入搜索路径堆栈310。在步骤S1305中取出节点保存数组401的数组编号3的节点,与上述同样通过步骤S1306~步骤S1312来复原节点211c′。然后从步骤S1313返回步骤S1304,将数组编号221c′压入搜索路径堆栈310。
接着,在步骤S1305中取出节点保存数组401的数组编号4的节点,经过步骤S1306~步骤S1312,与上述同样地复原节点210d′。然后从步骤S1313返回步骤S1304,将数组编号220d′压入搜索路径堆栈310。
然后,在步骤S1305中取出节点保存数组401的数组编号5的节点,在步骤S1306中将该节点的内容写入数组309′的数组编号220d′的数组元素中,来复原节点210e′。接着,执行步骤S1307~步骤S1309,节点210e′被判断为叶节点。
图15(b)示出该阶段即执行了步骤S1402的阶段的搜索路径堆栈310。另外,在从图15(a)的状态变成图15(b)的状态的过程中,节点保存数组401中的相当于数组编号3~5的3个节点被复原,因此将它们用粗线包围示出。
接着,执行步骤S1314~步骤S1317。由此,在步骤S1314中从搜索路径堆栈310使数组编号220d′出栈,数组编号220d′的节点210e′是节点[0],所以从步骤S1316进到步骤S1317,取得数组编号(220d′+1)。
接着,如图14的步骤S1403所示,执行步骤S1304~步骤S1309。即,在步骤S1304中将数组编号(220d′+1)压入搜索路径堆栈310,在步骤S1305中取出节点保存数组401的数组编号6的节点,在步骤S1306中复原节点211e′。然后,在步骤S1309中节点211e′被判断为叶节点。
图15(c)示出该阶段即执行了步骤S1403的阶段的搜索路径堆栈310的状态。另外,在从图15(b)的状态变成图15(c)的状态的过程中,节点保存数组401中的相当于数组编号6的节点被复原。
接着,如下地执行步骤S1314~步骤S1317。首先,在步骤S1314中从搜索路径堆栈310使数组编号(220d′+1)出栈。数组编号(220d′+1)的节点211e′是节点[1],所以从步骤S1316返回步骤S1314,从搜索路径堆栈310使数组编号221c′出栈。数组编号221c′的节点210d′是节点[0],所以从步骤S1316进到步骤S1317,取得数组编号(221c′+1)。
接着,如图14的步骤S1404所示,执行步骤S1304~步骤S1309。由此,在步骤S1304中将数组编号(221c′+1)压入搜索路径堆栈310,在步骤S1305中取出节点保存数组401的数组编号7的节点,在步骤S1306中复原节点211d′。然后,在步骤S1309中节点211d′被判断为叶节点。
图15(d)示出该阶段即执行了步骤S1404的阶段的搜索路径堆栈310的状态。另外,在从图15(c)的状态变成图15(d)的状态的过程中,节点保存数组401中的相当于数组编号7的节点被复原。
接着,执行步骤S1314~步骤S1317。即,反复步骤S1314~步骤S1316,直至取得作为节点[0]的节点210b′的数组编号220a′为止,然后执行步骤S1317。在此过程中,从搜索路径堆栈310依次使数组编号(221c′+1)、(220b′+1)和220a′出栈。然后在步骤S1317中取得数组编号(220a′+1)。
接着,如图14的步骤S1405所示,在步骤S1309的判断为分支节点的期间,反复从步骤S1304经由步骤S1309和步骤S1310到达步骤S1313的一系列处理。在此过程中,如下所述地复原节点211b′、节点210f′和节点210g′。
在构成步骤S1405的最初步骤即步骤S1304中,将数组编号(220a′+1)压入搜索路径堆栈310。在步骤S1305中取出节点保存数组401的数组编号8的节点,在步骤S1306中将其内容写入数组309′的数组编号(220a′+1)的数组元素中。
然后执行步骤S1307~步骤S1309,写入的是分支节点的内容,所以进到步骤S1310,从数组309′中取得空节点对的代表节点编号221b′。然后在步骤S1311中从搜索路径堆栈310取得数组编号(220a′+1),在步骤S1312中,对数组编号(220a′+1)的节点211b′的代表节点编号写入步骤S1310中得到的代表节点编号221b′。结果,节点211b′的复原结束,节点211b′成为图14所示的状态。
在下一步骤S1313中,取得(221b′+0)=221b′的数组编号,在步骤S1304中将该数组编号压入搜索路径堆栈310。然后,在步骤S1305中取出节点保存数组401的数组编号9的节点,并在步骤S1306中将其内容写入数组309′的数组编号221b′的数组元素中。
然后,执行步骤S1307~步骤S1309,写入的是分支节点的内容,所以进到步骤S1310,从数组309′取得空节点对的代表节点编号220f′。然后在步骤S1311中从搜索路径堆栈310取得数组编号221b′,在步骤S1312中,对数组编号221b′的节点210f′的代表节点编号写入在步骤S1310中得到的代表节点编号220f′。结果,节点210f′的复原结束,节点210f′成为图14所示的状态。
在下一个步骤S1313中,取得(220f′+0)=220f′的数组编号,在步骤S1304中将该数组编号压入搜索路径堆栈310。然后,在步骤S1305中取出节点保存数组401的数组编号10的节点,其内容在步骤S1306中被写入数组309′的数组编号220f′的数组元素内,复原节点210g′。然后,执行步骤S1307~步骤S1309,节点210g′被判断为叶节点。
图15(e)示出该阶段即执行了步骤S1405的阶段的搜索路径堆栈310。另外,在从图15(d)的状态变成图15(e)的状态的过程中,节点保存数组401中的相当于数组编号8~10的3个节点被复原。
接着,执行步骤S1314~步骤S1317。即,在步骤S1314中从搜索路径堆栈310使数组编号220f′出栈,数组编号220f′的节点210g′是节点[0],所以从步骤S1316进到步骤S1317,取得数组编号(220f′+1)。
接着,如图14的步骤S1406所示,执行步骤S1304~步骤S1309。由此,在步骤S1304中向搜索路径堆栈310压入数组编号(220f′+1),在步骤S1305中取出节点保存数组401的数组编号11的节点,在步骤S1306中复原节点211g′。然后,在步骤S1309中节点211g′被判断为叶节点。
图15(f)示出该阶段即执行了步骤S1406的阶段的搜索路径堆栈310的状态。另外,在从图15(e)的状态变成图15(f)的状态的过程中,节点保存数组401中的相当于数组编号11的节点被复原。
接着,如下地执行步骤S1314~步骤S1317。首先,在步骤S1314中从搜索路径堆栈310使数组编号(220f′+1)出栈。数组编号(220f′+1)的节点211g′是节点[1],所以从步骤S1316返回步骤S1314,从搜索路径堆栈310使数组编号221b′出栈。数组编号221b′的节点210f′是节点[0],所以从步骤S1316进到步骤S1317,取得数组编号(221b′+1)。
接着,如图14的步骤S1407所示,在步骤S1309的判断是分支节点的期间,反复从步骤S1304经由步骤S1309和步骤S1310到达步骤S1313的一系列处理。在此过程中,如下所述地复原节点211f′和节点210h′。
在构成步骤S1407的最初步骤即步骤S1304中,向搜索路径堆栈310压入数组编号(221b′+1)。在步骤S1305中取出节点保存数组401的数组编号12的节点,并在步骤S1306中将其内容写入数组309′的数组编号(221b′+1)的数组元素内。
然后执行步骤S1307~步骤S1309,写入的是分支节点的内容,所以进到步骤S1310,从数组309′中取得空节点对的代表节点编号221f′。然后在步骤S1311中从搜索路径堆栈310取得数组编号(221b′+1),在步骤S1312中,对数组编号(221b′+1)的节点211f′的代表节点编号写入在步骤S1310中得到的代表节点编号221f′。结果,节点211f′复原结束,节点211f′变成图14所示的状态。
在下一步骤S1313中,取得(221f′+0)=221f′的数组编号,该数组编号在步骤S1304中被压入搜索路径堆栈310。在步骤S1305中取出节点保存数组401的数组编号13的节点,并通过步骤S1306来复原节点210h′。然后,在步骤S1309中节点210h′被判断为叶节点。
图15(g)示出该阶段即执行了步骤S1407的阶段的搜索路径堆栈310。另外,在从图15(f)的状态变成图15(g)的状态的过程中,节点保存数组401中的相当于数组编号12和13的两个节点被复原。
接着,执行步骤S1314~步骤S1317。即,在步骤S1314中从搜索路径堆栈310使数组编号221f′出栈,数组编号为221f′的节点210h′是节点[0],所以从步骤S1316进到步骤S1317,取得数组编号(221f′+1)。
接着,如图14的步骤S1408所示,执行步骤S1304~步骤S1307,复原处理结束。即,在步骤S1304中向搜索路径堆栈310压入数组编号(221f′+1),在步骤S1305中取出节点保存数组401的数组编号14的节点,通过步骤S1306来复原节点211h′。然后,在步骤S1307中判断为从节点保存数组401取出了全部节点,复原处理结束。
图15(h)示出该阶段即执行了步骤S1408的阶段的搜索路径堆栈310。另外,在从图15(g)的状态变成图15(h)的状态的过程中,节点保存数组401中的相当于数组编号14的节点被复原。
在图15中示出了(a)~(h)这8个阶段,如上所述,这8个阶段都与复原0个以上分支节点后再复原1个叶节点的一系列步骤相对应。复原处理之所以为这样的一系列步骤的反复是因为按深度优先搜索顺序来保存节点。
可以从按照深度优先搜索顺序保存了节点的节点保存数组401中,按照保存的顺序来复原节点。即,可以通过反复如下的处理来容易地复原配对节点树:从节点保存数组401依次读出数组元素,在分支节点持续的期间依次一边确保与待复原子节点成对的节点的存储区域一边复原该子节点,如果读出了叶节点,则向着根节点追溯树结构,寻找已确保了用于存储复原后节点的存储区域但尚未复原的节点,将该找到的节点确定为下一个待复原的节点。如上所述,在复原处理中利用搜索路径堆栈310,但不需要基于包含在节点中的索引关键字和鉴别比特位置进行判断等。
本发明的复原方法的优点是能够简单且高效地复原配对节点树。如上所述,配对节点树的结构由索引关键字的集合唯一地规定。由此,只要保存索引关键字集合就可以复原配对节点树。但是,仅利用索引关键字集合来复原配对节点树的方法需要调查鉴别比特位置等的处理。另一方面,本实施方式的复原方法不需要基于索引关键字及鉴别比特位置的判断等,因此可缩短这部分的处理时间。
另外,本实施方式的的复原方法按照保存在保存信息中的顺序来复原节点即可,因此在经由网络发送保存信息、发送目的地计算机接收配对节点树而进行复原的情况下,具有缩短时间的效果。原因是,可以在接收结束之前,根据接收到的部分依次复原节点,从而同时进行接收和复原。
以上,对本发明第1实施方式进行了详细说明,但本实施方式不限于此,可进行各种变形。
上述所说明的流程图仅是处理一例,显然还存在可以替换处理顺序或并行地进行处理的步骤。例如,图13的步骤S1304可以移到步骤S1305的紧后面或步骤S1306的紧后面,也可以与由步骤S1305以及步骤S1306组成的处理并行地执行。
在上述例中,将与比特值0对应链接的节点[0]作为代表节点,将与比特值1对应链接的节点[1]作为与代表节点成对的非代表节点。不过,也可以将节点[1]作为代表节点,将节点[0]作为非代表节点。
另外,例如在原始配对节点树中节点[0]为代表节点、节点[1]为非代表节点的情况下,在复原的配对节点树中,可以是节点[0]为代表节点、节点[1]为非代表节点,也可以是节点[0]为非代表节点、节点[1]为代表节点。
此外,从关于图2B等的说明可知,将根节点配置在代表节点的位置还是配置在非代表节点的位置是任意的。
另外,在上述例中,按照使比特值0优先的深度优先搜索顺序来保存节点并复原,但显然也可以按照使比特值1优先的深度优先搜索顺序来保存节点并复原。
使比特值0优先的深度优先搜索顺序与以升序方式取出在配对节点树中存储的索引关键字的图7所示处理顺序相同。由此,上述实施方式的保存处理通过与图7类似的图10A的流程图示出,被图10A调用的图10B的处理与被图7调用的图5的求出最小值的处理类似。
同样,使比特值1优先的深度优先搜索顺序与以降序方式取出在配对节点树中存储的索引关键字的图8所示处理顺序相同。由此,在该情况下,分别变更图10A和图10B的处理、使得按照与图8和图6所示的同样的处理顺序对节点进行巡回即可。另外,也可以与此相应地变更图13的处理。
与上述实施方式相同,当以节点[0]作为代表节点这样的假定为基础进行说明时,具体而言需要以下的变更。首先,使得图10A的步骤S1006在节点[1]时进到步骤S1007。步骤S1007变更为从数组编号减1而取得节点[0]的数组编号,步骤S1008变更为对巡回开始节点的数组编号设定节点[0]的数组编号。并且,图10B的步骤S1018从加上值0变更成加上值1。
这样对以比特值1优先的深度优先搜索顺序保存的配对节点树进行复原时,按照如下方式变更图13即可。首先,将步骤S1313变更为对代表节点编号加上值1而取得节点[1]的数组编号,将步骤S1316变更为在节点[1]时进到步骤S1317,将步骤S1317变更为从数组编号减1来取得节点[0]的数组编号。
换言之,可如下地归纳上述变形例。在保存处理中以代表节点侧优先的方式进行搜索时,在节点[0]是代表节点的情况下,与图10A同样按照索引关键字的升序保存配对节点树,在节点[1]是代表节点的情况下按照索引关键字的降序保存配对节点树。另一方面,在保存处理中以非代表节点侧优先的方式进行搜索时,在节点[0]是代表节点的情况下,按照索引关键字的降序保存配对节点树,在节点[1]是代表节点的情况下,按照索引关键字的升序保存配对节点树。复原处理可以根据节点[0]和节点[1]中哪个是代表节点、或者保存是按照索引关键字的升序和降序中的哪个顺序来进行,与实施方式相应地进行适当变形。
在图10A~图15的例子中,便于表示所保存的节点内容的保存信息的排列顺序,所以为了方便说明,采用将保存信息存储在节点保存数组401中的例子进行了说明。但是,保存信息可以是按照保存节点的顺序来排列节点信息而成的信息,也可以不是节点保存数组401这样的数组。
根据实施方式,保存信息可以作为文件存储在外部存储装置306上,可以以节点保存数组401这样的数组或其它形式存储在主存储装置305上,也可以经由通信装置307和网络发送到其它计算机。在上述实施方式中为了便于说明,表现为在节点保存数组401中存储节点、或在节点保存数组401中保存节点等,但并不意味着排除经由网络发送节点内容来保存节点内容这样的方式。
另外,在上述保存处理中保存了分支节点中包含的代表节点编号,但也可以不保存。其理由是,在复原处理中与原始配对节点树所使用的数组309的数组编号无关地取得要存储复原后配对节点树的数组309′上的空节点对的代表节点的数组编号。即,保存前的原始分支节点中包含的代表节点编号在复原后完全没有使用,所以不需要保存。
在不保存分支节点的代表节点编号的情况下,保存信息的数据量相应地减少。即,在将保存信息存储为文件的情况下可减小文件大小,在经由网络发送保存信息的情况下可减少网络通信量。另外,在图13的复原处理中,使用与原始数组309的数组编号无关的数组309′的数组编号,所以还具有容易使在某一环境下保存的配对节点树在其它环境下复原的优点。
此外,图10A示出了保存现有的整个配对节点树的处理,也可以仅保存部分树。为此,可以将图10A的步骤S1001和步骤S1003中的根节点设定为待保存的部分树的根节点,而不是整个配对节点树的根节点。针对这样得到的节点保存数组执行图13的复原处理,即可复原所保存的部分树。
另外,在图13中示出了复原由保存在节点保存数组401中的全部节点构成的配对节点树的处理,但也可以通过变更图13所示处理的一部分来仅复原其中的部分树。
如上所述,在节点保存数组401中,对于任意的部分树,保存在构成该部分树的全部节点连续的数组编号的数组元素内。因此,只要预先指定希望复原的部分树的根节点位于节点保存数组401的哪个位置,就可以通过将该位置作为读取开始位置来读取节点保存数组401的内容,来只复原所保存的配对节点树的部分树。
但是为此,在图13的步骤S1303与步骤S1304之间追加步骤S1318,在步骤S1315与步骤S1316之间追加步骤S1319。在所追加的步骤S1318中,指定希望复原的部分树的根节点位于节点保存数组401的哪个位置,跳过该位置之前的节点保存数组401的内容。另外,在所追加的步骤S1319中,判断堆栈指针是否指向根节点的数组编号。然后,在堆栈指针指向根节点的数组编号的情况下结束复原处理,在没有指向根节点的数组编号的情况下进到步骤S1316。此外,步骤S1303以及所追加的步骤S1319中的根节点意味着复原对象部分树的根节点,而不是所保存的整个原始配对节点树的根节点。
这样通过变更一部分处理,例如可以将图14的节点保存数组401的数组编号3的节点指定为待复原的部分树的根节点,仅利用节点保存数组401中的数组编号3~7的部分,从节点保存数组401复原以节点211c′为根节点的部分树。
如上所述,根据本发明第1实施方式,可以简单高效地仅保存部分树、或者从节点保存数组中仅复原必要的部分树。由此,根据本实施方式,即使配对节点树的大小变大,也能够仅处理必要的部分树,能够使配对节点树的处理变得容易。
此外显然,可通过存储配对节点树的存储手段和使计算机执行图10A~图10B或图13所示的处理的程序,来在计算机上构建执行本实施方式的保存方法或复原方法的装置。因此,上述程序、以及存储程序的计算机可读存储介质包含在本发明第1实施方式中。
如以上所详细说明的,本发明第1实施方式的配对节点树保存方法是按照与索引关键字的升序或降序对应的深度优先搜索顺序来保存作为保存对象的构成配对节点树的部分树的节点的方法。如果选择升序或降序某一种,则深度优先搜索顺序是与配对节点树的树结构一一对应的顺序。另外,配对节点树有如下这样的特征:各节点具体怎样配置在存储区域上是任意的,而树结构由索引关键字的集合唯一地规定。
因此,根据本发明第1实施方式,按照不依赖于存储区域上节点配置方式的标准顺序、即与由索引关键字的集合唯一地规定的树结构一一对应的顺序,保存节点信息(保存信息)。即,在节点信息(保存信息)中,由所保存的叶节点来表示索引关键字集合,并且由其顺序性来表示配对节点树的树结构。因为有该顺序性,所以在复原处理中,不需要用于确定待复原配对节点树的树结构的多余处理,能够进行高效的复原。根据以上情况,本实施方式的保存顺序作为节点信息的交换形式可以说是恰当的顺序。
接着,对本发明第2实施方式的配对节点树最长一致/最短一致检索进行说明。首先,对下述的本实施方式所采用的用语和该实施方式的前提条件进行说明。
(a)最长一致检索是检索与作为指定检索关键字的最长一致检索关键字部分一致的索引关键字中、差分比特位置处于最下位的索引关键字的处理。将这样的索引关键字定义为“满足最长一致条件的索引关键字”。可能不存在满足最长一致条件的索引关键字,还可能存在一个或多个。此外,所谓差分比特位置表示在比较两个比特序列时比特值不一致的不一致比特中的最上位位置。
(b)最短一致检索是优先检索与作为指定检索关键字的最短一致检索关键字部分一致的索引关键字中、差分比特位置处于上位的索引关键字的处理。关于最短一致的定义的细节,可根据实施方式而不同。在以下实施方式中,按如下方式定义最短一致来详细说明最短一致检索方法。
将根节点的到鉴别比特位置为止的比特值与最短一致检索关键字完全一致、而在根节点的鉴别比特位置以后的比特值中存在与最短一致检索关键字不一致比特的索引关键字定义为“满足最短一致条件的索引关键字”。可能不存在满足最短一致条件的索引关键字,也可能存在一个或多个。
接着,参照图16、18、20、21对配对节点树的最长一致检索的具体方法进行说明。
图16是说明本发明第2实施方式的最长一致检索处理的流程图。图16的处理概要是在步骤S1601~S1606中取得最长一致节点,在步骤S1607~S1608中从以最长一致节点作为根节点的部分树中取得一个索引关键字。此外,在某部分树所包含的全部叶节点的索引关键字满足最长一致条件时,将该部分树的根节点定义为最长一致节点。由此,通过步骤S1607~S1608得到的索引关键字满足最长一致条件。更详细地说,图16的处理如下所述。
在步骤S1601中将所指定的最长一致检索关键字设定为检索关键字,在步骤S1602中将配对节点树的根节点设定为检索开始节点。
接着,在步骤S1603中,采用在步骤S1601中设定的检索关键字来检索数组309,取得索引关键字。该检索如图4所示。在步骤S1602中将根节点设定为检索开始节点,所以检索对象是整个配对节点树。在步骤S1603的检索中存储在搜索路径堆栈310中的内容在之后的步骤S1606中被利用。
在步骤S1603中取得了索引关键字后,处理进到步骤S1604,求出在步骤S1601中设定的检索关键字即最长一致检索关键字与在步骤S1603中得到的索引关键字之间的差分比特位置。该处理的详细内容与图20相对应地在后文叙述。
接着,在步骤S1605中,判断在步骤S1604中求出的差分比特位置是否是0。
在差分比特位置是0时,判断为“是”,并结束最长一致检索处理。在该情况下,在步骤S1603中得到的索引关键字与最长一致检索关键字从开头第0比特就不一致。另外,根据配对节点树的结构,配对节点树所包含的其它全部索引关键字也与最长一致检索关键字从开头第0比特就不一致。因此,在配对节点树内不存在包含满足部分一致条件的索引关键字的叶节点,所以得到“不存在满足最长一致条件的索引关键字”这样的检索结果。
在差分比特位置不是0时,步骤S1605的判断为“否”,处理进到步骤S1606。在该情况下,在配对节点树内至少存在一个满足最长一致条件的索引关键字。但是,在步骤S1605的阶段,仅仅判明了存在满足最长一致条件的索引关键字,所以在步骤S1606中,取得具体的最长一致节点。
在步骤S1606中,参照通过步骤S1603的检索而存储了数组309的数组编号的搜索路径堆栈310,并根据在步骤S1604中求出的差分比特位置来取得最长一致节点。
在取得了最长一致节点后,在下一步骤S1607中将最长一致节点设定为检索开始节点。然后,在下一步骤S1608中,从检索开始节点起执行图5所示的最小值检索处理,取得满足最长一致条件的索引关键字中的最小值,输出所取得的最小值作为最长一致检索结果,结束最长一致检索处理。
此外,步骤S1607和S1608可以根据实施方式进行各种变形。如本实施方式那样,从满足最长一致条件的一个以上的索引关键字中选择最小值的情况只不过是处理的一例。其它的变形例在后文中叙述。
接着,参照图20对图16的步骤S1604的处理进行说明。如后所述,图20的处理也被最短一致检索处理调用。
在步骤S201中,将检索关键字设定为比较关键字1,将索引关键字设定为比较关键字2。在最长一致检索处理的情况下,这里的“检索关键字”是在步骤S1601中设定的最长一致检索关键字,这里的“索引关键字”是在步骤S1603中得到的索引关键字。
接着,在步骤S202中,从最上位第0比特起依次对比较关键字1和比较关键字2的比特序列进行比较。取得在比较关键字1和比较关键字2中值不一致的不一致比特中最早发现的不一致比特的比特位置,作为差分比特位置,结束图20的处理。从上述说明可知,在从图16的步骤S1604调用图20的处理的情况下,在步骤S202中,得到最长一致检索关键字与步骤S1603中得到的索引关键字之间的差分比特位置。
接着,参照图18对在图16的步骤S1606中进行的取得最长一致节点的处理进行说明。为了便于理解图18的处理,分成(A1)~(A3)这3种情况来进行说明。
(A1)根节点为叶节点的情况
在该情况下,在图16的步骤S1603中得到的索引关键字是存储在根节点中的索引关键字。由此,如果最长一致检索关键字与索引关键字的差分比特位置大于0,则索引关键字满足最长一致条件,根节点对应于最长一致节点。
另外,从图16的步骤S1605可知,图18的处理仅在差分比特位置大于0的情况下进行,因此在(A1)的情况下,通过图18的处理必定将根节点设定为最长一致节点。具体如下所述。
在步骤S1801中,搜索路径堆栈310的堆栈指针后退1。
另外,在(A1)的情况下,存储在搜索路径堆栈310中的数组309的数组编号只是根节点的数组编号。由此,在步骤S1801的执行后,堆栈指针所指向的内容是根节点的数组编号。在该状态下,处理转移到步骤S1802。
在步骤S1802中,判断搜索路径堆栈310的堆栈指针是否指向根节点的数组编号。在(A1)的情况下如上所述,判断结果为“是”,进到步骤S1808。
在步骤S1808中,从搜索路径堆栈310取出堆栈指针所指向的数组编号。即,在(A1)的情况下,取出根节点的数组编号。
然后,在下一步骤S1809中,将在步骤S1808中得到的数组编号即根节点的数组编号设定为最长一致节点数组编号,图18的处理结束。
(A2)根节点是分支节点、根节点的鉴别比特位置是0的情况
在该情况下,检索对象配对节点树包含第0比特为0的索引关键字和第0比特为1的索引关键字双方。由此,必定存在至少第0比特一致的索引关键字。这意味着必定存在满足最长一致条件的索引关键字、并且在图16的步骤S1604中得到的差分比特位置大于0。即,在(A2)的情况下,步骤S1605的判断必定为“否”,必定执行图18的处理。
在步骤S1801中,搜索路径堆栈310的堆栈指针后退1。结果,堆栈指针所指向的内容为存储了步骤S1603中得到的索引关键字的叶节点的数组编号。在(A2)的情况下,该叶节点不是根节点。在步骤S1801的执行后,反复执行步骤S1802~S1806的循环。该循环是追溯搜索路径堆栈310的操作。
在步骤S1802中,判断搜索路径堆栈310的堆栈指针是否指向根节点的数组编号。在(A2)的情况下,在第一次执行了步骤S1802的时刻的判断为“否”,转移到步骤S1803。
在步骤S1803中,搜索路径堆栈310的堆栈指针后退1,取出堆栈指针所指向的数组编号。在下一步骤S1804中,从数组309读出在步骤S1803中得到的数组编号所指定的数组元素作为节点。然后,在下一步骤S1805中,从步骤S1804中读出的节点中取出鉴别比特位置。
此外,仅在步骤S1802的判断为“否”的情况下执行步骤S1803~S1806。由此,保证在步骤S1803中堆栈指针后退1时不产生溢出。另外,根据图4和步骤S1802的说明可知,执行步骤S1803~S1806时,是在搜索路径堆栈310中存储有一个以上的除了根节点以外的节点的数组编号的情况。由此,在步骤S1803的执行后堆栈指针所指向的是作为根节点的分支节点或者除此以外的分支节点的数组编号。
在步骤S1805的下一步骤S1806中,判断所取出的鉴别比特位置是否比在图20的步骤S202中得到的差分比特位置更上位。在鉴别比特位置比差分比特位置更上位的情况下判断为“是”,进到步骤S1807,在下位的情况下判断为“否”,返回步骤S1802。
在(A2)的情况下必定反复执行一次以上的步骤S1802~S1806的循环后,步骤S1806的判断成为“是”,按照步骤S1807、S1808、S1809的顺序进行处理。
在步骤S1807中,搜索路径堆栈310的堆栈指针前进1。执行步骤S1807时,是在执行了一次以上的步骤S1803之后,因此不会因为步骤S1807的操作而产生溢出。
在下一步骤S1808中从搜索路径堆栈310取出堆栈指针所指向的数组编号,在下一步骤S1809中,将在步骤S1808中得到的数组编号设定为最长一致节点的数组编号,图18的处理结束。
通过上述处理在(A2)的情况下被设定为最长一致节点的节点是以下两个中的任意一个。
与存储有步骤S1603中得到的索引关键字的叶节点链接的分支节点的鉴别比特位置比差分比特位置更上位时,将上述叶节点设定为最长一致节点。
在搜索路径堆栈310中依次存储有鉴别比特位置为m的分支节点的数组编号和与该分支节点链接且鉴别比特位置为n的分支节点的数组编号、鉴别比特位置m、鉴别比特位置n和差分比特位置d之间关系是m<d<n情况下,将鉴别比特位置为n的分支节点设定为最长一致节点。
(A3)根节点是分支节点、根节点的鉴别比特位置大于0的情况
该情况与(A2)的情况相比,不同点在于存在图16的步骤S1605的判断成为“是”的情况。
在步骤S1801中使搜索路径堆栈的堆栈指针后退1的情况、在步骤S1802~S1806的循环执行第一次时步骤S1802的判断必定为“否”的情况、以及之后的步骤S1803-S1806的动作与(A2)的情况相同。
在步骤S1806中判断为“否”而返回步骤S1802的情况下,再次执行步骤S1802的判断。(A3)的情况与(A2)的情况相比,不同点在于在步骤S1802执行了第二次以后判断成为“是”。
如上所述,在第一次执行步骤S1802时判断必定为“否”。在第二次以及第二次以后执行步骤S1802时,在之前执行步骤S1806,在步骤S1806中判断为“否”。即,作为反复执行了一次以上循环的结果,追溯搜索路径堆栈310直到堆栈指针指向根节点的数组编号的情况,仅在根节点的鉴别比特位置比差分比特位置下位的情况下,在步骤S1802中判断为“是”。
当在步骤S1802中判断为“是”时,进到步骤S1808,与(A1)的情况相同,将根节点的数组编号设定为最长一致节点的数组编号,图18的处理结束。
在(A3)的情况下,根节点的鉴别比特位置大于0,因此根节点的鉴别比特位置m与差分比特位置d之间的关系如下所述。配对节点树所包含的全部索引关键字中第0~第(m-1)比特是相同的。另外,在(A3)的情况下在步骤S1802中判断为“是”时为0<d<m。由此,在该情况下,配对节点树所包含的全部索引关键字中第0~第(d-1)比特与最长一致检索关键字一致。因此,在该情况下如上所述,将根节点的数组编号设定为最长一致节点的数组编号。
另外,(A3)的情况有时也与(A2)的情况相同,在反复执行了一次以上的步骤S1802~S1806的循环后,步骤S1806的判断成为“是”,以步骤S1807、S1808、S1809的顺序进行处理。该情况下的处理内容与(A2)的情况相同。
接下来,参照图21对最长一致检索的具体例进行说明。图21的配对节点树包含″000111″、″010010″、″010011″、″011010″、″100010″、″100011″、″101100″、″101111″这8个索引关键字。图21和图2B的配对节点树具有相同结构,因此标注了相同的标号。但是,节点211f的鉴别比特位置231f的值、节点210h的索引关键字250h的值和节点211h的索引关键字251h的值与图2B不同。
以下,对指定″101010″作为最长一致检索关键字的情况进行说明。
在图16的步骤S1601中将″101010″设定为检索关键字,在步骤S1602中将根节点设定为检索开始节点。当从步骤S1603调用图4的处理时,在搜索路径堆栈310中依次存储数组编号220、(220a+1)、(221b+1)、(221f+1)。另外,在步骤S1603中得到的索引关键字是数组编号(221f+1)的数组元素即节点211h的索引关键字251h中存储的″101111″。在图21中,利用节点211h旁边的“初始检索”来表示上述情况。
在步骤S1604中,求出值为″101111″的索引关键字251h与值为″101010″的检索关键字之间的差分比特位置,其值为3大于0因此步骤S1605的判断为“否”。因此,执行步骤S1606即图18的处理。通过反复步骤S1802~S1806对搜索路径堆栈310进行追溯,当取得数组编号(220a+1)时,数组编号为(220a+1)的数组元素中存储的节点211b的鉴别比特位置231b是2,鉴别比特位置与差分比特位置之间的关系是2<3,因此在步骤S1806中判断为“是”。由此,在步骤S1807中堆栈指针前进1,在步骤S1808中取出数组编号(221b+1),将数组编号(221b+1)设定为最长一致节点的数组编号。即,将数组编号(221b+1)的数组元素中存储的节点211f设定为最长一致节点。
这里,处理返回图16,在步骤S1607中将节点211f设定为检索开始节点,并进行步骤S1608的处理即图5的最小值检索。如图21所示,被设定为最长一致节点的分支节点即节点211f的子叶节点是节点210h和节点211h这两个。两节点的索引关键字的值是″101100″和″101111″。与最长一致检索关键字″101010″相比,均是第0~第2比特一致,第3比特不一致。另外,配对节点树所包含的其它6个索引关键字与最长一致检索关键字″101010″之间的差分比特位置均小于3。通过步骤S1608的处理,选择″101100″和″101111″中的最小值即″101100″,图16的处理结束。
接下来,参照图17、9、10、12对配对节点树的最短一致检索的具体方法进行说明。
图17是说明本发明第2实施方式的最短一致检索处理的流程图。图17是将图16中的「最长一致」变更为「最短一致」的图。
首先,在步骤S1701中将最短一致检索关键字设定为检索关键字,在步骤S1702中将根节点设定为检索开始节点。
接着,在步骤S1703中,采用在步骤S1701设定的检索关键字来检索数组,并取得索引关键字。该检索如图4所示。在步骤S1702中将根节点设定为检索开始节点,因此检索对象是整个配对节点树。通过步骤S1703的检索而存储在搜索路径堆栈310中的内容在之后的步骤S1706中利用。在索引关键字的取得后,处理进到步骤S1704。
在步骤S1704中,求出在步骤S1701中设定的检索关键字即最短一致检索关键字与在步骤S1703中得到的索引关键字之间的差分比特位置。
该处理的详细内容已对应着图20进行了叙述。但是,在从步骤S1704调用图20的处理的情况下,与最长一致检索的情况之间的不同点在于,在步骤S201中设定的比较关键字1是最短一致检索关键字,比较关键字2是在步骤S1703中得到的索引关键字。
在步骤S1704的执行后,在步骤S1705中,判断在步骤S1704中求出的差分比特位置是否是0。
在差分比特位置是0时,判断为“是”,结束最短一致检索处理。在该情况下,最短一致检索关键字与在步骤S1703中得到的索引关键字从开头的第0比特就不一致。另外,根据配对节点树结构,配对节点树所包含的其它所有的索引关键字与最短一致检索关键字也从开头第0比特就不一致。因此,得到“不存在满足最短一致条件的索引关键字”这样的检索结果。
在差分比特位置不是0时,步骤S1705的判断为“否”,处理进到步骤S1706。在该情况下,在配对节点树内至少存在一个满足最短一致条件的索引关键字。但是,在步骤S1705的阶段仅判明了存在满足最短一致条件的索引关键字,因此在步骤S1706中取得具体的最短一致节点。此外,在某个部分树中包含的所有叶节点的索引关键字均满足最短一致条件时,将该部分树的根节点定义为最短一致节点。
在步骤S1706中,参照通过步骤S1703的检索而存储有数组309的数组编号的搜索路径堆栈310,根据在步骤S1704中求出的差分比特位置来取得最短一致节点。
在取得了最短一致节点后,在下一步骤S1707中将最短一致节点设定为检索开始节点。然后,在下一步骤S1708中,从检索开始节点执行图5所示的最小值检索处理,取得满足最短一致条件的索引关键字中的最小值,输出所得到的最小值作为最短一致检索的结果,结束最短一致检索处理。
此外,与图16相同,步骤S1707和S1708可根据实施方式进行各种变形。
接着,参照图19对在图17的步骤S1706中进行的取得最短一致节点的处理进行说明。图19的处理是依据上述(b)的“最短一致条件”定义的处理,但为了使图19的处理容易理解,分成(B1)~(B4)这4个情况进行说明。(B1)和(B2)是作为基于最短一致关键字的检索结果、在搜索路径堆栈上存储有至少3个节点的数组编号的情况,(B3)和(B4)是除此之外的情况。
(B1)根节点是分支节点,在从根节点到存储步骤S1703中得到的索引关键字的叶节点的路径上,至少存在一个根节点以外的分支节点,当将根节点的鉴别比特位置设为m时,存在第0~第m比特的范围与最短一致检索关键字一致的索引关键字的情况
在该情况下,在上述路径上至少存在3个节点。在搜索路径堆栈310中按照根节点、作为根节点的子节点的分支节点、该分支节点的子节点的顺序存储数组编号。根据上述(b)的定义,在该情况下,从作为根节点的子节点的分支节点进行链接、并且与在搜索路径堆栈310中存储有数组编号的节点成对的节点对应于最短一致节点。在(B1)情况下图19的处理是将该节点设定为最短一致节点的处理。
首先,在步骤S1901中将搜索路径堆栈310的堆栈指针设定在保存区域中。
之后的步骤S1902~S1903形成循环,并反复执行一次以上。该循环表示对搜索路径堆栈310进行追溯,直至堆栈指针指向根节点的数组编号。首先,在步骤S1902中,搜索路径堆栈310的堆栈指针后退1。在下一步骤S1903中,判断搜索路径堆栈310的堆栈指针是否指向根节点的数组编号。在堆栈指针指向根节点的数组编号的情况下判断为“是”,进到步骤S1904,在除此以外情况下判断为“否”,返回步骤S1902。
在步骤S1904中,比较堆栈指针与保存区域的值。这里,执行步骤S1904的情况仅是堆栈指针指向根节点数组编号的情况。即,步骤S1904是调查紧接在图19的处理开始之前堆栈指针与指向根节点数组编号的堆栈指针相距多少的处理,是对保存区域的值与堆栈指针进行比较并根据其差来分支处理的处理。
在(B1)的情况下,如上所述在搜索路径堆栈310中存储有至少3个节点的数组编号,所以步骤S1904的比较结果必定为“差>2”。由此,处理必定进到步骤S1905。
在步骤S1905中,从搜索路径堆栈310取出堆栈指针所指向的数组编号即根节点的数组编号。在下一步骤S1906中,从数组309读出在步骤S1905中取出的数组编号所指定的数组元素作为节点。在下一步骤S1907中,从步骤S1906中读出的节点即根节点中取出鉴别比特位置。
在下一步骤S1908中,判断在步骤S1907中取出的鉴别比特位置是否比在图20的步骤S202中得到的差分比特位置更上位。在鉴别比特位置比差分比特位置更上位的情况下,判断为“是”,进到步骤S1909,在下位的情况下,判断为“否”,进到步骤S1914。
在(B1)的情况下,步骤S1908的判断必定为“是”。理由如下所述。
图19的处理仅在差分比特位置大于0的情况下进行,所以在步骤S1907中取出的根节点的鉴别比特位置为0时,步骤S1908的判断必定为“是”。
另外,在步骤S1907中取出的根节点的鉴别比特位置大于0的情况下,当将根节点的鉴别比特位置设为m时,配对节点树所包含的所有索引关键字中第0~第(m-1)比特的范围相同。另外,在(B1)的情况下,存在到第m比特为止与最短一致检索关键字一致的索引关键字。由此,配对节点树所包含的所有索引关键字中第0~第(m-1)比特的范围与最短一致检索关键字一致,所以鉴别比特位置m与差分比特位置d的关系是m≤d。由此步骤S1908的判断必定为“是”。
当在步骤S1908中判断为“是”时,在步骤S1909中搜索路径堆栈310的堆栈指针前进2。
在下一步骤S1910中从搜索路径堆栈310取出堆栈指针所指向的数组编号。
在下一步骤S1911中,取得与在步骤S1910中得到的数组编号成对的数组编号。
在步骤S1911的执行后,处理进到步骤S1914,将在步骤S1911中得到的数组编号设定为最短一致节点数组编号。然后,图19的处理结束。
(B2)根节点是分支节点,在从根节点到存储有步骤S1703中得到的索引关键字的叶节点的路径上,至少存在一个根节点以外的分支节点,当将根节点的鉴别比特位置设为m时,不存在第0~第m比特的范围与最短一致检索关键字一致的索引关键字的情况
在该情况下,与(B1)的不同点仅在于,不存在第0~第m比特的范围与最短一致检索关键字一致的索引关键字。由此,到步骤S1907为止的处理与(B1)的情况完全相同。
在步骤S1907的下一步骤S1908中,在(B2)的情况下判断为“否”,转移到步骤S1914。在该情况下,数组编号是在步骤S1905中取出的数组编号即根节点的数组编号。由此,在步骤S1914中将根节点的数组编号设定为最短一致节点的数组编号,并结束处理。
(B3)根节点是分支节点、从根节点与存储有步骤S1703中得到的索引关键字的叶节点链接的情况
在该情况下,在上述路径上仅存在两个节点。即,搜索路径堆栈310是存储有根节点的数组编号、以及存储索引关键字的叶节点的数组编号的状态。
在(B3)的情况下,步骤S1901~S1903也与(B1)的情况相同。但是,步骤S1903的下一步骤S1904的比较结果与(B1)的情况不同。在(B3)的情况下,将在步骤S1901中设定在保存区域中的值与堆栈指针进行比较,并取得“差=2”的结果。由此,处理必定进到步骤S1912。
在步骤S1912中搜索路径堆栈310的堆栈指针前进1。在下一步骤S1913中从搜索路径堆栈310取出堆栈指针所指向的数组编号。即,取出叶节点的数组编号。然后处理进到步骤S1914,将在步骤S1913中取出的叶节点的数组编号设定为最短一致节点的数组编号,并结束处理。
(B4)根节点是叶节点的情况
在该情况下,在图17的步骤S1703中得到的索引关键字是存储在根节点中的索引关键字。由此,如果最短一致检索关键字与索引关键字的差分比特位置大于0,则索引关键字满足最短一致条件,根节点相当于最短一致节点。另外,从图17的步骤S1705可知,图19的处理仅在差分比特位置大于0的情况下进行,在(B4)的情况下,通过图19的处理,必定将根节点设定为最短一致节点。具体地说如下所述。
步骤S1901与(B1)的情况相同。
在下一步骤S1902中,堆栈指针的值减1。另外,在(B4)的情况下,搜索路径堆栈310所存储的数组309的数组编号仅是根节点的数组编号。因此,在步骤S1902的执行后,堆栈指针所指向的数组编号即为根节点的数组编号。在该状态下,处理转至步骤S1903。
在步骤S1903中,判断搜索路径堆栈310的堆栈指针是否指向根节点的数组编号。在(B4)的情况下如上所述,判断结果为“是”,转至步骤S1904。
在步骤S1904中,对堆栈指针和保存区域的值进行比较。在(B4)的情况下,得到“差=1”的结果,根据该结果,处理转至步骤S1913。
在步骤S1913中,从搜索路径堆栈310取出堆栈指针所指向的数组编号即根节点的数组编号。然后,在下一步骤S1914中,将根节点的数组编号设定为最短一致节点的数组编号,图19的处理结束。
接下来,参照图22对最短一致检索的具体例进行说明。图22的配对节点树与图21的完全相同。
以下,对指定″101010″作为最短一致检索关键字的情况进行说明。
图17的步骤S1701~S1705的处理与图21的例子完全相同,所以省略说明。在步骤S1705中判断为“否”,执行步骤S1706即图19的处理。首先,在步骤S1901中将堆栈指针的值设定在保存区域中。接着,通过反复步骤S1902~S1903来追溯搜索路径堆栈310,如果得到数组编号220则步骤S1903的判断为“是”,进到步骤S1904。这里对堆栈指针与保存区域的值进行比较,结果进到步骤S1905,通过步骤S1905~S1907取出根节点210a的鉴别比特位置230a。鉴别比特位置230a的值是0,所以步骤S1908的判断为“是”,在步骤S1909中堆栈指针前进2。结果,在步骤S1910中取出数组编号(221b+1),在步骤S1911中取得与其成对的数组编号221b。由此,在步骤S1914中将数组编号221b设定为最短一致节点的数组编号。
这里,处理返回图17,在步骤S1707中将作为最短一致节点的节点210f设定为检索开始节点,并进行步骤S1708的处理即图5的最小值检索。如图22所示,设定为最短一致节点的分支节点即节点210f的子叶节点是节点210g和节点211g。两节点的索引关键字的值是″100011″和″100010″。与最短一致检索关键字″101010″相比,第0~第1比特一致,第2比特不一致。
与从根节点起的路径上的分支节点的鉴别比特位置进行对比,根节点210a的鉴别比特位置230a是0,下一节点211b的鉴别比特位置231b是2。由此,在第0比特的范围内这两个索引关键字与最短一致检索关键字一致,在第1~第2比特的范围内存在不一致的比特。
另一方面,配对节点树所包含的其它索引关键字是不满足部分一致条件的索引关键字250c、251d、250e、251e、以及第0~第2比特一致而第3比特不一致的索引关键字250h和251h。由此可知,通过最短一致检索,可优先检索与最短一致检索关键字部分一致的索引关键字中一致部分短的索引关键字。
在上述实施方式中,通过步骤S1708选择″100011″和″100010″中的最小值即″100010″。
此外,本发明第2实施方式不限于此,可进行各种变形。
在上述实施方式中,最左的物理比特位置对应于最上位的逻辑比特位置,但是在其它实施方式中也可以是另外的对应关系,例如,可将最右比特作为最上位比特。图18的步骤S1806及图19的步骤S1908的判断是依据逻辑比特位置的判断。
另外,在上述最长一致检索中,取得满足最长一致条件的索引关键字中的最小值作为结果。但是,可以对上述最长一致检索处理进行变形,以取得与各种实施方式对应的适当值作为检索结果。例如,可以取得满足最长一致条件的索引关键字中的最大值作为最长一致检索处理结果。
同样,对于最短一致检索,也可以根据实施方式来取得各种值作为检索结果。
在图19的步骤S1902~S1903的循环中逐个地追溯搜索路径堆栈310,但是例如也可以将该循环替换成在堆栈指针中代入指向根节点的数组编号的堆栈指针的步骤。
另外,可以根据实施方式对最短一致检索的定义的细节进行各种变形。图17的步骤S1704中得到的差分比特位置是根节点与紧接其下的分支节点的鉴别比特位置之间的值的情况下,对图19的处理进行变形,将紧接在根节点之下的分支节点设定为最短一致节点。
另外,在根节点的鉴别比特位置大于0、且小于步骤S1704中得到的差分比特位置的情况下,还可以进行其它变形。在该情况下,与最短一致检索关键字之间的差分比特位置为最上位的索引关键字是存储在下述部分树所包含的叶节点中的索引关键字,该部分树将与根节点链接的节点对中的、未通过步骤S1703的检索而存储在搜索路径堆栈310中的数组编号的一个节点作为根节点。由此,在步骤S1908的判断为“是”情况下,如果根节点的鉴别比特位置的值大于0,则可以对图19的处理进行变形以使堆栈指针仅前进1。
另外,在步骤S1704中得到的差分比特位置小于根节点的鉴别比特位置值时,可以对图19的处理进行变形,将根节点设定成最短一致节点。
另外,如果根节点的鉴别比特位置值大于0、且小于在步骤S1704中得到的差分比特位置的值,则可以将与步骤S1913中取出的数组编号成对的数组编号设定为最短一致节点的数组编号。
此外显然,可通过程序使计算机执行上述所说明的最长一致/最短致检索方法。
接下来,对本发明的第3实施方式进行说明。
以下,作为本实施方式的最佳方式,与上述实施方式相同,对将配对节点树存储在数组中的例子进行说明。作为分支节点所保持的表示链接目的地位置的数据,可以是存储装置的地址信息,不过通过采用由可存储分支节点或叶节点中占有区域的存储容量较大一方的数组元素构成的数组,可以利用数组编号来表示节点位置,并能够削减表示代表节点位置的第一位置信息的信息量。
图23A是说明第3实施方式的存储在数组中的配对节点树的结构例的图。与图2A所示的本申请人的上述在先申请中的结构例相比,不同点仅在于:在作为叶节点的节点[1]中存储表示该索引关键字的存储区域的参照指针118a来取代图2A所示的索引关键字118,其它都相同,所以仅说明与参照指针相关的部分,省略其它相同部分的说明。另外,在以后说明中还省略与第1以及第2实施方式相同部分的说明。
存储在参照指针118a中的数据是本实施方式的第二位置信息的具体例。以下为了简化表述,将参照指针中存储的数据也称为参照指针。
这里,表示鉴别比特位置所需的比特长度受最长索引关键字的比特长度的影响,但是由于前者是后者的对数,因此即使在利用非常长的索引关键字的情况下,表示鉴别比特位置所需的比特数也不那么多。另外,例如当利用存储地址或相对于预定存储地址的偏移作为参照指针时,参照指针的比特长度与索引关键字的比特长度无关。由此,通过以包含参照指针而不是索引关键字的方式来构成叶节点,事实上可以与索引关键字的长度无关地将配对节点树的节点所需的存储容量设为比较小的常数值。通常在大型数据库中因为要区分众多记录所以需要较长的索引关键字,这种数据库中的索引关键字的比特长度往往比数组100的各数组元素所需的比特长度要长。
另外,还可以在不同于数组100的未图示的数组的各数组元素中存储索引关键字,并利用该不同数组的数组编号作为参照指针。例如,在预先知道仅使用由长度为n比特的比特序列构成的索引关键字中限定的一部分的情况下,表示数组编号所需的比特数m小于n,所以通过使叶节点包含参照指针而不是索引关键字,来削减叶节点所需的存储容量。
此外,为了表示某叶节点与在该叶节点的参照指针所指向的存储区域中存储的索引关键字之间的关系,有时叫作与叶节点对应的索引关键字,也有时叫作与索引关键字对应的叶节点。
图23B是概念性地示出本实施方式的配对节点树的树结构的图。另外在该图中还示出存储有由参照指针所指向的索引关键字构成的关键字信息的关键字信息存储区域311。
图23B所示的配对节点树利用参照指针280c、281d、280e、281e、280g、281g、280h、281h置换了图2B所例示的配对节点树的各叶节点的索引关键字,在图23B的(2)所示的关键字信息存储区域311的各参照指针所指向的区域中存储有图2A所示的对应的关键字信息即索引关键字。
例如,在节点210c的节点类别260c中存储有1,所以该节点是叶节点,因此含有参照指针250c。在参照指针250c中存储了对存储有索引关键字290c的存储区域进行参照的指针。也可以将存储在参照指针250c中的数据称为参照指针,由标号280c表示。其它叶节点也同样,利用相同的参照指针这样的用语来表示参照指针和存储在参照指针中的数据。
图23B示出了连续设置有多个索引关键字的存储区域的例子,将这些连续的整个存储区域表示为索引关键字存储区域311,不过索引关键字可以不存储在连续的区域中。另外,索引关键字存储区域311中的索引关键字的配置顺序可以与树结构上叶节点彼此间的关系无关。参照指针280c表示存储有″000111××××××××″这样的索引关键字290c的存储区域。
这里,″××××××××″的部分是0比特以上长度的某特定比特序列。由此,在图23B的配对节点树的索引关键字中,仅存在1个第0~第5比特的范围为″000111″的关键字。因此,配对节点树的结构与″××××××××″部分的比特序列模式无关而不发生变化,具体原因后述。其它索引关键字也同样,在图23B的整个配对节点树中比最下位鉴别比特位置、即比5更下位的第6比特以后的比特不影响配对节点树的结构,所以表示为″×″。不论用″×″表示的比特是否存在,当该比特存在时不论其值是″0″还是″1″,图23B的配对节点树的树结构都不变。
图23C是说明用于本实施方式的硬件结构例的图。与图3所示的在本申请人的上述在先申请中提出的硬件结构例相比较,不同点仅在于在数据存储装置308中加入了关键字信息存储区域311。
如图23C所示,由存储有配对节点树的节点的数组元素构成的数组309与索引关键字存储区域311是不同的区域。因此,与存储有叶节点的数组元素中含有索引关键字的情况相比,在图23C的结构中,通常1个数组元素所需的存储区域量较少。即,可以通过从存储配对节点树的数组309中分离出索引关键字存储区域311,从而在向缓冲存储器303读入配对节点树的过程中增加在每1缓存块内存储的节点数。由此,在后述的检索处理等中减少缓存错误的频度,更高速地进行处理。
以下,顺次对采用了配对节点树的基本操作即检索、插入、删除进行详细的说明。这些操作是根据配对节点树的结构变更而对本申请人的上述在先申请中提出的检索、插入、删除操作进行了一部分变更后的操作。
图24是示出本实施方式的比特序列检索处理的流程图。
步骤S2401~步骤S2409的处理与图4所示的表示本申请人的上述在先申请中提出的比特序列检索基本动作的流程图中的步骤S401~步骤S409相同,因此省略说明。
在步骤S2405中,当判断为节点类别不是分支节点、即是叶节点时,分支到步骤S2410a,从该叶节点中取出参照指针,在步骤S2410b中读出参照指针所指向的关键字信息,结束处理。
图4所示的检索处理与图24的检索处理的区别在于,在步骤S2410a和S2410b中,不是直接参照索引关键字而是经由参照指针间接参照。结果,除了在步骤S2403中参照存储在数组309中的节点之外,还需要在步骤S2410b中参照存储在索引关键字存储区域311中的索引关键字,对存储装置的参照次数增加1次。
另一方面,配对节点树的节点数越多树越深,反复步骤S2402~S2409的循环的计算成本占整个检索处理的计算成本的比例越增加,对反复该循环的计算成本的削减影响越大。即,在节点数多的配对节点树的检索中,从数组309分离出索引关键字存储区域311所带来的高速化的优点较大,而增加的间接参照成本缩小到即使忽视也没有问题的程度。
接下来,通过图25~图28来说明本实施方式的配对节点树的节点插入处理。图25~图27说明常规插入处理,图28说明根节点插入处理。
图25是示出作为插入处理前级的检索处理的处理流程的图,相当于在图24所示的检索处理中将插入关键字作为检索关键字。步骤S2501~步骤S2510b的处理与图24的步骤S2401~步骤S2410b完全对应,所以省略说明。
在图25的步骤S2511中,将插入关键字与步骤S2510b中得到的索引关键字进行比较,如果相等则插入关键字已经存在于配对节点树中,所以插入为失败,结束处理。如果不相等,则进到下一处理即图26的步骤S2512以下的处理。
图26是说明准备用于待插入节点对的数组元素的处理的处理的流程图。图26的步骤S2512~步骤S2515的处理对应于图9B所示的在本申请人的上述在先申请中提出的准备用于待插入节点对的数组元素的处理中的步骤S912~步骤S915,所以省略说明。
图27是示出在图26中准备的数组元素内存储节点并求出其插入位置、变更现有节点内容而完成插入处理的处理流程的图。
图27所示的步骤S2516~步骤S2524的处理与图9C所示的在本申请人的上述在先申请中提出的步骤S916~步骤S924的处理相比,除了图24中的检索处理与图4所示的不同之外完全相同,所以省略说明。
继步骤S2524之后,进到步骤S2525a,在索引关键字存储区域上确保存储插入关键字所需的存储区域,并取得指向所确保的存储区域的指针。
接着在步骤S2525b中,将插入关键字写入到步骤S2525a中得到的指针所指向的索引关键字存储区域中。
进到步骤S2525c,在步骤S2514中得到的数组编号所指定的数组元素的节点类别中写入表示叶节点的1,在参照指针中写入步骤S2525a中得到的指针。
进到步骤S2526,从数组中读出步骤S2524中得到的数组编号的数组元素。
接着在步骤S2527中,在步骤S2515中得到的数组编号的数组元素中写入步骤S2526中读出的内容。
最后在步骤S2528中,对步骤S2524中得到的数组编号所指定的数组元素的节点类别写入表示分支节点的0,对鉴别比特位置写入步骤S2517中得到的比特位置,对代表节点编号写入步骤S2512中得到的数组编号,结束处理。
图28是说明本实施方式的包含根节点插入处理在内的整个叶节点插入处理的处理流程的图。
在步骤S2551中判断是否已经登记了所要取得的配对节点树的根节点的数组编号。如果已登记,则进行采用图25~图27说明的常规插入处理。
如果在步骤S2551中判断没有登记,则开始全新的配对节点树的登记、生成。
首先,在步骤S2552中,从数组求出空节点对,并取得该节点对中应作为代表节点的数组元素的数组编号。接着在步骤S2553中,求出对步骤S2552中得到的数组编号加上0后的数组编号。(实际上,等于在步骤S2552中得到的数组编号。)接着,在步骤S2554a中,在索引关键字存储区域上确保存储插入关键字所需的存储区域,并取得指向所确保的存储区域的指针。在下一步骤S2554b中,将插入关键字写入到步骤S2554a中得到的指针所指向的存储区域中。并且在步骤S2554c中,对于在步骤S2553中得到的数组编号的数组元素即与待插入的根节点对应的数组元素,对节点类别写入表示叶节点的1,对参照指针写入步骤S2554a中得到的指针。然后,在步骤S2556中,登记步骤S2553中得到的根节点的数组编号,结束处理。
在本申请人的上述在先申请中提出的插入处理与图25~图28的插入处理的不同点在于,将插入关键字写入数组309内,还是将插入关键字写入索引关键字存储区域311内而在数组309中写入参照指针。
基于该不同点,比上述在先申请进步之处是能够更高效地利用存储区域。在图27的步骤S2525a和图28的步骤S2554a中,根据要插入的索引关键字的长度来确保最小需要限度的存储区域即可。另外,即使利用较长索引关键字的情况下,也不会在数组309的各数组元素中大量产生无用的空区域。另外,索引关键字存储区域311与数组309相分离,所以还有可不预先判明索引关键字长度的优点。
另一方面,由于该不同点,与上述在先申请相比步骤数增加,追加的步骤是图27的步骤S2525a和S2525b、以及图28的S2554a和S2554b,对一次插入处理仅追加两个简单的步骤。即,在插入处理中增加的计算成本较少,与优点相比为可以忽略的程度。
接下来,参照图29、图30来说明本实施方式的从配对节点树中删除与特定索引关键字对应的叶节点的处理流程。
图29是示出作为删除处理前级的检索处理的处理流程的图,相当于在图24所示的检索处理中将删除关键字作为检索关键字。步骤S2901~步骤S2910b的处理与图24的步骤S2401~步骤S2410b完全对应,所以省略说明。
在图29的步骤S2911中将删除关键字与步骤S2910b中得到的索引关键字进行比较,如果不相等则在配对节点树中不存在要删除的索引关键字,删除失败,结束处理。如果相等则进到下一处理即图30的步骤S2912以下的处理。
图30是说明删除处理的后级处理流程的图。
首先,在步骤S2912中判断在搜索路径堆栈中是否存储有两个以上的数组编号。在没有存储两个以上数组编号、换言之仅为一个时,该数组编号是存储有根节点的数组元素的数组编号。该情况下转移至步骤S2918,删除在步骤S2901中得到的根节点的数组编号所涉及的节点对。接着进到步骤S2919,删除已登记的根节点的数组编号。再进到步骤S2920a,释放存储有与删除关键字相等的索引关键字的存储区域、即在步骤S2910a中得到的参照指针所指向的存储区域,结束处理。
当在步骤S2912中判断为在搜索路径堆栈中存储有两个以上数组编号时,进到步骤S2913,对在步骤S2908中得到的代表节点编号加上步骤S2907中得到的比特值的反转值,得到数组编号。该处理是求出配置了与对应于删除对象索引关键字的叶节点成对的节点的数组编号。
接着在步骤S2914中,读出在步骤S2913中得到的数组编号的数组元素内容,在步骤S2915中使搜索路径堆栈的堆栈指针后退1,取出数组编号。
接着进到步骤S2916,将步骤S2914中读出的数组元素内容写入到步骤S2915中得到的数组编号的数组元素中。该处理是将作为向存储有删除对象索引关键字的叶节点链接的链接源的分支节点置换成与上述叶节点成对的节点。
在下一步骤S2917中,删除在步骤S2908中得到的代表节点编号所涉及的节点对。
最后在步骤S2920a中,如上所述,释放在步骤S2910a中得到的参照指针所指向的存储区域,结束处理。
在本申请人的上述在先申请中提出的删除处理与图29~图30的删除处理的不同点在于,是仅将数组309作为操作对象,还是进一步将索引关键字存储区域311作为操作对象。
基于该不同点,在步骤S2910b中需要间接参照、且追加了步骤S2920a,所以与在先申请的删除处理相比,在图29~图30的删除处理中步骤数增加。但是,与由此增加的计算成本相比,上述优点更加显著。
图31A以及图31B是说明在图23B所例示的配对节点树中将″011010″作为删除关键字进行删除处理的例子的图。
关于图31A所示的配对节点树,对于节点对201f以下的节点省略了记载。删除对象索引关键字″011010″存储在作为临时存储区域的删除关键字270内。搜索路径堆栈310的堆栈指针指向数组编号221c+1,表示检索处理已结束。图中用粗框包围的节点是被检索处理搜索过的节点,从根节点210a到叶节点211d的数组编号被存储在搜索路径堆栈310内。
此外,与节点211d对应的索引关键字291d记述为″011010××××××××″,不过在图31A以及图31B的例子中,为了简化说明,而说明在索引关键字291d的″××××××××″部分中不存在比特值、″011010××××××××″与″011010″相等的情况。另外,对图23B所示的索引关键字291d、291e、290e、290c进行归纳,在图31A中用290这样的标号来表示。
在基于删除关键字的检索处理中,首先取得根节点210a的数组编号220,并将其存储在搜索路径堆栈310内。根节点210a的鉴别比特位置230a是0,删除关键字的比特位置0的比特值是0,所以将代表节点编号220a+0=220a存储在搜索路径堆栈310内。
于是读出节点210b,鉴别比特位置230b是1,删除关键字的比特位置1的比特值是1,所以将代表节点编号220b+1存储在搜索路径堆栈310内。
接着读出节点211c,鉴别比特位置231c是2,删除关键字的比特位置2的比特值是1,所以将代表节点编号221c+1存储在搜索路径堆栈310内。存储在数组编号为221c+1的数组元素内的节点211d的节点类别261d是1,表示是叶节点。与该叶节点对应的索引关键字291d被存储在由参照指针281d指示的存储区域内。该存储区域是索引关键字存储区域311的一部分。因此,当取出参照指针281d所参照的索引关键字291d时其值是″011010″,与存储在删除关键字270中的删除对象索引关键字一致。
在图31A所示的状态下,读出与对应于删除对象索引关键字的节点211d成对的节点210d的内容,将其内容写入到在搜索路径堆栈310的堆栈指针后退1的位置所存储的数组编号220b+1的数组元素(节点211c)中。之后删除节点对201d,并释放存储有索引关键字291d的存储区域。删除了节点对的数组元素为空,可再利用。另外,已释放的索引关键字存储区域也可再利用。
图31B所示的配对节点树是删除处理结束后的节点树。在节点211c的节点类别261c、鉴别比特位置231c、代表节点编号221c中,如括号内所示依然存储有节点210d中存储的值。
接着,参照图32A以及图32B对插入处理的具体例进行说明。
图32A所示是具有将比特序列″0100××××××××″、″0001××××××××″、″0000××××××××″作为索引关键字进行参照的参照指针的配对节点树。接下来要插入的插入关键字是″0011××××××××″。图示的树由节点对1201a、1201b、1201c构成。
节点对1201a的代表节点是根节点1210a,在鉴别比特位置中保持1。节点对1201a的下位节点对1201b的代表节点1210b是分支节点,在鉴别比特位置中保持3,与代表节点1210b成对的节点1211b是叶节点,其保持指向索引关键字1291b″0100××××××××″的参照指针1281b。作为分支节点的节点1210b链接到节点对1201c。
构成节点对1201c的节点1210c和1211c都是叶节点,分别存储有指向索引关键字1290c″0000××××××××″和索引关键字1291c″0001××××××××″的参照指针1280c、1281c。
图32B是示出插入了插入关键字″0011××××××××″的配对节点树的图。新的节点对1201d被插入在节点对1201b与节点对1201c之间。
比较图32A和图32B,所插入的节点1210d的内容是插入前节点1210b,插入后的节点1210b的鉴别比特位置从3变化为2。
以上对本发明第3实施方式进行了详细说明,但对本领域技术人员而言,本发明的实施方式不限于此,还可进行各种变形。
另外显然,可通过存储配对节点树的存储手段和使计算机执行图24所示的处理的程序来在计算机上构建执行本实施方式的比特序列检索方法的装置。
此外显然,可以通过使计算机执行图28、图25~图27所示的插入处理及其等同物的程序,来实现本实施方式的插入方法,可以通过使计算机执行图29以及图30所示的删除处理及其等同物的程序,来实现本实施方式的删除方法。并且,通过这些程序在计算机上实现分支节点及叶节点识别手段、以及根据分支节点的鉴别比特位置来链接到链接目的地节点对中某一个的手段等。
因此,上述程序以及存储有程序的计算机可读存储介质包含于本发明的实施方式中。此外,本实施方式的配对节点树的数据结构也包含在本发明的实施方式中。
通过采用以上详细说明的作为本实施方式提供的新数据结构的配对节点树,能够更有效地利用存储区域进行高速的比特序列数据检索,此外还能够容易地执行比特序列数据的追加删除。

Claims (40)

1.一种配对节点树保存方法,该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的位置信息,所述叶节点包含由检索对象比特序列构成的索引关键字,
将如下构成的配对节点树的任意部分树保存在与配置该配对节点树的区域不同的其它存储区域中,该配对节点树构成为以所述树的任意节点作为检索开始节点,依次反复下述动作:在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与该代表节点成对的非代表节点,直至到达所述叶节点为止,由此将存储在所述叶节点中的索引关键字作为检索结果关键字,该检索结果关键字是所述树的以所述检索开始节点为根节点的任意部分树的、基于所述检索关键字的检索结果,
该配对节点树保存方法的特征在于,
将待保存的所述部分树的根节点指定为与保存节点的顺序对应的路径的开始点即巡回开始节点,
从所述巡回开始节点仅链接所述节点对中的代表节点或非代表节点而巡回至叶节点,同时针对从所述巡回开始节点到所述叶节点的所述路径上的各节点,将表示该节点的位置的所述位置信息依次存储在堆栈中,并且将该节点的内容依次保存在所述其它存储区域中,
反复进行所述堆栈的出栈动作直到得到代表节点或非代表节点的位置信息,从该堆栈中读出该位置信息,将与已读出该位置信息的所述代表节点或所述非代表节点形成节点对的非代表节点或代表节点指定为新的所述巡回开始节点,反复所述节点的巡回和保存。
2.根据权利要求1所述的配对节点树保存方法,其特征在于,
所述配对节点树存储在数组中,所述位置信息是所述数组的存储有与该位置信息对应的所述节点的数组元素的数组编号。
3.根据权利要求1所述的配对节点树保存方法,其特征在于,
在保存于所述其它存储区域的所述内容中,当保存所述分支节点时包含所述鉴别比特位置,当保存所述叶节点时包含所述索引关键字。
4.根据权利要求3所述的配对节点树保存方法,其特征在于,
在所述分支节点和所述叶节点的双方中都包含区分所述分支节点和所述叶节点的类别信息,该配对节点树保存方法还保存所述类别信息。
5.根据权利要求3所述的配对节点树保存方法,其特征在于,
不保存所述分支节点中包含的所述位置信息。
6.根据权利要求1所述的配对节点树保存方法,其特征在于,
所述其它存储区域是数组。
7.一种配对节点树保存方法,该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的位置信息,所述叶节点包含由检索对象比特序列构成的索引关键字,
通过将如下构成的配对节点树的任意部分树经由传输介质发送到外部装置而保存在该外部装置中,该配对节点树构成为以所述树的任意节点作为检索开始节点,依次反复下述动作:在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与该代表节点成对的非代表节点,直至到达所述叶节点为止,由此将存储在所述叶节点中的索引关键字作为检索结果关键字,该检索结果关键字是所述树的以所述检索开始节点为根节点的任意部分树的、基于所述检索关键字的检索结果,
该配对节点树保存方法的特征在于,
将待保存的所述部分树的根节点指定为与保存节点的顺序对应的路径的开始点即巡回开始节点,
从所述巡回开始节点仅链接所述节点对中的代表节点或非代表节点而巡回至叶节点,同时针对从所述巡回开始节点到所述叶节点的所述路径上的各节点,将表示该节点的位置的所述位置信息依次存储在堆栈中,并且依次经由所述传输介质将该节点的内容发送到所述外部装置,
反复进行所述堆栈的出栈动作直到得到代表节点或非代表节点的位置信息,从该堆栈中读出该位置信息,将与已读出该位置信息的所述代表节点或所述非代表节点形成节点对的非代表节点或代表节点指定为新的所述巡回开始节点,反复所述节点的巡回和保存。
8.一种配对节点树复原方法,根据通过权利要求1所述的配对节点树保存方法保存在所述其它存储区域中的保存信息,按照保存顺序依次复原节点,由此来复原所述配对节点树,其特征在于,
从所述保存信息依次读出节点,
在待复原的配对节点树的根节点轮到被复原时,取得该根节点用的存储区域,将读出的节点内容存储在该存储区域中,由此复原该根节点,
在读出的节点是分支节点的期间依次反复下述处理:针对在所述保存信息中处于该分支节点的下一顺位的子节点,还取得与该子节点成对的节点用的存储区域,同时取得该子节点用的存储区域,将读出的该子节点的内容存储在所述存储区域中,由此来进行复原,并且在所述分支节点中写入包含该子节点的节点对的代表节点的所述存储区域的位置信息,如果读出了叶节点,则向着根节点对复原中的所述配对节点树的树结构进行追溯,搜索已取得但没有存储节点内容的存储区域,将通过该搜索而找到的该存储区域确定为要存储下一个待复原节点的内容的存储区域。
9.根据权利要求8所述的配对节点树复原方法,其特征在于,
在数组中复原所述配对节点树,在复原的所述分支节点中写入的所述位置信息是存储有与该位置信息对应的所述代表节点的数组元素的数组编号。
10.根据权利要求8所述的配对节点树复原方法,其特征在于,
在所述保存信息中,在保存有所述分支节点的所述内容中包含所述鉴别比特位置但不包含所述位置信息,在保存有所述叶节点的所述内容中包含所述索引关键字。
11.根据权利要求8所述的配对节点树复原方法,其特征在于,
要复原的所述配对节点树相当于保存在所述保存信息中的原始的所述配对节点树的部分树,
跳过保存在所述保存信息中的顺序在该部分树的所述根节点之前的节点的内容,从该部分树的该根节点的所述内容起依次读出所述保存信息,
在读出所述叶节点时的所述搜索过程中,如果追溯到复原中的所述配对节点树的根节点则复原结束。
12.根据权利要求8所述的配对节点树复原方法,其特征在于,所述保存信息存储在数组中。
13.一种配对节点树复原方法,接收通过权利要求7所述的配对节点树保存方法而发送到所述外部装置的保存信息,按照发送的顺序依次将节点复原到所述外部装置的存储区域中,由此来复原所述配对节点树,其特征在于,
从所述保存信息依次接收并读取节点,
在待复原的配对节点树的根节点轮到被复原时,取得该根节点用的存储区域,将读取出的节点内容存储在该存储区域中,由此复原该根节点,
在读取出的节点是分支节点的期间依次反复下述处理:针对在所述保存信息中处于该分支节点的下一顺位的子节点,还取得与该子节点成对的节点用的存储区域,同时取得该子节点用的存储区域,将读取出的该子节点的内容存储在所述存储区域中,由此来进行复原,并且在所述分支节点中写入包含该子节点的节点对的代表节点的所述存储区域的位置信息,如果读出了叶节点,则向着根节点对复原中的所述配对节点树的树结构进行追溯,搜索已取得但没有存储节点内容的存储区域,将通过该搜索而找到的该存储区域确定为要存储下一个待复原节点的内容的存储区域。
14.一种计算机可读存储介质,其特征在于,存储有用于使计算机执行权利要求1~7中任意一项所述的配对节点树保存方法或权利要求8~13中任意一项所述的配对节点树复原方法的程序。
15.一种程序,其特征在于,用于使计算机执行权利要求1~7中任意一项所述的配对节点树保存方法或权利要求8~13中任意一项所述的配对节点树复原方法。
16.一种配对节点树的节点序列数据结构,其特征在于,通过权利要求1所述的配对节点树保存方法来与所述其它存储区域进行对比。
17.一种数据结构,其构成为能够通过权利要求8或13所述的配对节点树复原方法来复原所述配对节点树。
18.一种最长一致检索方法,其采用了配对节点树,该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的位置信息,所述叶节点包含由检索对象比特序列构成的索引关键字,
该配对节点树构成为以所述树的任意节点作为检索开始节点,依次反复下述动作:在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与其相邻的存储区域中配置的节点,直至到达所述叶节点为止,由此将存储在所述叶节点中的索引关键字作为检索结果关键字,该检索结果关键字是所述树的以所述检索开始节点为根节点的任意部分树的、基于所述检索关键字的检索结果,
其特征在于,该最长一致检索方法具有以下步骤:
检索步骤,将所述配对节点树的所述根节点作为所述检索开始节点,将指定的最长一致检索关键字作为所述检索关键字,一边存储从所述根节点起的路径,一边进行所述检索来取得所述检索结果关键字;
差分比特位置取得步骤,对所述最长一致检索关键字和所述检索结果关键字的比特序列进行比较,取得作为比特值不一致的不一致比特位置中最上位位置的差分比特位置;以及
最长一致节点取得步骤,该最长一致节点取得步骤是在所述差分比特位置为比特序列的最上位以外的位置时,参照所存储的所述路径来设定最长一致节点的最长一致节点设定步骤,
在所述根节点是所述叶节点的情况下,或者所述根节点是所述分支节点且该根节点的所述鉴别比特位置是比所述差分比特位置更下位的位置的情况下,将所述根节点设定为所述最长一致节点,
在其它情况下,取得作为所述路径上的节点、接在所述鉴别比特位置比所述差分比特位置更上位的所述分支节点中的、所述鉴别比特位置为最下位的所述分支节点之后而在所述检索步骤中存储的所述分支节点或所述叶节点,作为所述最长一致节点。
19.根据权利要求18所述的最长一致检索方法,其特征在于,
该方法还具有索引关键字取得步骤,在该步骤中,选择所述配对节点树的以所述最长一致节点作为根节点的部分树中包含的所述叶节点,并取得所选择的该叶节点中包含的索引关键字。
20.根据权利要求18所述的最长一致检索方法,其特征在于,
所述配对节点树存储在数组中,所述位置信息是所述数组的存储有与该位置信息对应的所述代表节点的数组元素的数组编号。
21.根据权利要求20所述的最长一致检索方法,其特征在于,
在所述检索步骤中,在堆栈中依次保持存储有所述路径上的节点的所述数组元素的所述数组编号,由此来存储所述路径。
22.一种最短一致检索方法,其采用了配对节点树,该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的位置信息,所述叶节点包含由检索对象比特序列构成的索引关键字,
该配对节点树构成为以所述树的任意节点作为检索开始节点,依次反复下述动作:在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与其相邻的存储区域中配置的节点,直至到达所述叶节点为止,由此将存储在所述叶节点中的索引关键字作为检索结果关键字,该检索结果关键字是所述树的以所述检索开始节点为根节点的任意部分树的、基于所述检索关键字的检索结果,
该最短一致检索方法的特征在于,具有以下步骤:
检索步骤,将所述配对节点树的所述根节点作为所述检索开始节点,将指定的最短一致检索关键字作为所述检索关键字,一边存储从所述根节点起的路径,一边进行所述检索来取得所述检索结果关键字;
差分比特位置取得步骤,对所述最短一致检索关键字和所述检索结果关键字的比特序列进行比较,取得作为比特值不一致的不一致比特位置中最上位位置的差分比特位置;以及
最短一致节点取得步骤,该最短一致节点取得步骤是在所述差分比特位置为比特序列的最上位以外的位置时,参照所存储的所述路径来设定最短一致节点的最短一致节点设定步骤,
所述路径包含所述根节点、和该根节点的链接目的地的所述节点对中的一个所述分支节点即第一节点,在所述根节点的所述鉴别比特位置是比所述差分比特位置更上位的位置的情况下,取得所述第一节点的链接目的地的所述节点对中没有存储在所述路径中的节点即第二节点,作为所述最短一致节点。
23.根据权利要求22所述的最短一致检索方法,其特征在于,
该方法还具有索引关键字取得步骤,在该步骤中,选择所述配对节点树的以所述最短一致节点作为根节点的部分树中包含的所述叶节点,并取得所选择的该叶节点中包含的索引关键字。
24.根据权利要求22所述的最短一致检索方法,其特征在于,
所述配对节点树存储在数组中,所述位置信息是所述数组的存储有与该位置信息对应的所述代表节点的数组元素的数组编号。
25.根据权利要求24所述的最短一致检索方法,其特征在于,
在所述检索步骤中,在堆栈中依次保持存储有所述路径上的节点的所述数组元素的所述数组编号,由此来存储所述路径。
26.一种计算机可读存储介质,其特征在于,存储有用于使计算机执行权利要求18~21中任意一项所述的最长一致检索方法或权利要求22~25中任意一项所述的最短一致检索方法的程序。
27.一种程序,其特征在于,用于使计算机执行权利要求18~21中任意一项所述的最长一致检索方法或权利要求22~25中任意一项所述的最短一致检索方法。
28.一种比特序列检索方法,其采用了配对节点树,该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的第一位置信息,所述叶节点包含表示存储有由检索对象比特序列构成的索引关键字的存储区域的位置的第二位置信息,
该比特序列检索方法的特征在于,
将所述配对节点树的任意节点作为检索开始节点,依次反复下述动作:在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与其相邻的存储区域中配置的节点,直至到达所述叶节点为止,由此,将所述叶节点中包含的所述第二位置信息所表示的存储区域中存储的索引关键字作为检索结果关键字,该检索结果关键字是所述配对节点树的以所述检索开始节点为根节点的任意部分树的、基于所述检索关键字的检索结果。
29.根据权利要求28所述的比特序列检索方法,其特征在于,
所述配对节点树存储在数组中,所述第一位置信息是所述数组的存储有与该第一位置信息对应的所述代表节点的数组元素的数组编号。
30.根据权利要求29所述的比特序列检索方法,其特征在于,
在堆栈中依次保持存储有所述检索开始节点的数组元素的数组编号、以及存储有从所述检索开始节点到所述叶节点的链接目的地节点的数组元素的数组编号。
31.一种索引关键字插入方法,在配对节点树中插入包含了表示如下存储区域的位置的信息的叶节点,该存储区域存储由指定为插入关键字的期望比特序列构成的索引关键字,
该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的第一位置信息,所述叶节点包含表示存储有由检索对象比特序列构成的索引关键字的存储区域的位置的第二位置信息,
该索引关键字插入方法的特征在于,
将所述插入关键字作为检索关键字,从所述根节点开始一边存储路径一边依次反复下述处理直至到达所述叶节点为止,即,在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或与该代表节点相邻的存储区域中配置的节点,
在所述检索关键字与所述叶节点中包含的所述第二位置信息所表示的存储区域中存储的索引关键字之间,进行大小比较和比特序列比较,
根据在比特序列比较中成为不同比特值的开头比特位置与所述路径上的分支节点的鉴别比特位置之间的相对位置关系,来确定由待插入的所述叶节点和另一个节点组成的节点对的插入位置,
根据所述大小关系来确定将待插入的所述叶节点设为待插入的所述节点对的哪个节点,
在所述叶节点中存储表示存储所述插入关键字的存储区域的位置的信息,作为所述第二位置信息。
32.根据权利要求31所述的插入方法,其特征在于,
所述配对节点树存储在数组中,所述第一位置信息是所述数组的存储有与该第一位置信息对应的所述代表节点的数组元素的数组编号。
33.根据权利要求32所述的插入方法,其特征在于,
在堆栈中依次保持存储有所述根节点的数组元素的数组编号、以及存储有从所述根节点到所述叶节点的链接目的地节点的数组元素的数组编号。
34.一种索引关键字删除方法,从配对节点树中删除包含了表示如下存储区域的位置的信息的叶节点,该存储区域存储由指定为删除关键字的期望比特序列构成的索引关键字,
该配对节点树是用于比特序列检索的树,由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的第一位置信息,所述叶节点包含表示存储有由检索对象比特序列构成的索引关键字的存储区域的位置的第二位置信息,
该索引关键字删除方法的特征在于,
将所述删除关键字作为检索关键字,从所述根节点起依次反复下述动作直至到达所述叶节点为止,即,在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或配置在与该代表节点相邻的存储区域中的节点,
将与所述叶节点成对的另一个节点存储在该节点对的链接源的分支节点中。
35.根据权利要求34所述的删除方法,其特征在于,
所述配对节点树存储在数组中,所述第一位置信息是所述数组的存储有与该第一位置信息对应的所述代表节点的数组元素的数组编号。
36.根据权利要求35所述的删除方法,其特征在于,
在堆栈中依次保持存储有所述根节点的数组元素的数组编号、以及存储有从所述根节点到所述叶节点的链接目的地节点的数组元素的数组编号。
37.一种计算机可读存储介质,其特征在于,存储有用于使计算机执行权利要求28~36中任意一项所述的方法的程序。
38.一种程序,其特征在于,用于使计算机执行权利要求28~36中任意一项所述的方法。
39.一种数据结构,是在比特序列检索中使用的树状的数据结构,其特征在于,
该树由根节点、以及在相邻的存储区域中配置的分支节点和叶节点、或者分支节点之间或叶节点之间的节点对构成,
所述根节点是表示树的起点的节点,当该树的节点为一个时所述根节点是所述叶节点,当树的节点为两个以上时所述根节点是所述分支节点,
所述分支节点包含进行比特序列检索的检索关键字的鉴别比特位置、和表示作为链接目的地节点对中的一个节点的代表节点的位置的第一位置信息,
所述叶节点包含表示存储有由检索对象比特序列构成的索引关键字的存储区域的位置的第二位置信息,
该数据结构使得能够以任意节点作为检索开始节点,依次反复下述动作:在所述分支节点中根据该分支节点中包含的鉴别比特位置的检索关键字的比特值,来链接到链接目的地节点对的代表节点或配置在与该代表节点相邻的存储区域中的节点,直至到达所述叶节点为止,由此执行基于所述检索关键字的检索。
40.根据权利要求39所述的数据结构,其特征在于,
所述数据结构存储在数组中,所述第一位置信息是所述数组的存储有与该第一位置信息对应的所述代表节点的数组元素的数组编号。
CN2008800122779A 2007-04-19 2008-04-14 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质 Expired - Fee Related CN101657818B (zh)

Applications Claiming Priority (7)

Application Number Priority Date Filing Date Title
JP110019/2007 2007-04-19
JP2007110019A JP4514768B2 (ja) 2007-04-19 2007-04-19 カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
JP114915/2007 2007-04-25
JP2007114915A JP4439013B2 (ja) 2007-04-25 2007-04-25 ビット列検索方法及び検索プログラム
JP2007132289A JP4514771B2 (ja) 2007-05-18 2007-05-18 カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
JP132289/2007 2007-05-18
PCT/JP2008/000983 WO2008132806A1 (ja) 2007-04-19 2008-04-14 カップルドノードツリーの退避/復元方法、最長一致/最短一致検索方法、ビット列検索方法及び記憶媒体

Publications (2)

Publication Number Publication Date
CN101657818A true CN101657818A (zh) 2010-02-24
CN101657818B CN101657818B (zh) 2013-07-10

Family

ID=40048627

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2008800122779A Expired - Fee Related CN101657818B (zh) 2007-04-19 2008-04-14 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质

Country Status (3)

Country Link
US (1) US8386526B2 (zh)
JP (1) JP4514768B2 (zh)
CN (1) CN101657818B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102193941A (zh) * 2010-03-12 2011-09-21 富士通株式会社 数据处理装置和为值串形式索引值建立索引的方法

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4502223B2 (ja) 2007-12-05 2010-07-14 株式会社エスグランツ ビット列のマージソート装置、方法及びプログラム
JP4498409B2 (ja) * 2007-12-28 2010-07-07 株式会社エスグランツ データベースのインデックスキー更新方法及びプログラム
US8452731B2 (en) 2008-09-25 2013-05-28 Quest Software, Inc. Remote backup and restore
EP2515245A1 (en) 2009-11-30 2012-10-24 S. Grants Co., Ltd. Bit stream retrieval device, retrieval method, and program
JP5473893B2 (ja) * 2010-12-28 2014-04-16 株式会社高速屋 コード列検索装置、検索方法及びプログラム
US9026496B1 (en) * 2011-09-30 2015-05-05 Emc Corporation Efficient building of restore list
JP6407946B2 (ja) * 2016-12-12 2018-10-17 ファナック株式会社 機器情報及び位置情報の管理装置及び管理システム
CN107451486B (zh) * 2017-06-30 2021-05-18 华为技术有限公司 一种文件系统的权限设置方法及装置
US11308063B2 (en) * 2019-12-30 2022-04-19 Yahoo Assets Llc Data structure to array conversion
CN113760394B (zh) * 2020-06-03 2022-05-13 阿里巴巴集团控股有限公司 数据处理方法、装置、电子设备及存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6675163B1 (en) * 2000-04-06 2004-01-06 International Business Machines Corporation Full match (FM) search algorithm implementation for a network processor
JP3601416B2 (ja) * 2000-06-13 2004-12-15 日本電気株式会社 情報検索方法及び装置
JP4271227B2 (ja) 2006-10-30 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP4271214B2 (ja) 2006-07-07 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102193941A (zh) * 2010-03-12 2011-09-21 富士通株式会社 数据处理装置和为值串形式索引值建立索引的方法
CN102193941B (zh) * 2010-03-12 2013-09-18 富士通株式会社 数据处理装置和为值串形式索引值建立索引的方法

Also Published As

Publication number Publication date
JP2008269197A (ja) 2008-11-06
US8386526B2 (en) 2013-02-26
JP4514768B2 (ja) 2010-07-28
CN101657818B (zh) 2013-07-10
US20100042598A1 (en) 2010-02-18

Similar Documents

Publication Publication Date Title
CN101657818B (zh) 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质
CN101484895B (zh) 比特序列检索装置以及检索方法
CN101535993B (zh) 比特序列检索装置及检索方法
CN101689204B (zh) 比特序列检索方法以及程序
CN101542485B (zh) 配对节点树的分割/结合方法和程序
CN101884043B (zh) 比特序列合并排序装置、方法以及程序
CN101589390B (zh) 比特序列检索装置、检索方法
CN101911060B (zh) 数据库的索引关键字更新方法
JP4514771B2 (ja) カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
JP4439013B2 (ja) ビット列検索方法及び検索プログラム
EP2149845A1 (en) Coupled node tree save/restore method, longest consistence/shortest consistence retrieval method, bit retrieval method and memory medium
CN101911068B (zh) 比特序列检索装置、检索方法
WO2009122651A1 (ja) ビット列検索装置、検索方法及びプログラム
JP2011018296A (ja) カップルドノードツリーのインデックスキー挿入/削除方法
JP4813575B2 (ja) ビット列検索装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
ASS Succession or assignment of patent right

Owner name: KOUSOKUYA INC.

Free format text: FORMER OWNER: GRANTS CO. LTD S.

Effective date: 20121031

C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20121031

Address after: Kanagawa

Applicant after: Kousokuya Inc.

Address before: Chiba County, Japan

Applicant before: Grants Co. Ltd S.

C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20130710

Termination date: 20150414

EXPY Termination of patent right or utility model