具体实施方式
首先,关于本申请人在之前的上述申请中提出的作为本发明前提的配对节点树,说明将配对节点树存储在数组中的例子。分支节点保持的表示链接目的地位置的数据也可以是存储装置的地址信息,不过通过使用由可存储分支节点或叶节点中的所占区域的存储容量更大一方的数组元素构成的数组,可以用数组编号来表示节点位置,可以削减位置信息的信息量。
图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]表示与其成对的节点。此外,有时将存储在某个数组编号的数组元素中的节点称为该数组编号的节点,将存储有节点的数组元素的数组编号称为节点的数组编号。
附在节点[0]112以及节点[1]113前的标号0、1是表示该节点被存储在节点对的哪个数组元素中的节点位置。例如,关于节点[0]存储在数组的偶数编号的数组元素中等,由此可以根据数组编号来求出节点位置。即,在此情况下,如果数组编号是偶数,则该数组编号的节点的节点位置是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中存储有“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用于保存如下数组元素的数组编号,即:该数组元素存储有在检索中搜索到的节点。
在图3的例示中,主存储装置305、外部存储装置306以及通信装置307通过一根总线304与数据处理装置301连接,不过连接方法不仅限于此。另外,还可以使主存储装置305位于数据处理装置301内,或可以将搜索路径堆栈310实现为中央处理装置302内的硬件。或者,显 然可以根据可使用的硬件环境、索引关键字集合的大小等,选择适当的硬件结构,例如,使数组309位于外部存储装置306内、使搜索路径堆栈310位于主存储装置305内等。
并且,尽管未作特别图示,但为了在后面的处理中使用处理中途所得到的各种值,当然可以使用与各个处理对应的临时存储装置。
以下,说明本实施方式的上述配对节点树所存储的索引关键字的各种检索、配对节点树的生成以及分割或结合。
首先,参照图4A、图4B以及图4C,来说明基本的检索处理。
图4A是说明本实施方式的基本检索处理的概略的图。图4B是说明基本检索的处理流程的图。图4C是说明配对节点树的基本检索例的图,示出图2B所例示的配对节点树中与检索例相关的部分以及搜索路径堆栈和各种工作区域。
如图4A所示,在步骤S401中,设定检索开始节点。通过指定或取得检索开始节点的数组编号而将该数组编号或该数组编号的节点设定在未图示的检索开始节点设定区域中,由此进行检索开始节点的设定。此外,上述检索开始节点设定区域是先前所述的“为了在之后的处理中使用在处理途中得到的各种值而与各个处理相应的临时存储装置”之一。在以下的说明中,也有改变“设定在未图示的检索开始节点设定区域中”这样的说法,而描述成“设定为检索开始节点”、或仅描述成“设定成检索开始节点”。
在上述步骤S401中,在从整个配对节点树检索索引关键字的情况下将根节点设定为检索开始节点,不过在之后说明的各种应用检索中,有时将配对节点树的某节点指定为检索开始节点,从将所指定的检索开始节点作为根节点的部分树中检索索引关键字。
接着在步骤S402中,在搜索路径堆栈中存储终端节点。终端节点是用于表示搜索路径堆栈的底部的虚拟分支节点,为了与其它分支节点区别,节点类别设为″1″。鉴别比特位置设为作为小于0的值的″-1″。鉴别比特位置的位数设为相对于索引关键字的位数是充分的。此外,由于鉴别比特位置是″-1″,所以能够识别为是终端节点,因此不一定需要将节 点类别设为″1″。
终端节点的代表节点编号有全为0的终端节点[0]和全为1的终端节点[1]。在代表节点编号为无关的情况下,仅表述为终端节点。并且,当将代表节点存储在偶数数组编号的数组元素中时,终端节点[0]的节点位置是0,终端节点[1]的节点位置是1。此外,对于终端节点[0]和终端节点[1]的代表节点编号,只要能够识别节点位置0和节点位置1,就不一定需要全为0或全为1。
接着在步骤S403中设定检索关键字,进到步骤S404,通过在步骤S403中设定的检索关键字,从在步骤S401中设定的检索开始节点开始检索数组,得到索引关键字。接着,参照图4B来详细说明得到该索引关键字的检索处理。
如图4B所示,在步骤S405中,在代表节点编号设定区域中设定检索开始节点所属的节点对的代表节点的数组编号。
在图4C的例示中,检索开始节点是作为根节点的节点210a,在代表节点编号设定区域280中设定节点对201a的代表节点即节点210a的数组编号220。如果检索开始节点是节点211c,则在代表节点编号设定区域280中设定节点对201c的代表节点210c的数组编号220b。
接着在步骤S406中,在节点位置设定区域中设定表示检索开始节点在节点对中位于哪个的节点位置。在图4C的例示中,作为节点位置,在节点位置设定区域290中设定节点210a的节点位置″0″。
如图4C的搜索路径堆栈310所示,节点类别为″1″,鉴别比特位置由于所有比特是″1″而成为″-1″。
继由以上步骤S405和步骤S406组成的初始设定之后,转移至步骤S407以后的循环处理。
在步骤S407中,从数组中读取出设定在代表节点编号设定区域中的代表节点编号所指向的数组元素对,作为节点对。在步骤S407的最初处理中,读出在步骤S405中初始设定的代表节点编号所指向的节点对。在图4C的例示中,设定数组编号220作为代表节点编号,因此读出节点对201a。
接着在步骤S408中,从已读出的节点对中取出设定在节点位置设定区域中的节点位置所指向的节点。在步骤S408的最初处理中,取出在步骤S406中初始设定的节点位置所指向的节点。在图4C的例示中,设定了节点位置″0″,因此读出节点对201a的两个节点中的节点210a。
接着在步骤S409中,从在步骤S408取出的节点中取出节点类别,并进到步骤S410。
在步骤S410中,判定在步骤S409取出的节点类别是否是分支节点。
如果节点类别不是分支节点,则在步骤S408中取出的节点是叶节点,并进到步骤S416,从节点中取出索引关键字作为检索结果,并结束处理。
如果步骤S410的判定结果是肯定的,在步骤S409中取出的节点类别是分支节点,则经过步骤S411~步骤S415的代表节点编号设定区域和节点位置设定区域的更新处理、以及在搜索路径堆栈中存储节点的存储处理,返回到步骤S407,并反复此循环处理,直至通过步骤S410的判定处理确认已取出叶节点为止。
在步骤S411中,从在步骤S408取出的节点中取出鉴别比特位置。
接着在步骤S412中,根据检索关键字,将在步骤S411取出的鉴别比特位置所指向的比特值设定为节点位置。在图4C的例示中,设定在检索关键字设定区域270中的值是″011010″,因此作为最初的循环处理,取出鉴别比特位置″0″,并将检索关键字″011010″的第0比特的″0″设定在节点位置设定区域290中。
接着,在步骤S413中,从节点中取出代表节点编号,设定在代表节点编号设定区域中。
接着,进到步骤S414,将设定在代表节点编号设定区域中的代表节点编号加上节点位置后的值存储为在步骤S408取出的节点的代表节点编号,并在步骤S415中,将该节点存储在搜索路径堆栈中而返回步骤S407。在图4C的例示中,取出代表节点编号220a而设定在代表节点编号设定区域280中,将220a+0=220a存储为节点210a的代表节点编号,将该节点堆入搜索路径堆栈310。
当处理返回步骤S407时,在图4C的例示中,读出代表节点编号220a所指向的节点对201b,取出设定在节点位置设定区域290中的″0″所指向的节点210b,从该节点210b取出鉴别比特位置″1″,将检索关键字″011010″的第1比特的比特值″1″设定在节点位置设定区域290中。并且,还取出代表节点编号220b设定在代表节点编号设定区域280中,将代表节点编号220b+节点位置″1″存储为其代表节点编号的节点210b堆入搜索路径堆栈310。
继续返回步骤S407,读出设定在代表节点编号设定区域280中的220b所指向的节点对201c,取出设定在节点位置设定区域290中的″1″所指向的节点211c,从该节点211c取出鉴别比特位置″2″,将检索关键字″011010″的第2比特的比特值″1″设定在节点位置设定区域290中。并且,取出代表节点编号221c设定在代表节点编号设定区域280中,将代表节点编号221c+节点位置″1″存储为其代表节点编号的节点211c堆入搜索路径堆栈310。
再次返回步骤S407,读出设定在代表节点编号设定区域280中的221c所指向的节点对201d,取出设定在节点位置设定区域290中的″1″所指向的节点211d,从该节点211d取出节点类别261d。这样一来,由于节点类别261d是″1″,因此判定为该节点是叶节点,并得到索引关键字″011010″。
以上,对本实施方式的基本检索处理进行了说明,如果仅仅是用于基本检索,则不需要在搜索路径堆栈中堆入节点。但是,在之后说明的各种处理动作中,为了活用基本检索中的从检索开始节点至叶节点的链接路径的历史信息,说明将链接路径的节点存储在搜索路径堆栈中的方式。
另外,在图4C的例示中,作为检索结果得到了与检索关键字相同的索引关键字,但即使在配对节点树中不存在与检索关键字相同的索引关键字,由于通过分支节点的鉴别比特位置和该鉴别比特位置所指向的检索关键字的比特值来求出下一个链接目的地的节点位置,并最终到达叶节点,因此可以求出作为检索结果的索引关键字。
并且,由上述说明可知,检索关键字与作为检索结果的索引关键字之间,链接路径的所有分支节点的鉴别比特位置的比特值彼此相等。
接下来,通过图5A~图5C、图6A、图6B来说明本实施方式的配对节点树中的节点插入处理。图5A~图5C说明常规的插入处理,图6A、图6B说明包含根节点的插入处理的插入处理。通过根节点的插入处理和常规的插入处理生成配对节点树,因此包含根节点的插入处理的节点插入处理的说明也是配对节点树的生成处理的说明。
图5A是示出作为插入处理前级的检索处理的处理流程的图,相当于在图4A所示的检索处理中,将检索开始节点设为根节点,将待插入的节点的索引关键字即插入关键字设为检索关键字。即,步骤S501相当于在图4A的步骤S401中将检索开始节点设为根节点,步骤S503相当于在图4A的S403步骤中将插入关键字设为检索关键字。并且,S502、步骤S504的处理与图4A的步骤S402、步骤S404的处理完全对应,因此省略说明。
在图5A的步骤S511中,对插入关键字和作为检索结果得到的索引关键字进行比较,如果相等则插入关键字已经存在于配对节点树中,因此插入失败,处理结束。如果不相等则进到下一处理、图5B的步骤S512以下的处理。
图5B是说明准备用于待插入节点对的数组元素及其插入位置的处理的流程图。
在步骤S512中,从数组中求出空节点对,取得该节点对中应成为代表节点的数组元素的数组编号,设定为代表节点编号。
进到步骤S513,对插入关键字和在步骤S504得到的索引关键字的大小进行比较,当插入关键字大时得到值1的布尔值,当插入关键字小时得到值0的布尔值,设定成节点位置。
进到步骤S514,将在步骤S512设定的代表节点编号加上在步骤S513得到的布尔值后的数组编号设定为插入节点的数组编号。
进到步骤S515,将在步骤S512设定的代表节点编号加上在步骤S513得到的布尔值的逻辑非值后的数组编号,设定为对节点的数组编号。
在步骤S514设定的数组编号是存储将插入关键字作为索引关键字 保持的叶节点的数组元素的数组编号,在步骤S515得到的数组编号是存储与该叶节点成对的节点的数组元素的数组编号。
即,根据在前级检索处理中的得到的存储在叶节点中的索引关键字与插入关键字之间的大小,来决定在待插入的节点对中的哪个节点存储保持插入关键字的叶节点。
在步骤S516中,例如以逻辑“异或”来进行插入关键字与在步骤S504中得到的索引关键字的比特序列比较,得到差分比特列。
进到步骤S517,根据在步骤S516得到的差分比特列,得到从上位第0比特起观察到的第一个不一致比特的比特位置即差分比特位置。对于该处理,可以在例如利用具有优先编码器的CPU中,对其输入差分比特列,得到不一致的比特位置。另外,还可以以软件方式进行与优先编码器等同的处理,得到差分比特位置。
例如在对图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、代表节点编号设为所插入节点对的代表节点的数组编号的分支节点。
接下来,进到图5C的步骤S518以下的处理。
图5C是说明在图5B所准备的数组中存储节点并且求出其插入位置、变更现有节点的内容使插入处理完成的处理的流程图。
步骤S518~步骤S524的处理是求出待插入节点对在配对节点树上的位置的处理,步骤S525以下的处理是在各节点中设定数据使插入处理完成的处理。
在步骤S518中,保存当前取出的节点。最初保存的节点是在步骤S504取出的叶节点。
接着进到步骤S519,从搜索路径堆栈中取出堆栈指针所指向的节点,堆栈指针后退1。
进到步骤S520,从在步骤S519取出的节点中取出鉴别比特位置。
接着进到步骤S521,判定在步骤S520取出的鉴别比特位置是否是比在步骤S517得到的比特位置上位的位置关系。这里所谓上位的位置关系是在比特序列中靠左侧的位置、即比特位置值小的位置。
如果步骤S521的判定结果是否定的,则返回步骤S518,在步骤S518中,保存在步骤S519取出的节点,反复进行处理直至在以下步骤S521中的判定为肯定为止。当在步骤S521中的判定为肯定时,进到步骤S522。
在步骤S522中,判定在步骤S519取出的节点是否是终端节点。如果不是终端节点则转移到步骤S523,从在步骤S519取出的节点中取出代表节点编号,设定为父节点的数组编号,然后进到步骤525。如果是终端节点,则转移到步骤S524,将根节点的数组编号设定为父节点的数组编号,进到步骤525。这里,所谓父节点是其链接目的地作为在步骤S512取得并待插入的节点对的节点,是与待插入节点对最近的上位节点。
关于在上述步骤S518~步骤S524中说明的处理,为了决定待插入节点对的插入位置,调查待插入的索引关键字和通过检索取得的索引关键字的差分比特位置、与存储在搜索路径堆栈内的分支节点的鉴别比特位置之间的相对位置关系,将鉴别比特位置为上位的分支节点的下一分支节点作为父节点,将其链接目的地作为待插入节点对的插入位置。
例如当在图2B的配对节点树中插入″111000″时,其第3比特是0, 因此检索结果的索引关键字为存储在节点210h内的″101011。通过插入关键字″111000″和存储在节点210h内的索引关键字″101011″的比特序列比较来得到差分比特位置1。依次对搜索路径堆栈310进行逆向搜索,直到所得到的比特位置1与堆积在搜索路径堆栈内的分支节点的鉴别比特位置之间的位置关系成为鉴别比特位置处于上位为止,此时到达根节点210a。存储在搜索路径堆栈310内的根节点210a的代表节点编号,在图4B所示的步骤S414中,设定了加上节点位置后的值。因此,从根节点210a中取出代表节点编号220a+1,设定成父节点的数组编号(步骤S523)。即,作为父节点的数组编号,得到节点211b的数组编号。在步骤S527中改写节点211b的内容,插入关键字″111000″插入到改写后的节点211b的链接目的地。
另外,所谓对搜索路径堆栈进行逆向搜索到达终端节点是指:即使到达根节点,根节点的鉴别比特位置也不是比先前求出的在比特序列比较中成为不同比特值的最上位比特位置还上位的比特位置,是下述情况:在该配对节点树的索引关键字的上位比特中,比根节点的鉴别比特位置上位的比特值全部相等。并且,在待插入的索引关键字中,第一次出现与比根节点的鉴别比特位置上位的比特值不同的比特值。因此,待插入节点对成为根节点的直接链接目的地。即,根节点为父节点。并且,根节点的鉴别比特位置变为与现有索引关键字不同的值的插入关键字的最上位比特的位置。
此外,在从搜索路径堆栈中取出终端节点时,其鉴别比特位置如先前所述是″-1″,因此步骤S521的判定为“是”,转移到步骤S522的判定处理。
接着,说明步骤S525以下的对各节点设定数据使插入处理完成的处理。
在步骤S525中,针对在步骤S514所设定的插入节点的数组编号所指向的数组元素,对其节点类别写入1(叶节点),对其索引关键字写入插入关键字。
进到步骤S526,读出在步骤S518中保存的节点,将读出的内容写 入在步骤S515中设定的对节点的数组编号的数组元素。
最后在步骤S527中,针对父节点的数组编号所指向的数组元素,对其节点类别写入0(分支节点),对其鉴别比特位置写入在步骤S517中设定的差分比特位置,对其代表节点编号写入在步骤S512中设定的代表节点编号,结束处理。
在对上述图2B的配对节点树插入″111000″的例子中,在所取得的空节点对的节点[0]中写入所保存的节点211b的内容(步骤S526),节点[1]设为保持插入关键字″111000″的叶节点(步骤S525)。并且,在节点211b的鉴别比特位置上存储通过比特序列比较而成为不同比特值的最上位比特位置即差分比特位置1,在代表节点编号中存储存储有所取得的节点对的代表节点的数组元素的数组编号(步骤S527)。
通过以上处理,完成对配对节点树插入存储有新索引关键字的叶节点。
图6A是说明本实施方式的包含根节点插入处理在内的、追加索引关键字时的节点插入处理全体的处理流程图。
在步骤S601中,判断要求取得的配对节点树的根节点的数组编号是否已登记。如果已登记,则转移到步骤S602进行使用图5A~图5C说明的常规插入处理。
如果步骤S601的判断为未登记,则转移到步骤S603、步骤S604的处理,开始全新的配对节点树的登记、生成。
在步骤S603中,在根节点中设定包含插入关键字的叶节点。之后,参照图6B对步骤S603的处理进行详细说明。
接着进到步骤S604,登记插入节点的数组编号作为根节点的数组编号,结束处理。
图6B是说明在根节点中设定包含插入关键字的叶节点的处理流程的图。
首先,在步骤S605中,根据数组求出空节点对,取得该节点对中应成为代表节点的数组元素的数组编号。接着在步骤S606中,求出对在步骤S605得到的数组编号加0后的数组编号,设定为插入节点的数组编号。 (实际上,与在步骤S605中取得的数组编号相等。)。进而在步骤S607中,针对在步骤S606中设定的插入节点的数组编号所指向的数组元素,对其的节点类别存储1(叶节点),并且对其索引关键字存储插入关键字,结束处理。
如先前所述可知,当索引关键字的集合存在时,从该集合中依次取出索引关键字,并反复图6A、图6B以及图5A~图5C的处理,由此可构筑与索引关键字的集合对应的本发明的配对节点树。
接着,参照图7A、图7B来说明本实施方式的、从配对节点树中删除特定索引关键字的处理流程。
图7A是表示作为删除处理前级的检索处理的处理流程的图,类似于在图4A、图4B所示的检索处理中将删除关键字设为检索关键字、将检索开始节点设为根节点。但是,在本实施方式的删除处理中,不使用搜索路径堆栈而使用保存1个节点的保存节点,这一点不同于先前说明的检索处理。
根据之后的说明可知,在删除处理中,搜索路径仅追溯一个即可因此不需要采用堆栈,所以取而代之,使用保存节点的节点保存区域和保存该节点的数组编号的父节点数组编号保存区域。
以下,有时将设定在节点保存区域中的节点称为保存节点,将在节点保存区域中保存节点的情况表述为在保存节点中设定节点。另外,有时将保存在父节点数组编号保存区域中的数组编号称为父节点的数组编号,将在父节点数组编号保存区域中保存数组编号的情况表述为在父节点中设定数组编号。
如图7A所示,首先在步骤S701中,设定根节点的数组编号作为代表节点编号。
接着在步骤S702中,设定根节点的节点位置作为节点位置。
进而在步骤S703中,对保存节点设定终端节点。
通过以上结束初始设定,执行步骤S704~步骤S712的循环处理、以及通过步骤S707的判定结果从循环跳出后的处理即步骤S713和步骤S714。
在上述循环处理中,步骤S704~步骤S707的节点类别的判定处理与图4B所示的步骤S407~步骤410完全相同,所以省略说明。
在步骤S707的判定结果是节点类别为分支节点的情况下,执行经由步骤S708~步骤S712返回步骤S704的循环处理。
步骤S708和步骤S709的处理是取代使用搜索路径堆栈的处理,在步骤S708中,将在步骤S705中取出的节点设定成保存节点。
在步骤S709中,将设定在代表节点编号设定区域中的代表节点编号加上设定在节点位置设定区域中的节点位置后的值的数组编号设定在父节点中。显然,这里设定在父节点中的数组编号是存储有在步骤S708中保存的节点的数组元素的数组编号。
接下来的步骤S710~步骤S712的处理与图4B的步骤S411~步骤S413的处理完全对应,所以省略说明。此外,与图4B所示的步骤S414、步骤S415对应的步骤不使用搜索路径堆栈,所以在本实施方式的删除处理中不存在。
作为上述循环处理的链接结果,当到达叶节点并在步骤S707中的判定为否定的时,分支到步骤S713,从叶节点中取出索引关键字。
接着,在步骤S714中比较删除关键字和索引关键字,如果不相等,则要删除的索引关键字不存在于配对节点树中,所以删除失败,处理结束。如果相等则进到下一处理、图7B的步骤S715以下的处理。
图7B是说明删除处理后级的处理流程的图。
首先,在步骤S715中判定保存在节点保存区域中的节点是否是终端节点。保存的节点是终端节点是指根节点是叶节点。在此情况下,转移到步骤S719,删除在步骤S701设定的代表节点编号所指示的节点对、即根节点的数组编号所指示的节点对。接着进到步骤S720,删除已登记的根节点的数组编号,结束处理。
当在步骤S715中判定为所保存的节点不是终端节点时,进到步骤S716,从在步骤S704读出的节点对中,取出使在步骤S711设定的节点位置的比特值反转而得到的节点位置所指向的节点。该处理取出与存储有删除对象的索引关键字的叶节点成对的节点。
接着,在步骤S717中,读出在步骤S716中取出的节点的内容,写到在步骤S709设定的父节点的数组编号的数组元素。该处理将作为链接到存储有删除对象的索引关键字的叶节点的链接源的分支节点(父节点)置换成与上述叶节点成对的节点。
最后,在步骤S718中删除在步骤S712设定的代表节点编号所指向的节点对,结束处理。
接着,参照图8A、图8B以及图8C,来说明本实施方式的、求出存储在配对节点树(包含部分树)中的索引关键字的最小值的最小值检索处理。
图8A是说明求出存储在配对节点树(包含部分树)中的索引关键字的最小值的处理流程的概要的图。根据先前所述的索引关键字在树上的配置来求出索引关键字最小值的处理,相当于在树上从检索开始节点起搜索节点[0]直到到达叶节点。即,相当于在图4A、图4B所示的基本检索中进行节点位置始终为″0″的检索。即,相当于利用比特值全为″0″的检索关键字进行检索。
图8A所示的步骤S801和步骤S802相当于图4A所示的步骤S401和步骤S402,如上所述,节点位置可以固定为″0″,所以不需要设定检索关键字而进行基于其比特值的分支。因此,可以省略与步骤S403相当的步骤。
在下一步骤S804中,从在步骤S801设定的检索开始节点起检索数组,得到索引关键字的最小值。接着,参照图8B来详细说明得到该索引关键字最小值的检索处理。
如图8B所示,在步骤S805中,在代表节点编号设定区域中设定检索开始节点所属的节点对的代表节点的数组编号。
接着在步骤S806中,在节点位置设定区域中设定表示检索开始节点在节点对中位于哪一个的节点位置。
接着,进到步骤S807,从数组中读出设定在代表节点编号设定区域中的代表节点编号所指向的数组元素对,作为节点对。
接着在步骤S808中,从读出的节点对中取出在步骤S806设定在节 点位置设定区域的节点位置所指向的节点。
接着在步骤S809中,从在步骤S808或后述的步骤S817取出的节点中取出节点类别,进到步骤S810。
在步骤S810中,判定在步骤S809取出的节点类别是否是分支节点。
如果节点类别不是分支节点,则在步骤S808或步骤S817中取出的节点是叶节点,进到步骤S818,从节点中取出索引关键字作为检索结果即最小值,结束处理。
如果步骤S810的判定结果是肯定的、在步骤S809取出的节点类别是分支节点,则经过步骤S813、步骤S815~步骤S817的处理返回步骤S809,反复该循环处理,直至通过步骤S810的判定处理确认取出了叶节点为止。
在步骤S813中,从节点中取出代表节点编号,设定在代表节点编号设定区域中。
接着,在步骤S815中将节点存储在搜索路径堆栈中。
接着,进到步骤S816,从数组中读出设定在代表节点编号设定区域中的代表节点编号所指向的数组元素对,作为节点对。
接着在步骤S817中,从在步骤S816读出的节点对中,取出作为节点[0]的节点,并返回步骤S809。然后如上所述,反复步骤S809~步骤S817的处理,直至通过步骤S810的判定处理确认取出了叶节点为止。
图8C是说明配对节点树的最小值检索例的图,示出图2B所例示的配对节点树中与最小值检索有关的根节点210a和节点210b以下的阶层的部分树。
在初始设定中,设定根节点210a作为检索开始节点,设定数组编号220作为代表节点编号,在搜索路径堆栈310中存储终端节点。并且设定根节点210a的节点位置0。
接着,从设定为代表节点编号的数组编号220所指向的节点对201a中取出初始设定的节点位置所指向的节点210a,进行节点类别260a的判定,由于是分支节点,因此取出代表节点编号220a设定在代表节点编号设定区域中,并且将节点210a存储在搜索路径堆栈310中。
接着,从代表节点编号220a所指向的节点对201b中取出作为节点[0]的节点210b,进行节点类别260b的判定,由于是分支节点,因此取出代表节点编号220b设定在代表节点编号设定区域中,并且将节点210b存储在搜索路径堆栈310中。
进而,从代表节点编号220b所指向的节点对201c中取出作为节点[0]的节点210c,进行节点类别260c的判定,由于是叶节点,因此取出索引关键字″000111″作为最小值。
在上述例中,检索开始节点是节点位置为0的根节点,不过当将检索开始节点设为211c时,初始设定220b作为代表节点编号、1作为节点位置,读出节点对201c并从该节点对201c中取出节点211c。
接着,参照图9A、图9B以及图9C,说明本实施方式的求出存储在配对节点树(包含部分树)中的索引关键字的最大值的最大值检索处理。
该最大值检索处理是与先前说明的最小值检索处理为相对的关系的处理,根据以下的说明可知,相当于在最小值检索中将值″0″置换为″1″。
图9A是说明求出存储在配对节点树(包含部分树)中的索引关键字最大值的处理流程的概要的图。根据如先前述的索引关键字在树上的配置,求出索引关键字最大值的处理相当于在树上从检索开始节点起搜索节点[1]直到到达叶节点。即,相当于在图4A、图4B所示的基本检索中进行节点位置始终为″1″的检索。即,相当于利用比特值全为″1″的检索关键字进行检索。
图9A所示的步骤S901和步骤S902相当于图4A所示的步骤S401和步骤S402,如上所述,可以将节点位置固定为″1″,因此不需要设定检索关键字而进行根据其比特值的分支。因此,可以省略相当于步骤S403的步骤。
在下一步骤S904中,从在步骤S901设定的检索开始节点起检索数组,得到索引关键字的最大值。接着,参照图9B来详细说明得到该索引关键字最大值的检索处理。
如图9B所示,在步骤S905中,在代表节点编号设定区域中设定检索开始节点所属的节点对的代表节点的数组编号。
接着在步骤S906中,在节点位置设定区域中设定表示检索开始节点在节点对中位于哪一个的节点位置。
接着进到步骤S907,从数组中读出设定在代表节点编号设定区域中的代表节点编号所指向的数组元素对,作为节点对。
接着在步骤S908中,从读出的节点对中取出在步骤S906设定在节点位置设定区域中的节点位置所指向的节点。
接着,在步骤S909中,从步骤S908或后述的步骤S917取出的节点中取出节点类别,进到步骤S910。
在步骤S910中,判定在步骤S909中取出的节点类别是否是分支节点。
如果节点类别不是分支节点,则在步骤S908或步骤S917取出的节点是叶节点,进到步骤S918,从节点中取出索引关键字作为检索结果即最大值,结束处理。
如果步骤S910的判定结果是肯定的、在步骤S909取出的节点类别是分支节点,则经过步骤S913~步骤S917的处理返回步骤S909,反复该循环处理,直至通过步骤S910的判定处理确认取出了叶节点为止。
在步骤S913中,从节点中取出代表节点编号,设定在代表节点编号设定区域中。
接着进到步骤S914,将设定在代表节点编号设定区域中的代表节点编号加1后的值存储在节点的代表节点编号中,在步骤S915中将该节点存储在搜索路径堆栈内。
接着进到步骤S916,从数组中读出设定在代表节点编号设定区域中的代表节点编号所指向的数组元素对,作为节点对。
接着在步骤S917中,从在步骤S916读出的节点对中,取出作为节点[1]的节点,返回步骤S909。然后,如上所述,反复步骤S909~步骤S917的处理,直至通过步骤S910的判定处理确认取出了叶节点为止。
图9C是说明配对节点树的最大值检索例的图,示出了图2B所例示的配对节点树中与最大值检索有关的根节点210a和节点211b以下的阶层的部分树。
在初始设定中,设定根节点210a作为检索开始节点、数组编号220作为代表节点编号,在搜索路径堆栈310中存储终端节点。并且设定根节点210a的节点位置0。
接着,从设定为代表节点编号的数组编号220所指向的节点对201a中,取出已初始设定的节点位置所指向的节点210a,进行节点类别260a的判定,由于是分支节点,因此取出代表节点编号220a设定在代表节点编号设定区域中,并且将其代表节点编号设定成210a+1的节点210a存储到搜索路径堆栈310。
接着,从代表节点编号220a所指向的节点对201b中取出作为节点[1]的节点211b,进行节点类别261b的判定,由于是分支节点,因此取出代表节点编号221b设定在代表节点编号设定区域中,并且将在代表节点编号中存储了221b+1的节点211b存储到搜索路径堆栈310。
进而,从代表节点编号221b所指向的节点对201f中取出作为节点[1]的节点211f,进行节点类别261f的判定,由于是分支节点,因此取出代表节点编号221f设定在代表节点编号设定区域中,并且将在代表节点编号中存储了221f+1的节点211f存储到搜索路径堆栈310。
进而,从代表节点编号221f所指向的节点对201h中取出作为节点[1]的节点211h,进行节点类别261h的判定,由于是叶节点,因此取出索引关键字″101100″作为最大值。
以上,对本实施方式的最小值/最大值检索处理进行了说明,如果仅仅用于最小值、最大值检索,则与基本检索的情况相同,不需要在搜索路径堆栈中推入节点。但是,在之后说明的各种处理动作中,为了活用在最小值/最大值检索中从检索开始节点到叶节点的链接路径的历史信息,说明了将链接路径的节点存储在搜索路径堆栈中的情况。
接着,参照图10A、图10B以及图10C,说明本实施方式的、求出存储在配对节点树(包含部分树)中的索引关键字下限值的下限值检索处理。这里所谓下限值是指所指定的下限关键字以上的索引关键字的最小值。
图10A以及图10B是示出求出存储在配对节点树中的索引关键字下 限值的处理的流程图。图10A和图10B所示的求出下限值的处理可应用于如下的处理:在对用户等指定的检索范围进行检索时,将实际不能得到索引关键字的范围作为对象外,对实际包含索引关键字的范围进行检索。此外,在图10A以及图10B中,省略了所指定的下限关键字的取得处理。在以后的各种应用检索中也是同样的。
首先,在步骤S1001中,设定检索开始节点。如先前图4A所示的基本检索说明所述,检索开始节点的设定是通过下述方式来进行的:通过指定或取得检索开始节点的数组编号,将该数组编号或该数组编号的节点设定在未图示的检索开始节点设定区域中。上述点在之后说明的其它应用检索中也是同样的。
接着在步骤S1002中,在搜索路径堆栈中存储终端节点。
在步骤S1003中,进行图8B所示的最小值检索处理并求出索引关键字的最小值。然后,在步骤S1004中,进行下限关键字和在步骤S1003求出的最小值的比较,并判定最小值是否是下限关键字以上。当最小值取得下限关键字以上的值时,进到步骤S1005,将在步骤S1003求出的最小值设定为下限值,结束处理。
在步骤S1004中,当判定为在步骤S1002求出的最小值小于下限关键字时,在步骤S1006中在搜索路径堆栈中存储终端节点[0],并进到步骤S1007。
在步骤S1007中将下限关键字设定为检索关键字。接着在步骤S1008中,利用该检索关键字将在步骤S1001设定的检索开始节点作为检索开始节点,通过参照图4B进行了说明的比特序列检索方法来检索数组,得到索引关键字。
然后,在步骤S1009中,比较检索关键字和作为步骤S1008的检索结果而得到的索引关键字,判定值是否一致。当判定为检索关键字和索引关键字相等时,进到步骤S1010,将通过检索得到的索引关键字设定为上述下限值,并结束处理。
当判定为检索关键字与索引关键字不相等时,进到如图10B所示的步骤S1011。
在步骤S1011中,判定检索关键字与索引关键字的大小关系。在索引关键字小于检索关键字即下限关键字时意味着,该索引关键字不包含在用户等所指定的检索范围内。
另一方面,当索引关键字大于检索关键字时意味着,该索引关键字包含在所指定的检索范围内。因此,当判定为索引关键字大于检索关键字时,进到步骤S1019,将该索引关键字设定为下限值,结束处理。
另一方面,在步骤S1011中,当判定为索引关键字小于检索关键字时,进到步骤S1012。从步骤S1012到步骤S1018的处理是根据配对节点树的顺序性以升序的方式取出索引关键字的处理。如先前所述,在配对节点树中,当使节点[1]侧和树的深度方向优先来搜索叶节点时,存储在该叶节点中的索引关键字以降序的方式排序。
因此,为了以升序的方式取出索引关键字,可以使构成节点对的节点中的节点[0]侧和树的深度优先,从节点开始依次搜索叶节点,并从各叶节点中取出索引关键字。
通过步骤S1012~步骤S1018的处理,依次取出存储在配对节点树内的索引关键字,得到取大于检索关键字即下限关键字的值的索引关键字,此时将该索引关键字设定为下限值。
首先,在步骤S1012中,从搜索路径堆栈中取出堆栈指针所指向的节点,堆栈指针的值减1。最初在步骤S1012中搜索路径堆栈的状态是执行了步骤S1008的检索处理时的状态。
接着在步骤S1013中,根据取出的节点的代表编号来得到所取出的节点的节点位置。
接着,进到步骤S1014,判定在步骤S1013中得到的节点位置是否是节点[1]侧。如果是节点[1]侧则返回步骤S1012,如果是节点[0]侧则进到步骤S1015。
在步骤S1015中,判定在步骤S1012取出的节点是否是终端节点。如果该节点是终端节点,则不存在下限值,作为检索失败而结束处理。此情况为例外的处理,是下述情况:作为求出下限值的对象的配对节点树仅由存储了比下限关键字小的索引关键字的叶节点构成。
如果步骤S1015的判定为“不是终端节点”,则进到步骤S1016,设定在步骤S1012取出的节点的代表节点编号,作为检索开始节点所属的节点对的代表节点的数组编号。
进而,在步骤S1017中,将值1设定为检索开始节点的节点位置,进到步骤S1018,执行图8B所示的最小值检索,取得索引关键字的最小值,并返回步骤S1011的下限关键字和索引关键字的大小判定处理。
上述步骤S1016和步骤S1017的处理是与图8B所示的步骤S805和步骤S806对应的处理。在步骤S1016中,设定在步骤S1012取出的节点的代表节点编号,作为检索开始节点所属的节点对的代表节点的数组编号,在步骤S805中,将该设定的在步骤S1012取出的节点的代表节点编号设定在代表节点编号设定区域中。同样,在步骤S1017中,将值1设定为检索开始节点的节点位置,在步骤S806中,将该设定的值1设定在节点位置设定区域中。
通过以上说明的步骤S1011~步骤S1018的循环处理,以升序的方式取出索引关键字,在得到大于检索关键字(下限关键字)的索引关键字时,分支到步骤S1019,将其设定为下限值。
图10C是说明配对节点树的下限值检索例的图,图10C(a)示出在图2B所例示的配对节点树中与下限值检索例有关的根节点210a和节点210b以下的阶层的部分树以及检索关键字设定区域270,在检索关键字设定区域270中设定有下限关键字″010100″。图10C(b)示出下限关键字检索后的基于下限值检索的搜索路径堆栈310的状态转变(1)、(2)、(3)。
当执行上述步骤S1008的基于下限关键字″010100″的将根节点210a作为检索开始节点的检索时,如图10C(a)中粗框所示,搜索节点210a、节点210b、节点211c、节点210d,到达作为叶节点的节点210e,并得到索引关键字″010010″。
当执行上述检索时,如图10C(b)的(1)所示,在搜索路径堆栈310中依次存储终端节点[0]和从节点210a到节点210d的搜索路径的分支节点,未图示的堆栈指针指向节点210d。并且,分支目标节点的节点位置为″1″的节点210b的代表节点编号加1,成为220b+1。
如图10C(b)所示,节点210e为下限值的搜索开始节点,在图10B所示的步骤S1011中执行存储在节点210e内的索引关键字″010010″和下限关键字″010100″的大小比较。索引关键字″010010″小于下限关键字″010100″,所以从搜索路径堆栈310中取出节点210d,堆栈指针所指向的节点如图10C(b)的(2)所示,从节点210d变为节点211c。
从节点210d的代表节点编号220d开始检测节点位置″0″。因此,将代表节点编号220d设定为图8B所示的最小值检索中的代表节点编号,对节点位置设定值″1″来执行最小值检索。于是,如图10C(b)的(2)所示,取出数组编号为220d+1的叶节点211e的索引关键字″010011″。该索引关键字也小于下限关键字,并且根据节点211c的代表节点编号221c检测到节点位置″0″,所以将代表节点编号221c设定为图8B所示的最小值检索的代表节点编号,对节点位置设定值″1″来再次执行最小值检索。于是,如图10C(b)中(3)所示,取出数组编号为221c+1的叶节点211d的索引关键字″011010″。然后,根据与下限关键字的大小比较,求出该索引关键字作为下限值。
接着参照图11A、图11B以及图11C,来说明本实施方式的、求出存储在配对节点树(包含部分树)内的索引关键字上限值的上限值检索处理。这里所谓上限值是指定的上限关键字以下的索引关键字的最大值。
图11A以及图11B是示出求出存储在配对节点树中的索引关键字的上限值的处理的流程图。图11A以及图11B所示的求出上限值的处理与先前说明的下限值检索相同,应用于以下的处理:在对用户等指定的检索范围进行检索时,将实际不能取得索引关键字的范围作为对象外,对实际包含索引关键字的范围进行检索。
该上限值检索处理是与先前说明的下限值检索处理成相对的关系的处理,根据以下说明可知,相当于在下限值检索中使节点位置0和1互换、最小值置换成最大值、大小关系互换。
首先,在步骤S1101中设定检索开始节点。接着在步骤S1102中,在搜索路径堆栈中存储终端节点。
在步骤S1103中,进行图9B所示的最大值检索处理并求出索引关键 字的最大值。然后,在步骤S1104中,进行上限关键字和在步骤S1103求出的最大值的比较,判定最大值是否是上限关键字以下。当最大值取上限关键字以下的值时,进到步骤S1105,将在步骤S1103求出的最大值设定为上限值,结束处理。
在步骤S1104中,当判定为在步骤S1102求出的最大值大于上限关键字时,在步骤S1106中,在搜索路径堆栈中存储终端节点[1],并进到步骤S1107。
在步骤S1107中将上限关键字设定为检索关键字。接着在步骤S1108中,利用该检索关键字将在步骤S1101设定的检索开始节点作为检索开始节点,通过参照图4B说明的比特序列检索方法来检索数组,得到索引关键字。
然后,在步骤S1109中,对检索关键字与作为步骤S1108的检索结果而得到的索引关键字进行比较,判定值是否一致。当判定为检索关键字与索引关键字相等时,进到步骤S1110,将通过检索得到的索引关键字设定为上述上限值,并结束处理。
当判定为检索关键字与索引关键字不相等时,进到图11B所示的步骤S1111。
在步骤S1111中,判定检索关键字与索引关键字的大小关系。在索引关键字大于检索关键字即上限关键字时意味着,该索引关键字不包含在用户等所指定的检索范围内。
另一方面,在索引关键字小于检索关键字时意味着,该索引关键字包含在所指定的检索范围内。因此,当判定为索引关键字小于检索关键字时,进到步骤S1119,将该索引关键字设定为上限值,结束处理。
另一方面,在步骤S1111中,当判定为索引关键字大于检索关键字时,进到步骤S1112。从步骤S1112到步骤S1118的处理是根据配对节点树的顺序性以降序的方式取出索引关键字的处理。如先前所述,在配对节点树中,当使节点[1]侧和树的深度方向优先来搜索叶节点时,存储在该叶节点内的索引关键字以降序的方式排序。
因此,为了以降序的方式取出索引关键字,可以使构成节点对的节 点中的节点[1]侧以及树的深度优先,从节点开始依次搜索叶节点,并从各叶节点中取出索引关键字。
通过步骤S1112~步骤S1118的处理,依次取出存储在配对节点树内的索引关键字,并得到取小于检索关键字即上限关键字的值的索引关键字,此时将该索引关键字设定为上限值。
首先,在步骤S1112中,从搜索路径堆栈取出堆栈指针所指向的节点,使堆栈指针的值减1。最初在步骤S1112中的搜索路径堆栈的状态是执行了步骤S1108的检索处理时的状态。
接着在步骤S1113中,根据所取出的节点的代表编号来得到所取出节点的节点位置。
接着进到步骤S1114,判定在步骤S1113得到的节点位置是否是节点[0]侧。如果是节点[0]侧,则返回步骤S1112,如果是节点[1]侧,则进到步骤S1115。
在步骤S1115中,判定在步骤S1112取出的节点是否是终端节点。如果该节点是终端节点,则不存在上限值,作为检索失败而结束处理。该情况为例外的处理,是下述情况:作为求出上限值的对象的配对节点树仅由存储了比上限关键字大的索引关键字的叶节点构成。
如果步骤S1115的判定为“不是终端节点”,则进到步骤S1116,设定在步骤S1112取出的节点的代表节点编号,作为检索开始节点所属的节点对的代表节点的数组编号。
进而,在步骤S1117中,将值0设定为检索开始节点的节点位置,进到步骤S1118,执行图9B所示的最大值检索,取得索引关键字的最大值,并返回步骤S1111的上限关键字与索引关键字的大小判定处理。
上述步骤S1116和步骤S1117的处理是与图9B所示的步骤S905和步骤S906对应的处理。在步骤S1116中,设定在步骤S1112取出的节点的代表节点编号,作为检索开始节点所属的节点对的代表节点的数组编号,在步骤S905中,将该设定的在步骤S1112取出的节点的代表节点编号设定在代表节点编号设定区域中。同样,在步骤S1117中,将值0设定为检索开始节点的节点位置,在步骤S906中,将该设定的值0设定在 节点位置设定区域中。
通过以上所说明的步骤S1111~步骤S1118的循环处理以降序的方式取出索引关键字,在得到小于检索关键字(上限关键字)的索引关键字时,分支到步骤S1119,并将其设定为上限值。
图11C是说明配对节点树的上限值检索例的图,图11C(a)示出图2B所例示的配对节点树中与上限值检索例有关的的根节点210a和节点211b以下的阶层的部分树、以及检索关键字设定区域270,在检索关键字设定区域270中设定有上限关键字″101001。图11C(b)示出上限关键字检索后的基于上限值检索的搜索路径堆栈310的状态转变(1)、(2)。
当执行上述步骤S1108的基于上限关键字″101001″的将根节点210a作为检索开始节点的检索时,如图11C(a)中粗框所示,搜索节点210a、节点211b、节点211f,到达作为叶节点的节点210h,得到索引关键字″101011″。
当执行上述检索时,如图11C(b)中(1)所示,在搜索路径堆栈310中依次存储终端节点[1]和从节点210a到节点211f的搜索路径的分支节点,未图示的堆栈指针指向节点211f。并且,分支目标节点的节点位置为″1″的节点210a、节点210b的代表节点编号加1,分别成为220a+1、220b+1。
如图11C(a)所示,节点210h为上限值的搜索开始节点,在图11B所示的步骤S1111中执行存储在节点210h内的索引关键字″101011″和上限关键字″101001″的大小比较。索引关键字″101011″大于上限关键字″101001″,所以从搜索路径堆栈310取出节点211f,堆栈指针所指向的节点如图11C(b)的(1)中箭头所示,从节点211f变为节点211b。
根据节点211f的代表节点编号221f检测出节点位置″0″,所以执行图11B所示的从步骤S1114到步骤S1112的循环处理。然后,在步骤S1113中取出节点211b,如图11C(b)中从(1)向(2)的虚线箭头所示,堆栈指针指向节点210a。根据节点211b的代表节点编号221b+1检测出节点位置″1″。
因此,将存储在搜索路径堆栈310内的节点211b的代表节点编号221b+1减去1得出的221b设定为图9B所示的最大值检索的代表节点编号,对节点位置设定值″1″,执行最大值检索。于是,如图11C(b)中(2)所 示,取出数组编号为220f+1的叶节点211g的索引关键字″100011″。然后,根据与上限关键字的大小比较,求出该索引关键字作为上限值。
接着,说明本实施方式的配对节点树的分割/结合处理。
这里,所谓配对节点树的分割是指,在指定了由某比特序列构成的分割关键字时,将配对节点树所包含的索引关键字根据与该分割关键字的大小关系来分成两组,并生成由属于各自组的索引关键字组成的两个配对节点树。
关于大小关系的分割,在以下说明中被分割为大于分割关键字的组和分割关键字以下的组,但根据以下的说明可容易地理解:即使在分割成分割关键字以上的组和小于分割关键字的组的情况下,也可同样地进行分割/结合。
总之,分割关键字是用来决定在哪儿分割配对节点树的关键字。
另外,所谓配对节点树的结合是指,根据与两个索引关键字的集合对应的两棵配对节点树,来生成与两个索引关键字集合的和集合对应的配对节点树。在本发明中,前提是两个索引关键字集合的积集合是空的。
以下,作为配对节点树的分割/结合处理,说明三个实施例,在此说明中,有时将配对节点树简单称为树。
第1实施例是,取出作为分割对象的处理源树(以下,有时简单称为处理源。)的索引关键字的最小值,将所取出的索引关键字的最小值插入通过处理源的分割而生成的处理目标树(以下,有时简单称为处理目标。),在最小值为分割关键字以下的期间,反复进行从处理源树中删除索引关键字最小值的处理,由此从作为分割对象的处理源树中分割处理目标树。
参照图12A和图12B,说明第1实施例的配对节点树的分割处理流程。
图12A是第1实施例的分割处理的前级处理即关于处理目标的初始设定等的处理的图。
在最开始的步骤S1201中,将所指定的分割关键字设定为处理源的分割关键字。关于分割关键字的指定,可以是操作者从外部输入的情况、基于某计算机程序的处理结果的情况、或基于来自远方的指令的情况等。 所指定的分割关键字被设定在对处理源的分割关键字进行保持的存储器上的区域中。
接着在步骤S1202中,将处理源的根节点设定成处理源的检索开始节点,在步骤S1202a中,在处理源的搜索路径堆栈内存储终端节点,进到步骤S1203。
在步骤S1203中,从处理源的检索开始节点、即在步骤S1202中设定为检索开始节点的根节点开始,进行图8B所示的最小值检索,并求出最小值。
接着在步骤S1204中,判定该最小值是否大于分割关键字。如果处理源的最小值从最开始起就比分割关键字大,则在处理源中不包含分割关键字以下的索引关键字,所以在此处理结束。以上的初始处理在第2、第3分割处理中也是同样的。
如果在步骤S1203的最小值检索中得到的最小值比分割关键字小,则进到步骤S1205,将该最小值设定为处理目标的插入处理中的插入关键字。
接着在步骤S1206中,执行图6B所示的对根节点设定含有插入关键字的叶节点(插入节点)的处理。然后,进到步骤S1207,登记插入节点的数组编号作为处理目标的根节点的数组编号,在步骤S1208中,设定处理目标的根节点作为处理目标的检索开始节点,由此使处理目标的初始设定结束,转移到图12B所示的步骤S1209。
图12B是说明第1实施例的分割处理的后级处理的图。
如图12B所示,在步骤S1209中,将步骤S1205或后述步骤S1214中的插入关键字设定为处理源的删除处理中的删除关键字,在步骤S1210中,通过图7A、图7B所示的删除处理,从处理源树中删除包含删除关键字的叶节点。
在下一步骤S1211中,判定处理源树是否已登记。该判定结果为未登记是意味着处理源树已全部删除完毕,所以例外的情况是分割关键字大于等于处理源树的索引关键字的最大值,在此情况下结束处理。
如果处理源树已登记,则转移到步骤S1212,将在步骤S1202中设 定为检索开始节点的根节点作为最小值检索的检索开始节点,执行图8A所示的最小值检索处理,得到索引关键字的最小值。
接着,进到步骤S1213,判定在步骤S1212得到的最小值是否大于分割关键字。如果最小值大于分割关键字,则树的分割完成所以结束处理,如果最小值小于等于分割关键字,则转移到步骤S1214。
在步骤S1214中,将在步骤S1212得到的最小值设定为处理目标的插入处理中的插入关键字。
接着在步骤S1215中,通过图5A、图5B所示的树的插入处理,执行基于插入关键字向处理目标插入节点,并返回到作为从处理源树删除节点的删除处理的步骤S1209、步骤S1210。
反复以上的步骤S1209~步骤S1215的循环处理,直至在步骤S1213中判定为在步骤S1212得到的最小值大于分割关键字为止,由此来实现树的分割。
在上述分割处理的说明中,从处理源的索引关键字的最小值开始依次进行删除,但本领域技术人员可知同样地可以从索引关键字的最大值开始依次进行删除。在此情况下,步骤S1203和步骤S1212成为求出索引关键字最大值的处理,步骤S1204和步骤S1213是最大值与分割关键字的大小关系的判定处理,在步骤S1214中,将最大值设定为处理目标的插入关键字。
以上,对分割处理进行了说明,结合处理也可以根据图12A以及图12B所示的处理流程来执行。
结合处理将要结合的两棵树中的某一棵作为处理源树,如果分割关键字为处理源树的索引关键字的最大值以上,则相当于先前所述的例外处理,删除处理源树,并与处理目标树结合。此外,在处理源树的索引关键字的最大值是未知的情况下,通过之前图9A所示的最大值检索处理来求出分割关键字。
然后,由于处理目标已经登记完毕,因此可省略步骤S1205~步骤S1207,由于处理源的分割关键字设为处理源树的索引关键字的最大值以上,因此在步骤S1204和步骤S1213的大小比较中,分割关键字始终大 于最小值,分支到步骤S1205或步骤S1214,因此可以省略步骤S1204以及步骤S1213。如果是这样则没有设定分割关键字的意义,最终不需要步骤S1201,可以仅通过反复最小值检索、插入处理和删除处理来进行结合处理。
另外,如对分割处理的叙述可知,可以通过反复最大值检索、插入处理和删除处理来进行结合处理。
本实施例的处理逻辑虽然简易,但反复进行将处理源的根节点作为检索开始节点的最小值检索,并以索引关键字为单位进行插入删除,所以执行时的处理步骤数增加。
接着,对本实施方式的分割/结合处理的第2实施例进行说明。
本实施例与第1实施例的相同点是以索引关键字为单位进行插入删除,但在搜索应插入删除的索引关键字中活用搜索路径堆栈,减少插入处理和删除处理执行时的处理步骤数。
参照图13A以及图13B,说明第2实施例的配对节点树的分割处理流程。
图13A是说明第2实施例的分割处理的前级处理即关于初始设定的处理的图。
在最开始的步骤S1301中,将所指定的分割关键字设定为处理源的分割关键字。如第1实施例所述,关于分割关键字的指定,可以是操作者从外部输入的情况、基于某计算机程序的处理结果的情况、或基于来自远方的指令的情况等。所指定的分割关键字被设定在对处理源的分割关键字进行保持的存储器上的区域中。
接着在步骤S1302中,将处理源的根节点设定为处理源的检索开始节点,并进到步骤S1302a,在处理源的搜索路径堆栈中存储终端节点。
接着在步骤S1303中,从处理源的检索开始节点、即在步骤S1302中设定为检索开始节点的根节点开始,进行图8B所示的最小值检索,求出最小值。
接着在步骤S1304中,判定该最小值是否大于分割关键字。如果处理源的最小值从一开始就大于分割关键字,则在处理源中不包含分割关 键字以下的索引关键字,所以在此处理结束。
如果在步骤S1303的最小值检索中得到的最小值是分割关键字以下,则进到步骤S1306~步骤S1310的处理目标的初始设定处理。
在步骤S1306中,将在步骤S1303得到的最小值设定为插入关键字。接着在步骤S1307中,执行图6B所示的对根节点设定包含插入关键字的叶节点(插入节点)的处理。然后,进到步骤S1308,登记插入节点的数组编号作为处理目标的根节点的数组编号,在步骤S1309中设定处理目标的根节点作为处理目标的检索开始节点。进而,在步骤S1310中,在处理目标的搜索路径堆栈中存储终端节点来完成处理目标的初始设定处理,转移到图13B所示的步骤S1311以后的后级处理。
图13B是说明第2实施例的配对节点树的分割处理的后级的图。
在步骤S1311中,从处理源将删除节点删除,之后得到复制有与删除节点成对的节点的内容的该节点的父节点(处理源的父节点)。在后文中,参照图15来详细说明步骤S1311的处理以及删除节点和处理源的父节点。
接着在步骤S1312中,判定处理源是否已登记。与实施例1的情况相同,如果处理源未登记则意味着处理源树已全部删除完毕,因此例外的情况是分割关键字大于等于处理源树的索引关键字的最大值,在此情况下处理结束。
如果处理源已登记,则进到步骤S1313,对处理源的检索开始节点设定在步骤S1311得到的处理源的父节点,进入步骤S1314,执行图8B所示的最小值检索来得到最小值。
如之后所说明的那样,处理源的父节点是紧接着删除节点的上位的分支节点。删除节点包含处理源的索引关键字的最小值,根据先前所述的索引关键字的顺序性,下一个要检索的最小值位于处理源的父节点的下位。因此,在步骤S1314中最小值检索的检索开始节点不是根节点而是处理源的父节点,由此可以降低处理步骤数。
接着在步骤S1315中,判定在步骤S1314得到的最小值是否大于分割关键字。如果最小值大于分割关键字,则树的分割完成,所以结束处 理,如果小于等于分割关键字则进到步骤S1316。
在步骤S1316中,从处理目标的检索开始节点开始执行图9B所示的最大值检索,得到最大值。对于处理目标的检索开始节点,在最初处理中是在步骤S1309设定的处理目标的根节点,此后是在后述的步骤S1318中设定的。
接着进到步骤S1317,根据在步骤1303或后述的步骤S1314中得到的最小值和在步骤S1316中得到的最大值,来求出待插入节点对的处理目标的父节点,并对处理目标的该父节点插入包含该最小值的节点对。该处理是与图12B所示的步骤S1215的插入处理不同的本实施例特有的处理,关于步骤S1317的处理和处理目标的父节点,在后文中参照图14来详细说明。
接着在步骤S1318中,对处理目标的检索开始节点设定处理目标的父节点,返回步骤S1311。
反复以上的步骤S1311~步骤S1318的循环处理,直至在步骤S1315中判定为在步骤S1314得到的最小值大于分割关键字为止,由此来实现树的分割。
图14是说明与图13B所示的步骤S1317对应的处理目标节点对的插入处理流程的图。
如图14所示,在步骤S1401中,从数组中取得节点对为空的代表节点的数组编号,设定为代表节点编号。
接着在步骤S1402中,将在步骤S1401设定的代表节点编号加上值″1″后得到的数组编号设定为插入节点的数组编号,在步骤S1403中,将代表节点编号加上值″0″后得到的数组编号设定为与插入节点成对的对节点的数组编号。
接着在步骤S1404中,对在图13B所示的步骤S1314得到的最小值即插入关键字与在步骤S1316得到的最大值以比特序列进行比较,求出从上位第0比特起观察到的第一个不一致比特的位置,将其设定在差分比特位置存储区域中。
接着进到步骤S1405,执行图5C所示的步骤S518以后的、求出插 入节点对的位置、写入节点对的各节点内容使插入处理完成的处理,然后结束处理。
上述步骤S1401~步骤S1404的处理相当于:由图5B所示的步骤S512~步骤S517构成的、准备用于待插入节点对的数组元素的处理。另外,图13B所示的步骤S1316的处理目标的最大值检索相当于作为图5A所示的插入处理前级的处理目标的检索处理。在本实施例的情况下,处理源的最小值始终大于处理目标的最大值,所以如果在步骤S513中进行设定则布尔值为1,因此,在步骤S1402的插入节点的数组编号成为对在步骤S1401设定的代表节点编号加上值1后所得的值。
在以上的准备了用于待插入节点对的数组元素的处理之后,通过步骤S1405的处理,来结束插入处理。
图15是说明与图13B所示的步骤S1311对应的处理源的删除处理的图。
在初始步骤S1501中,从处理源的搜索路径堆栈中取出堆栈指针所指向的节点,堆栈指针后退1。这里,在处理源的搜索路径堆栈中,通过在图13A所示的步骤S1303或图13B所示的步骤S1314中执行的最小值检索而存储有节点,堆栈指针指向存储有最小值的叶节点所紧接着的上位分支节点、或者终端节点(根节点是叶节点的情况)。
在下一步骤S1502中,判定在步骤S1501取出的节点是否是终端节点。如果该节点是终端节点,则转移到步骤S1511,删除根节点的数组编号所指向的节点对,在步骤S1512中,去除根节点的数组编号登记,返回“没有登记处理源”。
如果在步骤S1501中取出的节点不是终端节点,则进到步骤S1503,将在步骤S1501中取出的节点的代表节点编号设定为删除节点的数组编号。即,删除节点是存储有最小值的叶节点。
接着进到步骤S1504,从处理源的搜索路径堆栈中取出堆栈指针所指向的节点,堆栈指针后退1。这里,处理源的搜索路径堆栈的堆栈指针指向存储有最小值的叶节点所紧接着的上位分支节点的再紧接着的上位分支节点、或者终端节点(仅在分支节点为根节点时)。
接着在步骤S1505中,判定该取出的节点是否是终端节点。
如果在步骤S1504取出的节点不是终端节点,则分支到步骤S1506,从该节点取出代表节点编号,设定在存储处理源的父节点的数组编号的区域中,并且保存该父节点的代表节点编号,然后进到步骤S1508。
如果在步骤S1504取出的节点是终端节点,则分支到步骤S1507,将根节点的数组编号设定在存储处理源的父节点的数组编号的区域中,并且保存该父节点的代表节点编号,进到步骤S1507a。在步骤S1507a中,为了消除堆栈指针的下溢,使处理源的搜索路径堆栈的堆栈指针前进1,进到步骤S1508。
此外如上所述,在步骤S1504取出的节点是位于比删除节点上位两个的分支节点。因此,从该分支节点取出的代表节点编号是指向存储有删除节点所紧接着的上位分支节点的数组元素的数组编号。即,处理源的父节点是删除节点所紧接着的上位分支节点。另外,所保存的父节点的代表节点编号是配置有删除节点的数组元素的数组编号。
在步骤S1508中,将与删除节点成对的节点的数组编号设定在存储对节点的数组编号的区域中。
接着在步骤S1509中,读出在步骤S1508设定的对节点的数组编号所指向的数组元素的内容,存储在步骤S1506或步骤S1507中设定的处理源的父节点的数组编号所指向的数组元素中。
接着在步骤S1510中,删除所保存的父节点的代表节点编号所指向的节点对,返回“登记了处理源”。
通过上述处理,删除由删除节点和对节点构成的节点对,将删除节点的对节点的内容存储在删除节点所紧接的上位分支节点即父节点中,并且将该父节点的数组编号设定在存储处理源的父节点的数组编号的区域中,在图13B所示的步骤S1313中用于设定下一个最小值检索的检索开始节点。
以上,对第2实施例的树分割处理进行了说明,但即使在本实施例中也与第1实施例的情况相同,可以从索引关键字的最大值开始依次进行删除。
另外,与第1实施例的情况相同,可以将分割处理的处理流程用于树的结合处理。进行下述处理即可:将要结合的两棵树中的任一棵作为处理源树,将分割关键字设为处理源树的索引关键字的最大值以上或最小值以下,进行处理源树的删除处理,将所删除的节点插入处理目标树。
接下来,对本实施方式的分割/结合处理的第3实施例进行说明。
以上说明的第1实施例和第2实施例的分割/结合处理以索引关键字为单位进行插入删除。第3实施例以关注配对节点树的顺序性的、满足规定条件的、配对节点树的较大部分树为单位,进行插入删除。
图16A以及图16B是说明第3实施例的配对节点树的分割处理流程的图。另外,图22A~图22C通过实例来说明上述分割处理的图,例示了与图2B所例示的配对节点树类似的树。图22A示出分割前的树结构例,图22B示出第一次分割后的树结构例,图22C示出下一次分割后的树结构例。此外,在图22A~图22C中还记载了处理源的搜索路径堆栈和其堆栈指针所指向的节点。
首先参照图16A,说明本实施例的作为分割处理前级的初始处理。
将在最初的步骤S1601中指定的分割关键字设定为处理源的分割关键字。如第1和第2实施例所述,分割关键字的指定,可以是操作者从外部输入的情况、基于某计算机程序的处理结果的情况、或基于来自远方的指令的情况等。所指定的分割关键字被设定在对处理源的分割关键字进行保持的存储器上的区域中。
在图22A的例示中,分割关键字等于节点211g的索引关键字251g的″100011″。此外如先前所述,取得的分割关键字不需要包含在处理源内,但如之后所说明的那样,在本实施例中需要根据所取得的分割关键字来求出处理源的上限值或下限值,将处理源所包含的索引关键字作为新的分割关键字。因此,在以下的说明中,将分割关键字作为处理源所包含的关键字来进行说明。
接着在步骤S1602中,将处理源的根节点设定为处理源的检索开始节点,进到步骤S1602a,在处理源的搜索路径堆栈中存储终端节点。
接着在步骤S1603中,从处理源的检索开始节点、即在步骤S1602 设定成检索开始节点的根节点起,进行图8B所示的最小值检索,求出最小值。
接着在步骤S1604中,判定该最小值是否大于分割关键字。如果处理源的最小值从一开始就大于分割关键字,则在处理源中不包含分割关键字以下的索引关键字,因此这里处理结束。
如果在步骤S1603的最小值检索中得到的最小值是分割关键字以下,则进到步骤S1605~步骤S1606的处理源的初始设定处理和步骤S1608~步骤S1608b的处理目标的初始设定处理。
在步骤S1605中,利用分割关键字来求出处理源的分割节点。分割节点是包含分割关键字作为最大值的部分树中最大树(以下,称为分割节点树。)的根节点。在图22A的例示中,如图22A(a)的(1)所示,节点210f是分割节点,用虚线包围的部分树是分割节点树291。步骤S1605的求出分割节点的处理将参照图17A以及图17B在后文中详细说明。
接着进到步骤S1606,将堆积在处理源的搜索路径堆栈内的终端节点设为终端节点[1]。在进入到步骤S1606的阶段,堆积在处理源的搜索路径堆栈中的终端节点,如之后所说明的那样是终端节点[0],不过为了之后参照图19说明的求出处理源的下一分割节点的处理,置换成终端节点[1]。
接着进到步骤S1608,将在步骤S1605求出的分割节点设定成处理目标的根节点,登记为处理目标的根节点。接着进到步骤S1608a,在处理目标的检索开始节点中设定处理目标的根节点。并且,进到步骤S1608b,在处理目标的搜索路径堆栈中存储终端节点,使与处理目标相关的初始处理结束,以完成前级处理,进到图16B所示的步骤S1609以后的处理。另外,步骤S1608的处理在后文中参照图18A进行详细说明。
在图22A的例示中刚开始分割处理,如图22A的(b)所示,处理目标不存在而没有被登记,所以将分割节点210f的内容作为处理目标,存储在新取得的节点对201i的代表节点210i中,设定成处理目标的根节点,登记为处理目标的根节点。结果,如图22B(b)所示,生成由被插入的分割节点树291组成的处理目标的树。
另一方面,在图22B(a)的(1)中示出了从处理源删除了将节点210f作为分割节点的分割节点树291的树结构,用虚线包围的方式示出了将分割节点210b作为根节点的下一分割节点树292。
接下来参照图16B,说明本实施例中作为分割处理后级的从处理源删除分割节点树和插入到处理目标的处理。
在步骤S1609中,从处理源删除分割节点树,得到该节点的父节点。
在图22C(b)的例示中,示出了将根节点210i作为插入位置、经由新取得的节点对201j将下一分割节点树292插入处理目标的树结构。另外,在图22C(a)的(1)中,示出了从图22B(a)的(1)所示的树结构中删除下一分割节点树292后的结构。另外,步骤S1609的删除处理在后文中参照图21来详细说明。
接着进到步骤S1610,判定处理源是否已登记,如果未登记,则结束处理。该判定结果未登记意味着处理源树已全部删除,因此是分割关键字大于等于处理源树的索引关键字的最大值的例外情况。
如果步骤S1610的判定结果为已登记,则进到步骤S1611,检索处理源,求出下一分割节点。步骤S1611中求出下一分割节点的处理在后文中参照图19来详细说明。
在步骤S1611之后的步骤S1612中,判定在步骤S1611中是否求出了分割节点。如果没有求出分割节点,则分割处理结束。
如果求出了分割节点,则在步骤S1613中,求出将该分割节点作为根节点的部分树的分割节点树的最大值,作为下一分割关键字。另外,在后文中参照图20来详细说明步骤S1613中求出分割节点的最大值作为下一分割关键字的处理。
接着在步骤S1614中,对处理目标的检索开始节点设定处理目标的插入位置的节点。显然在刚插入到处理目标的分割节点树中含有处理目标的最小值,因此将刚插入的分割节点、例如在图22C(b)所例示的处理目标中,将节点210j的数组编号220j(插入位置)设定为检索开始节点的数组编号,由此与将根节点作为检索开始节点的情况相比,可以减轻最小值检索的处理。
在步骤S1614之后,进到步骤S1615。
在步骤S1615中,从处理目标的检索开始节点起,通过图8B所示的最小值检索,从数组中得到索引关键字的最小值。
接着在步骤S1616中,对在步骤S1613设定的作为下一分割节点树的最大值的分割关键字、和在步骤S1615得到的处理目标的最小值进行比特序列比较,求出从上位第0比特起观察到的第一个不一致比特位置,设定为差分比特位置。在图22B的例示中,下一分割节点树292的最大值是索引关键字251c″011010″,处理目标的最小值是索引关键字250g″100010″,所以差分比特位置是″0″。
接着进到步骤S1617,将处理目标的根节点作为插入位置向处理目标插入分割节点树,返回步骤S1609。步骤S1617中分割节点树的插入处理在后文中参照图18B来详细说明。
在以上步骤S1609~步骤S1617的循环处理中,反复进行下一分割节点树的插入、删除处理以及求出再下一分割节点的处理,直至不能求出分割节点为止。
在本实施例中如上所述以分割节点树为单位进行删除插入处理,所以削减了处理步骤数。
接下来,参照图17A和图17B,详细说明图16A所示的步骤S1605中求出分割节点(第一个分割节点)的处理。
图17A是说明求出第一个分割节点的处理的前级处理的流程图。
如图17A所示,在步骤S1701中将分割关键字设定为检索关键字,在步骤S1702中将处理源的根节点设定为检索开始节点。接着进到步骤S1703,在处理源的搜索路径堆栈中存储终端节点[0]。
接着进到步骤S1704,执行图4B所示的检索处理,作为检索结果得到与分割关键字相等的索引关键字,结束前级处理,进到图17B所示的后级处理。
参照图17B来说明后级的处理,但在此之前,再次参照图22A,说明在本实施例中将分割关键字作为处理源所包含的索引关键字的必要性。
当前,假设利用分割关键字″100001″对图22A(a)的(1)所示的处理源进行分割。当利用该分割关键字执行图17A所示的步骤S1704的检索处理时,作为检索结果得到的索引关键字是索引关键字251g的″100011″。但是,这是因为:应作为分割点的索引关键字是存储在叶节点211c中的以″100001″为上限的上限值″011010″、或者存储在叶节点210g中的以″100001″为下限的下限值″100010″,无论在哪种情况下都与利用分割关键字″100001″进行检索的结果不一致。
因此,在求出分割节点之前,需要通过如图10A、图10B所示或如图11A、图11B所示的处理来求出下限值或上限值,将分割关键字根据其定义作为处理源所包含的索引关键字而求出。
接下来,说明求出第一个分割节点的处理流程的后级处理。
图17B是说明求出第一个分割节点的处理的后级处理的流程图。后级的处理是,追溯处理源的搜索路径堆栈,求出所取出节点的节点位置第一次为节点[0]侧的节点,将其代表节点编号设定为分割节点的数组编号。换言之,追溯处理源的搜索路径堆栈,将第一个节点[0]作为分割节点。
如图17B所示,在步骤S1705中从搜索路径堆栈中取出节点,堆栈指针减1。除了处理源仅由根节点构成这样的例外情况之外,这里最初取出的节点是包含利用分割关键字检索出的检索结果的索引关键字在内的叶节点所紧接的上位分支节点。
接着进到步骤S1706,根据节点的代表节点编号,得到配置在该代表节点编号所指向的数组元素中的节点的节点位置。
接着在步骤S1707中,判定在步骤S1706得到的节点位置是否是节点[1]侧。如果判定结果是节点[1]侧,则返回步骤S1705的处理,如果是节点[0]侧,则进到步骤S1708。
在步骤S1708中,判定在步骤S1705取出的节点是否是终端节点。作为判定结果,如果是终端节点,则进到步骤S1710,将根节点的代表节点编号设定为分割节点的数组编号,结束处理。
如果步骤S1708的判定结果不是终端节点,则进到步骤S1709,将 在步骤S1705得到的节点的代表节点编号设定为分割节点的数组编号,结束处理。
在图22A所示的例子中,当将根节点210a设定为检索开始节点、利用分割关键字″100011″执行检索处理时,得到作为检索结果的索引关键字251g,在图22A(a)的(2)所示的搜索路径堆栈310中依次堆入终端节点[0]、节点210a、211b、210f。(节点210a、210f的代表节点编号分别加1。)
因此,在图17B所示的步骤S1705的最初处理时,搜索路径堆栈的堆栈指针指向节点210f,在步骤S1706中根据代表节点编号220f+1得到节点位置1。因此,作为步骤S1707的判定处理结果,返回步骤S1705,在下一步骤S1707中根据指针返回一个的节点211b的代表节点编号221b来判定节点位置0,经由步骤S1708的判定转移到步骤S1709,将在步骤S1705取出的节点211b的代表节点编号221b、即节点210f的数组编号221b设定为分割节点的数组编号。然后,在图22A(a)的(2)中如箭头所示,处理源的搜索路径堆栈310的堆栈指针指向节点210a。
此外,在步骤S1708的判定为终端节点例如是这样的情况:将如图22A所示的节点210f作为根节点的树是处理源,分割关键字是″100011″。在该情况下,在第2次的步骤S1707中,根据指针从根节点210f返回一个的终端节点[0]的代表节点编号,来判定节点位置0,在步骤S1708中判定为是终端节点,转移到步骤S1710,将根节点210f的代表节点编号220f、即节点210g的数组编号220f设定为分割节点的数组编号。
这里,在进一步对分割处理进行说明之前,先说明以下情况:分割关键字是分割节点树的最大值,分割节点树是以分割关键字为最大值的处理源的部分树中最大的部分树,如果换一种表达方式,则是该根节点的鉴别比特位置为最上位的部分树。
根据到目前为止的说明可知,分割节点是对在利用分割关键字进行检索时到达分割关键字的路径进行追溯,第一个节点[0]。
如果包含分割关键字作为索引关键字的叶节点是节点[0],则该叶节点是分割节点本身,分割节点树仅由一个叶节点构成。由于配对节点树的顺序性,与该叶节点成对的位于节点[1]侧的叶节点的索引关键字均大 于分割关键字。因此,在当前的情况下,在将比分割关键字上位的分支节点作为根节点的部分树中,分割关键字不可能是最大值,因此分割关键字是分割节点树的最大值,分割节点树是以分割关键字为最大值的处理源的部分树中最大的节点树。
如果包含分割关键字作为索引关键字的叶节点是节点[1],则追溯树搜索节点[1]侧,根据配对节点树的顺序性,无论在哪个将节点[1]作为根节点的部分树中,上述分割关键字都是这些部分树的最大值。并且,在追溯到节点[0]时,在其以上的上位节点的下位存在与该节点[0]成对的节点[1]以下的节点,在这些节点中存在包含大于上述分割关键字的索引关键字在内的叶节点。
因此,将上述节点[0]即分割节点作为根节点的部分树是包含上述分割关键字作为最大值的最大部分树。
下面,继续参照图18A以下的图来说明分割处理。
图18A是说明图16B所示的步骤S1608中处理目标的根节点的插入处理的流程图。
在步骤S1801中,将在图16A所示的处理流程的步骤S1605、即图17B所示的步骤S1709或步骤S1710中求出的存储有分割节点的数组元素的数组编号设定为插入节点的数组编号。
接着在步骤S1802中,从数组中取得空节点对的代表节点的数组编号。
接着在步骤S1803中,将在步骤S1802取得的数组编号设定为节点[0]的数组编号。
接着在步骤S1804中,读出在步骤S1801设定的插入节点的数组编号所指向的数组元素的内容,存储在步骤S1803所设定的节点[0]的数组编号所指向的数组元素中。
最后在步骤S1805中,将节点[0]的数组编号登记为处理目标的根节点的数组编号,结束根节点的插入处理。
在图22A以及图22B(b)的例示中,将存储有分割节点210f的数组元素的数组编号221b设定成插入节点的数组编号,将所取得的空节点对 201i的代表节点编号220′设定为节点[0]的数组编号。
然后,将数组编号221b所指向的数组元素的内容、即分割节点210f的内容存储在数组编号220′所指向的数组元素、即节点210i中,将数组编号220′登记为处理目标的根节点的数组编号。
图18B是说明图16B所示的步骤S1617中根节点以外的插入处理的流程图。
首先在步骤S1811中,将图16B所示的处理流程的步骤S1611所求出的存储有分割节点的数组元素的数组编号设定为插入节点的数组编号。该步骤S1811与图18A所示的步骤S1801的不同点仅在于,求出分割节点的处理步骤不是步骤S1605而是步骤S1611。
接着在步骤S1812中,设定处理目标的根节点的数组编号作为处理目标的插入位置。
接下来的步骤S1813~步骤S1815与图18A所示的根节点的插入处理的步骤S1802~步骤S1804是同样的。
在步骤S1813中,从数组中取得空节点对的代表节点的数组编号,接着在步骤S1814中,将在步骤S1813取得的数组编号设定为节点[0]的数组编号,接着在步骤S1815中,读出在步骤S1811设定的插入节点的数组编号所指向的数组元素的内容,存储在步骤S1814所设定的节点[0]的数组编号所指向的数组元素中。
接着进到步骤S1816,将在步骤S1813取得的数组编号与值1相加所得的值设定为节点[1]的数组编号。
接着在步骤S1817中,读出在步骤S1812设定的处理目标的插入位置的数组编号所指向的数组元素的内容,存储在步骤S1816所设定的节点[1]的数组编号所指向的数组元素中。
最后在步骤S1818中,对节点类别设定分支,对鉴别比特位置设定在图16B所示的步骤S1616中求出的差分比特位置,对代表节点编号设定在步骤S1814中设定的节点[0]的数组编号,来形成分支节点,并存储在步骤S1812所设定的处理目标的插入位置的数组编号所指向的数组元素中,结束处理。
在图22B以及图22C(b)的例示中,将存储有分割节点210b的数组元素的数组编号220a设定为插入节点的数组编号,设定根节点210i的数组编号220′作为处理目标的插入位置。另外,将所取得的空节点对201j的代表节点的数组编号220j设定为节点[0]的数组编号。
然后,将插入节点的数组编号220a所指向的数组元素的内容、即分割节点210b的内容作为节点210j存储在节点[0]的数组编号220j所指向的数组元素中。
另一方面,在数组编号220j与1相加所得的值(即数组编号220j+1)所指向的数组元素即节点211j中,存储有处理目标的插入位置的数组编号220′所指向的数组元素即图22B(b)所示的根节点210i的内容。
然后在图22C(b)所示的根节点210i的鉴别比特位置230i中,存储有先前在关于图16B的步骤S1616的例示中说明的分割节点树292的最大值即索引关键字251c″011010″和处理目标的最小值即索引关键字250g″100010″的差分比特位置″0″。另外,在代表节点编号中存储有节点[0]的数组编号220j。
根据上述说明理解可知,生成插入目标后的插入处理为:在插入目标的根节点的正下方插入由分支节点构成的节点对,在该节点对的节点[1]以下连接已有的处理目标的根节点以下的部分树,在节点[0]连接分割节点树。通过此处理,可确保插入分割节点树后的插入目标的顺序性。
图19是说明图16B所示的步骤S1611中的求出下一分割节点的处理的处理流程的图。
在步骤S1901中,从搜索路径堆栈中取出节点,使搜索路径堆栈的堆栈指针减1。堆栈指针的初始值是图16B所示的步骤S1609的删除处理结束时的值,在之后参照图21的删除处理的说明中可知,堆栈指针的初始值指向比分割节点(在删除处理中是删除节点)上位两个的节点。
接着进到步骤S1902,根据在步骤S1901取出的节点的代表节点编号,得到存储在该代表节点编号所指向的数组元素中的节点的节点位置。
接着在步骤S1903中,判定在步骤S1902得到的节点位置是否是节点[0]侧。如果是节点[0]侧,则返回到步骤S1901,如果是节点[1]侧,则 转移到步骤S1904。
在步骤S1904中,判定节点是否是终端节点。如果节点是终端节点,则返回“没有分割节点”。
如果节点不是终端节点,则进到步骤S1905,将在S1901取出的节点的代表节点编号减去值1后得到的节点[0]的数组编号设定为分割节点的数组编号,返回“有分割节点”。
在图22A以及图22B的例示中,在求出下一分割节点的阶段,处理源的搜索路径堆栈310的堆栈指针如先前所述,如图22A(a)的(3)所示,指向比分割节点210f上位两个的根节点210a,在存储在搜索路径堆栈310内的根节点210a的代表节点编号中设定有220a+1,所以节点位置为节点[1]侧,位于与其成对的节点[0]侧的节点210b成为下一分割节点,将存储有该节点的数组元素的数组编号即220a设定为分割节点的数组编号。
此外,如图22A(a)的(3)所示,存储在搜索路径堆栈310内的终端节点,在图16A所示步骤S1606中,从终端节点[0]变更为终端节点[1]。
另外,在图22B以及图22C的例示中,在进一步求出下一分割节点的阶段,处理源的搜索路径堆栈310的堆栈指针如图22B(a)的(3)所示,指向终端节点[1],所以从步骤S1903进到步骤S1904,通过步骤S1904的判定而返回没有分割节点。即,当分割节点的父节点为根节点时不存在下一分割节点。这从配对节点树的顺序性看来,是显而易见的。
图20是说明图16B所示的步骤S1613的处理流程的图,在该步骤S1613中,对将步骤S1611求出的分割节点作为根节点的分割节点树求取最大值,作为下一分割关键字。
首先在步骤S2001中,保存处理源的搜索路径堆栈的堆栈指针的值。其理由是:通过图19所示的步骤S1901的处理而指向比分割节点上位两个的节点的处理源的堆栈指针的值,该值由于后述步骤S2003的最大值检索而发生变动,变得不能在后述图21所示的步骤S2104中使用。
接着在步骤S2002中,将在图19所示的步骤S1905中设定的分割节点的数组编号设定为检索开始节点的数组编号。
然后在步骤S2003中,执行图9B所示的最大值检索,求出索引关键 字的最大值。
接着进到步骤S2004,将在步骤S2003中得到的最大值设定为分割关键字。
最后在步骤S2005中,将在步骤S2001保存的值作为处理源的搜索路径堆栈的堆栈指针的值进行复原,结束处理。
在图22B(a)的例示中,如(1)所示,将分割节点210b作为检索开始节点进行最大值检索,求出索引关键字251c″011010″作为最大值。此时,搜索路径堆栈310的堆栈指针被保存复原,图22B(a)的(3)所示的搜索路径堆栈的堆栈指针指向与图22B(a)的(2)所示的节点相同的节点。
以上,根据参照图19以及图20而详细说明的内容可知,图16B所示的步骤S1611中求出的下一分割节点和步骤S1613中求出的下一分割关键字的关系,与先前说明的图16A所示的步骤S1601中设定的分割关键字和步骤S1605中求出的分割节点或分割节点树的关系是相同的。
在上述步骤S1613中求出的下一分割关键字是将在步骤S1611中求出的下一分割节点作为根节点的分割节点树的最大值。另外,在步骤S1611中求出的下一分割节点是节点[0],所以将比其上位的节点作为根节点的部分树包含下述叶节点,该叶节点存储有比在步骤S1613中求出的下一分割关键字大的索引关键字,这一点也可以根据配对节点树的顺序性而得出。
图21是说明图16B所示的步骤S1609中的分割节点树的删除处理的处理流程的图。虽然都是删除处理存在类似的地方,但图15所示的删除处理是对作为存储有删除关键字的叶节点的删除节点进行删除,与此相对,图21所示的处理基本上是对作为分支节点的分割节点进行删除,从处理源删除将该分割节点作为根节点的分割分支节点树。
首先在步骤S2101中,将在图16A所示的步骤S1605或图16B所示的步骤S1611中求出的分割节点的数组编号设定为处理源的删除节点的数组编号。
接着在步骤S2102中,判定在步骤S2101设定的删除节点的数组编号是否与处理源的根节点的数组编号一致。在删除节点的数组编号与处 理源的根节点的数组编号一致时,进到步骤S2111,删除处理源的根节点的数组编号所指向的节点对,接着在步骤S2112中除去处理源的根节点的数组编号的登记,返回“没有登记处理源”,然后结束处理。
作为步骤S2102的判定处理结果,在删除节点的数组编号与处理源的根节点的数组编号不一致时,进到步骤S2104,从处理源的搜索路径堆栈中取出堆栈指针所指向的节点。此外,通过图17B所示的步骤S1705或图19所示的步骤S1901的处理,该堆栈指针存储比分割节点上位两个的节点。
接着在步骤S2105中,判定该取出的节点是否是终端节点。当判定为该取出的节点不是终端节点时,进到步骤S2106,设定该取出的节点的代表编号作为父节点的数组编号,并且保存父节点的代表节点编号,进到步骤S2108。
在步骤S2105中,当判定为在步骤S2104取出的节点是终端节点时,进到步骤S2107,设定根节点的数组编号作为父节点的数组编号,并且保存父节点的代表节点编号,进到步骤S2108。
在步骤S2108中,求出与在步骤S2101设定了数组编号的删除节点成对的节点的数组编号,设定为对节点的数组编号。
接着在步骤S2109中,读出在步骤S2108设定的对节点的数组编号所指向的数组元素的内容,存储在步骤S2106或步骤S2107中设定的父节点的数组编号所指向的数组元素中。
最后在步骤S2110中,删除在步骤S2106或步骤S2107保存的父节点的代表节点编号所指向的节点对,返回“登记了处理源”,然后结束处理。
在图22A的(1)的例示中,分割节点210f的数组编号221b在未图示的删除节点设定区域中设定为删除节点210f的数组编号,另外如图22A的(3)所示,从搜索路径堆栈中取出节点210a。此时,如图所示,不进行堆栈指针的更新。并且,在图21所示的步骤S2106中,对父节点的数组编号设定代表节点编号220a+1,并且保存父节点211b的代表节点编号221b。
接着对对节点的数组编号设定与删除节点210f成对的节点211f的数组编号221b+1,并在处理源的父节点的数组编号220a+1所指向的数组元素中,存储对节点211f的数组编号221b+1所指向的数组元素的内容、即节点211f的内容。其结果表示在图22B的(1)的节点211b中。
同样,在图22B的(1)的例示中,分割节点210b的数组编号220a在未图示的删除节点设定区域中设定为删除节点210b的数组编号,另外如图22B的(3)所示,从搜索路径堆栈中取出终端节点[1]。
因此,图21所示的步骤S2105的判定结果为“是”,对父节点的数组编号设定根节点210a的数组编号220,并且保存父节点210a的代表节点编号220a。
接着,对对节点的数组编号设定与删除节点210b成对的节点211b的数组编号220a+1,在处理源的父节点的数组编号220所指向的数组元素中,存储对节点211b的数组编号220a+1所指向的数组元素的内容即节点211b的内容。其结果表示在图22C的(1)的节点210a中。
通过以上对第3实施例的配对节点树的分割处理进行了详细说明,根据第3实施例,以分割节点树为单位进行分割处理。即,将分割节点从处理源分离,将分割节点的对节点复制到父节点,由此从处理源删除分割节点树,并将分割节点插入处理目标,从而完成分割节点树的插入。
因此,只要采用相同的数组,就不需要对分割节点以外的节点进行处理,与实施例2的情况相比,可进一步减少处理的执行步骤数。
接下来,说明与分割处理同样以部分树为单位进行处理的第3实施例的配对节点树的结合处理。本实施例的结合处理与第1实施例和第2实施例的结合处理大不相同,第1实施例和第2实施例的结合处理以索引关键字为单位、换言之以节点为单位来进行结合处理,与此相对,第3实施例的结合处理以满足规定条件的部分树为单位,从处理源中分割而与处理目标结合。在第1实施例和第2实施例的结合处理中,可通过选择分割关键字来直接应用分割处理,与此相对如本实施例那样,当以部分树为单位进行结合处理时,不能单纯地应用分割处理。
这是因为,处理源和处理目标具有与存储在各自内部的索引关键字 的差分比特位置对应的结构,未必能够将处理源本身作为分割节点树直接插入处理目标。
图23A以及图23B是说明第3实施例的配对节点树的结合处理流程的图。在以下说明中,处理目标的索引关键字大于处理源的索引关键字,但即使相反也能够同样进行处理,根据下述说明能够容易地进行理解。
图26A~图26C是通过实例来说明上述结合处理的图,例示了与图2B所例示的配对节点树的部分树类似的树。
图26A是示出结合处理开始前的处理源和处理目标的树的结构例的图。在图26A(a)中例示了处理源,示出了标注有其数组编号的标号220a+1的分割结合节点和分割结合节点树293,该分割结合节点树293是以该分割结合节点为根节点的部分树,是作为结合处理单位的部分树。以后,有时利用堆积在搜索路径堆栈中的紧接上位节点的代表节点编号来示出表示节点的标号。
在图26A(b)中例示了处理目标,并示出对作为结合位置的节点标注其数组编号的标号221f。另外,在图26A中还示出处理源的最大值是索引关键字251g的″101001″,处理目标的最小值是索引关键字250h的″101011″。
图26B是示出将图26A所示的分割结合节点树293插入处理目标、并从处理源删除后的树结构的图。在图26B(a)中,用虚线包围的方式示出处理源的下一分割结合节点树294,并示出最大值是索引关键字251d的″011010″。在图26B(b)中,分别用虚线包围的方式示出结合到处理目标的分割结合节点树293、通过结合处理追加的节点对201k与节点221f之间的链接关系,并示出下一结合位置是节点220′。
图26C是示出将图26B所示的分割结合节点树294插入处理目标、并从处理源删除的树结构的图。图26B(a)所示的处理源的下一个的分割结合节点220是根节点,因此删除处理源的根节点,在图26C(a)中什么也没有显示。在图26C(b)中示出,分别用虚线包围的方式示出了结合到处理目标的分割结合节点树294、通过结合处理追加的节点对201m与节点220′之间的链接关系。
以下,参照图23A、图23B以及图26A~图26C来说明本实施例的结合处理的概要。
图23A是说明本实施例的结合处理中的初始处理的处理流程的图。如图所示,在步骤S2301中,在处理源的搜索路径堆栈中存储终端节点。接着,在步骤S2302中,在处理目标的搜索路径堆栈中存储终端节点。
接着进到步骤S2303,将处理源的根节点设定为处理源的检索开始节点。并且,在下一步骤S2304中,将处理目标的根节点设定为处理目标的检索开始节点,结束初始处理,进到图23B所示的步骤S2307。
图23B是说明在处理源全部结合到处理目标为止的循环处理的图。
如图23B所示,在步骤S2307中,从处理源的检索开始节点起通过图9B所示的检索处理,求出处理源的索引关键字的最大值,接着在步骤S2309中,从处理目标的检索开始节点起通过图8B所示的检索处理,求出处理目标的索引关键字的最小值。
接着在步骤S2310中,对在步骤S2307求出的最大值和在步骤S2309求出的最小值进行比特序列比较,求出从上位第0比特起观察到的第一个不一致比特的位置,设定成差分比特位置。
如先前所述,在图26A的例示中,处理源的最大值是″101001″,处理目标的最小值是″101011″,因此求出差分比特位置″4″。另外,在图26B的例示中,(a)所示的处理源的最大值是″011010″,(b)所示的处理目标的最小值是″101000″,因此差分比特位置是″0″。此外,在处理源和处理目标中都不存在鉴别比特位置与其差分比特位置相等的分支节点。
这是因为,由于处理目标的最小值大于处理源的最大值,因此处理源的最大值的差分比特位置的比特值是0,如果在处理源的分支节点中存在鉴别比特位置与差分比特位置相等的节点,则处理源的最大值为节点[0],这与是最大值的情况相矛盾。对于处理目标来说也是同样的。
此外,在以下说明中,有时将在该步骤S2310中求出的差分比特位置简单称为差分比特位置。
接着在步骤S2311中,根据在步骤S2310求出的差分比特位置,来求出处理源的分割结合节点。在图26A的例示中,如图26A的(a)处理源 所示,求出分割结合节点220a+1。另外,在图26B的例示中,如图26B的(a)处理源所示,求出下一分割结合节点220。该处理的详细在后文中参照图24来说明。
接着进到步骤S2312,根据差分比特位置,求出用于插入在步骤S2311求出的分割结合节点的处理目标的结合位置。在图26A的例示中,如图26A的(b)处理目标所示,求出结合位置221f。另外,在图26B的例示中,如图26B的(b)处理目标所示,求出结合位置220′。该处理的详细在后文中参照图25来说明。
接着在步骤S2313中,在步骤S2312求出的结合位置上插入步骤S2311求出的分割结合节点。在参照图18B进行了说明的插入处理中,将在步骤S2311求出的分割结合节点的数组编号设定为步骤S1801的插入节点的数组编号,并对步骤S1802的处理目标的插入位置设定在步骤S2312求出的结合位置的数组编号,然后执行该插入处理,由此实现此处理。
在图26A以及图26B的例示中,在图18B的步骤S1811在插入节点设定区域中设定分割结合节点220a+1的数组编号220a+1,在步骤S1812在插入位置设定区域中设定结合位置221f的数组编号221f。接着在步骤S1813中,取得空的节点对201k,该数组编号220k在步骤S1814中设定为节点[0]的数组编号。
然后,在步骤S1815中,读出设定在插入节点设定区域中的数组编号220a+1所指向的数组元素的内容、即分割结合节点211b的内容,存储在设定为节点[0]的数组编号的数组编号220k所指向的数组元素即节点210k中。
进而在步骤S1816中,将数组编号220k加1后的值即220k+1设定为节点[1]的数组编号。然后在步骤S1817中读出设定为插入位置的数组编号221f所指向的数组元素即节点210h的内容,存储在设定为节点[1]的数组编号的数组编号220k+1所指向的数组元素即节点211k中。
最后在步骤S1818中,在设定为插入位置的数组编号221f所指向的数组元素即节点210h的位置上,对节点类别设定0,对鉴别比特位置设 定在图23B的步骤S2310求出的差分比特位置4,对代表节点编号设定被设定为节点[0]的数组编号的数组编号220k,来生成新的分支节点,得到图26B的(b)所示的结合后处理目标的结构。
另外,在图26B以及图26C的例示中,图26B(a)所示的处理源的最大值″011010″和(b)所示的处理目标的最小值″101000″的差分比特位置是″0″,因此设定节点220作为下一分割结合节点。在图18B的步骤S1811中,在插入节点设定区域中设定下一分割结合节点220的数组编号220,在步骤S1812中,在插入位置设定区域中设定结合位置220′的数组编号220′。接着在步骤S1813中,如图26C的(b)所示,取得空的节点对201m,并在步骤S1814中将该数组编号220m设定为节点[0]的数组编号。
然后,在步骤S1815中,读出设定在插入节点设定区域中的数组编号220所指向的数组元素的内容、即下一分割结合节点210a的内容,存储在设定为节点[0]的数组编号的数组编号220m所指向的数组元素即节点210m中。
进而在步骤S1816中,将数组编号220m加上1后的值即220m+1设定为节点[1]的数组编号。然后在步骤S1817中,读出设定为插入位置的数组编号220′所指示的数组元素即节点210f的内容,存储在设定为节点[1]的数组编号的数组编号220m+1所指向的数组元素即节点211m中。
最后在步骤S1818中,在设定为插入位置的数组编号220′所指向的数组元素即节点210f的位置上,对节点类别设定0,对鉴别比特位置设定在图23B的步骤S2310求出的差分比特位置″0″,对代表节点编号设定被设定为节点[0]的数组编号的数组编号220m,来生成新的分支节点,得到图26B的(c)所示的结合后处理目标的结构。
接着返回图23B的树结合处理的说明,在步骤S2314中,对分割节点设定在步骤S2311求出的分割结合节点,进入步骤S2315,从处理源中将删除节点删除,并获得该节点的父节点。步骤S2315的处理是通过执行参照图21进行说明的删除处理来实现的。该删除处理是在步骤S2314中将在步骤S2311求出的分割结合节点设定为分割节点之后执行的,因此相当于将分割节点替换为分割结合节点后执行的处理。
接着进到步骤S2316,判定是否登记了处理源。如果已登记则进到步骤S2317,如果没有登记,则结合处理完成因此结束处理。
在步骤S2317中,将在步骤S2315得到的删除节点的父节点设定成处理源的检索开始节点,返回步骤S2307。
在图26A和图26B的例示中,当求出处理源的分割结合节点220a+1的处理结束时,处理源的搜索路径堆栈的堆栈指针指向终端节点,所以在图23B所示的步骤S2315中调用的图21所示的删除处理的步骤S2105的判定处理为“是”,进到步骤S2107。在步骤S2107中对父节点的数组编号设定根节点210a的数组编号220,并保存代表节点编号220a。对删除节点设定分割结合节点220a+1、对对节点设定节点210b。然后,在数组编号220的数组元素中存储节点210b的内容,删除代表节点编号220a所指向的节点对201b,成为图26B(a)所的处理目标。
在图26B以及图26C的例示中,当求出处理源的分割结合节点220的处理结束时,在图23B所示的步骤S2315中调用的、图21所示的删除处理的步骤S2102的删除节点是否是根节点的判定处理为“是”,进到步骤S2111。在步骤S2111中删除根节点的数组编号220所指向的节点对201a,除去根节点的数组编号的登记,如图26C的(a)所示,处理目标消失。
接着,说明本实施例的结合处理中的求出处理源的分割结合节点的处理。除了处理源仅是根节点这样的例外,分割结合节点是通过最大值检索搜索到的分支节点中的、鉴别比特位置比在图23B所示的步骤S2310求出的差分比特位置下位的节点中最上位的分支节点。
如果将以分割结合节点作为根节点的处理源的部分树称作分割结合节点树,则本实施例的结合处理以分割结合节点树为单位进行结合处理。
图24是说明图23B所示的步骤S2311的求出处理源的分割结合节点的处理流程的图。此外,在求出分割结合节点的处理开始时,处理源的搜索路径堆栈的堆栈指针指向:存储有图23B所示的步骤S2307的最大值检索的结果(即,索引关键字的最大值)的叶节点所紧接的上位节点。
如图24所示,在步骤S2401中,从处理源的搜索路径堆栈中取出堆 栈指针所指向的节点,堆栈指针后退1,进到步骤S2402。
在步骤S2402中,从在步骤S2401取出的节点中取得鉴别比特位置。
接着在步骤S2403中,判定在步骤S2402取得的鉴别比特位置是否小于差分比特位置的值(是否为上位的位置关系)。如果不小于则返回步骤S2401,如果小于则进到步骤S2404。如先前所述,不存在上述鉴别比特位置与差分比特位置相等的情况。
在步骤S2404中,判定在步骤S2401取出的节点是否为终端节点。如果不是终端节点,则进到步骤S2405,将在步骤S2401取出的节点的代表节点编号,设定为处理源的分割结合节点的数组编号,然后结束处理。
如果步骤S2404的判定结果是终端节点,则进到步骤S2406,将根节点的数组编号设定为处理源的分割结合节点的数组编号,然后结束处理。
以下,参照图26A以及图26B来说明上述处理。
在图26A的(a)处理源的例示中,作为最大值检索的结果,未图示的搜索路径堆栈的堆栈指针指向节点211b,所以取出鉴别比特位置″5″,由于差分比特位置是″4″,因此步骤S2403的判定为“否”,反复从步骤S2401起的处理,直至到达根节点210a,根节点210a的鉴别比特位置是″0″、比差分比特位置上位,所以在步骤S2403的判定处理中分支到步骤S2404,通过步骤S2405的处理来求出分割结合节点220a+1。(由于执行了最大值检索,因此搜索路径堆栈中根节点210a的代表节点编号更新成220a+1。)
在图26B的例示中,通过从作为删除节点211b的父节点的根节点210a起的处理源的最大值检索,求出最大值″011010″,处理目标的最小值如图26B(b)所示为″101000″,所以设定差分比特位置″0″。处理源的搜索路径堆栈的堆栈指针指向节点211c,所以取出鉴别比特位置″2″,差分比特位置是″0″,所以步骤S2403的判定为“否”,反复从步骤S2401起的处理,直至到达根节点210a,根节点210a的鉴别比特位置是″0″、不小于差分比特位置,所以还反复从步骤S2401起的处理,直至到达终端节点,终端节点的鉴别比特位置是″-1″,所以在步骤S2403的判定处理中 分支到步骤S2404,在步骤S2404的判定处理中分支到步骤S2406,通过步骤S2406的处理求出下一分割结合节点220。
接下来,说明求出处理目标的结合位置的处理。对结合处理后的处理目标插入了存储有处理源的索引关键字最大值的叶节点,因此存在具有与差分比特位置相等值的鉴别比特位置的新分支节点。即,在利用最小值检索搜索到的路径中插入具有与差分比特位置相等值的鉴别比特位置的分支节点,将该插入位置作为处理目标的结合位置。
在配对节点树中,下位分支节点的鉴别比特位置比上位分支节点的鉴别比特位置下位,因此具有刚刚比差分比特位置上位的鉴别比特位置的分支节点的子节点位置成为结合位置,或者在例外的情况下如果不存在具有上位鉴别比特位置的节点,则根节点成为结合位置。
在插入到结合位置的分支节点的子节点对的节点[1]侧,存在存储有结合前的处理目标的索引关键字最小值的叶节点,节点[0]是分割结合节点。
图25是说明求出上述处理目标的结合位置的处理流程的图。如图25所示,求出处理目标的结合位置的处理流程是与图24所示的求出处理源的分割结合节点的处理流程相同的结构。图25的处理流程是针对处理目标的流程,不同点仅在于所求出的是结合位置。此外,在求出处理目标的结合位置的处理开始时,处理目标的搜索路径堆栈的堆栈指针指向:存储有图23B所示的步骤S2309的最小值检索结果(即,索引关键字的最小值)的叶节点所紧接上位的节点。
如图25所示,在步骤S2501中,从处理目标的搜索路径堆栈中取出堆栈指针所指向的节点,堆栈指针后退1,进到步骤S2502。
在步骤S2502中,从在步骤S2501取出的节点中取得鉴别比特位置。
接着在步骤S2503中,判定在步骤S2502取得的鉴别比特位置是否小于差分比特位置的值(是否处于上位的位置关系)。如果不小于则返回步骤S2501,如果小于则进到步骤S2504。如先前所述,不存在上述鉴别比特位置与差分比特位置相等的情况。
在步骤S2504中,判定在步骤S2501取出的节点是否是终端节点。 如果不是终端节点则进到步骤S2505,将在步骤S2501取出的节点的代表节点编号设定为处理目标的结合位置的数组编号,结束处理。
如果步骤S2504的判定结果是终端节点,则进到步骤S2506,将根节点的数组编号设定为处理目标的结合位置的数组编号,结束处理。
以下,参照图26A以及图26B来说明上述处理。
在图26A的(b)处理目标的例示中,作为最小值检索的结果,未图示的搜索路径堆栈的堆栈指针指向节点210f,所以取出鉴别比特位置″3″,差分比特位置是″4″,因此步骤S2503的判定为“是”,从步骤S2504分支到步骤S2505,通过步骤S2505的处理将节点210f的代表节点编号221f设定为结合位置的数组编号。
在图26B的例示中,处理源的最大值″011010″和处理目标的最小值″101000″的差分比特位置是″0″,因此追溯搜索路径堆栈到达终端节点,在步骤S2504中判定为是终端节点而分支到步骤S2506,求出根节点210f的数组编号221作为下一结合位置的数组编号。
以上,对第3实施例的配对节点树的结合处理进行了详细地说明,根据第3实施例,以分割结合节点树为单位进行结合处理。即,从处理源分离出分割结合节点,将分割结合节点的对节点复制到父节点,由此从处理源删除分割结合节点树,将分割结合节点与处理目标结合,从而完成分割结合节点树的结合。
因此,只要采用相同的数组,不需要对除了分割结合节点以外的节点进行处理,与实施例2的情况相比,进一步减少处理的执行步骤数。
以上,对用于实施本发明的优选方式进行了详细说明,但本领域技术人员可知本发明的实施方式不限于此,还能够进行各种变形。
接着,参照图27A和图27B,说明以升序方式取出存储在配对节点树中的索引关键字的处理。
图27A是说明以升序方式取出存储在配对节点树的任意部分树中的索引关键字的处理的流程图。以升序方式取出索引关键字的处理相当于,优先构成节点对的节点中的节点[0]侧和树的深度,从节点起依次搜索叶节点,并从各叶节点中取出索引关键字。
如图27A所示,在步骤S2701中设定检索开始节点,在步骤S2702中,在搜索路径堆栈内存储终端节点,在步骤S2703中,执行图8B所示的最小值检索,并进到步骤S2704。
在步骤S2704中,取出在步骤S2703或后述步骤S2711中得到的作为最小值的索引关键字。
接着在步骤S2705中,从搜索路径堆栈内取出堆栈指针所指向的节点,堆栈指针的值减1。在最初步骤S2705中的搜索路径堆栈的状态是执行了步骤S2703的最小值检索时的状态。
接着在步骤S2708中,判定在步骤S2705取出的节点是否是终端节点。如果该节点是终端节点,则结束索引关键字的取出,因此结束处理。
如果在步骤S2708的判定为“不是终端节点”,则进到步骤S2709,将在步骤S2705取出的节点的代表节点编号,设定为检索开始节点所属的节点对的代表节点的数组编号。
此外在步骤S2710中,将值″1″设定为检索开始节点的节点位置,然后进到步骤S2711,执行图8B所示的最小值检索,取得索引关键字的最小值,返回步骤S2704的取出作为最小值的索引关键字的处理。
反复上述步骤S2704~步骤S2711的循环处理,直至步骤S2708中的判定为“是”为止,由此以升序方式取出将检索开始节点作为根节点的部分树的索引关键字。
图27B是说明通过图27A的流程图所说明的以升序方式取出索引关键字的处理例的图。配对节点树是图2B所例示的节点树,检索开始节点是根节点210a。在图27B的(1)~(8)中,示出在执行以升序方式取出索引关键字的处理的各阶段搜索路径堆栈310的状态以及被取出的索引关键字。
图27B(1)示出在将根节点210a作为检索开始节点执行到最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。堆栈指针所指向的位置从终端节点变为节点210b。这里,节点210b的代表节点编号220b所指向的节点是叶节点210c,所以取出该节点210c的索引关键字″000111″,堆栈指针所指向的位置减1,成为节点210a。然后,对最小值 检索中的代表节点编号设定代表节点编号220b,对节点位置设定值″1″,并执行下一最小值检索。即,下一检索开始节点为代表节点编号220b所指向的节点对201c的节点[1]即节点211c。
图27B(2)示出在将节点211c作为检索开始节点执行了最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最小值检索的结果,在搜索路径堆栈310中在节点210a之后存储有节点211c和节点210d。这里,节点210d的代表节点编号220d所指向的节点210e是叶节点,所以取出该节点210e的索引关键字″010010″,堆栈指针所指向的位置减1,成为节点211c。然后,对最小值检索中的代表节点编号设定代表节点编号220d,对节点位置设定值″1″,并执行下一最小值检索。
图27B(3)示出在对代表节点编号设定代表节点编号220d、对节点位置设定值″1″来执行最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点211e是叶节点,所以取出该节点211e的索引关键字″010011″,堆栈指针所指向的位置减1,成为节点210a。然后,对最小值检索中的代表节点编号设定代表节点编号221c,对节点位置设定值″1″,并执行下一最小值检索。
图27B(4)示出在对代表节点编号设定代表节点编号221c、对节点位置设定值″1″来执行最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点211d是叶节点,所以取出该节点的索引关键字″011010″,堆栈指针所指向的位置减1,成为终端节点。然后,对最小值检索中的代表节点编号设定代表节点编号220a,对节点位置设定值″1″,并执行下一最小值检索。即,下一检索开始节点是节点211b。
图27B(5)示出在将节点211b作为检索开始节点执行了最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最小值检索的结果,在搜索路径堆栈310中在终端节点之后存储有节点211b和节点210f。这里,节点210f的代表节点编号220f所指向的节点210g是叶节点,所以取出该节点210g的索引关键字″100010″,堆栈指针所指向的位置减1,成为节点211b。然后,对最小值检索中的代表节点编号设定 代表节点编号220f,对节点位置设定值″1″,并执行下一最小值检索。
图27B(6)示出在对代表节点编号设定代表节点编号220f、对节点位置设定值″1″来执行最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点211g是叶节点,所以取出该节点的索引关键字″100011″,堆栈指针所指向的位置减1,成为终端节点。然后,对最小值检索中的代表节点编号设定节点211b的代表节点编号221b,对节点位置设定值″1″,并执行下一最小值检索。
图27B(7)示出在对代表节点编号设定代表节点编号221b、对节点位置设定值″1″来执行最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最小值检索的结果,在终端节点之后存储有节点211f。这里,因为节点211f的代表节点编号221f所指向的节点210h是叶节点,所以取出该节点210h的索引关键字″101011″,堆栈指针所指向的位置减1,成为终端节点。然后,对最小值检索中的代表节点编号设定代表节点编号221f,对节点位置设定值″1″,并执行下一最小值检索。
图27B(8)示出在对代表节点编号设定代表节点编号221f、对节点位置设定值″1″来执行最小值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点211h是叶节点,所以取出该节点211h的索引关键字″101100″。然后,在图27A所示的步骤S2708中,判断为在上次步骤S2705中从搜索路径堆栈310取出的节点是终端节点,并结束处理。
如上述说明可知,在利用最小值检索得到作为最大值的索引关键字时,没有进行这样的处理:从搜索路径堆栈中取出存储有作为最大值的索引关键字的叶节点所紧接上位的分支节点、接着重新将节点存储在终端节点之后,因此在进到下一最小值检索之前,在图27A所示的步骤S2705中取出终端节点,在步骤S2708中判定为终端节点,然后结束处理。
接下来,参照图28A以及图28B,来说明以降序方式取出存储在配对节点树中的索引关键字的处理。该索引关键字的降序取出处理相对于先前参照图27A以及图27B说明的升序取出处理,成相对的关系,相当于改变最小值检索而进行最大值检索并使节点位置反转的处理。
图28A是说明以降序方式取出存储在配对节点树的任意部分树中的索引关键字的处理的流程图。以降序方式取出索引关键字的处理相当于,优先构成节点对的节点中的节点[1]侧以及树的深度,从节点起依次搜索叶节点,从各叶节点中取出索引关键字。
如图28A所示,在步骤S2801中设定检索开始节点,在步骤S2802中在搜索路径堆栈内存储终端节点,在步骤S2803中,执行图9B所示的最大值检索,并进到步骤S2804。
在步骤S2804中,取出在步骤S2803或后述步骤S2811得到的作为最大值的索引关键字。
接着在步骤S2805中,从搜索路径堆栈中取出堆栈指针所指向的节点,堆栈指针的值减1。在最初步骤S2805中的搜索路径堆栈的状态是执行步骤S2803的最大值检索时的状态。
接着在步骤S2808中,判定在步骤S2805取出的节点是否是终端节点。如果该节点是终端节点,则索引关键字的取出结束,所以处理结束。
如果步骤S2808的判定为“不是终端节点”,则进到步骤S2809,将在步骤S2805取出的节点的代表节点编号减去1后的值,设定为检索开始节点所属的节点对的代表节点的数组编号。
并且,在步骤S2810中,将值″0″设定为检索开始节点的节点位置,然后进到步骤S2811,执行图9B所示的最大值检索,取得索引关键字的最大值,并返回步骤S2804的取出作为最大值的索引关键字的处理。
反复进行上述步骤S2804~步骤S2811的循环处理,直至步骤S2808的判定成为“是”为止,由此以降序方式来取出将检索开始节点作为根节点的部分树的索引关键字。
图28B是说明通过图28A的流程图所说明的以降序方式取出索引关键字的处理例的图。配对节点树是图2B所例示的节点树,检索开始节点是根节点210a。在图28B的(1)~(8)中,示出在执行以降序方式取出索引关键字的处理的各阶段的搜索路径堆栈310的状态以及所取出的索引关键字。
图28B(1)示出将根节点210a作为检索开始节点执行到最大值检索处 理的阶段的搜索路径堆栈310以及所取出的索引关键字。堆栈指针所指向的位置从终端节点变为节点211f。这里,节点211f的代表节点编号221f+1所指向的节点211h是叶节点,所以取出该节点211h的索引关键字″101100″,堆栈指针所指向的位置减1,成为节点211b。然后,对最大值检索中的代表节点编号设定从代表节点编号221f+1减去1后的值221f,对节点位置设定值″0″,并执行下一最大值检索。
图28B(2)示出在对代表节点编号设定代表节点编号221f、对节点位置设定″0″来执行最大值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点210h是叶节点,所以取出该节点210h的索引关键字″101011″,堆栈指针所指向的位置减1,成为节点210a。然后,对最大值检索中的代表节点编号设定代表节点编号221b,对节点位置设定值″0″,并执行下一最大值检索。
图28B(3)示出在对代表节点编号设定代表节点编号221b、对节点位置设定值″0″来执行最大值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最大值检索的结果,在搜索路径堆栈310中在节点210a之后存储有节点210f。这里,节点210f的代表节点编号220f+1所指向的节点211g是叶节点,所以取出该节点211g的索引关键字″100011″,堆栈指针所指向的位置减1,成为节点210a。然后,对最大值检索中的代表节点编号设定代表节点编号220f,对节点位置设定值″0″,并执行下一最大值检索。
图28B(4)示出在对代表节点编号设定代表节点编号220f、对节点位置设定值″0″来执行最大值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点210g是叶节点,所以取出该节点210g的索引关键字″100010″,堆栈指针所指向的位置减1,成为终端节点。然后,对最大值检索中的代表节点编号设定代表节点编号220a,对节点位置设定值″0″,并执行下一最大值检索。即,下一检索开始节点为节点210b。
图28B(5)示出在将节点210b作为检索开始节点执行最大值检索处理的阶段中的搜索路径堆栈310以及所取出的索引关键字。根据最大值检 索的结果,在搜索路径堆栈310中在终端节点之后存储有节点210b和节点211c。这里,节点211c的代表节点编号221c+1所指向的节点211d是叶节点,所以取出该节点211d的索引关键字″011010″,堆栈指针所指向的位置减1,成为节点210b。然后,对最大值检索中的代表节点编号设定代表节点编号221c,对节点位置设定值″0″,并执行下一最大值检索。
图28B(6)示出在对代表节点编号设定代表节点编号221c、对节点位置设定值″0″来执行最大值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最大值检索的结果,在搜索路径堆栈310中在节点210b之后存储有节点210d。这里,节点210d的代表节点编号220d+1所指向的节点211e是叶节点,所以取出该节点211e的索引关键字″010011″,堆栈指针所指向的位置减1,成为节点210b。然后,对最大值检索中的代表节点编号设定节点210d的代表节点编号220d,对节点位置设定值″0″,并执行下一最大值检索。
图28B(7)示出在对代表节点编号设定代表节点编号220d、对节点位置设定值″0″来执行最大值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点210e是叶节点,所以取出该节点210e的索引关键字″010010″,堆栈指针所指向的位置减1,成为终端节点。然后,对最大值检索中的代表节点编号设定代表节点编号220b,对节点位置设定值″0″,并执行下一最大值检索。
图28B(8)示出在对代表节点编号设定代表节点编号220b、对节点位置设定值″0″来执行最大值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点210c是叶节点,所以取出该节点210c的索引关键字″000111″。然后,在图28A所示的步骤S2808中,判断为在上次步骤S2805中从搜索路径堆栈310取出的节点是终端节点,并结束处理。
由上述说明可知,在利用最大值检索得到作为最小值的索引关键字时,没有进行这样的处理:从搜索路径堆栈中取出存储有作为最小值的索引关键字的叶节点所紧接上位的分支节点、接着重新将节点存储在终端节点之后,因此在进入下一最大值检索之前,在图28A所示的步骤 S2805中取出终端节点,在步骤S2808中判定是终端节点,然后结束处理。
接着,参照图29A、图29B以及图29C,来说明指定范围以升序方式取出存储在配对节点树中的索引关键字的范围指定升序取出处理。
图29A是说明范围指定升序取出处理的初始处理的流程图。索引关键字取出的范围预先利用上限关键字和下限关键字来指定。
如图所示,在步骤S2901中设定根节点作为检索开始节点。接着在步骤S2902中,通过图10A以及图10B所示的下限值检索处理,根据下限关键字来求出下限值,在步骤S2903中,通过图11A以及图11B所示的上限值检索处理,根据上限关键字求出上限值。
接着在步骤S2904中,在搜索路径堆栈中存储终端节点[0],在步骤S2905中将在上述步骤S2902求出的下限值设定为检索关键字,并进到步骤S2906。
在步骤S2906中,通过图4B所示的检索处理,对配置有配对节点树的数组进行检索,求出索引关键字,结束初始处理,转移到图29B所示的步骤S2907。
图29B是说明范围指定升序取出处理的循环处理的流程图。
在步骤S2907中,取出在步骤S2906得到的索引关键字、或在后述步骤S2915得到的作为最小值的索引关键字。
接着在步骤S2908中,判定在步骤S2903求出的上限值和在步骤S2907取出的索引关键字是否相等,如果相等,则索引关键字的到达上限值的升序取出结束,因此处理结束。
如果不相等,则接着在步骤S2909中,从搜索路径堆栈取出堆栈指针所指向的节点,堆栈指针的值减1。在最初的步骤S2909中搜索路径堆栈的状态是执行了步骤S2906的检索时的状态。
接着在步骤S2910中,从所取出的节点的代表编号得到所取出节点的节点位置。
接着进到步骤S2911,判定在步骤S2910得到的节点位置是否是节点[1]侧。如果是节点[1]侧则返回步骤S2909,如果是节点[0]侧则进到步骤S2912。
在步骤S2912中,判定在步骤S2909取出的节点是否是终端节点。如果该节点是终端节点,则索引关键字的取出结束,所以结束处理。
如果步骤S2912的判定为“不是终端节点”,则进到步骤S2913,将在步骤S2909取出的节点的代表节点编号,设定为检索开始节点所属的节点对的代表节点的数组编号。
进而在步骤S2914中,将值″1″设定为检索开始节点的节点位置,然后进到步骤S2915,执行图8B所示的最小值检索,取得索引关键字的最小值,返回步骤S2907的取出作为最小值的索引关键字的处理。
反复上述步骤S2907~步骤S2915的循环处理,直至在步骤S2908或步骤S2912的判定为“是”为止,由此以升序方式取出在利用上限关键字和下限关键字指定的范围内的索引关键字。
图29C是说明通过图29A以及图29B的流程图所说明的指定范围以升序方式取出索引关键字的处理例的图。在图29C(a)中示出了图2B所例示的配对节点树、以及分别设定在检索关键字设定区域270以及第2检索关键字设定区域271中的下限关键字″010100″以及上限关键字″101001″。在图29C(b)的(1)~(3)中,示出了执行以升序方式取出索引关键字的处理的各阶段的搜索路径堆栈310的状态以及所取出的索引关键字。
利用下限关键字″010100″,求出存储在节点211d内的索引关键字″011010″作为下限值,节点211d成为范围指定升序取出处理的搜索开始节点。另外,利用上限关键字″101001″,将存储在节点211g内的索引关键字”100011″作为上限值求出,节点211g成为范围指定升序取出处理的搜索结束节点。
接着,将上述下限值作为检索关键字从根节点210a开始进行检索,并取出搜索开始节点的索引关键字″010100″。该索引关键字是搜索范围内的最小值。
在图29C(b)的(1)中,示出所取出的索引关键字和基于检索执行结果的搜索路径堆栈310的节点存储状态。在当前的情况下,在搜索路径堆栈310中存储有终端节点[0]、节点210a、节点210b、节点211c,节点 210b和节点211c的代表节点编号分别加1。索引关键字″010100″小于上限值″100011″,因此执行包含下一最小值检索的循环处理。
图29C(b)(1)所示的搜索路径堆栈310的右侧实线箭头所示的堆栈指针所指位置的节点210a的代表节点编号220a是追溯搜索路径堆栈310时的初始节点[0]侧,所以将该代表节点编号220a设定为最小值检索的检索开始节点所属的节点对201b的代表节点210b的数组编号,在检索开始节点的节点位置设定值″1″,然后进行最小值检索。堆栈指针如虚线箭头所示指向终端节点[0]。
图29C(b)中(2)示出执行上述最小值检索阶段的搜索路径堆栈310以及所取出的索引关键字。通过最小值检索,在终端节点[0]上存储节点211b和节点210f。然后,由于节点210f的代表节点编号220f所指向的节点210g是叶节点,因此取出其索引关键字″100010″。该索引关键字也小于上限值,因此循环处理继续前进。
图29C(b)中(3)示出在对代表节点编号设定代表节点编号220f、对节点位置设定值″1″来执行最小值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最小值检索的结果,从数组中取出的节点211g是叶节点,所以取出该节点211g的索引关键字″100011″。所取出的索引关键字″100011″与上限值相等,所以处理结束。节点211g如图29C(a)所示为搜索结束节点,如图29C(b)的(3)所示,该索引关键字″100011″是搜索范围的最大值。
接着,参照图30A、图30B以及图30C,说明指定范围以降序方式取出存储在配对节点树内的索引关键字的范围指定降序取出处理。该索引关键字的范围指定降序取出处理相对于之前参照图29A~图29C所说明的范围指定升序取出处理,成相对的关系,相当于改变最小值检索进行最大值检索、并使节点位置以及上限和下限反转的处理。
图30A是说明范围指定降序取出处理的初始处理的流程图。与先前说明的范围指定升序取出处理的情况相同,索引关键字取出的范围预先利用上限关键字和下限关键字来指定。
如图所示,在步骤S3001中设定根节点作为检索开始节点。接着在 步骤S3002中,通过图11A和图11B所示的上限值检索处理,根据上限关键字求出上限值,在步骤S3003中,通过图10A以及图10B所示的下限值检索处理,根据下限关键字来求出下限值。
接着在步骤S3004中,在搜索路径堆栈中存储终端节点[1],在步骤S3005中设定在上述步骤S3002求出的上限值作为检索关键字,进到步骤S3006。
在步骤S3006中,通过图4B所示的检索处理对配置有配对节点树的数组进行检索,求出索引关键字,结束初始处理,然后转移到图30B所示的步骤S3007。
图30B是说明范围指定降序取出处理的循环处理的流程图。
在步骤S3007中,取出在步骤S3006得到的索引关键字、或者在后述步骤S3015得到的作为最大值的索引关键字。
接着在步骤S3008中,判定在步骤S3003求出的下限值与在步骤S3007取出的索引关键字是否相等,如果相等则降序取出索引关键字直至到达下限值的步骤结束,所以处理结束。
如果不相等,则接着在步骤S3009中,从搜索路径堆栈取出堆栈指针所指向的节点,堆栈指针的值减1。在最初的步骤S3009中的搜索路径堆栈的状态是执行了步骤S3006的检索时的状态。
接着在步骤S3010中,根据所取出节点的代表编号得到所取出节点的节点位置。
接着进到步骤S3011,判定在步骤S3010得到的节点位置是否是节点[0]侧。如果是节点[0]侧则返回步骤S3009,如果是节点[1]侧则进到步骤S3012。
在步骤S3012中,判定在步骤S3009取出的节点是否是终端节点。如果该节点是终端节点,则索引关键字的取出结束,所以处理结束。
如果在步骤S3012的判定为“不是终端节点”,则进到步骤S3013,将在步骤S3009取出的节点的代表节点编号减去值″1″后的值设定为检索开始节点所属的节点对的代表节点的数组编号。
此外在步骤S3014中,将值″1″设定为检索开始节点的节点位置,然 后进到步骤S3015,执行图9B所示的最大值检索,取得索引关键字的最大值,并返回步骤S3007的取出作为最大值的索引关键字的处理。
反复进行上述步骤S3007~步骤S3015的循环处理,直至步骤S3008或步骤S3012中的判定为“是”为止,由此以降序方式取出在利用上限关键字和下限关键字指定的范围内的索引关键字。
图30C是说明通过图30A、图30B的流程图所说明的指定索引关键字的范围以降序方式取出的处理例的图。在图30C(a)中示出图2B所例示的配对节点树、和分别设定在检索关键字设定区域270以及第2检索关键字设定区域271上的上限关键字″101001″以及下限关键字″011001″。在图30C(b)的(1)~(3)中示出,在执行以降序方式取出索引关键字的处理的各阶段的搜索路径堆栈310的状态以及所取出的索引关键字。
利用上限关键字″101001″,将存储在节点211g中的索引关键字″100011″作为上限值求出,节点211g成为范围指定降序取出处理的搜索开始节点。另外,利用下限关键字″011001″将存储在节点211d中的索引关键字″011010″作为下限值求出,节点211d成为范围指定降序取出处理的搜索结束节点。
接着将上述上限值作为检索关键字从根节点210a进行检索,并取出搜索开始节点的索引关键字″100011″。该索引关键字是搜索范围内的最大值。
图30C(b)的(1)示出所取出的索引关键字和基于检索执行结果的搜索路径堆栈310的节点存储状态。在当前的情况下,在搜索路径堆栈310中存储有终端节点[1]、节点210a、节点211b、节点210f,节点210a和节点210f的代表节点编号分别加1。索引关键字″100011大于下限值″011001,因此执行包含下一最大值检索的循环处理。
根据图30C(b)的(1)所示的存储在搜索路径堆栈310内的节点210f的代表节点编号220f+1,判定为节点位置是节点[1]侧,所以将该代表节点编号220f+1减去1后的值设定为最大值检索的检索开始节点所属的节点对201g的代表节点210g的数组编号,对检索开始节点的节点位置设定值″0″,进行最大值检索。
图30C(b)的(2)示出在执行了上述最大值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。并且,由于节点210f的代表节点编号220f所指向的节点210g是叶节点,因此取出该索引关键字″100010″。该索引关键字也大于下限值,因此循环处理继续进行。然后,堆栈指针如搜索路径堆栈310的右侧实线箭头所示指向节点210a,将其代表节点编号220a+1减去1后的值设定为下一最大值检索的检索开始节点所属的节点对201b的代表节点210b的数组编号,对检索开始节点的节点位置设定值″0″,进行最大值检索。
图30C(b)的(3)示出在对代表节点编号设定代表节点编号220a、对节点位置设定值″0″并执行了最大值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。在最大值检索开始时,堆栈指针如搜索路径堆栈310的左侧虚线箭头所示,指向终端节点[1],根据最大值检索的结果,在该终端节点[1]之后存储有节点210b和节点211c。节点211c的代表节点编号221c+1所指向的节点211d是叶节点,因此取出该节点211d的索引关键字″011010″。所取出的索引关键字″011010″与下限值相等,因此处理结束。节点211d如图30C(a)所示为搜索结束节点,如图30C(b)中(3)所示,其索引关键字″011010″是搜索范围的最小值。
接下来,说明收容在配对节点树中的索引关键字的前方一致检索处理。在本实施方式的前方一致检索中,在上位具有有效比特的前方一致关键字是预先指定的。
图31A是说明本实施方式的前方一致检索的处理流程的图。
如图所示,在步骤S3101中对检索开始节点设定根节点,在步骤S3102中将前方一致关键字的无关比特值设为″0″的比特序列的关键字设定为下限关键字,在步骤S3103中,根据步骤S3101以及步骤S3102中的设定,执行图10A以及图10B所示的下限值检索,得到索引关键字的下限值。
接着进到步骤S3103a,在前方一致关键字的有效比特范围内,对前方一致关键字和在步骤S3103得到的下限值进行比较,在步骤S3103b中判定在有效比特范围内是否一致。如果一致则进到步骤S3104,如果不一 致则不存在利用所指定的前方一致关键字取出的索引关键字,所以作为检索失败结束处理。通过在上述步骤S3103b的判定,保证在步骤S3104以下的处理中至少下限值符合前方一致检索。
在步骤S3104中,在未图示的差分比特位置设定区域中,设定从前方一致关键字的上位第0比特起观察到的有效比特的末尾的比特位置。
接着进到步骤S3105,从搜索路径堆栈取出节点,搜索路径堆栈的堆栈指针后退1。
接着在步骤S3106中,取出在步骤S3105取出的节点的鉴别比特位置,进到步骤S3107。
在步骤S3107中,判定在步骤S3106取出的鉴别比特位置是否大于在步骤S3104设定的差分比特位置的值。如果鉴别比特位置大于差分比特位置则返回进到步骤S3105,如果不大于则进到步骤S3108。
在步骤S3108中,判定在步骤S3105取出的节点是否是终端节点。如果不是终端节点,则进到步骤S3109,如果是终端节点,则进到步骤S3110。
在步骤S3109中,对检索开始节点设定在步骤S3105取出的节点的代表节点编号所指向的节点,然后进到步骤S3111,在步骤S3110中,对检索开始节点设定根节点,然后进到步骤S3111。
以上说明的步骤S3105~步骤S3110的处理是如下这样的处理:将包含所有存储有符合前方一致检索的索引关键字的叶节点、不包含存储有不符合的索引关键字的叶节点在内的部分树的根节点,作为在步骤S3111的检索中的检索开始节点。
可知上述下限值是上述部分树的最小值,该部分树的根节点通过步骤S3103中求出下限值的处理而存储在搜索路径堆栈中。
然后,读出存储在搜索路径堆栈中的分支节点,取出鉴别比特位置,与在步骤S3104设定的差分比特位置进行比较,此时如果鉴别比特位置大于差分比特位置,则存储在其下位叶节点内的索引关键字均符合前方一致检索,但在上位分支节点的下位可能存在存储有符合前方一致检索的索引关键字的叶节点。
因此再读出分支节点,取出鉴别比特位置,与差分比特位置进行比较,此时如果鉴别比特位置与差分比特位置相等,则该分支节点的代表节点编号指向包含上述下限值的叶节点所存在侧的节点位置的节点,容易地理解到:将该节点作为根节点的部分树包含所有存储有符合前方一致检索的索引关键字的叶节点、不包含存储有不符合索引关键字的叶节点。
当不存在具有与差分比特位置相等值的鉴别比特位置的分支节点、而取出鉴别比特位置小于差分比特位置的分支节点时,其代表节点编号指向包含上述下限值的叶节点所存在侧的节点位置的节点,由于该节点的鉴别比特位置大于差分比特位置,因此如先前所述,存储在其下位的叶节点内的索引关键字均符合前方一致检索。
另一方面,针对上述取出的鉴别比特位置小于差分比特位置的分支节点的代表节点编号所指向的节点,关于在与该节点成对的节点侧存在的叶节点中存储的索引关键字,根据鉴别比特位置的定义,该索引关键字不符合前方一致检索。
根据以上可知,鉴别比特位置小于等于在步骤S3104设定的差分比特位置的分支节点所紧接下位的节点、即其代表节点编号所指向的节点成为下述部分树的根节点,该部分树包含所有存储有符合前方一致检索的索引关键字的叶节点,不包含存储有不符合的索引关键字的叶节点。
在步骤S3111中,通过图27A所示的以升序方式取出索引关键字的处理,从检索开始节点搜索数组以升序的方式取出索引关键字。
通过以上处理,全部取出在存储于配对节点树内的索引关键字中、在前方一致关键字的有效比特范围内比特值相等的索引关键字。
图31B是说明通过图31A的流程图说明的前方一致检索的检索例的图。图31B(a)示出图2B所例示的配对节点树中与本检索例有关的根节点210a和节点211b以下阶层的部分树、以及检索关键字设定区域270、第2检索关键字设定区域271。在检索关键字设定区域270中设定有前方一致关键字″10××××″,在第2检索关键字设定区域271中设定有将前方一致关键字的无关比特″×″作为″0″而得到的下限关键字″100000″。
此外,对于前方一致关键字的有效比特、无关比特的识别,除了明确指定有效比特的比特数之外,还可以通过在索引关键字的各比特前附加表示是有效比特还是无关比特的识别比特来进行。
在图31B(b)中示出基于在下限值检索以后升序取出索引关键字的搜索路径堆栈310的状态转变(1)~(5)和所取出的索引关键字。
图31B(b)的(1)示出在执行了图31A所示的步骤S3103的下限值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。堆栈指针所指向的位置从终端节点变为节点210f。这里,节点210f的代表节点编号220f所指向的节点是叶节点210g,所以取出该节点210g的索引关键字″100010″作为下限值。
另一方面,虽未图示,将前方一致关键字″10××××的有效比特的末尾的比特位置″1″设定为差分比特位置。
因此,从节点210f起依次对存储在搜索路径堆栈310中的节点的鉴别比特位置和差分比特位置进行比较,取出节点210a作为检索开始节点所紧接上位的节点(父节点),其代表节点编号220a+1设定为检索开始节点211b的数组编号。
以下,执行图31A的步骤S3111所示的以升序方式取出索引关键字的处理、即反复最小值检索的处理。
图31B(b)的(2)示出在将节点211b作为检索开始节点执行了最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最小值检索结果,在搜索路径堆栈310中在终端节点[0]之后存储有节点211b和节点210f。这里,节点210f的代表节点编号220f所指向的节点210g是叶节点,因此再次取出该节点210g的索引关键字″100010″作为最小值,堆栈指针所指向的位置减1,成为节点211b。并且,对最小值检索中的代表节点编号设定代表节点编号220f,对节点位置设定值″1″,并执行下一最小值检索。
图31B(b)的(3)示出在对代表节点编号设定代表节点编号220f、对节点位置设定值″1″来执行最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点211g是叶节点,所以 取出该节点211g的索引关键字″100011″,堆栈指针所指向的位置减1,成为终端节点[0]。然后,对最小值检索中的代表节点编号设定代表节点编号221b,对节点位置设定值″1″,并执行下一最小值检索。
图31B(b)的(4)示出在对代表节点编号设定代表节点编号221b、对节点位置设定值″1″来执行最小值检索处理的阶段的搜索路径堆栈310以及所取出的索引关键字。根据最小值检索的结果,在搜索路径堆栈310中在终端节点[0]之后存储有节点211f。这里,节点211f的代表节点编号221f所指向的节点210h是叶节点,因此取出该节点210h的索引关键字″101011″,堆栈指针所指向的位置减1,成为终端节点[0]。然后,对最小值检索中的代表节点编号设定代表节点编号221f,对节点位置设定值″1″,并执行下一最小值检索。
图31B(b)的(5)示出在对代表节点编号设定代表节点编号221f、对节点位置设定值″1″执行了最小值检索的阶段的搜索路径堆栈310以及所取出的索引关键字。这里,从数组中取出的节点211h是叶节点,因此取出该节点211h的索引关键字″101100″。然后,在图27A所示的步骤S2708中,判断为在上次步骤S2705从搜索路径堆栈310内取出的节点是终端节点,结束处理。
显而易见,通过以上说明的本发明实施方式的配对节点树的各种检索处理、分割结合处理以及使计算机执行其等同物的程序,可实现本发明的配对节点树的各种检索方法、分割方法以及结合方法。
因此,上述程序以及存储有程序的计算机可读取的存储介质包含于本发明的实施方式中。另外,由上述配对节点树的树结构构成的数据结构也包含于本发明的实施方式中。