ビット列検索装置、検索方法及びプログラム
【課題】カップルドノードツリーを複数の格納区域に分割して配置する
【解決手段】カップルドノードツリーのブランチノードは、リンク先のノード対の格納された格納区域の識別子とその格納区域におけるリンク先のノード対の代表ノードの位置を示す位置情報を含む。カップルドノードツリーに新しくインデックスキーを含むリーフノードを挿入するときは、挿入するリーフノードの挿入位置から空ノード対を有する空格納区域を探索し、そこから空ノード対を挿入位置まで移動させてリーフノードを挿入する。
【解決手段】カップルドノードツリーのブランチノードは、リンク先のノード対の格納された格納区域の識別子とその格納区域におけるリンク先のノード対の代表ノードの位置を示す位置情報を含む。カップルドノードツリーに新しくインデックスキーを含むリーフノードを挿入するときは、挿入するリーフノードの挿入位置から空ノード対を有する空格納区域を探索し、そこから空ノード対を挿入位置まで移動させてリーフノードを挿入する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明はビット列の集合から所望のビット列を検索する検索装置、検索方法及びプログラムに関するものであり、特にビット列を記憶するデータ構造に工夫をして、検索速度等の向上を図る技術分野のものである。
【背景技術】
【0002】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【0003】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
上記ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
【0004】
図1は、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
【0005】
図1の例では、インデックスキー“100010”を保持するノード1750aがルートノードとなっており、その検査ビット位置は0である。ノード1750aの左リンク1740aにはノード1750bが接続され、右リンク1741aにはノード1750fが接続されている。
【0006】
ノード1750bの保持するインデックスキーは“010011”であり、検査ビット位置2030bは1である。ノード1750bの左リンク1740bにはノード1750cが、右リンク1741bにはノード1750dが接続されている。ノード1750cが保持するインデックスキーは“000111”、検査ビット位置は3である。ノード1750dが保持するインデックスキーは“011010”、検査ビット位置は2である。
【0007】
ノード1750cから実線で接続された部分はノード1750cの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ1740cは、その欄が空欄であることを示している。点線の接続された右ポインタ1741cの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード1750cを右ポインタが指定していることを表している。
【0008】
ノード1750dの右ポインタ1741dはノード1750d自身を指しており、左リンク1740dにはノード1750eが接続されている。ノード1750eの保持するインデックスキーは“010010”、検査ビット位置は5である。ノード1750eの左ポインタ1740eはノード1750bを、右ポインタ1741eはノード1750eを指している。
【0009】
また、ノード1750fの保持するインデックスキーは“101011”であり、検査ビット位置1730fは2である。ノード1750fの左リンク1740fにはノード1750gが、右リンク1741fにはノード1750hが接続されている。
【0010】
ノード1750gの保持するインデックスキーは“100011”であり、検査ビット位置1730gは5である。ノード1750gの左ポインタ1740gはノード1750aを、右ポインタ1741gはノード1750gを指している。
【0011】
ノード1750hの保持するインデックスキーは“101100”であり、検査ビット位置1730hは3である。ノード1750hの左ポインタ1740hはノード1750fを、右ポインタ1741hはノード1750hを指している。
【0012】
図1の例では、ルートノード1750aからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が1であるか0であるか判定を行い、1であれば右リンクをたどり、0であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば(図1において点線で示されたこの逆戻りのリンクをバックリンクという)、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
【0013】
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は1回ですむことなどのメリットがあるが、各ノードからの2つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
【0014】
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献1に開示された技術がある。下記特許文献1に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
【0015】
しかしながら、下記特許文献1に開示されたものにおいても、1つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを1つとしたため、例えば図1に示したパトリシアツリーの最下段の部分である左ポインタ1740c、右ポインタ1741h等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
【特許文献1】特開2001−357070号公報
【発明の開示】
【発明が解決しようとする課題】
【0016】
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願2006−187827において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであって、該ツリーのノードが1つのときはリーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。
【0017】
ところで近年において、情報処理技術の進展とともに情報サービスへの要求がさらに拡大し、より厳しいものになってきている。情報サービスを提供する上で基本となるのはデータベースの構築とそのデータベースからの情報の取出しであるが、データベースに蓄積されるデータ量はますます増大し、極めて巨大なものとなりつつある。
【0018】
本出願人の先に提案した検索手法は、上記巨大化しつつあるデータベースの高速検索を可能とするものであるが、データベースが巨大化するとともにそれに対応するカップルドノードツリーも、従来のツリー構造のものより記憶容量が少なくてすむとはいえ、大きなものとなる。一方、各種記憶手段の記憶容量にはそれぞれ制限があり、経済的なシステムを構築するためには各種アクセス速度、記憶容量の記憶手段を組み合わせて利用する必要がある。特に、キャッシュメモリを有効利用できることが望ましい。
【0019】
そこで本発明の解決しようとする課題は、カップルドノードツリーを複数の格納区域に分割して配置することを可能とするカップルドノードツリーの構造とそれを用いた検索手法を提供することである。
【課題を解決するための手段】
【0020】
本発明のカップルドノードツリーのブランチノードは、リンク先のノード対の格納された格納区域の識別子とその格納区域におけるリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含む。
【0021】
検索時には、カップルドノードツリーの任意のノードを検索開始ノードとしてブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとする。
【0022】
本発明のカップルドノードツリーに新たにインデックスキーを挿入する場合は、まずそのインデックスキーを検索キーとして、ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてブランチノードに含まれる格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを、ルートノードから順次リーフノードに至るまでリンク経路を記憶しながら繰り返し、該リーフノードに格納されたインデックスキーを検索結果キーとして取得する。
【0023】
挿入するインデックスキーと検索の結果得られたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭のビット位置と、リンク経路上のブランチノードの弁別ビット位置との相対的位置関係により、挿入されるリーフノードともう一方のノードからなる挿入ノード対の挿入される格納区域の識別子と挿入ノード対の代表ノードの該格納区域における位置情報を含むブランチノードの位置情報を示す挿入位置を決定し、挿入ノード対を格納可能な空き領域を備えた空格納区域を探索し、空ノード対を取得し、空ノード対に空格納区域の上位の格納区域のノード対の内容を格納し、該上位の格納区域のノード対を解放して空ノード対を取得する操作を、該上位の格納区域が、挿入ノード対が挿入される格納区域となるまで繰り返し、検索キーと検索結果キーの大小関係に応じて、挿入されるリーフノードを挿入ノード対のどちらのノードとするかを決定し、挿入するインデックスキーをリーフノードに格納する。
【0024】
本発明のカップルドノードツリーからあるインデックスキーを削除するときは、削除するキーにより検索を行い、削除対象のインデックスキーを保持するノードと同一ノード対を構成するノードの内容を当該ノード対のリンク元のブランチノードに書き込み、当該ノード対を削除することにより行う。
【発明の効果】
【0025】
本発明によれば、ブランチノードがリンク先のノード対の格納された格納区域の識別子を含むので、カップルドノードツリーを複数の格納区域に分割して配置することが可能になる。
【発明を実施するための最良の形態】
【0026】
以下、本発明を実施するための最良の形態として、カップルドノードツリーを配列に格納する例について説明する。ブランチノードが保持するリンク先の代表ノードの位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、代表ノードの位置を示す位置情報の情報量を削減することができる。
【0027】
図2Aは、本発明の一実施形態における配列に格納されたカップルドノードツリーの構成例を説明する図である。
図2Aを参照すると、ブロック番号Aで識別される格納区域に配置された配列100の配列番号10の配列要素にノード101が記憶されている。ノード101はノード種別102、弁別ビット位置103、代表ノード番号104a及びブロック番号104bで構成されている。ノード種別102は0であり、ノード101がブランチノードであることを示している。弁別ビット位置103には1が格納されている。代表ノード番号104aにはリンク先のノード対の代表ノードの配列番号20が格納され、ブロック番号104bにはAが格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。さらに、弁別ビット位置に格納された値を、単に弁別ビット位置ということもある。
【0028】
配列番号20の配列要素には、ノード対111の代表ノードであるノード[0]112が格納されている。そして隣接する次の配列要素(配列番号20+1)に代表ノードと対になるノード[1]113が格納されている。ノード[0]112はノード101と同様にブランチノードである。ノード[0]112のノード種別114には0が、弁別ビット位置115には3が、代表ノード番号116aには30が格納され、ブロック番号116bにはBが格納されている。またノード[1]113は、ノード種別117とインデックスキー118aで構成されている。ノード種別117には1が格納されており、ノード[1]113がリーフノードであることを示している。インデックスキー118には、“0001”が格納されている。以下では表記の簡略化のため、インデックスキーに格納されたデータのこともインデックスキーということがある。
【0029】
配列100には、さらにノード対カウンタ119が格納されており、そこには配列100に格納されているノード対の個数である2が記憶されている。
パトリシアツリーについて先に述べたと同様に、インデックスキーと対応するレコードにアクセスするためのアクセス先情報も当然必要である。インデックスキーとアクセス先情報との対応づけは、例えば、インデックスキーを記憶している記憶領域に隣接する記憶領域に、当該インデックスキーに対応するアクセス先情報を記憶することによって行ってもよい。以下ではアクセス先情報については省略して説明する。
【0030】
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
【0031】
上述のノード[0]112のブロック番号116bの値Bで識別される配列120には、ノード対カウンタ129と、配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121が格納されている。
【0032】
ノード対カウンタ129には、配列120に格納されているノード対の個数である1が記憶されている。ノード122とノード123からなるノード対121の内容は省略されている。
【0033】
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された0あるいは1は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。検索キーの、前段のブランチノードの弁別ビット位置にあるビット値である0か1を代表ノード番号に加えた配列番号のノードにリンクする。
【0034】
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置にあるビット値を加えることにより、リンク先のノードが格納されたブロック番号で識別される配列の配列要素の配列番号を求めることができる。
【0035】
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図2Bは、カップルドノードツリーのツリー構造を概念的に示す図である。図示の6ビットのインデックスキーは、図1に例示されたパトリシアツリーのものと同じである。
【0036】
符号210aで示すのがルートノードである。図示の例では、ルートノード210aはブロック番号Aの配列309aの配列番号220に配置されたノード対201aの代表ノードとしている。
【0037】
ツリー構造としては、ルートノード210aの下にノート対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
【0038】
図に示すように、ノード対201a、201b、201f及び201gはブロック番号Aの配列309aに格納され、ノード対カウンタ290aには4が記憶されている。ノード対201cとそれより下層のノード対201d、201eは、ブロック番号Bの配列309bに格納され、ノード対カウンタ290bには3が記憶されている。ノード対201hはブロック番号Cの配列309cに格納され、ノード対カウンタ290cには1が記憶されている。
【0039】
各ノードの前に付された0あるいは1の符号は、図1において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
【0040】
図2Bに示す例では、ルートノード210aのノード種別260aは0でブランチノードであることを示し、弁別ビット位置230aは0を示している。ブロック番号240aはAであり、リンク先のノード対201bがブロック番号Aの配列309aに配置されていることを示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列309aの配列要素の配列番号である。
【0041】
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに0であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには1が格納され、ブロック番号240bには配列309bのブロック番号Bが格納されている。リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列309bの配列要素の配列番号220bが格納されている。
【0042】
ノード210cのノード種別260cには1が格納されているので、このノードはリーフノードであり、したがって、インデックスキーを含んでいる。インデックスキー250cには“000111”が格納されている。一方ノード211cのノード種別261cは0であり、ブランチノードであることを示している。弁別ビット位置231cは2、ブロック番号241cはBであり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列309bの配列要素の配列番号221cが格納されている。
【0043】
ノード210dのノード種別260dは0であり、ブランチノードであることを示している。弁別ビット位置230dは5、ブロック番号240dはBであり、代表ノード番号にはノード対201eの代表ノード210eの格納された配列309bの配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは1であり、インデックスキー251dには“011010”が格納されている。
【0044】
ノード対201eのノード210e、211eのノード種別260e、261eはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250e、251eにはインデックスキーとして“010010”と“010011”が格納されている。
【0045】
ノード対201bのもう一方のノードであるノード211bの弁別ビット位置231bには2が格納され、ブロック番号にはAが格納されている。リンク先の代表ノード番号にはノード対201fの代表ノード210fの格納された配列309aの配列要素の配列番号221bが格納されている。
【0046】
ノード対201fのノード210f、211fのノード種別260f、261fはともに0であり双方ともブランチノードである。それぞれの弁別ビット位置230f、231fには5、3が格納されている。また、ノード210fのブロック番号240fにはA、ブロック番号241fにはCが格納されている。ノード210fの代表ノード番号にはノード対201gの代表ノード210gの格納された配列309aの配列要素の配列番号220fが格納され、ノード211fの代表ノード番号にはノード対201hの代表ノードであるノード[0]210hの格納された配列309cの配列要素の配列番号221fが格納されている。
【0047】
ノード対201gのノード210g、211gのノード種別260g、261gはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250g、251gには“100010”と“100011”が格納されている。
【0048】
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250h、251hには“101011”と“101100“が格納されている。
【0049】
以下、上述のツリーからインデックスキー“100010”を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から0、1、2、・・・とする。
まず、ビット列“100010”を検索キーとしてルートノード210aから処理をスタートする。ルートノード210aの弁別ビット位置230aは0であるので、検索キー“100010”の弁別ビット位置が0のビット値をみると1である。また、ブロック番号240aはAであり、リンク先のノード対は配列309aに存在することが示されている。そこで代表ノード番号の格納された配列番号220aに1を加えた配列番号の配列309aの配列要素に格納されたノード211bにリンクする。
【0050】
ノード211bの弁別ビット位置231bには2が格納されているので、検索キー“100010”の弁別ビット位置が2のビット値をみると0である。ブロック番号240bはAであり、リンク先のノード対は配列309aに存在することが示されている。そこで代表ノード番号の格納された配列番号221bに0を加えた配列番号の配列309aの配列要素に格納されたノード210fにリンクする。
【0051】
ノード210fの弁別ビット位置230fには5が格納されているので、検索キー“100010”の弁別ビット位置が5のビット値をみると0である。ブロック番号240fはAであり、リンク先のノード対は配列309aに存在することが示されている。そこで代表ノード番号の格納された配列番号220fに0を加えた配列番号の配列309aの配列要素に格納されたノード210gにリンクする。
【0052】
ノード210gのノード種別260gは1でありリーフノードであることを示しているので、インデックスキー250gを読み出して検索キーと比較すると両方とも“100010”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
【0053】
図2Bに示すように、カップルドノードツリーのノード対は、いわばツリーの深さ方向を優先して分割して格納領域に配置されている。したがって、上述の検索キー“100010”によるルートノード210aを検索開始ノードとした検索は、配列309aに対するアクセスだけで実行することができる。
【0054】
次に、図2Bを参照してカップルドノードツリーの構成(論理的構成)の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図2Bの例で、ルートノード210aの弁別ビット位置が0であるのは、図2Bに例示されたインデックスキーに0ビット目が0のものと1のものがあるからである。0ビット目が0のインデックスキーのグループはノード210bの下に分類され、0ビット目が1のインデックスキーのグループはノード211bの下に分類されている。
【0055】
ノード211bの弁別ビット位置が2であるのは、ノード211h、210h、211g、210gに格納された0ビット目が1のインデックスキーの1ビット目がすべて0で等しく、2ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
【0056】
以下0ビット目の場合と同様に、2ビット目が1であるものはノード211f側に分類され、2ビット目が0であるものはノード210f側に分類される。
そして2ビット目が1であるインデックスキーは3ビット目の異なるものがあるのでノード211fの弁別ビット位置には3が格納され、2ビット目が0であるインデックスキーでは3ビット目も4ビット目も等しく5ビット目で異なるのでノード210fの弁別ビット位置には5が格納される。
【0057】
ノード211fのリンク先においては、3ビット目が1のものと0のものがそれぞれ1つしかないことから、ノード210h、211hはリーフノードとなり、それぞれインデックスキー250hと251hに“101011”と“101100”が格納されている。
【0058】
仮にインデックスキーの集合に“101100”の代わりに“101101”か“101110”が含まれていたとしても、3ビット目までは“101100”と等しいので、ノード211hに格納されるインデックスキーが変わるだけで、ツリーの論理構造自体は変わることはない。しかし、“101100”に加えて“101101”が含まれていると、ノード211hはブランチノードとなり、その弁別ビット位置は5になる。追加されるインデックスキーが“101110”であれば、弁別ビット位置は4となる。それらの場合、ブランチノード211hのリンク先に例えば配列309cに格納されたノード対があり、リーフノード211hに格納されていたインデックスキー“101100”とインデックスキー“101101”あるいは“101110”の弁別ビット位置でのビット値に応じて、ビット値が0のインデックスキーはノード[0]に、ビット値が1のインデックスキーはノード[1]に格納される。ノード対カウンタ290cの値は2となる。
【0059】
以上説明したように、カップルドノードツリーの論理構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
そしてさらにいえば、異なるビット値となるビット位置ごとにビット値が“1”のノードとビット値が“0”のノードとに分岐していることから、ノード[1]側とツリーの深さ方向を優先させてリーフノードをたどると、それらに格納されたインデックスキーは、ノード211hのインデックスキー251hの“101100”、ノード210hのインデックスキー250hの“101011”、・・・、ノード210cのインデックスキー250cの“000111”となり降順にソートされている。
【0060】
すなわち、カップルドノードツリーにおいては、インデックスキーはソートされてツリー上に配置されている。
検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが“101100”であればノード211hに到達することができる。また、上記説明からも想像がつくように、“101101”か“101110”を検索キーとした場合でもノード211hにたどり着き、インデックスキー251h“101100”が検索結果キーとして得られる。
【0061】
また、例えば“100100”で検索した場合でも、ノード210a、211b、210fのリンク経路では検索キーの3ビット目と4ビット目は使われることがなく、“100100”の5ビット目が0なので、“100010”で検索した場合と同様にノード210gに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
【0062】
図3は、本発明を実施するためのハードウェア構成例を説明する図である。
本発明の検索装置による検索処理及びデータメンテナンスは中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施される。カップルドノードツリーが配置される配列309aと検索中にたどるノードが格納された配列の配列要素の配列番号と配列のブロック番号を記憶する探索経路スタック310を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。
【0063】
図3の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309aは外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
【0064】
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた主記憶装置305の一時記憶領域が用いられることは当然である。そして、以下の説明においては、一次記憶領域に格納されるあるいは設定される値を一時記憶領域の名前で呼ぶことがある。
【0065】
次に、本発明の一実施態様に係るカップルドノードツリーを用いた基本的な操作である検索処理について説明する
図4は、一実施形態におけるビット列の検索処理を示すフローチャートである。
【0066】
まず、ステップS401aで、検索開始ノードを格納した配列のブロック番号と配列要素の配列番号を取得する。検索開始ノードの指定は、検索処理を利用する各種アプリケーションや、利用者によって行われる。
【0067】
取得された検索開始ノードのブロック番号と配列番号は、図示しない検索開始ノード設定エリアに設定されるが、この検索開始ノード設定エリアは、先に述べた「処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶領域」の一つである。以下の説明では、「図示しない検索開始ノード設定エリアに設定する」のような表現に変えて、「検索開始ノードの配列番号を得る。」、「検索開始ノードとして設定する」あるいは単に「検索開始ノードに設定する」のように記述することもある。検索開始ノード以外についても同様である。
【0068】
次に、ステップS402bで、探索経路スタック310に取得されたブロック番号と配列番号を格納し、ステップS403aで、そのブロック番号と配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップS404で、読み出したノードから、ノード種別を取り出し、ステップS405で、ノード種別がブランチノードであるか否かを判定する。
【0069】
ステップS405の判定において、読み出したノードがブランチノードである場合は、ステップS406に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップS407で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップS408aで、ノードからブロック番号と代表ノード番号を取り出して、ステップS409で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップS402bに戻る。
【0070】
以降、ステップS405の判定においてリーフノードと判定されてステップS410に進むまで、ステップS402からステップS409までの処理を繰り返す。ステップS410で、リーフノードからインデックスキーを取り出して、処理を終了する。
【0071】
次に、図5〜図8によりカップルドノードツリーにおけるノード挿入処理を説明する。図5〜図7Eが通常の挿入処理を説明するものであり、図8はルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
【0072】
図5は、本発明の一実施形態における挿入処理、特に空ノード対を挿入位置に取得する処理を概念的に説明する図である。図5に例示するカップルドノードツリーは、後に図12C〜図12Eに示すカップルドノードツリーの部分木である。なお、図5においては、一部において引用符号の表記を省略しているが、図12Cにはすべて表記されている。
【0073】
図5の(1)に示すものは、挿入キーにより検索を行い、挿入キーの挿入位置を求め、空の配列要素の存在する配列である空ブロックを探索した状態である。挿入キー3270の値は“01000”であり、ビット位置1のみが値“1”であり、他のビット位置の値は“0”である。カップルドノードツリーはルートノード3210b、とその下位に直列に連なるノード対3201c、ノード対3201d、3201eから構成されている。
【0074】
ルートノード3210bは、ブロック番号がAである配列3309aの配列番号3220aの配列要素に配置されている。その弁別ビット位置は2、ブロック番号はB、代表ノード番号は3220bである。配列3309aのノード対カウンタ3390aには“2”が格納されている。図の例では配列3309aには部分木のルートノード3210bしか示されていないが、先に述べたように、図示しない上位のノード対により、配列3309aの配列要素が使われているものとしている。
【0075】
ノード対3201cの代表ノードはブランチノードであり、ブロック番号がBである配列3309bの配列番号3220bの配列要素に配置されている。その弁別ビット位置は3、ブロック番号はB、代表ノード番号は3220cである。代表ノードと対をなすノードはリーフノードであり、インデックスキーには“00100”が格納されている。
【0076】
ノード対3201dの代表ノードはブランチノードであり、ブロック番号がBである配列3309bの配列番号3220cの配列要素に配置されている。その弁別ビット位置は4、ブロック番号はC、代表ノード番号は3220dである。代表ノードと対をなすノードはリーフノードであり、インデックスキーには“00010”が格納されている。配列3309bのノード対カウンタ3390bには“1”が格納されている。
【0077】
ノード対3201eの代表ノードはリーフノードであり、ブロック番号がCである配列3309cの配列番号3220cの配列要素に配置されている。そのインデックスキーには“00000”が格納されている。また、代表ノードと対をなすノードはリーフノードであり、インデックスキーには“00001”が格納されている。配列3309cのノード対カウンタ3390cには“2”が格納されている。
【0078】
上述のカップルノードツリーを、検索キーを挿入キー3270、検索開始ノードをルートノード3210bとして検索すると、太枠で示すリーフノードに格納されたインデックスキー“00000”が検索結果キーとして得られる。そして、検索結果キーと挿入キーの上位からのビット列比較により、最初に異なるビット値となる差分ビット位置を求めると、値1が得られる。差分ビット位置と各弁別ビット位置との相対的な大小関係から、挿入位置として、太枠で示すルートノード3210bが得られる。
【0079】
ここで、挿入位置がルートノード3210bであるとは、ブランチノードであるルートノードのブロック番号Bの配列の代表ノード番号3220bの指す配列要素に、挿入キーをインデックスキーとして含むリーフノードとそれと対をなすノードからなる挿入ノードの代表ノードが配置されるということである。つまり、挿入ノード対の実際に挿入される配列要素は、挿入位置のブランチノードのリンク先である。
【0080】
図に示す例では、各配列のノード対の最大格納数は2としている。そこで、ブロック番号Bの配列3309bのノード対カウンタ3390bの値は2で最大格納数を示していることから下位のノードの配置された空ブロックを探索し、ブロック番号Cの配列3309c(以下、ブロックCということがある。他の配列についても同様である。)から空ノード対3201fを取得した状態が、図5の(1)に示すものである。
【0081】
図5の(2)に示すものは、空のノード対を含むブロックCのノードにリンクするブロックBのノードを含むノード対をブロックCに移動してブロックBに空ノード対を確保し、挿入ノード対を挿入位置に挿入可能とした状態である。
図5の(1)に示すブロックBのノード対3201dの内容がブロックCの空ノード対3201fに書き込まれ、ノード対3201dの配置されていた配列要素は空になっている。すなわち、挿入ノード対が挿入されるブロックBに空ノード対が確保されている。したがって、ノード対カウンタ3390bの値は1つ減って1になっている。また、ノード対カウンタ3390cの値は1つ増えて2になっている。
【0082】
図5の(3)に示すものは、挿入位置に挿入ノード対を挿入するとともに、挿入位置のブランチノードの弁別ビット位置を更新して挿入処理を完成させた状態である。
挿入キー“01000”が検索結果キー“00000”より大きいことから、挿入キーをインデックスキーとして含むリーフノードはノード対3201dのノード[1]に配置され、挿入位置のブランチノードであるルートノード3210bの内容がノード対3201dのノード[0]に書き込まれている。そして、挿入位置のブランチノードであるルートノード3210bの弁別ビット位置は差分ビット位置の値1に更新されている。ノード対カウンタ3390bの値は2に更新されている。
【0083】
図6は、本発明の一実施形態における挿入処理全体の処理フローの概要を説明する図である。
まず、ステップS600として示すように、挿入キーを検索キーとして、ルートノードよりカップルドノードツリーを検索して検索結果キーを得る。ステップS600の詳細フローは図7Aを参照して説明する。
次にステップS610として示すように、挿入ノード対の挿入位置を求める。ステップS610の詳細フローは図7Bを参照して説明する。
次にステップS630として示すように、ノード対用の空き領域を備えた空格納区域を探索し、空ノード対を取得する。ステップS630の詳細フローは図7Cを参照して説明する。
上述のステップS600、ステップS610及びステップS630の処理により、図5の(1)に示す状態が得られる。
【0084】
次にステップS640として示すように、挿入ノード対の挿入位置に空ノード対を移動する。この処理は、図5の(2)に示す状態に対応する。ステップS640の詳細フローは図7Dを参照して説明する。
【0085】
最後にステップS660として示すように、空ノード対に挿入キー等を格納して挿入ノード対を完成させる。この処理は、図5の(3)に示す状態に対応する。ステップS660の詳細フローは図7Eを参照して説明する。
【0086】
以下、図7A〜図7Eを参照して、図6に示す概略フローチャートの各ステップの詳細フローチャートを説明する。この詳細フローチャートにおいては、カップルドノードツリーは配列に格納されているものとして説明する。
【0087】
図7Aは、挿入キーを検索キーとして、ルートノードよりカップルドノードツリーを検索して検索結果キーを得る図6に示すステップS600の詳細な処理フローを説明する図である。挿入キーは検索キーとして設定されているものとする。
【0088】
ステップS701において、検索開始ノードに、ルートノードの配置された配列のブロック番号とその配列の配列要素の配列番号を設定する。図5に示す例では、検索開始ノードにブロック番号Aと配列番号3220aが設定される。
次にステップS703において、図4に示す検索処理により、検索結果キーとしてのインデックスキーを得る。図5の例示では、インデックスキー“00000”が得られる。
【0089】
ステップS705において、挿入キー(検索キー)とインデックスキー(検索結果キー)が等しいか判定し、等しければ挿入失敗として処理を終了する。等しくなければ図7Bに示すステップS711に進む。
【0090】
図7Bは、挿入ノード対の挿入位置を求める図6に示すステップS610の詳細な処理フローを説明する図である。
ステップS711で、挿入キーとステップS703で得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップS712に進み、ステップS711で得た差分ビット列から、上位0ビット目から見た最初の不一致ビットのビット位置を、差分ビット位置に設定する。この処理は、例えばプライオリティエンコーダを有するCPUではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置(差分ビット位置)を得ることも可能である。図5に示す例では、差分ビット位置には1が設定される。
【0091】
次にステップS713で、リーフ位置ポインタに、探索経路スタックのスタックポインタの値を設定する。図5に示す例では、リーフ位置ポインタに設定される値は、探索経路スタックのブロック番号Cと配列番号3220dを指すスタックポインタの値である。探索経路スタックの一番下のスタックエリアを指すポインタ値を0とすると、リーフ位置ポインタに設定される値は3になる。
【0092】
次にステップS714に進み、探索経路スタックのスタックポインタがルートノードの配列番号を指しているか判定する。指していればステップS720に移行し、指していなければステップS715に進む。
ステップS715において、探索経路スタックのスタックポインタを1つ戻してそこにスタックされているブロック番号と配列番号を取り出す。
ステップS716に進み、ステップS715で取り出したブロック番号と配列番号の指す配列要素を配列からノードとして読み出す。
ステップS717に進み、ステップS716で読み出したノードから、弁別ビット位置を取り出す。
次にステップS718に進み、ステップS717で取り出した弁別ビット位置がステップS712で設定した差分ビット位置より上位の位置関係か判定する。ここで上位の位置関係とは、ビット列のより左側の位置、すなわちビット位置の値が小さい位置であることとする。
【0093】
ステップS718の判定結果が否定であれば、ステップS714に戻り、ステップS718での判定が肯定になるかステップS714での判定が肯定になるまで繰り返す。ステップS718での判定が肯定になると、ステップS719で経路探索スタックのスタックポインタを1つ進め、ステップS720に移行する。
【0094】
ステップS720では、探索経路スタックから、スタックポインタの指すブロック番号と配列番号を取り出し、挿入位置のブロック番号と配列番号に設定する。次にステップS721において、挿入位置ポインタに、探索経路スタックポインタの値を設定して、図7Cに示すステップS731に進む。図5に示す例示では、ルートノード3210bの弁別ビット位置の値が2であり、差分ビット位置より下位なので、ステップS714での判定が肯定になってステップS714からステップS718のループ処理から抜け出す。したがって、挿入位置のブロック番号と配列番号には、ブロック番号Aと配列番号3210bが設定される。また、挿入位置ポインタの値には、上述のポインタ値の表記(以下、この表記を断りなく用いることがある。)によれば、ルートノードの配列番号を指すポインタの値である0が設定される。
【0095】
図7Cは、ノード対に用いる空配列要素を備えた空ブロックを探索し、空ノード対を取得する図6に示すステップS630の詳細な処理フローを説明する図である。
まずステップS731で、ブロック番号に、ステップS720で設定した挿入位置のブロック番号を設定する。図5の例示では、ここでブロック番号に設定されるのはブロック番号Aである。
【0096】
次にステップS732で、ブロック番号の指す配列のノード対カウンタの値は上限値か判定する。上限値でなければステップS736に分岐し、上限値であればステップS733に進み、探索経路スタックのスタックポインタの値はリーフ位置ポインタの値と等しいか判定する。それらの値が等しくなければ、ステップS734に分岐し、探索経路スタックのスタックポインタを1つ進めて、スタックポインタの指すブロック番号を取り出し、ステップS732に戻る。
【0097】
探索経路スタックのスタックポインタの値とリーフ位置ポインタの値が等しければ、ステップS735において、ブロック管理から、空状態の配列のブロック番号を取得し、ステップS736に進む。なお、本発明は、配列の空塞がりの管理を行うブロック管理の存在を前提としており、ブロック管理から、空状態の配列のブロック番号を取得するものとしている。また、配列に格納可能なノード対の上限も、ブロック管理から与えられ、ノード対カウンタの値により配列に空が存在するか判断するものとする。
【0098】
ステップS736では、ノード対の移動先のブロック番号に、取得したブロック番号を設定し、図7Dに示すステップS741に進む。ここで設定される取得したブロック番号は、ステップS731で設定した挿入位置のブロック番号、ステップS734で取り出したブロック番号、あるいはステップS735で取得したブロック番号である。
【0099】
図5の例示では、ブロック番号Aの配列3309aのノード対カウンタ3390a及びブロック番号Bの配列3309bのノード対カウンタ3390bの値は上限値であり、ブロック番号Cの配列3309cのノード対カウンタ3390cの値は上限値でないので、探索経路スタックからブロック番号Cが取り出されて、ノード対の移動先のブロック番号に設定される。このとき、探索経路スタックのポインタ値は、ブロック番号Cと代表ノード番号3220dを指す3である。
【0100】
図7Dは、挿入ノード対の挿入位置に空ノード対を移動する図6に示すステップS640の詳細な処理フローを説明する図である。挿入ノード対の挿入位置に空ノード対を確保するために、空ノード対を取得したブロック番号の配列(移動先)に配置されたノードから、ステップS703で実行した検索処理のリンク経路を遡り、空ノード対を取得したブロック番号の配列とは異なるブロック番号の配列に配置された上位のノードを含むノード対(移動元)を移動先に移動し、移動元を空ノード対とすることを、挿入位置に空ノード対を確保するまで繰り返す。
【0101】
まず、ステップS741で、探索経路スタックのスタックポインタの値は挿入位置ポインタの値と等しいか判定する。等しければ図7Dに示すステップS761に分岐し、等しくなければステップS742に進む。ステップS742では、探索経路スタックのスタックポインタの指すブロック番号と配列番号を取り出し、スタックポインタを1つ戻す。
次にステップS743で、取り出したブロック番号とステップS736で設定した移動先のブロック番号は一致するか判定する。一致すればステップS741に戻り、一致しなければステップS744に進む。図5に示す例示では、図7Dに示す処理の最初の処理のときには探索経路スタックのスタックポインタの値は3であり、移動先のブロック番号はCである。したがって、ステップS741〜ステップS743の処理ループを一周してからステップS744に進む。このとき、ステップS742で取り出したブロック番号はBであり、探索経路スタックのスタックポインタの値は1になっている。
【0102】
ステップS744では、ノード対の移動元のブロック番号にステップS742で取り出したブロック番号を、ノード対の移動元の代表ノード番号にステップS742で取り出した配列番号から得た代表ノード番号を設定する。ここで配列番号から代表ノード番号を得ることは、ノード[0]とノード[1]の配列番号は1つ違いであり、その大小とどちらが偶数であるか決められていることにより可能であることは明らかである。
図5の例示では、ノード対の移動元のブロック番号にはBが、代表ノード番号には3220cが設定される。
【0103】
次に、ステップS745で、ステップS736で設定したノード対の移動先のブロック番号の配列から空のノード対の代表ノードの配列番号を取得するとともに、ノード対カウンタを1つ加算し、ステップS746で、ノード対の移動先の代表ノード番号に、ステップS745で取得した空のノード対の代表ノードの配列番号を設定する。
次に、ステップS747において、ステップS744で設定したノード対の移動元のブロック番号と代表ノード番号の指す配列要素の組の内容をノード対として読み出し、ステップS748で、該読み出したノード対の内容を、ステップS746で設定したノード対の移動先のブロック番号と代表ノード番号の指す配列要素の組に書き込む。
【0104】
図5の例示では、図5の(1)に示すように、ノード対の移動先のブロック番号がCである配列3309cから空のノード対3201fが取得され、その代表ノードの配列番号は、図5の(2)に示すように3220c’である。そして、ノード対カウンタ3390cは1つ加算され1から2になっており、ノード対の移動元のブロック番号Bと代表ノード番号3220cの指す配列要素の組(ノード対3201d)の内容がノード対の移動先のブロック番号Cと代表ノード番号3220c’の指す配列要素の組(ノード対3201f)に書き込まれている。ノード対3201fと代表ノード番号3220fに付された括弧書き(3201d)と(3220d)は、それぞれの値が図5の(1)で示すものの内容と等しいことを示している。
【0105】
次に、ステップS749において、探索経路スタックのスタックポインタの指すブロック番号と配列番号を取り出し、ステップS750で、該取り出したブロック番号と配列番号の指す配列要素の、ブロック番号にノード対の移動先のブロック番号を、代表ノード番号にノード対の移動先の代表ノード番号を書き込む。
次に、ステップS751において、ノード対の移動元のブロック番号と代表ノード番号の指すノード対を解放するとともに、ノード対カウンタを1つ減算する。そして、ステップS752において、ノード対の移動先のブロック番号に、ノード対の移動元のブロック番号を設定してステップS741に戻る。
【0106】
図5に示す例では、探索経路スタックのスタックポインタの値は1となっており、ブロック番号Bと配列番号3220bが取り出される。ブロック番号Bと配列番号3220bの指すノード3210cのブロック番号にノード対の移動先のブロック番号Cを、代表ノード番号にノード対の移動先の代表ノード番号3220c’を、書き込んだ状態が図5の(2)に示されている。また、ノード対の移動元のブロック番号Bと代表ノード番号3220cの指すノード対3201dを解放するとともに、ノード対カウンタ3390bを1つ減算して1としている。また、ノード対の移動先のブロック番号には、ノード対の移動元のブロック番号Bが設定される。
【0107】
図5に示す例においては、ステップS741に最初に戻ったとき、探索経路スタックのスタックポインタの値は1であるので、ステップS742を経て探索経路スタックのスタックポインタの値を0としてからステップS743に至り、比較対象のブロック番号が共にBであるので、再度ステップS741に戻る。このときは、探索経路スタックのスタックポインタの値は0であって、挿入位置ポインタの値と等しいので、図7Eに示すステップS761に進む。
【0108】
図7Eは、空ノード対に挿入キー等を格納して挿入ノード対を完成させる図6に示すステップS660の詳細な処理フローを説明する図である。
まず、ステップS761において、空のノード対のブロック番号に、ノード対の移動先のブロック番号を設定し、次にステップS762に進み、空のノード対のブロック番号の配列から、空のノード対の代表ノードの配列番号を取得するとともに、ノード対カウンタを1つ加算する。
【0109】
次にステップS763において、挿入キーとステップS703で得たインデックスキーの大小を比較し、挿入キーが大きいときは値1を小さいときは値0のブール値を得る。
次にステップS764で、ステップS762で設定した代表ノード番号にステップS763で得たブール値を加えて、リーフノードの配列番号に設定する。また、ステップS765において、ステップS762で設定した代表ノードの配列番号にステップS763で得たブール値の論理否定値を加算した配列番号を対ノードの配列番号に設定する。ステップS764で設定した配列番号は、挿入キーをインデックスキーとして含むリーフノードが配置される配列要素の配列番号であり、ステップS765で設定した配列番号は、そのリーフノードとノード対を成すノードが配置される配列要素のものである。
【0110】
次にステップS766において、空ノード対のブロック番号とステップS764で設定したリーフノードの配列番号の指す配列要素の、ノード種別にリーフを、インデックスキーに挿入キーを書き込む。
次にステップS767において、挿入位置のブロック番号と配列番号の指す配列要素からその内容を読み出し、ステップS768で、該読み出した内容を空ノード対のブロック番号とステップS765で設定した配列番号の指す配列要素に書き込む。
最後にステップS769において、挿入位置のブロック番号と配列番号の指す配列要素の、ノード種別にブランチを、弁別ビット位置に差分ビットビット位置を、代表ノード番号に挿入するノード対の代表ノード番号を書き込み、処理を終了する。
【0111】
図8は、本発明の一実施の形態におけるルートノードの挿入処理を含むインデックスキーを挿入する場合のノード挿入処理全体を説明する処理フロー図である。
ステップS801において、取得することを求められたカップルドノードツリーのルートノードのブロック番号と配列番号が登録済みであるか判定される。登録済みであれば、図6〜図7Eを用いて説明した通常の挿入処理が行われる。
【0112】
ステップ801での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まることになる。
まず、ステップS802において、ブロック管理から、空状態の配列のブロック番号を取得する。次にステップS803において、該取得したブロック番号の指す配列から空きのノード対の代表ノードとなるべき配列要素の配列番号を取得するとともに、ノード対カウンタを1つ加算する。
【0113】
次にステップS804において、ステップS803で得た配列番号に0を加えた配列番号を求める(実際には、ステップS803で取得した配列番号に等しい。)。さらにステップS805において、ブロック番号とステップS804で得た配列番号の指す配列要素の、ノード種別にリーフを、インデックスキーに挿入キーを書き込む。
最後にステップS806で、ステップS802とステップS804でそれぞれ取得したルートノードのブロック番号と配列番号を登録して処理を終了する。
【0114】
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図8及び図6〜図7Eの処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかである。
【0115】
次に図9、図10を参照して、本発明の一実施の形態におけるカップルドノードツリーに係るインデックスキーの集合から、特定のインデックスキーを削除する処理フローを説明する。
【0116】
図9は、削除処理の前段である検索処理の処理フローを説明する図である。削除対象のインデックスキーは削除キーとして指定されているものとする。
まず、ステップS901で、検索開始ノードに、ルートノードの配置された配列のブロック番号とルートノードの配置された配列要素の配列番号を設定する。
【0117】
次にステップS902において、図4に示す検索処理により、削除キーを検索キーとして検索開始ノードより配列を検索し、検索結果キーとしてのインデックスキーを得る。
次にステップ903において、削除キーとインデックスキーを比較し、等しくなければ削除するインデックスキーはカップルドノードツリーに存在しないのであるから、削除は失敗となり、処理を終了する。等しければ次の処理、図10のステップS904以下の処理に進む。
【0118】
図10は、削除処理の後段の処理フローを説明する図である。
まず、ステップS904で探索経路スタックに2つ以上の配列番号が格納されているか判定する。2つ以上の配列番号が格納されていないということは、言い換えれば1つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合はステップS912に移行し、ステップS901で得たブロック番号の指す配列を解放する。次にステップS913に進み、ルートノードのブロック番号と配列番号の登録を抹消して処理を終了する。
【0119】
ステップS904において探索経路スタックに2つ以上の配列番号が格納されていると判定されたときはステップS905に進み、ステップS902において実行した図4に示す検索処理のステップS408aで得た代表ノード番号にステップS407で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除対象のインデックスキーが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
【0120】
次にステップS906において、ステップS905で得た配列番号の配列要素の内容を読み出し、さらにステップS907において、探索経路スタックのスタックポインタを1つ戻してブロック番号と配列番号を取り出す。
次にステップS908に進み、ステップS907で読み出した配列要素の内容をステップS907で得たブロック番号と配列番号の指す配列要素に書き込む。この処理は、削除対象のインデックスキーが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
【0121】
次にステップS909において、上述の図4に示すステップS408aで得たブロック番号と代表ノード番号の指すノード対を削除するとともに、ノード対カウンタの値を1つ減算し、ステップS910に進む。
ステップS910では、ノード対カウンタの値は0か判定し、0でなければ処理を終了し、0であれば、ステップS911において、上述の図4に示すステップS408aで得たブロック番号の指す配列を解放して処理を終了する。
【0122】
次に、具体例により、本発明の一実施形態に係る削除処理と挿入処理を説明する。
図11Aは、ノードの削除前のカップルドノードツリーと削除処理において検索処理を実行した探索経路スタックの状態を説明する図である。
【0123】
図11Aに例示するカップルドノードツリーは、ノード対1201a、1201b、1201cで構成されている。ノード対1201aとノード対1201bはブロック番号Aの配列1309aに配置され、ノード対1201cはブロック番号Bの配列1309bに配置されている。したがって、配列1309aのノード対カウンタ1390aの値は2であり、配列1309bのノード対カウンタ1390bの値は1である。
【0124】
ノード対1201aの代表ノードであるルートノード1210aは配列1309aの配列番号1220の配列要素に配置されており、ノード種別1260aは0であってブランチノードである。弁別ビット位置1230aには0が保持され、ブロック番号1240aにはAが保持されている。また、代表ノード番号には、ノード対1201bの代表ノード1210bの配置された配列番号である1220aが保持されている。
【0125】
ノード対1201bの代表ノード1210bはノード種別1260bが0であってブランチノードであり、弁別ビット位置1230bには2が保持され、ブロック番号にはBが保持されている。また、代表ノード番号には、ノード対1201cの代表ノード1210cの配置された配列番号である1220bが保持されている。
代表ノード1210bと対をなすノード1211bはノード種別1261bが1であってリーフノードであり、インデックスキー1251bには“10000”が格納されている。
【0126】
ノード対1201cの代表ノード1210cはノード種別1260cが1であってリーフノードであり、インデックスキー1250cには“00000”が格納されている。
代表ノード1210cと対をなすノード1211cはノード種別1261cが1であってリーフノードであり、インデックスキー1251cには“00100”が格納されている。
【0127】
削除キー1270には、“00100”が設定されている。この削除キーを検索キーとしてルートノード1210aより検索をした経路が、探索経路スタック310にスタックされている。探索経路スタック310には、配列番号とブロック番号の組が、(1220、A)、(1220a、A)、(1220b+1、B)とスタックされている。これに対応してリンク経路が、カップルドノードツリーの太枠で囲んだノードと太線の矢印で示されている。検索結果としてリーフノード1211cのインデックスキー“00100”が得られ、リーフノード1211cが削除対象の削除ノードとなることが図11Aに示されている。また、太線の矢印で示す探索経路スタック310のスタックポインタは、配列番号1220b+1とブロック番号Bを指している。
【0128】
図11Bは、削除処理を完了した後のカップルドノードツリー等の状態を説明する図である。図11Aに示す削除ノード1211cと対をなすノード1210cの内容が、探索経路スタック310のスタックポインタを1つ戻したところにスタックされているブロック番号Aと配列番号1220aの指すノード1210bに書き込まれた状態が図11Bに示されている。ノード種別1260bの括弧書き(1260c)は、ノード種別1260bにはノード種別1260cの値が書き込まれたことを示している。インデックスキー1250bとその括弧書き(1250c)についても同様である。
【0129】
削除ノード1211cとそれと対をなし、その内容が直近上位のブランチノード1210bに書き込まれたノード1210cからなるノード対1201cは削除され、ノード対カウンタ1390bの値は1つ減って0となっている。したがって、ブロック番号Bの配列1309bは解放される。
【0130】
次に、図12A及び図12Bを参照して挿入処理の具体例1を説明する。具体例1は、探索経路スタック上のブロック番号の指す配列に空のノード対を確保する配列要素が存在しない場合のものである。
【0131】
図12Aは、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態とブロック番号Bの配列2309bを新たに取得した状態を説明する図である。
図12Aに示すように、ノード対2201aとノード対2201bからなるカップルドノードツリーがブロック番号Aの配列2309aに配置されている。したがって、配列2309aのノード対カウンタ2390aの値は2である。
【0132】
ノード対2201aの代表ノードであるルートノード2210aは、ブロック番号Aの配列2309aの配列番号2220の配列要素に配置されている。ルートノード2210aのノード種別は0であってブランチノードである。弁別ビット位置2230aには0が保持され、ブロック番号2240aにはAが保持されている。また、代表ノード番号には、ノード対2201bの代表ノード2210bの配置された配列番号である2220aが保持されている。
ノード対2201bの代表ノード2210bはノード種別2260bが1であってリーフノードであり、インデックスキー2250bには“00001”が格納されている。代表ノード2210bと対をなすノード2211bはノード種別2261bが1であってリーフノードであり、インデックスキー2251bには“10000”が格納されている。
【0133】
挿入キー2270には、“00000”が設定されている。この挿入キーを検索キーとしてルートノード2210aより検索をしたリンク経路が、カップルドノードツリーの太枠で囲んだノードと太線の矢印で示され、さらに検索結果としてリーフノード2210bのインデックスキー“00001”が得られることが示されている。
【0134】
探索経路スタック310には、配列番号とブロック番号の組が、(2220、A)、(2220a、A)とスタックされている。挿入キーと検索結果キーの差分ビット位置は4であるから、検索処理後に1つ戻された探索経路スタックのスタックポインタは図7Bに示すステップS719の処理により1つ進められ、図12Aに太線の矢印で示すように、配列番号2220aとブロック番号Aを指している。
したがって、挿入位置のブロック番号はA、配列番号は2220aであるから、リーフノード2210bが挿入位置となることが図12Aに示されている。
【0135】
図12Aの例示では、ノード対カウンタ2390aが上限値となっていること、探索経路スタックのスタックポインタはリーフ位置ポインタであることから、ノード対カウンタ2309bの値が0の空のブロック番号Bの配列2309bを新たに取得する。さらに配列2309bから、代表ノード2210cとそれと対をなすノード2211cからなる空ノード対2201cを取得した状態が図12Aに示されている。
【0136】
図12Bは、挿入処理後のカップルドノードツリーを説明する図である。挿入キー“00000”と検索結果のインデックスキー“00001”の大小関係により、確保した空ノード対2201cのノード[0]を、挿入キー“00000”をインデックスキー2250cとして含むリーフノード2210cとし、ノード[1]を、検索結果キー“00001”
をインデックスキー2251cとして含むリーフノード2211cとしている。また、ノード対カウンタ2390cの値は1つ増えて1となっている。
挿入位置のノード2210bはブランチノードとなり、ノード種別2260bは0に更新され、その弁別ビット位置には挿入キーと検索結果キーの差分ビット位置である4が格納され、ブロック番号2240bにはBが格納されている。また、代表ノード番号2220bは挿入されたノード対2201cの代表ノード2210cが配置された配列要素の配列番号が格納されている。
【0137】
次に図12C、図12D及び図12Eを参照して、挿入処理の具体例2を説明する。具体例2は、探索経路スタック上のブロック番号の指す配列に空のノード対を確保する配列要素が存在する場合のものである。図12C、図12D及び図12Eに例示するカップルドノードツリーは、図5にその部分木を示したものである。図5には記載されていないノード対3201aと挿入位置のノード3210bと対をなすノード3211bが示されている。その他のツリー構造は、図5に示すものと同じであるので、説明を省略する。
【0138】
図12Cは、図5の(1)に示すものに対応し、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態と探索経路スタック上のブロック番号の指す配列に空ノード対を取得した状態を説明する図である。
ノード対3201aの代表ノードであるルートノード3210aは、ブロック番号Aの配列3309aの配列番号3220の配列要素に配置されている。ルートノード3210aのノード種別3260aは0であってブランチノードである。弁別ビット位置3230aには0が保持され、ブロック番号3240aにはAが保持されている。また、代表ノード番号には、ノード対3201bの代表ノード3210bの配置された配列番号である3220aが保持されている。
代表ノード3210bと対をなすノード3211bのノード種別3261bはリーフノードであることを示す1であり、インデックスキー3251bには“10000”が格納されている。
【0139】
図5に示すものと同じく、挿入キー3270には、“01000”が設定されている。この挿入キーを検索キーとしてルートノード3210aより検索をしたリンク経路が、カップルドノードツリーの太枠で囲んだノードと太線の矢印で示され、さらに検索結果としてリーフノード3210eのインデックスキー“00000”が得られることが示されていることも、ブランチノード3210b以降は図5の(1)に示すものと同じである。
探索経路スタック310には、配列番号とブロック番号の組が、(3220、A)、(3220a、B)、(3220b、B)、(3220c、B)、(3220d、C)とスタックされている。探索経路スタック310のスタックポインタは、図12Cに太線の矢印で示すように、最初に見つかった空ノード対の存在する配列3309cのブロック番号Cと配列番号3220dを指している。
【0140】
また、図5の(1)に示すものと同様に、ブロック番号Cの配列3309cに空ノード対3201fを取得した状態が示されている。
図12Cの例示では、検索開始ノードはノード3210aであり、弁別ビット位置3230aが0、ブロック番号3240がA、代表ノード番号3220aがノード対3201bの代表ノードを指しており、挿入キーの0ビット目のビット値が0である。したがって、挿入処理の検索処理において、ルートノード3210aからノード3210bにリンクする。それ以降の処理は図5の(1)を参照して説明したものとほぼ同じである。図5の(1)に示すものでは、検索開始ノードがノード3210bであって、その弁別ビット位置が“2”で差分ビット位置の値“1”より下位であるから、図7Bに示すステップS720にはステップS714から直接分岐するものであるが、図12Cに示すものでは、検索開始ノードがノード3210aであって、その弁別ビット位置が“0”で差分ビット位置の値“1”より上位であるから、ステップS719を介してステップS720に進む。したがって、どちらの場合も、ノード3210bが挿入位置となり、同じになるので、説明を省略する。
【0141】
図12Dは、図5の(2)に示すものに対応する図であり、空のノード対を含むブロックCのノードにリンクするブロックBのノードを含むノード対をブロックCに移動してブロックBに空ノード対を確保し、挿入ノード対を挿入位置に挿入可能とした状態を示している。各ブロック番号の配列の状態については図5の(2)について説明したとおりである。
探索経路スタック310のスタックポインタは、図12Cに示す最初に見つかった空ノード対の存在する配列3309cのブロック番号Cと配列番号3220dを指すものから、空ノード対に移動してブロック番号Bの配列3309bに空ノード対を確保するノード対3201dの直近上位のノード3210cのブロック番号Bと配列番号3220cを指すポインタ値から1つ戻した、ブロック番号Bと配列番号3220bを指すものとなっている。このポインタ値を1つ戻す操作は、図7Dに示すステップS742で実行される。
【0142】
図12Eは、図5の(3)に示すものに対応する図であり、挿入位置に挿入ノード対を挿入するとともに、挿入位置のブランチノードの弁別ビット位置を更新して挿入処理を完成させた状態を示している。各ブロック番号の配列の状態については図5の(3)について説明したとおりである。
探索経路スタック310のスタックポインタは、図7Bに示すステップS721で設定された挿入位置ポインタと等しく、ブロック番号Aと配列番号3220aを指すものとなっている。
【0143】
以上本発明を実施するための最良の形態について詳細に説明したが、本発明の実施の形態はそれに限ることなく種々の変形が可能であることは当業者に明らかである。例えばリーフノードが、インデックスキー自体を含むことに代えてインデックスキーを格納した記憶領域の位置を示す情報を含むようにすることが可能であることは、当業者に自明である。
【0144】
また、本発明のビット列検索方法を実行する装置が、カップルドノードツリーを格納する記憶手段と図4に例示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。そして、そのプログラムにより、ブランチノードとリーフノードの識別手段、ブランチノードの弁別ビット位置に応じてリンク先のノード対のどちらかにリンクする手段等がコンピュータ上に実現される。
【0145】
また、本発明のインデックスキー挿入方法あるいはインデックスキー削除方法を実行する装置が、図6あるいは図9及び図10に例示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことも明らかである。
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
【図面の簡単な説明】
【0146】
【図1】従来の検索で用いられるパトリシアツリーの一例を示す図である。
【図2A】配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図2B】カップルドノードツリーのツリー構造を概念的に示す図である。
【図3】本発明を実施するためのハードウェア構成例を説明する図である。
【図4】本発明の一実施形態における検索処理を説明するフローチャートである。
【図5】本発明の一実施形態における挿入処理を概念的に説明する図である。
【図6】本発明の一実施形態における挿入処理全体の処理フローの概要を説明する図である。
【図7A】挿入キーを検索キーとして、ルートノードよりカップルドノードツリーを検索して検索結果キーを得る処理フローを説明する図である。
【図7B】挿入ノード対の挿入位置を求める処理フローを説明する図である。
【図7C】ノード対用の空配列要素を備えた空ブロックを探索し、空ノード対を取得する処理フローを説明する図である。
【図7D】挿入ノード対の挿入位置に空ノード対を移動する処理フローを説明する図である。
【図7E】空ノード対に挿入キー等を格納して挿入ノード対を完成させる処理フローを説明する図である。
【図8】本発明の一実施の形態におけるルートノードの挿入処理を含むノード挿入処理全体を説明する処理フロー図である。
【図9】本発明の一実施形態における削除処理の前段である検索処理の処理フローを説明する図である。
【図10】本発明の一実施形態における削除処理の後段の処理フローを説明する図である。
【図11A】ノードの削除前のカップルドノードツリーと削除処理において検索処理を実行した探索経路スタックの状態を説明する図である。
【図11B】削除処理を完了した後のカップルドノードツリー等の状態を説明する図である。
【図12A】挿入処理の具体例1において、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態と配列を新たに取得した状態を説明する図である。
【図12B】挿入処理の具体例1における挿入処理後のカップルドノードツリーを説明する図である。
【図12C】挿入処理の具体例2において、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態と探索経路スタック上のブロック番号の指す配列に空ノード対を取得した状態を説明する図である。
【図12D】挿入処理の具体例2において、空のノード対を移動して挿入ノード対を挿入位置に挿入可能とした状態を説明する図である。
【図12E】挿入処理の具体例2において、挿入位置に挿入ノード対を挿入するとともに、挿入位置のブランチノードの弁別ビット位置を更新して挿入処理を完成させた状態を説明する図である。
【符号の説明】
【0147】
10、20、30 配列番号
100、120 配列
101 ノード
102 ノード種別
103a 弁別ビット位置
104a 代表ノード番号
104b ブロック番号
111 ノード対
112 ノード[0]、代表ノード
113 ノード[1]、代表ノードと対をなすノード
119、129 ノード対カウンタ
301 データ処理装置
302 中央処理装置
303 キャッシュメモリ
304 バス
305 主記憶装置
306 外部記憶装置
307 通信装置
308 データ格納装置
309a 配列
310 探索経路スタック
1270 削除キー
2270、3270 挿入キー
【技術分野】
【0001】
本発明はビット列の集合から所望のビット列を検索する検索装置、検索方法及びプログラムに関するものであり、特にビット列を記憶するデータ構造に工夫をして、検索速度等の向上を図る技術分野のものである。
【背景技術】
【0002】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【0003】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
上記ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
【0004】
図1は、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
【0005】
図1の例では、インデックスキー“100010”を保持するノード1750aがルートノードとなっており、その検査ビット位置は0である。ノード1750aの左リンク1740aにはノード1750bが接続され、右リンク1741aにはノード1750fが接続されている。
【0006】
ノード1750bの保持するインデックスキーは“010011”であり、検査ビット位置2030bは1である。ノード1750bの左リンク1740bにはノード1750cが、右リンク1741bにはノード1750dが接続されている。ノード1750cが保持するインデックスキーは“000111”、検査ビット位置は3である。ノード1750dが保持するインデックスキーは“011010”、検査ビット位置は2である。
【0007】
ノード1750cから実線で接続された部分はノード1750cの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ1740cは、その欄が空欄であることを示している。点線の接続された右ポインタ1741cの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード1750cを右ポインタが指定していることを表している。
【0008】
ノード1750dの右ポインタ1741dはノード1750d自身を指しており、左リンク1740dにはノード1750eが接続されている。ノード1750eの保持するインデックスキーは“010010”、検査ビット位置は5である。ノード1750eの左ポインタ1740eはノード1750bを、右ポインタ1741eはノード1750eを指している。
【0009】
また、ノード1750fの保持するインデックスキーは“101011”であり、検査ビット位置1730fは2である。ノード1750fの左リンク1740fにはノード1750gが、右リンク1741fにはノード1750hが接続されている。
【0010】
ノード1750gの保持するインデックスキーは“100011”であり、検査ビット位置1730gは5である。ノード1750gの左ポインタ1740gはノード1750aを、右ポインタ1741gはノード1750gを指している。
【0011】
ノード1750hの保持するインデックスキーは“101100”であり、検査ビット位置1730hは3である。ノード1750hの左ポインタ1740hはノード1750fを、右ポインタ1741hはノード1750hを指している。
【0012】
図1の例では、ルートノード1750aからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が1であるか0であるか判定を行い、1であれば右リンクをたどり、0であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば(図1において点線で示されたこの逆戻りのリンクをバックリンクという)、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
【0013】
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は1回ですむことなどのメリットがあるが、各ノードからの2つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
【0014】
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献1に開示された技術がある。下記特許文献1に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
【0015】
しかしながら、下記特許文献1に開示されたものにおいても、1つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを1つとしたため、例えば図1に示したパトリシアツリーの最下段の部分である左ポインタ1740c、右ポインタ1741h等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
【特許文献1】特開2001−357070号公報
【発明の開示】
【発明が解決しようとする課題】
【0016】
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願2006−187827において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであって、該ツリーのノードが1つのときはリーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。
【0017】
ところで近年において、情報処理技術の進展とともに情報サービスへの要求がさらに拡大し、より厳しいものになってきている。情報サービスを提供する上で基本となるのはデータベースの構築とそのデータベースからの情報の取出しであるが、データベースに蓄積されるデータ量はますます増大し、極めて巨大なものとなりつつある。
【0018】
本出願人の先に提案した検索手法は、上記巨大化しつつあるデータベースの高速検索を可能とするものであるが、データベースが巨大化するとともにそれに対応するカップルドノードツリーも、従来のツリー構造のものより記憶容量が少なくてすむとはいえ、大きなものとなる。一方、各種記憶手段の記憶容量にはそれぞれ制限があり、経済的なシステムを構築するためには各種アクセス速度、記憶容量の記憶手段を組み合わせて利用する必要がある。特に、キャッシュメモリを有効利用できることが望ましい。
【0019】
そこで本発明の解決しようとする課題は、カップルドノードツリーを複数の格納区域に分割して配置することを可能とするカップルドノードツリーの構造とそれを用いた検索手法を提供することである。
【課題を解決するための手段】
【0020】
本発明のカップルドノードツリーのブランチノードは、リンク先のノード対の格納された格納区域の識別子とその格納区域におけるリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含む。
【0021】
検索時には、カップルドノードツリーの任意のノードを検索開始ノードとしてブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとする。
【0022】
本発明のカップルドノードツリーに新たにインデックスキーを挿入する場合は、まずそのインデックスキーを検索キーとして、ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてブランチノードに含まれる格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを、ルートノードから順次リーフノードに至るまでリンク経路を記憶しながら繰り返し、該リーフノードに格納されたインデックスキーを検索結果キーとして取得する。
【0023】
挿入するインデックスキーと検索の結果得られたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭のビット位置と、リンク経路上のブランチノードの弁別ビット位置との相対的位置関係により、挿入されるリーフノードともう一方のノードからなる挿入ノード対の挿入される格納区域の識別子と挿入ノード対の代表ノードの該格納区域における位置情報を含むブランチノードの位置情報を示す挿入位置を決定し、挿入ノード対を格納可能な空き領域を備えた空格納区域を探索し、空ノード対を取得し、空ノード対に空格納区域の上位の格納区域のノード対の内容を格納し、該上位の格納区域のノード対を解放して空ノード対を取得する操作を、該上位の格納区域が、挿入ノード対が挿入される格納区域となるまで繰り返し、検索キーと検索結果キーの大小関係に応じて、挿入されるリーフノードを挿入ノード対のどちらのノードとするかを決定し、挿入するインデックスキーをリーフノードに格納する。
【0024】
本発明のカップルドノードツリーからあるインデックスキーを削除するときは、削除するキーにより検索を行い、削除対象のインデックスキーを保持するノードと同一ノード対を構成するノードの内容を当該ノード対のリンク元のブランチノードに書き込み、当該ノード対を削除することにより行う。
【発明の効果】
【0025】
本発明によれば、ブランチノードがリンク先のノード対の格納された格納区域の識別子を含むので、カップルドノードツリーを複数の格納区域に分割して配置することが可能になる。
【発明を実施するための最良の形態】
【0026】
以下、本発明を実施するための最良の形態として、カップルドノードツリーを配列に格納する例について説明する。ブランチノードが保持するリンク先の代表ノードの位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、代表ノードの位置を示す位置情報の情報量を削減することができる。
【0027】
図2Aは、本発明の一実施形態における配列に格納されたカップルドノードツリーの構成例を説明する図である。
図2Aを参照すると、ブロック番号Aで識別される格納区域に配置された配列100の配列番号10の配列要素にノード101が記憶されている。ノード101はノード種別102、弁別ビット位置103、代表ノード番号104a及びブロック番号104bで構成されている。ノード種別102は0であり、ノード101がブランチノードであることを示している。弁別ビット位置103には1が格納されている。代表ノード番号104aにはリンク先のノード対の代表ノードの配列番号20が格納され、ブロック番号104bにはAが格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。さらに、弁別ビット位置に格納された値を、単に弁別ビット位置ということもある。
【0028】
配列番号20の配列要素には、ノード対111の代表ノードであるノード[0]112が格納されている。そして隣接する次の配列要素(配列番号20+1)に代表ノードと対になるノード[1]113が格納されている。ノード[0]112はノード101と同様にブランチノードである。ノード[0]112のノード種別114には0が、弁別ビット位置115には3が、代表ノード番号116aには30が格納され、ブロック番号116bにはBが格納されている。またノード[1]113は、ノード種別117とインデックスキー118aで構成されている。ノード種別117には1が格納されており、ノード[1]113がリーフノードであることを示している。インデックスキー118には、“0001”が格納されている。以下では表記の簡略化のため、インデックスキーに格納されたデータのこともインデックスキーということがある。
【0029】
配列100には、さらにノード対カウンタ119が格納されており、そこには配列100に格納されているノード対の個数である2が記憶されている。
パトリシアツリーについて先に述べたと同様に、インデックスキーと対応するレコードにアクセスするためのアクセス先情報も当然必要である。インデックスキーとアクセス先情報との対応づけは、例えば、インデックスキーを記憶している記憶領域に隣接する記憶領域に、当該インデックスキーに対応するアクセス先情報を記憶することによって行ってもよい。以下ではアクセス先情報については省略して説明する。
【0030】
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
【0031】
上述のノード[0]112のブロック番号116bの値Bで識別される配列120には、ノード対カウンタ129と、配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121が格納されている。
【0032】
ノード対カウンタ129には、配列120に格納されているノード対の個数である1が記憶されている。ノード122とノード123からなるノード対121の内容は省略されている。
【0033】
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された0あるいは1は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。検索キーの、前段のブランチノードの弁別ビット位置にあるビット値である0か1を代表ノード番号に加えた配列番号のノードにリンクする。
【0034】
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置にあるビット値を加えることにより、リンク先のノードが格納されたブロック番号で識別される配列の配列要素の配列番号を求めることができる。
【0035】
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図2Bは、カップルドノードツリーのツリー構造を概念的に示す図である。図示の6ビットのインデックスキーは、図1に例示されたパトリシアツリーのものと同じである。
【0036】
符号210aで示すのがルートノードである。図示の例では、ルートノード210aはブロック番号Aの配列309aの配列番号220に配置されたノード対201aの代表ノードとしている。
【0037】
ツリー構造としては、ルートノード210aの下にノート対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
【0038】
図に示すように、ノード対201a、201b、201f及び201gはブロック番号Aの配列309aに格納され、ノード対カウンタ290aには4が記憶されている。ノード対201cとそれより下層のノード対201d、201eは、ブロック番号Bの配列309bに格納され、ノード対カウンタ290bには3が記憶されている。ノード対201hはブロック番号Cの配列309cに格納され、ノード対カウンタ290cには1が記憶されている。
【0039】
各ノードの前に付された0あるいは1の符号は、図1において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
【0040】
図2Bに示す例では、ルートノード210aのノード種別260aは0でブランチノードであることを示し、弁別ビット位置230aは0を示している。ブロック番号240aはAであり、リンク先のノード対201bがブロック番号Aの配列309aに配置されていることを示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列309aの配列要素の配列番号である。
【0041】
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに0であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには1が格納され、ブロック番号240bには配列309bのブロック番号Bが格納されている。リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列309bの配列要素の配列番号220bが格納されている。
【0042】
ノード210cのノード種別260cには1が格納されているので、このノードはリーフノードであり、したがって、インデックスキーを含んでいる。インデックスキー250cには“000111”が格納されている。一方ノード211cのノード種別261cは0であり、ブランチノードであることを示している。弁別ビット位置231cは2、ブロック番号241cはBであり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列309bの配列要素の配列番号221cが格納されている。
【0043】
ノード210dのノード種別260dは0であり、ブランチノードであることを示している。弁別ビット位置230dは5、ブロック番号240dはBであり、代表ノード番号にはノード対201eの代表ノード210eの格納された配列309bの配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは1であり、インデックスキー251dには“011010”が格納されている。
【0044】
ノード対201eのノード210e、211eのノード種別260e、261eはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250e、251eにはインデックスキーとして“010010”と“010011”が格納されている。
【0045】
ノード対201bのもう一方のノードであるノード211bの弁別ビット位置231bには2が格納され、ブロック番号にはAが格納されている。リンク先の代表ノード番号にはノード対201fの代表ノード210fの格納された配列309aの配列要素の配列番号221bが格納されている。
【0046】
ノード対201fのノード210f、211fのノード種別260f、261fはともに0であり双方ともブランチノードである。それぞれの弁別ビット位置230f、231fには5、3が格納されている。また、ノード210fのブロック番号240fにはA、ブロック番号241fにはCが格納されている。ノード210fの代表ノード番号にはノード対201gの代表ノード210gの格納された配列309aの配列要素の配列番号220fが格納され、ノード211fの代表ノード番号にはノード対201hの代表ノードであるノード[0]210hの格納された配列309cの配列要素の配列番号221fが格納されている。
【0047】
ノード対201gのノード210g、211gのノード種別260g、261gはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250g、251gには“100010”と“100011”が格納されている。
【0048】
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250h、251hには“101011”と“101100“が格納されている。
【0049】
以下、上述のツリーからインデックスキー“100010”を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から0、1、2、・・・とする。
まず、ビット列“100010”を検索キーとしてルートノード210aから処理をスタートする。ルートノード210aの弁別ビット位置230aは0であるので、検索キー“100010”の弁別ビット位置が0のビット値をみると1である。また、ブロック番号240aはAであり、リンク先のノード対は配列309aに存在することが示されている。そこで代表ノード番号の格納された配列番号220aに1を加えた配列番号の配列309aの配列要素に格納されたノード211bにリンクする。
【0050】
ノード211bの弁別ビット位置231bには2が格納されているので、検索キー“100010”の弁別ビット位置が2のビット値をみると0である。ブロック番号240bはAであり、リンク先のノード対は配列309aに存在することが示されている。そこで代表ノード番号の格納された配列番号221bに0を加えた配列番号の配列309aの配列要素に格納されたノード210fにリンクする。
【0051】
ノード210fの弁別ビット位置230fには5が格納されているので、検索キー“100010”の弁別ビット位置が5のビット値をみると0である。ブロック番号240fはAであり、リンク先のノード対は配列309aに存在することが示されている。そこで代表ノード番号の格納された配列番号220fに0を加えた配列番号の配列309aの配列要素に格納されたノード210gにリンクする。
【0052】
ノード210gのノード種別260gは1でありリーフノードであることを示しているので、インデックスキー250gを読み出して検索キーと比較すると両方とも“100010”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
【0053】
図2Bに示すように、カップルドノードツリーのノード対は、いわばツリーの深さ方向を優先して分割して格納領域に配置されている。したがって、上述の検索キー“100010”によるルートノード210aを検索開始ノードとした検索は、配列309aに対するアクセスだけで実行することができる。
【0054】
次に、図2Bを参照してカップルドノードツリーの構成(論理的構成)の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図2Bの例で、ルートノード210aの弁別ビット位置が0であるのは、図2Bに例示されたインデックスキーに0ビット目が0のものと1のものがあるからである。0ビット目が0のインデックスキーのグループはノード210bの下に分類され、0ビット目が1のインデックスキーのグループはノード211bの下に分類されている。
【0055】
ノード211bの弁別ビット位置が2であるのは、ノード211h、210h、211g、210gに格納された0ビット目が1のインデックスキーの1ビット目がすべて0で等しく、2ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
【0056】
以下0ビット目の場合と同様に、2ビット目が1であるものはノード211f側に分類され、2ビット目が0であるものはノード210f側に分類される。
そして2ビット目が1であるインデックスキーは3ビット目の異なるものがあるのでノード211fの弁別ビット位置には3が格納され、2ビット目が0であるインデックスキーでは3ビット目も4ビット目も等しく5ビット目で異なるのでノード210fの弁別ビット位置には5が格納される。
【0057】
ノード211fのリンク先においては、3ビット目が1のものと0のものがそれぞれ1つしかないことから、ノード210h、211hはリーフノードとなり、それぞれインデックスキー250hと251hに“101011”と“101100”が格納されている。
【0058】
仮にインデックスキーの集合に“101100”の代わりに“101101”か“101110”が含まれていたとしても、3ビット目までは“101100”と等しいので、ノード211hに格納されるインデックスキーが変わるだけで、ツリーの論理構造自体は変わることはない。しかし、“101100”に加えて“101101”が含まれていると、ノード211hはブランチノードとなり、その弁別ビット位置は5になる。追加されるインデックスキーが“101110”であれば、弁別ビット位置は4となる。それらの場合、ブランチノード211hのリンク先に例えば配列309cに格納されたノード対があり、リーフノード211hに格納されていたインデックスキー“101100”とインデックスキー“101101”あるいは“101110”の弁別ビット位置でのビット値に応じて、ビット値が0のインデックスキーはノード[0]に、ビット値が1のインデックスキーはノード[1]に格納される。ノード対カウンタ290cの値は2となる。
【0059】
以上説明したように、カップルドノードツリーの論理構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
そしてさらにいえば、異なるビット値となるビット位置ごとにビット値が“1”のノードとビット値が“0”のノードとに分岐していることから、ノード[1]側とツリーの深さ方向を優先させてリーフノードをたどると、それらに格納されたインデックスキーは、ノード211hのインデックスキー251hの“101100”、ノード210hのインデックスキー250hの“101011”、・・・、ノード210cのインデックスキー250cの“000111”となり降順にソートされている。
【0060】
すなわち、カップルドノードツリーにおいては、インデックスキーはソートされてツリー上に配置されている。
検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが“101100”であればノード211hに到達することができる。また、上記説明からも想像がつくように、“101101”か“101110”を検索キーとした場合でもノード211hにたどり着き、インデックスキー251h“101100”が検索結果キーとして得られる。
【0061】
また、例えば“100100”で検索した場合でも、ノード210a、211b、210fのリンク経路では検索キーの3ビット目と4ビット目は使われることがなく、“100100”の5ビット目が0なので、“100010”で検索した場合と同様にノード210gに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
【0062】
図3は、本発明を実施するためのハードウェア構成例を説明する図である。
本発明の検索装置による検索処理及びデータメンテナンスは中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施される。カップルドノードツリーが配置される配列309aと検索中にたどるノードが格納された配列の配列要素の配列番号と配列のブロック番号を記憶する探索経路スタック310を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。
【0063】
図3の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309aは外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
【0064】
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた主記憶装置305の一時記憶領域が用いられることは当然である。そして、以下の説明においては、一次記憶領域に格納されるあるいは設定される値を一時記憶領域の名前で呼ぶことがある。
【0065】
次に、本発明の一実施態様に係るカップルドノードツリーを用いた基本的な操作である検索処理について説明する
図4は、一実施形態におけるビット列の検索処理を示すフローチャートである。
【0066】
まず、ステップS401aで、検索開始ノードを格納した配列のブロック番号と配列要素の配列番号を取得する。検索開始ノードの指定は、検索処理を利用する各種アプリケーションや、利用者によって行われる。
【0067】
取得された検索開始ノードのブロック番号と配列番号は、図示しない検索開始ノード設定エリアに設定されるが、この検索開始ノード設定エリアは、先に述べた「処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶領域」の一つである。以下の説明では、「図示しない検索開始ノード設定エリアに設定する」のような表現に変えて、「検索開始ノードの配列番号を得る。」、「検索開始ノードとして設定する」あるいは単に「検索開始ノードに設定する」のように記述することもある。検索開始ノード以外についても同様である。
【0068】
次に、ステップS402bで、探索経路スタック310に取得されたブロック番号と配列番号を格納し、ステップS403aで、そのブロック番号と配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップS404で、読み出したノードから、ノード種別を取り出し、ステップS405で、ノード種別がブランチノードであるか否かを判定する。
【0069】
ステップS405の判定において、読み出したノードがブランチノードである場合は、ステップS406に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップS407で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップS408aで、ノードからブロック番号と代表ノード番号を取り出して、ステップS409で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップS402bに戻る。
【0070】
以降、ステップS405の判定においてリーフノードと判定されてステップS410に進むまで、ステップS402からステップS409までの処理を繰り返す。ステップS410で、リーフノードからインデックスキーを取り出して、処理を終了する。
【0071】
次に、図5〜図8によりカップルドノードツリーにおけるノード挿入処理を説明する。図5〜図7Eが通常の挿入処理を説明するものであり、図8はルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
【0072】
図5は、本発明の一実施形態における挿入処理、特に空ノード対を挿入位置に取得する処理を概念的に説明する図である。図5に例示するカップルドノードツリーは、後に図12C〜図12Eに示すカップルドノードツリーの部分木である。なお、図5においては、一部において引用符号の表記を省略しているが、図12Cにはすべて表記されている。
【0073】
図5の(1)に示すものは、挿入キーにより検索を行い、挿入キーの挿入位置を求め、空の配列要素の存在する配列である空ブロックを探索した状態である。挿入キー3270の値は“01000”であり、ビット位置1のみが値“1”であり、他のビット位置の値は“0”である。カップルドノードツリーはルートノード3210b、とその下位に直列に連なるノード対3201c、ノード対3201d、3201eから構成されている。
【0074】
ルートノード3210bは、ブロック番号がAである配列3309aの配列番号3220aの配列要素に配置されている。その弁別ビット位置は2、ブロック番号はB、代表ノード番号は3220bである。配列3309aのノード対カウンタ3390aには“2”が格納されている。図の例では配列3309aには部分木のルートノード3210bしか示されていないが、先に述べたように、図示しない上位のノード対により、配列3309aの配列要素が使われているものとしている。
【0075】
ノード対3201cの代表ノードはブランチノードであり、ブロック番号がBである配列3309bの配列番号3220bの配列要素に配置されている。その弁別ビット位置は3、ブロック番号はB、代表ノード番号は3220cである。代表ノードと対をなすノードはリーフノードであり、インデックスキーには“00100”が格納されている。
【0076】
ノード対3201dの代表ノードはブランチノードであり、ブロック番号がBである配列3309bの配列番号3220cの配列要素に配置されている。その弁別ビット位置は4、ブロック番号はC、代表ノード番号は3220dである。代表ノードと対をなすノードはリーフノードであり、インデックスキーには“00010”が格納されている。配列3309bのノード対カウンタ3390bには“1”が格納されている。
【0077】
ノード対3201eの代表ノードはリーフノードであり、ブロック番号がCである配列3309cの配列番号3220cの配列要素に配置されている。そのインデックスキーには“00000”が格納されている。また、代表ノードと対をなすノードはリーフノードであり、インデックスキーには“00001”が格納されている。配列3309cのノード対カウンタ3390cには“2”が格納されている。
【0078】
上述のカップルノードツリーを、検索キーを挿入キー3270、検索開始ノードをルートノード3210bとして検索すると、太枠で示すリーフノードに格納されたインデックスキー“00000”が検索結果キーとして得られる。そして、検索結果キーと挿入キーの上位からのビット列比較により、最初に異なるビット値となる差分ビット位置を求めると、値1が得られる。差分ビット位置と各弁別ビット位置との相対的な大小関係から、挿入位置として、太枠で示すルートノード3210bが得られる。
【0079】
ここで、挿入位置がルートノード3210bであるとは、ブランチノードであるルートノードのブロック番号Bの配列の代表ノード番号3220bの指す配列要素に、挿入キーをインデックスキーとして含むリーフノードとそれと対をなすノードからなる挿入ノードの代表ノードが配置されるということである。つまり、挿入ノード対の実際に挿入される配列要素は、挿入位置のブランチノードのリンク先である。
【0080】
図に示す例では、各配列のノード対の最大格納数は2としている。そこで、ブロック番号Bの配列3309bのノード対カウンタ3390bの値は2で最大格納数を示していることから下位のノードの配置された空ブロックを探索し、ブロック番号Cの配列3309c(以下、ブロックCということがある。他の配列についても同様である。)から空ノード対3201fを取得した状態が、図5の(1)に示すものである。
【0081】
図5の(2)に示すものは、空のノード対を含むブロックCのノードにリンクするブロックBのノードを含むノード対をブロックCに移動してブロックBに空ノード対を確保し、挿入ノード対を挿入位置に挿入可能とした状態である。
図5の(1)に示すブロックBのノード対3201dの内容がブロックCの空ノード対3201fに書き込まれ、ノード対3201dの配置されていた配列要素は空になっている。すなわち、挿入ノード対が挿入されるブロックBに空ノード対が確保されている。したがって、ノード対カウンタ3390bの値は1つ減って1になっている。また、ノード対カウンタ3390cの値は1つ増えて2になっている。
【0082】
図5の(3)に示すものは、挿入位置に挿入ノード対を挿入するとともに、挿入位置のブランチノードの弁別ビット位置を更新して挿入処理を完成させた状態である。
挿入キー“01000”が検索結果キー“00000”より大きいことから、挿入キーをインデックスキーとして含むリーフノードはノード対3201dのノード[1]に配置され、挿入位置のブランチノードであるルートノード3210bの内容がノード対3201dのノード[0]に書き込まれている。そして、挿入位置のブランチノードであるルートノード3210bの弁別ビット位置は差分ビット位置の値1に更新されている。ノード対カウンタ3390bの値は2に更新されている。
【0083】
図6は、本発明の一実施形態における挿入処理全体の処理フローの概要を説明する図である。
まず、ステップS600として示すように、挿入キーを検索キーとして、ルートノードよりカップルドノードツリーを検索して検索結果キーを得る。ステップS600の詳細フローは図7Aを参照して説明する。
次にステップS610として示すように、挿入ノード対の挿入位置を求める。ステップS610の詳細フローは図7Bを参照して説明する。
次にステップS630として示すように、ノード対用の空き領域を備えた空格納区域を探索し、空ノード対を取得する。ステップS630の詳細フローは図7Cを参照して説明する。
上述のステップS600、ステップS610及びステップS630の処理により、図5の(1)に示す状態が得られる。
【0084】
次にステップS640として示すように、挿入ノード対の挿入位置に空ノード対を移動する。この処理は、図5の(2)に示す状態に対応する。ステップS640の詳細フローは図7Dを参照して説明する。
【0085】
最後にステップS660として示すように、空ノード対に挿入キー等を格納して挿入ノード対を完成させる。この処理は、図5の(3)に示す状態に対応する。ステップS660の詳細フローは図7Eを参照して説明する。
【0086】
以下、図7A〜図7Eを参照して、図6に示す概略フローチャートの各ステップの詳細フローチャートを説明する。この詳細フローチャートにおいては、カップルドノードツリーは配列に格納されているものとして説明する。
【0087】
図7Aは、挿入キーを検索キーとして、ルートノードよりカップルドノードツリーを検索して検索結果キーを得る図6に示すステップS600の詳細な処理フローを説明する図である。挿入キーは検索キーとして設定されているものとする。
【0088】
ステップS701において、検索開始ノードに、ルートノードの配置された配列のブロック番号とその配列の配列要素の配列番号を設定する。図5に示す例では、検索開始ノードにブロック番号Aと配列番号3220aが設定される。
次にステップS703において、図4に示す検索処理により、検索結果キーとしてのインデックスキーを得る。図5の例示では、インデックスキー“00000”が得られる。
【0089】
ステップS705において、挿入キー(検索キー)とインデックスキー(検索結果キー)が等しいか判定し、等しければ挿入失敗として処理を終了する。等しくなければ図7Bに示すステップS711に進む。
【0090】
図7Bは、挿入ノード対の挿入位置を求める図6に示すステップS610の詳細な処理フローを説明する図である。
ステップS711で、挿入キーとステップS703で得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップS712に進み、ステップS711で得た差分ビット列から、上位0ビット目から見た最初の不一致ビットのビット位置を、差分ビット位置に設定する。この処理は、例えばプライオリティエンコーダを有するCPUではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置(差分ビット位置)を得ることも可能である。図5に示す例では、差分ビット位置には1が設定される。
【0091】
次にステップS713で、リーフ位置ポインタに、探索経路スタックのスタックポインタの値を設定する。図5に示す例では、リーフ位置ポインタに設定される値は、探索経路スタックのブロック番号Cと配列番号3220dを指すスタックポインタの値である。探索経路スタックの一番下のスタックエリアを指すポインタ値を0とすると、リーフ位置ポインタに設定される値は3になる。
【0092】
次にステップS714に進み、探索経路スタックのスタックポインタがルートノードの配列番号を指しているか判定する。指していればステップS720に移行し、指していなければステップS715に進む。
ステップS715において、探索経路スタックのスタックポインタを1つ戻してそこにスタックされているブロック番号と配列番号を取り出す。
ステップS716に進み、ステップS715で取り出したブロック番号と配列番号の指す配列要素を配列からノードとして読み出す。
ステップS717に進み、ステップS716で読み出したノードから、弁別ビット位置を取り出す。
次にステップS718に進み、ステップS717で取り出した弁別ビット位置がステップS712で設定した差分ビット位置より上位の位置関係か判定する。ここで上位の位置関係とは、ビット列のより左側の位置、すなわちビット位置の値が小さい位置であることとする。
【0093】
ステップS718の判定結果が否定であれば、ステップS714に戻り、ステップS718での判定が肯定になるかステップS714での判定が肯定になるまで繰り返す。ステップS718での判定が肯定になると、ステップS719で経路探索スタックのスタックポインタを1つ進め、ステップS720に移行する。
【0094】
ステップS720では、探索経路スタックから、スタックポインタの指すブロック番号と配列番号を取り出し、挿入位置のブロック番号と配列番号に設定する。次にステップS721において、挿入位置ポインタに、探索経路スタックポインタの値を設定して、図7Cに示すステップS731に進む。図5に示す例示では、ルートノード3210bの弁別ビット位置の値が2であり、差分ビット位置より下位なので、ステップS714での判定が肯定になってステップS714からステップS718のループ処理から抜け出す。したがって、挿入位置のブロック番号と配列番号には、ブロック番号Aと配列番号3210bが設定される。また、挿入位置ポインタの値には、上述のポインタ値の表記(以下、この表記を断りなく用いることがある。)によれば、ルートノードの配列番号を指すポインタの値である0が設定される。
【0095】
図7Cは、ノード対に用いる空配列要素を備えた空ブロックを探索し、空ノード対を取得する図6に示すステップS630の詳細な処理フローを説明する図である。
まずステップS731で、ブロック番号に、ステップS720で設定した挿入位置のブロック番号を設定する。図5の例示では、ここでブロック番号に設定されるのはブロック番号Aである。
【0096】
次にステップS732で、ブロック番号の指す配列のノード対カウンタの値は上限値か判定する。上限値でなければステップS736に分岐し、上限値であればステップS733に進み、探索経路スタックのスタックポインタの値はリーフ位置ポインタの値と等しいか判定する。それらの値が等しくなければ、ステップS734に分岐し、探索経路スタックのスタックポインタを1つ進めて、スタックポインタの指すブロック番号を取り出し、ステップS732に戻る。
【0097】
探索経路スタックのスタックポインタの値とリーフ位置ポインタの値が等しければ、ステップS735において、ブロック管理から、空状態の配列のブロック番号を取得し、ステップS736に進む。なお、本発明は、配列の空塞がりの管理を行うブロック管理の存在を前提としており、ブロック管理から、空状態の配列のブロック番号を取得するものとしている。また、配列に格納可能なノード対の上限も、ブロック管理から与えられ、ノード対カウンタの値により配列に空が存在するか判断するものとする。
【0098】
ステップS736では、ノード対の移動先のブロック番号に、取得したブロック番号を設定し、図7Dに示すステップS741に進む。ここで設定される取得したブロック番号は、ステップS731で設定した挿入位置のブロック番号、ステップS734で取り出したブロック番号、あるいはステップS735で取得したブロック番号である。
【0099】
図5の例示では、ブロック番号Aの配列3309aのノード対カウンタ3390a及びブロック番号Bの配列3309bのノード対カウンタ3390bの値は上限値であり、ブロック番号Cの配列3309cのノード対カウンタ3390cの値は上限値でないので、探索経路スタックからブロック番号Cが取り出されて、ノード対の移動先のブロック番号に設定される。このとき、探索経路スタックのポインタ値は、ブロック番号Cと代表ノード番号3220dを指す3である。
【0100】
図7Dは、挿入ノード対の挿入位置に空ノード対を移動する図6に示すステップS640の詳細な処理フローを説明する図である。挿入ノード対の挿入位置に空ノード対を確保するために、空ノード対を取得したブロック番号の配列(移動先)に配置されたノードから、ステップS703で実行した検索処理のリンク経路を遡り、空ノード対を取得したブロック番号の配列とは異なるブロック番号の配列に配置された上位のノードを含むノード対(移動元)を移動先に移動し、移動元を空ノード対とすることを、挿入位置に空ノード対を確保するまで繰り返す。
【0101】
まず、ステップS741で、探索経路スタックのスタックポインタの値は挿入位置ポインタの値と等しいか判定する。等しければ図7Dに示すステップS761に分岐し、等しくなければステップS742に進む。ステップS742では、探索経路スタックのスタックポインタの指すブロック番号と配列番号を取り出し、スタックポインタを1つ戻す。
次にステップS743で、取り出したブロック番号とステップS736で設定した移動先のブロック番号は一致するか判定する。一致すればステップS741に戻り、一致しなければステップS744に進む。図5に示す例示では、図7Dに示す処理の最初の処理のときには探索経路スタックのスタックポインタの値は3であり、移動先のブロック番号はCである。したがって、ステップS741〜ステップS743の処理ループを一周してからステップS744に進む。このとき、ステップS742で取り出したブロック番号はBであり、探索経路スタックのスタックポインタの値は1になっている。
【0102】
ステップS744では、ノード対の移動元のブロック番号にステップS742で取り出したブロック番号を、ノード対の移動元の代表ノード番号にステップS742で取り出した配列番号から得た代表ノード番号を設定する。ここで配列番号から代表ノード番号を得ることは、ノード[0]とノード[1]の配列番号は1つ違いであり、その大小とどちらが偶数であるか決められていることにより可能であることは明らかである。
図5の例示では、ノード対の移動元のブロック番号にはBが、代表ノード番号には3220cが設定される。
【0103】
次に、ステップS745で、ステップS736で設定したノード対の移動先のブロック番号の配列から空のノード対の代表ノードの配列番号を取得するとともに、ノード対カウンタを1つ加算し、ステップS746で、ノード対の移動先の代表ノード番号に、ステップS745で取得した空のノード対の代表ノードの配列番号を設定する。
次に、ステップS747において、ステップS744で設定したノード対の移動元のブロック番号と代表ノード番号の指す配列要素の組の内容をノード対として読み出し、ステップS748で、該読み出したノード対の内容を、ステップS746で設定したノード対の移動先のブロック番号と代表ノード番号の指す配列要素の組に書き込む。
【0104】
図5の例示では、図5の(1)に示すように、ノード対の移動先のブロック番号がCである配列3309cから空のノード対3201fが取得され、その代表ノードの配列番号は、図5の(2)に示すように3220c’である。そして、ノード対カウンタ3390cは1つ加算され1から2になっており、ノード対の移動元のブロック番号Bと代表ノード番号3220cの指す配列要素の組(ノード対3201d)の内容がノード対の移動先のブロック番号Cと代表ノード番号3220c’の指す配列要素の組(ノード対3201f)に書き込まれている。ノード対3201fと代表ノード番号3220fに付された括弧書き(3201d)と(3220d)は、それぞれの値が図5の(1)で示すものの内容と等しいことを示している。
【0105】
次に、ステップS749において、探索経路スタックのスタックポインタの指すブロック番号と配列番号を取り出し、ステップS750で、該取り出したブロック番号と配列番号の指す配列要素の、ブロック番号にノード対の移動先のブロック番号を、代表ノード番号にノード対の移動先の代表ノード番号を書き込む。
次に、ステップS751において、ノード対の移動元のブロック番号と代表ノード番号の指すノード対を解放するとともに、ノード対カウンタを1つ減算する。そして、ステップS752において、ノード対の移動先のブロック番号に、ノード対の移動元のブロック番号を設定してステップS741に戻る。
【0106】
図5に示す例では、探索経路スタックのスタックポインタの値は1となっており、ブロック番号Bと配列番号3220bが取り出される。ブロック番号Bと配列番号3220bの指すノード3210cのブロック番号にノード対の移動先のブロック番号Cを、代表ノード番号にノード対の移動先の代表ノード番号3220c’を、書き込んだ状態が図5の(2)に示されている。また、ノード対の移動元のブロック番号Bと代表ノード番号3220cの指すノード対3201dを解放するとともに、ノード対カウンタ3390bを1つ減算して1としている。また、ノード対の移動先のブロック番号には、ノード対の移動元のブロック番号Bが設定される。
【0107】
図5に示す例においては、ステップS741に最初に戻ったとき、探索経路スタックのスタックポインタの値は1であるので、ステップS742を経て探索経路スタックのスタックポインタの値を0としてからステップS743に至り、比較対象のブロック番号が共にBであるので、再度ステップS741に戻る。このときは、探索経路スタックのスタックポインタの値は0であって、挿入位置ポインタの値と等しいので、図7Eに示すステップS761に進む。
【0108】
図7Eは、空ノード対に挿入キー等を格納して挿入ノード対を完成させる図6に示すステップS660の詳細な処理フローを説明する図である。
まず、ステップS761において、空のノード対のブロック番号に、ノード対の移動先のブロック番号を設定し、次にステップS762に進み、空のノード対のブロック番号の配列から、空のノード対の代表ノードの配列番号を取得するとともに、ノード対カウンタを1つ加算する。
【0109】
次にステップS763において、挿入キーとステップS703で得たインデックスキーの大小を比較し、挿入キーが大きいときは値1を小さいときは値0のブール値を得る。
次にステップS764で、ステップS762で設定した代表ノード番号にステップS763で得たブール値を加えて、リーフノードの配列番号に設定する。また、ステップS765において、ステップS762で設定した代表ノードの配列番号にステップS763で得たブール値の論理否定値を加算した配列番号を対ノードの配列番号に設定する。ステップS764で設定した配列番号は、挿入キーをインデックスキーとして含むリーフノードが配置される配列要素の配列番号であり、ステップS765で設定した配列番号は、そのリーフノードとノード対を成すノードが配置される配列要素のものである。
【0110】
次にステップS766において、空ノード対のブロック番号とステップS764で設定したリーフノードの配列番号の指す配列要素の、ノード種別にリーフを、インデックスキーに挿入キーを書き込む。
次にステップS767において、挿入位置のブロック番号と配列番号の指す配列要素からその内容を読み出し、ステップS768で、該読み出した内容を空ノード対のブロック番号とステップS765で設定した配列番号の指す配列要素に書き込む。
最後にステップS769において、挿入位置のブロック番号と配列番号の指す配列要素の、ノード種別にブランチを、弁別ビット位置に差分ビットビット位置を、代表ノード番号に挿入するノード対の代表ノード番号を書き込み、処理を終了する。
【0111】
図8は、本発明の一実施の形態におけるルートノードの挿入処理を含むインデックスキーを挿入する場合のノード挿入処理全体を説明する処理フロー図である。
ステップS801において、取得することを求められたカップルドノードツリーのルートノードのブロック番号と配列番号が登録済みであるか判定される。登録済みであれば、図6〜図7Eを用いて説明した通常の挿入処理が行われる。
【0112】
ステップ801での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まることになる。
まず、ステップS802において、ブロック管理から、空状態の配列のブロック番号を取得する。次にステップS803において、該取得したブロック番号の指す配列から空きのノード対の代表ノードとなるべき配列要素の配列番号を取得するとともに、ノード対カウンタを1つ加算する。
【0113】
次にステップS804において、ステップS803で得た配列番号に0を加えた配列番号を求める(実際には、ステップS803で取得した配列番号に等しい。)。さらにステップS805において、ブロック番号とステップS804で得た配列番号の指す配列要素の、ノード種別にリーフを、インデックスキーに挿入キーを書き込む。
最後にステップS806で、ステップS802とステップS804でそれぞれ取得したルートノードのブロック番号と配列番号を登録して処理を終了する。
【0114】
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図8及び図6〜図7Eの処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかである。
【0115】
次に図9、図10を参照して、本発明の一実施の形態におけるカップルドノードツリーに係るインデックスキーの集合から、特定のインデックスキーを削除する処理フローを説明する。
【0116】
図9は、削除処理の前段である検索処理の処理フローを説明する図である。削除対象のインデックスキーは削除キーとして指定されているものとする。
まず、ステップS901で、検索開始ノードに、ルートノードの配置された配列のブロック番号とルートノードの配置された配列要素の配列番号を設定する。
【0117】
次にステップS902において、図4に示す検索処理により、削除キーを検索キーとして検索開始ノードより配列を検索し、検索結果キーとしてのインデックスキーを得る。
次にステップ903において、削除キーとインデックスキーを比較し、等しくなければ削除するインデックスキーはカップルドノードツリーに存在しないのであるから、削除は失敗となり、処理を終了する。等しければ次の処理、図10のステップS904以下の処理に進む。
【0118】
図10は、削除処理の後段の処理フローを説明する図である。
まず、ステップS904で探索経路スタックに2つ以上の配列番号が格納されているか判定する。2つ以上の配列番号が格納されていないということは、言い換えれば1つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合はステップS912に移行し、ステップS901で得たブロック番号の指す配列を解放する。次にステップS913に進み、ルートノードのブロック番号と配列番号の登録を抹消して処理を終了する。
【0119】
ステップS904において探索経路スタックに2つ以上の配列番号が格納されていると判定されたときはステップS905に進み、ステップS902において実行した図4に示す検索処理のステップS408aで得た代表ノード番号にステップS407で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除対象のインデックスキーが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
【0120】
次にステップS906において、ステップS905で得た配列番号の配列要素の内容を読み出し、さらにステップS907において、探索経路スタックのスタックポインタを1つ戻してブロック番号と配列番号を取り出す。
次にステップS908に進み、ステップS907で読み出した配列要素の内容をステップS907で得たブロック番号と配列番号の指す配列要素に書き込む。この処理は、削除対象のインデックスキーが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
【0121】
次にステップS909において、上述の図4に示すステップS408aで得たブロック番号と代表ノード番号の指すノード対を削除するとともに、ノード対カウンタの値を1つ減算し、ステップS910に進む。
ステップS910では、ノード対カウンタの値は0か判定し、0でなければ処理を終了し、0であれば、ステップS911において、上述の図4に示すステップS408aで得たブロック番号の指す配列を解放して処理を終了する。
【0122】
次に、具体例により、本発明の一実施形態に係る削除処理と挿入処理を説明する。
図11Aは、ノードの削除前のカップルドノードツリーと削除処理において検索処理を実行した探索経路スタックの状態を説明する図である。
【0123】
図11Aに例示するカップルドノードツリーは、ノード対1201a、1201b、1201cで構成されている。ノード対1201aとノード対1201bはブロック番号Aの配列1309aに配置され、ノード対1201cはブロック番号Bの配列1309bに配置されている。したがって、配列1309aのノード対カウンタ1390aの値は2であり、配列1309bのノード対カウンタ1390bの値は1である。
【0124】
ノード対1201aの代表ノードであるルートノード1210aは配列1309aの配列番号1220の配列要素に配置されており、ノード種別1260aは0であってブランチノードである。弁別ビット位置1230aには0が保持され、ブロック番号1240aにはAが保持されている。また、代表ノード番号には、ノード対1201bの代表ノード1210bの配置された配列番号である1220aが保持されている。
【0125】
ノード対1201bの代表ノード1210bはノード種別1260bが0であってブランチノードであり、弁別ビット位置1230bには2が保持され、ブロック番号にはBが保持されている。また、代表ノード番号には、ノード対1201cの代表ノード1210cの配置された配列番号である1220bが保持されている。
代表ノード1210bと対をなすノード1211bはノード種別1261bが1であってリーフノードであり、インデックスキー1251bには“10000”が格納されている。
【0126】
ノード対1201cの代表ノード1210cはノード種別1260cが1であってリーフノードであり、インデックスキー1250cには“00000”が格納されている。
代表ノード1210cと対をなすノード1211cはノード種別1261cが1であってリーフノードであり、インデックスキー1251cには“00100”が格納されている。
【0127】
削除キー1270には、“00100”が設定されている。この削除キーを検索キーとしてルートノード1210aより検索をした経路が、探索経路スタック310にスタックされている。探索経路スタック310には、配列番号とブロック番号の組が、(1220、A)、(1220a、A)、(1220b+1、B)とスタックされている。これに対応してリンク経路が、カップルドノードツリーの太枠で囲んだノードと太線の矢印で示されている。検索結果としてリーフノード1211cのインデックスキー“00100”が得られ、リーフノード1211cが削除対象の削除ノードとなることが図11Aに示されている。また、太線の矢印で示す探索経路スタック310のスタックポインタは、配列番号1220b+1とブロック番号Bを指している。
【0128】
図11Bは、削除処理を完了した後のカップルドノードツリー等の状態を説明する図である。図11Aに示す削除ノード1211cと対をなすノード1210cの内容が、探索経路スタック310のスタックポインタを1つ戻したところにスタックされているブロック番号Aと配列番号1220aの指すノード1210bに書き込まれた状態が図11Bに示されている。ノード種別1260bの括弧書き(1260c)は、ノード種別1260bにはノード種別1260cの値が書き込まれたことを示している。インデックスキー1250bとその括弧書き(1250c)についても同様である。
【0129】
削除ノード1211cとそれと対をなし、その内容が直近上位のブランチノード1210bに書き込まれたノード1210cからなるノード対1201cは削除され、ノード対カウンタ1390bの値は1つ減って0となっている。したがって、ブロック番号Bの配列1309bは解放される。
【0130】
次に、図12A及び図12Bを参照して挿入処理の具体例1を説明する。具体例1は、探索経路スタック上のブロック番号の指す配列に空のノード対を確保する配列要素が存在しない場合のものである。
【0131】
図12Aは、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態とブロック番号Bの配列2309bを新たに取得した状態を説明する図である。
図12Aに示すように、ノード対2201aとノード対2201bからなるカップルドノードツリーがブロック番号Aの配列2309aに配置されている。したがって、配列2309aのノード対カウンタ2390aの値は2である。
【0132】
ノード対2201aの代表ノードであるルートノード2210aは、ブロック番号Aの配列2309aの配列番号2220の配列要素に配置されている。ルートノード2210aのノード種別は0であってブランチノードである。弁別ビット位置2230aには0が保持され、ブロック番号2240aにはAが保持されている。また、代表ノード番号には、ノード対2201bの代表ノード2210bの配置された配列番号である2220aが保持されている。
ノード対2201bの代表ノード2210bはノード種別2260bが1であってリーフノードであり、インデックスキー2250bには“00001”が格納されている。代表ノード2210bと対をなすノード2211bはノード種別2261bが1であってリーフノードであり、インデックスキー2251bには“10000”が格納されている。
【0133】
挿入キー2270には、“00000”が設定されている。この挿入キーを検索キーとしてルートノード2210aより検索をしたリンク経路が、カップルドノードツリーの太枠で囲んだノードと太線の矢印で示され、さらに検索結果としてリーフノード2210bのインデックスキー“00001”が得られることが示されている。
【0134】
探索経路スタック310には、配列番号とブロック番号の組が、(2220、A)、(2220a、A)とスタックされている。挿入キーと検索結果キーの差分ビット位置は4であるから、検索処理後に1つ戻された探索経路スタックのスタックポインタは図7Bに示すステップS719の処理により1つ進められ、図12Aに太線の矢印で示すように、配列番号2220aとブロック番号Aを指している。
したがって、挿入位置のブロック番号はA、配列番号は2220aであるから、リーフノード2210bが挿入位置となることが図12Aに示されている。
【0135】
図12Aの例示では、ノード対カウンタ2390aが上限値となっていること、探索経路スタックのスタックポインタはリーフ位置ポインタであることから、ノード対カウンタ2309bの値が0の空のブロック番号Bの配列2309bを新たに取得する。さらに配列2309bから、代表ノード2210cとそれと対をなすノード2211cからなる空ノード対2201cを取得した状態が図12Aに示されている。
【0136】
図12Bは、挿入処理後のカップルドノードツリーを説明する図である。挿入キー“00000”と検索結果のインデックスキー“00001”の大小関係により、確保した空ノード対2201cのノード[0]を、挿入キー“00000”をインデックスキー2250cとして含むリーフノード2210cとし、ノード[1]を、検索結果キー“00001”
をインデックスキー2251cとして含むリーフノード2211cとしている。また、ノード対カウンタ2390cの値は1つ増えて1となっている。
挿入位置のノード2210bはブランチノードとなり、ノード種別2260bは0に更新され、その弁別ビット位置には挿入キーと検索結果キーの差分ビット位置である4が格納され、ブロック番号2240bにはBが格納されている。また、代表ノード番号2220bは挿入されたノード対2201cの代表ノード2210cが配置された配列要素の配列番号が格納されている。
【0137】
次に図12C、図12D及び図12Eを参照して、挿入処理の具体例2を説明する。具体例2は、探索経路スタック上のブロック番号の指す配列に空のノード対を確保する配列要素が存在する場合のものである。図12C、図12D及び図12Eに例示するカップルドノードツリーは、図5にその部分木を示したものである。図5には記載されていないノード対3201aと挿入位置のノード3210bと対をなすノード3211bが示されている。その他のツリー構造は、図5に示すものと同じであるので、説明を省略する。
【0138】
図12Cは、図5の(1)に示すものに対応し、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態と探索経路スタック上のブロック番号の指す配列に空ノード対を取得した状態を説明する図である。
ノード対3201aの代表ノードであるルートノード3210aは、ブロック番号Aの配列3309aの配列番号3220の配列要素に配置されている。ルートノード3210aのノード種別3260aは0であってブランチノードである。弁別ビット位置3230aには0が保持され、ブロック番号3240aにはAが保持されている。また、代表ノード番号には、ノード対3201bの代表ノード3210bの配置された配列番号である3220aが保持されている。
代表ノード3210bと対をなすノード3211bのノード種別3261bはリーフノードであることを示す1であり、インデックスキー3251bには“10000”が格納されている。
【0139】
図5に示すものと同じく、挿入キー3270には、“01000”が設定されている。この挿入キーを検索キーとしてルートノード3210aより検索をしたリンク経路が、カップルドノードツリーの太枠で囲んだノードと太線の矢印で示され、さらに検索結果としてリーフノード3210eのインデックスキー“00000”が得られることが示されていることも、ブランチノード3210b以降は図5の(1)に示すものと同じである。
探索経路スタック310には、配列番号とブロック番号の組が、(3220、A)、(3220a、B)、(3220b、B)、(3220c、B)、(3220d、C)とスタックされている。探索経路スタック310のスタックポインタは、図12Cに太線の矢印で示すように、最初に見つかった空ノード対の存在する配列3309cのブロック番号Cと配列番号3220dを指している。
【0140】
また、図5の(1)に示すものと同様に、ブロック番号Cの配列3309cに空ノード対3201fを取得した状態が示されている。
図12Cの例示では、検索開始ノードはノード3210aであり、弁別ビット位置3230aが0、ブロック番号3240がA、代表ノード番号3220aがノード対3201bの代表ノードを指しており、挿入キーの0ビット目のビット値が0である。したがって、挿入処理の検索処理において、ルートノード3210aからノード3210bにリンクする。それ以降の処理は図5の(1)を参照して説明したものとほぼ同じである。図5の(1)に示すものでは、検索開始ノードがノード3210bであって、その弁別ビット位置が“2”で差分ビット位置の値“1”より下位であるから、図7Bに示すステップS720にはステップS714から直接分岐するものであるが、図12Cに示すものでは、検索開始ノードがノード3210aであって、その弁別ビット位置が“0”で差分ビット位置の値“1”より上位であるから、ステップS719を介してステップS720に進む。したがって、どちらの場合も、ノード3210bが挿入位置となり、同じになるので、説明を省略する。
【0141】
図12Dは、図5の(2)に示すものに対応する図であり、空のノード対を含むブロックCのノードにリンクするブロックBのノードを含むノード対をブロックCに移動してブロックBに空ノード対を確保し、挿入ノード対を挿入位置に挿入可能とした状態を示している。各ブロック番号の配列の状態については図5の(2)について説明したとおりである。
探索経路スタック310のスタックポインタは、図12Cに示す最初に見つかった空ノード対の存在する配列3309cのブロック番号Cと配列番号3220dを指すものから、空ノード対に移動してブロック番号Bの配列3309bに空ノード対を確保するノード対3201dの直近上位のノード3210cのブロック番号Bと配列番号3220cを指すポインタ値から1つ戻した、ブロック番号Bと配列番号3220bを指すものとなっている。このポインタ値を1つ戻す操作は、図7Dに示すステップS742で実行される。
【0142】
図12Eは、図5の(3)に示すものに対応する図であり、挿入位置に挿入ノード対を挿入するとともに、挿入位置のブランチノードの弁別ビット位置を更新して挿入処理を完成させた状態を示している。各ブロック番号の配列の状態については図5の(3)について説明したとおりである。
探索経路スタック310のスタックポインタは、図7Bに示すステップS721で設定された挿入位置ポインタと等しく、ブロック番号Aと配列番号3220aを指すものとなっている。
【0143】
以上本発明を実施するための最良の形態について詳細に説明したが、本発明の実施の形態はそれに限ることなく種々の変形が可能であることは当業者に明らかである。例えばリーフノードが、インデックスキー自体を含むことに代えてインデックスキーを格納した記憶領域の位置を示す情報を含むようにすることが可能であることは、当業者に自明である。
【0144】
また、本発明のビット列検索方法を実行する装置が、カップルドノードツリーを格納する記憶手段と図4に例示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。そして、そのプログラムにより、ブランチノードとリーフノードの識別手段、ブランチノードの弁別ビット位置に応じてリンク先のノード対のどちらかにリンクする手段等がコンピュータ上に実現される。
【0145】
また、本発明のインデックスキー挿入方法あるいはインデックスキー削除方法を実行する装置が、図6あるいは図9及び図10に例示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことも明らかである。
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
【図面の簡単な説明】
【0146】
【図1】従来の検索で用いられるパトリシアツリーの一例を示す図である。
【図2A】配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図2B】カップルドノードツリーのツリー構造を概念的に示す図である。
【図3】本発明を実施するためのハードウェア構成例を説明する図である。
【図4】本発明の一実施形態における検索処理を説明するフローチャートである。
【図5】本発明の一実施形態における挿入処理を概念的に説明する図である。
【図6】本発明の一実施形態における挿入処理全体の処理フローの概要を説明する図である。
【図7A】挿入キーを検索キーとして、ルートノードよりカップルドノードツリーを検索して検索結果キーを得る処理フローを説明する図である。
【図7B】挿入ノード対の挿入位置を求める処理フローを説明する図である。
【図7C】ノード対用の空配列要素を備えた空ブロックを探索し、空ノード対を取得する処理フローを説明する図である。
【図7D】挿入ノード対の挿入位置に空ノード対を移動する処理フローを説明する図である。
【図7E】空ノード対に挿入キー等を格納して挿入ノード対を完成させる処理フローを説明する図である。
【図8】本発明の一実施の形態におけるルートノードの挿入処理を含むノード挿入処理全体を説明する処理フロー図である。
【図9】本発明の一実施形態における削除処理の前段である検索処理の処理フローを説明する図である。
【図10】本発明の一実施形態における削除処理の後段の処理フローを説明する図である。
【図11A】ノードの削除前のカップルドノードツリーと削除処理において検索処理を実行した探索経路スタックの状態を説明する図である。
【図11B】削除処理を完了した後のカップルドノードツリー等の状態を説明する図である。
【図12A】挿入処理の具体例1において、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態と配列を新たに取得した状態を説明する図である。
【図12B】挿入処理の具体例1における挿入処理後のカップルドノードツリーを説明する図である。
【図12C】挿入処理の具体例2において、ノードの挿入前のカップルドノードツリーと探索経路ブロックの状態と探索経路スタック上のブロック番号の指す配列に空ノード対を取得した状態を説明する図である。
【図12D】挿入処理の具体例2において、空のノード対を移動して挿入ノード対を挿入位置に挿入可能とした状態を説明する図である。
【図12E】挿入処理の具体例2において、挿入位置に挿入ノード対を挿入するとともに、挿入位置のブランチノードの弁別ビット位置を更新して挿入処理を完成させた状態を説明する図である。
【符号の説明】
【0147】
10、20、30 配列番号
100、120 配列
101 ノード
102 ノード種別
103a 弁別ビット位置
104a 代表ノード番号
104b ブロック番号
111 ノード対
112 ノード[0]、代表ノード
113 ノード[1]、代表ノードと対をなすノード
119、129 ノード対カウンタ
301 データ処理装置
302 中央処理装置
303 キャッシュメモリ
304 バス
305 主記憶装置
306 外部記憶装置
307 通信装置
308 データ格納装置
309a 配列
310 探索経路スタック
1270 削除キー
2270、3270 挿入キー
【特許請求の範囲】
【請求項1】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索装置において、
前記ツリーの任意のノードを検索開始ノードとして、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとすることを特徴とするビット列検索装置。
【請求項2】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記検索開始ノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項1記載のビット列検索装置。
【請求項3】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法において、
前記ツリーの任意のノードを検索開始ノードとし、
前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返し、
前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとする、
ことを特徴とするビット列検索方法。
【請求項4】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記検索開始ノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項3記載のビット列検索方法。
【請求項5】
請求項3または4記載のビット列検索方法をコンピュータに実行させるためのプログラム。
【請求項6】
ビット列検索に用いるツリー状のデータ構造であって、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなり、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、
前記リーフノードは、検索対象のビット列からなるインデックスキーを含み、
前記ツリーの任意のノードを検索開始ノードとして、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索の実行を可能とすることを特徴とするデータ構造。
【請求項7】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーに、挿入キーとして指定されたビット列からなるインデックスキーを含むリーフノードを挿入するインデックスキー挿入方法において、
前記挿入キーを検索キーとして、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを、前記ルートノードから順次前記リーフノードに至るまでリンク経路を記憶しながら繰り返し、前記リーフノードに格納されたインデックスキーを、前記検索キーによる検索結果である検索結果キーとして取得する検索ステップと、
前記検索キーと前記検索結果キーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭のビット位置と、前記リンク経路上のブランチノードの弁別ビット位置との相対的位置関係により、挿入される前記リーフノードともう一方のノードからなる挿入ノード対の挿入される格納区域の識別子と挿入ノード対の代表ノードの該格納区域における位置情報を含むブランチノードの位置情報を示す挿入位置を決定する挿入位置決定ステップと、
前記挿入ノード対を格納可能な空き領域を備えた空格納区域を探索し、空ノード対を取得する空格納区域探索ステップと、
前記空ノード対に前記空格納区域の直近上位の格納区域のノード対の内容を格納し、該直近上位の格納区域のノード対を解放して空ノード対を取得する操作を、該直近上位の格納区域が、前記挿入ノード対が挿入される格納区域となるまで繰り返す空ノード対移動ステップと、
前記検索キーと前記検索結果キーの大小関係に応じて、挿入される前記リーフノードを前記挿入ノード対のどちらのノードとするかを決定し、前記指定されたインデックスキーを前記リーフノードに格納するリーフノード挿入ステップと、
を備えたことを特徴とするインデックスキー挿入方法。
【請求項8】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記ルートノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記ルートノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項7記載のインデックスキー挿入方法。
【請求項9】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーから、削除キーとして指定されたビット列からなるインデックスキーを含むリーフノードを削除するインデックスキー削除方法において、
前記削除キーを検索キーとして、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを、前記ルートノードから順次前記削除キーとして指定されたビット列からなるインデックスキーを含むリーフノードに至るまでリンク経路を記憶しながら繰り返し、
前記リーフノードと対をなすもう一方のノードの内容を、当該ノード対のリンク元のブランチノードに書き込み、
当該ノード対を削除する、
ことを特徴とするインデックスキー削除方法。
【請求項10】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記ルートノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記ルートノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項9記載のインデックスキー削除方法。
【請求項11】
請求項7または8記載のインデックスキー挿入方法をコンピュータに実行させるためのプログラム。
【請求項12】
請求項9または10記載のインデックスキー削除方法をコンピュータに実行させるためのプログラム。
【請求項13】
請求項5、請求項11又は請求項12いずれか1項記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項1】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索装置において、
前記ツリーの任意のノードを検索開始ノードとして、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとすることを特徴とするビット列検索装置。
【請求項2】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記検索開始ノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項1記載のビット列検索装置。
【請求項3】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法において、
前記ツリーの任意のノードを検索開始ノードとし、
前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返し、
前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとする、
ことを特徴とするビット列検索方法。
【請求項4】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記検索開始ノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項3記載のビット列検索方法。
【請求項5】
請求項3または4記載のビット列検索方法をコンピュータに実行させるためのプログラム。
【請求項6】
ビット列検索に用いるツリー状のデータ構造であって、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなり、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、
前記リーフノードは、検索対象のビット列からなるインデックスキーを含み、
前記ツリーの任意のノードを検索開始ノードとして、前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて、該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを、前記検索開始ノードをルートノードとする前記ツリーの任意の部分木の前記検索キーによる検索の実行を可能とすることを特徴とするデータ構造。
【請求項7】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーに、挿入キーとして指定されたビット列からなるインデックスキーを含むリーフノードを挿入するインデックスキー挿入方法において、
前記挿入キーを検索キーとして、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを、前記ルートノードから順次前記リーフノードに至るまでリンク経路を記憶しながら繰り返し、前記リーフノードに格納されたインデックスキーを、前記検索キーによる検索結果である検索結果キーとして取得する検索ステップと、
前記検索キーと前記検索結果キーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭のビット位置と、前記リンク経路上のブランチノードの弁別ビット位置との相対的位置関係により、挿入される前記リーフノードともう一方のノードからなる挿入ノード対の挿入される格納区域の識別子と挿入ノード対の代表ノードの該格納区域における位置情報を含むブランチノードの位置情報を示す挿入位置を決定する挿入位置決定ステップと、
前記挿入ノード対を格納可能な空き領域を備えた空格納区域を探索し、空ノード対を取得する空格納区域探索ステップと、
前記空ノード対に前記空格納区域の直近上位の格納区域のノード対の内容を格納し、該直近上位の格納区域のノード対を解放して空ノード対を取得する操作を、該直近上位の格納区域が、前記挿入ノード対が挿入される格納区域となるまで繰り返す空ノード対移動ステップと、
前記検索キーと前記検索結果キーの大小関係に応じて、挿入される前記リーフノードを前記挿入ノード対のどちらのノードとするかを決定し、前記指定されたインデックスキーを前記リーフノードに格納するリーフノード挿入ステップと、
を備えたことを特徴とするインデックスキー挿入方法。
【請求項8】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記ルートノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記ルートノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項7記載のインデックスキー挿入方法。
【請求項9】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の格納区域の識別子と該ノード対の一方のノードである代表ノードの前記格納区域における位置を示す位置情報を含み、前記リーフノードは、検索対象のビット列からなるインデックスキーを含むカップルドノードツリーから、削除キーとして指定されたビット列からなるインデックスキーを含むリーフノードを削除するインデックスキー削除方法において、
前記削除キーを検索キーとして、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じて該ブランチノードに含まれる前記格納区域の識別子の示す格納区域に格納されたリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを、前記ルートノードから順次前記削除キーとして指定されたビット列からなるインデックスキーを含むリーフノードに至るまでリンク経路を記憶しながら繰り返し、
前記リーフノードと対をなすもう一方のノードの内容を、当該ノード対のリンク元のブランチノードに書き込み、
当該ノード対を削除する、
ことを特徴とするインデックスキー削除方法。
【請求項10】
前記格納区域は配列であって、前記カップルドノードツリーは複数個の配列に分割して記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
スタックを備え、前記ルートノードの格納された配列の識別子と該配列の配列要素の配列番号、及び前記ルートノードから前記リーフノードに至るリンク先のノードの格納された配列の識別子と該配列の配列要素の配列番号が、順次前記スタックに保持されていくことを特徴とする請求項9記載のインデックスキー削除方法。
【請求項11】
請求項7または8記載のインデックスキー挿入方法をコンピュータに実行させるためのプログラム。
【請求項12】
請求項9または10記載のインデックスキー削除方法をコンピュータに実行させるためのプログラム。
【請求項13】
請求項5、請求項11又は請求項12いずれか1項記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【図1】
【図2A】
【図2B】
【図3】
【図4】
【図5】
【図6】
【図7A】
【図7B】
【図7C】
【図7D】
【図7E】
【図8】
【図9】
【図10】
【図11A】
【図11B】
【図12A】
【図12B】
【図12C】
【図12D】
【図12E】
【図2A】
【図2B】
【図3】
【図4】
【図5】
【図6】
【図7A】
【図7B】
【図7C】
【図7D】
【図7E】
【図8】
【図9】
【図10】
【図11A】
【図11B】
【図12A】
【図12B】
【図12C】
【図12D】
【図12E】
【公開番号】特開2009−199577(P2009−199577A)
【公開日】平成21年9月3日(2009.9.3)
【国際特許分類】
【出願番号】特願2008−168003(P2008−168003)
【出願日】平成20年6月26日(2008.6.26)
【出願人】(506235616)株式会社エスグランツ (32)
【Fターム(参考)】
【公開日】平成21年9月3日(2009.9.3)
【国際特許分類】
【出願日】平成20年6月26日(2008.6.26)
【出願人】(506235616)株式会社エスグランツ (32)
【Fターム(参考)】
[ Back to top ]