(57)【要約】【課題】検索対象のビット列のデータ構造であって、必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスの容易なデータ構造を備えたビット列検索装置及び検索方法を提供する。【解決手段】ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対とからなり、ブランチノードは、検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを備え、ルートノードからブランチノードにおいて、ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対のどちらかのノードにリンクすることを順次リーフノードに至るまで繰り返すことにより検索キーによるインデックスキーの検索を実行する。【選択図】図１
2008015872.tif 000002
【特許請求の範囲】
【請求項１】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、前記ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、該ツリーのノードが２つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含む、カップルドノードツリーを備え、
前記ルートノードを含む前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対のどちらかのノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより前記検索キーによる検索を実行することを特徴とするビット列検索装置。
【請求項２】
前記カップルドノードツリーは、配列に記憶され、前記リンク先のノード対の一方のノードの位置を示す情報は、そのノードが格納された前記配列の配列要素の配列番号であることを特徴とする請求項１記載のビット列検索装置。
【請求項３】
前記配列番号と前記検索キーの弁別ビット位置のビット値との演算によりリンク先のノードの格納された配列要素の配列番号を求めることを特徴とする請求項２記載のビット列検索装置。
【請求項４】
前記ブランチノードとリーフノードは、それぞれのノードの種別を示すデータを含むことを特徴とする請求項１記載のビット列検索装置。
【請求項５】
前記リーフノードに含まれるインデックスキーと前記検索キーを比較し、一致すれば検索成功とし、一致しなければ検索失敗とすることを特徴とする請求項１〜４記載のビット列検索装置。
【請求項６】
請求項２記載のビット列検索装置の前記カップルドノードツリーに所望のビット列からなるインデックスキーを含むリーフノードを挿入するインデックスキー挿入方法において、
前記インデックスキーを前記検索キーとして前記カップルドノードツリーから該当するリーフノードを検索するとともに、該リーフノードに至るまでたどったリンク経路のブランチノード及び該リーフノードが格納された配列要素の配列番号をスタックに順次格納し、
前記検索キーと前記該当するリーフノードに含まれるインデックスキーの間で大小比較とビット列比較を行い、
ビット列比較で異なるビット値となる先頭のビット位置と前記スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係により挿入されるインデックスキーを含むリーフノードともう一方のノードからなるノード対の挿入位置を決定し、
前記大小関係により挿入するインデックスキーを含むリーフノードを前記挿入されるノード対のどちらのノードとするかを決定する、
ことを特徴とするインデックスキー挿入方法。
【請求項７】
請求項２記載のビット列検索装置の前記カップルドノードツリーから任意のインデックスキーを含むリーフノードを削除するインデックスキー削除方法において、
前記インデックスキーを前記検索キーとして前記カップルドノードツリーから該当するリーフノードを検索し、
削除対象のインデックスキーを保持する前記リーフノードと同一ノード対を構成するノードの内容を当該ノード対のリンク元のブランチノードに書き込み、
当該ノード対を削除する、
ことを特徴とするインデックスキー削除方法。
【請求項８】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法において、
前記ルートノードを含む前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対のどちらかのノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、
前記検索キーによる検索を実行することを特徴とするビット列検索方法。
【請求項９】
前記カップルドノードツリーは、配列に記憶され、前記リンク先のノード対の一方のノードの位置を示す情報は、そのノードが格納された前記配列の配列要素の配列番号であることを特徴とする請求項８記載のビット列検索方法。
【請求項１０】
前記配列番号と前記検索キーの弁別ビット位置のビット値との演算によりリンク先のノードの格納された配列要素の配列番号を求めることを特徴とする請求項９記載のビット列検索方法。
【請求項１１】
前記リーフノードに含まれるインデックスキーと検索キーを比較し、一致すれば検索成功とし、一致しなければ検索失敗とすることを特徴とする請求項８〜１０記載のビット列検索方法。
【請求項１２】
請求項８〜１１記載のビット列検索方法をコンピュータに実行させるためのプログラム。
【請求項１３】
請求項６記載のインデックスキー挿入方法をコンピュータに実行させるためのプログラム。
【請求項１４】
請求項７記載のインデックスキー削除方法をコンピュータに実行させるためのプログラム。
【請求項１５】
ビット列検索に用いるツリー状のデータ構造であって、
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなり、
前記ルートノードは、前記ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、該ツリーのノードが２つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、
前記リーフノードは検索対象のビット列からなるインデックスキーを含み、
前記ルートノードを含む前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対のどちらかのノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより前記検索キーによる検索の実行を可能とすることを特徴とするデータ構造。
【請求項１６】
前記データ構造は、配列に記憶され、前記リンク先のノード対の一方のノードの位置を示す情報は、そのノードが格納された前記配列の配列要素の配列番号であることを特徴とする請求項１５記載のデータ構造。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はビット列の集合から所望のビット列を検索する検索装置に関するものであり、特にビット列を記憶するデータ構造に工夫をして、検索速度等の向上を図る技術分野のものである。
【背景技術】
【０００２】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【０００３】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
上記ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
【０００４】
図１７は、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
【０００５】
図１７の例では、インデックスキー"100010"を保持するノード1750aがルートノードとなっており、その検査ビット位置は０である。ノード1750aの左リンク1740aにはノード1750bが接続され、右リンク1741aにはノード1750fが接続されている。
【０００６】
ノード1750bの保持するインデックスキーは"010011"であり、検査ビット位置1730bは１である。ノード1750bの左リンク1740bにはノード1750cが、右リンク1741bにはノード1750dが接続されている。ノード1750cが保持するインデックスキーは"000111"、検査ビット位置は３である。ノード1750dが保持するインデックスキーは"011010"、検査ビット位置は２である。
【０００７】
ノード1750cから実線で接続された部分はノード1750cの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ1740cは、その欄が空欄であることを示している。点線の接続された右ポインタ1741cの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード1750cを右ポインタが指定していることを表している。
【０００８】
ノード1750dの右ポインタ1741dはノード1750d自身を指しており、左リンク1740dにはノード1750eが接続されている。1750eの保持するインデックスキーは"010010"、検査ビット位置は５である。ノード1750eの左ポインタ1740eはノード1750bを、右ポインタ1741eはノード1750eを指している。
【０００９】
また、ノード1750fの保持するインデックスキーは"101011"であり、検査ビット位置1730fは２である。ノード1750fの左リンク1740fにはノード1750gが、右リンク1741fにはノード1750hが接続されている。
【００１０】
ノード1750gの保持するインデックスキーは"100011"であり、検査ビット位置1730gは５である。ノード1750gの左ポインタ1740gはノード1750aを、右ポインタ1741gはノード1750gを指している。
【００１１】
ノード1750hの保持するインデックスキーは"101100"であり、検査ビット位置1730hは３である。ノード1750hの左ポインタ1740hはノード1750fを、右ポインタ1741hはノード1750hを指している。
【００１２】
図１７の例では、ルートノード1750aからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が１であるか０であるか判定を行い、１であれば右リンクをたどり、０であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば（図１７において点線で示されたこの逆戻りのリンクをバックリンクという。)、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
【００１３】
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は１回ですむことなどのメリットがあるが、各ノードからの２つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
【００１４】
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献１に開示された技術がある。下記特許文献１に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
【００１５】
しかしながら、下記特許文献1に開示されたものにおいても、1つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを１つとしたため、例えば図１７に示したパトリシアツリーの最下段の部分である左ポインタ1740c、右ポインタ1741h等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
【特許文献１】特開２００１−３５７０７０号公報
【発明の開示】
【発明が解決しようとする課題】
【００１６】
そこで本発明の解決しようとする課題は、検索対象のビット列のデータ構造であって、必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスの容易なデータ構造を備えたビット列検索装置及び検索方法を提供することである。
【課題を解決するための手段】
【００１７】
本発明によれば、カップルドノードツリーと名付ける以下のデータ構造を持つツリーが提供され、本発明のビット列検索装置においてはこのカップルドノードツリーを用いてインデックスキーの検索が行われる。
【００１８】
本発明のカップルドノードツリーは、リンク先のデータを有するブランチノードと検索対象であるインデックスキーを有するリーフノードを備える。そしてそのツリー構造は、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対から構成される。
【００１９】
ブランチノードは、検索キーの弁別ビット位置とリンク先のノード対のうちの一方である代表ノードにリンクするための代表ノード番号を含み、前記リーフノードは検索対象であるビット列からなるインデックスキーを含む。ルートノードは、ツリーのノードがただ一つのときを除いてはブランチノードである。
【００２０】
検索キーの弁別ビット位置は、検索キーのその位置のビット値を用いる点ではパトリシアツリーの検査ビット位置と同様であるが、パトリシアツリーでは検査ビット位置のビット値を判定してリンク先を求めるのに対して、本発明のカップルドノードツリーでは弁別ビット位置のビット値をリンク先のノードを求める演算に用いる点で異なる。
【００２１】
検索キーによる検索の実行は、ルートノードを含む、各ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の一方のノードにリンクすることを順次リーフノードに至るまで繰り返すことにより行われる。
【００２２】
リーフノードに至ると、リーフノードの保持するインデックスキーと検索キーを比較し、一致すれば検索は成功となる。一致しなければ、検索対象のインデックスキーには検索キーと一致するものはなかったことになる。
【００２３】
本発明のカップルドノードツリーに新たなインデックスキーを追加する場合は、まずそのインデックスキーを検索キーとして検索を行い、見つかったリーフノードのインデックスキーを取得する。また、リーフノートに至るまでたどったブランチノードの番号をルートノードから順次スタックに格納しておく。
【００２４】
追加するインデックスキーと検索により取得されたインデックスキーの間で大小比較とビット列比較を行い、ビット列比較で異なるビット値となる先頭の（最上位の）ビット位置とスタックに格納されているブランチノードの弁別ビット位置との相対的位置関係により追加されるノード対の挿入位置を決定し、大小関係により追加するインデックスキーを含むリーフノードを追加されるノード対のどちらのノードとするかを決定する。
【００２５】
本発明のカップルドノードツリーからあるインデックスキーを削除するときは、削除するキーにより検索を行い、削除対象のインデックスキーを保持するノードと同一ノード対を構成するノードの内容を当該ノード対のリンク元のブランチノードに書き込み、当該ノード対を削除することにより行う。
【発明の効果】
【００２６】
本発明によるカップルドノードツリーは、ツリー構造をノード対で構成しており、インデックスキーの集合に対して、その大きさをコンパクトにすることができる。また、ノードを、ポインタを含むブランチノードとインデックスキーを含むリーフノードに分離しているため、ポインタ情報が必要なノードにはポインタ情報は持たせるが、インデックスキーのための領域は必要なく、インデックスキーが必要なノードにはポインタのための領域は必要としないから、記憶領域に無駄が生じることがない。また、パトリシアツリーのようなバックリンクの処理も必要がない。
【００２７】
カップルドノードツリーを配列に格納した場合には、ポインタを配列番号とすることができ、さらに必要な記憶容量を低減することができる。
本発明によれば、上述のように検索に用いるツリー構造体を格納する記憶容量を低減することができ、それによっても検索処理負担を小さくできるが、さらにブランチノードは、カップルドノードツリーに含まれるインデックスのビット列構成により規定される弁別ビット位置を保持するように配置されているから、必要なビット位置での処理のみとなり、分岐処理の負担も小さい。また、弁別ビット位置のビット値は判定処理に用いられるのではなく、演算処理に用いられるので、この点でもＣＰＵ処理負担は軽くなる。
【００２８】
また、カップルドノードツリーの挿入処理や削除処理も単純であり、メンテナンス負担も軽いものとなる。
以上のとおりであるので、本発明によれば、高速にビット列検索を実行することができ、データメンテナンスの容易なビット列検索装置が提供される。
【発明を実施するための最良の形態】
【００２９】
以下、本発明を実施するための最良の形態として、カップルドノードツリーを配列に格納する例について説明する。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
【００３０】
図１は、配列に格納されたカップルドノードツリーの構成例を説明する図である。
図１を参照すると、ノード101が配列100の配列番号10の配列要素に配置されている。ノード101はノード種別102、弁別ビット位置103及び代表ノード番号104で構成されている。ノード種別102は０であり、ノード101がブランチノードであることを示している。弁別ビット位置103には１が格納されている。代表ノード番号104にはリンク先のノード対の代表ノードの配列番号２０が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
【００３１】
配列番号２０の配列要素には、ノード対111の代表ノードであるノード[0]112が格納されている。そして隣接する次の配列要素(配列番号20+1）に代表ノードと対になるノード[1]113が格納されている。ノード[0]112のノード種別114には０が、弁別ビット位置115には３が、代表ノード番号116には３０が格納されている。またノード[1]113のノード種別117には１が格納されており、ノード[1]113がリーフノードであることを示している。インデックスキー118には、"0001"が格納されている。パトリシアツリーについて先に述べたと同様に、リーフノードにインデックスキーと対応するレコードにアクセスする情報が含まれることは当然であるが、表記は省略している。
【００３２】
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。
配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121の内容は省略されている。
【００３３】
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された０あるいは１は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である０か１を代表ノード番号に加えた配列番号のノードにリンクする。
【００３４】
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
【００３５】
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図２は、カップルドノードツリーのツリー構造を概念的に示す図である。図示の６ビットのインデックスキーは、図１７に例示されたパトリシアツリーのものと同じである。
【００３６】
符号210aで示すのがルートノードである。図示の例では、ルートノード210aは配列番号220に配置されたノード対201ａの代表ノードとしている。
ツリー構造としては、ルートノード210ａの下にノート対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
【００３７】
各ノードの前に付された０あるいは１の符号は、図１において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
【００３８】
図示された例では、ルートノード210aのノード種別260aは０でブランチノードであることを示し、弁別ビット位置230aは０を示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列要素の配列番号である。
【００３９】
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに０であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには１が格納され、リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列要素の配列番号220bが格納されている。
【００４０】
ノード210cのノード種別260cには１が格納されているので、このノードはリーフノードであり、したがって、インデックスキーを含んでいる。インデックスキー250ｃには"000111"が格納されている。一方ノード211cのノード種別261cは０、弁別ビット位置231cは２であり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列要素の配列番号221cが格納されている。
【００４１】
ノード210dのノード種別260dは０、弁別ビット位置230dは５であり、代表ノード番号にはノード対201ｅの代表ノード210ｅの格納された配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは１であり、インデックスキー251dには"011010"が格納されている。
【００４２】
ノード対201eのノード210e、211eのノード種別260e、261eはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー250e、251eにはインデックスキーとして"010010"と"010011"が格納されている。
【００４３】
ノード対201bのもう一方のノードであるノード211bの弁別ビット位置231bには２が格納され、リンク先の代表ノード番号にはノード対201fの代表ノード210fの格納された配列要素の配列番号221bが格納されている。
【００４４】
ノード対201fのノード210f、211fのノード種別260f、261fはともに０であり双方ともブランチノードである。それぞれの弁別ビット位置230f、231fには５，３が格納されている。ノード210fの代表ノード番号にはノード対201gの代表ノード210gの格納された配列要素の配列番号220fが格納され、ノード211fの代表ノード番号にはノード対201hの代表ノードであるノード[0]210hの格納された配列要素の配列番号221fが格納されている。
【００４５】
ノード対201gのノード210g、211gのノード種別260g、261gはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー250g、251gには"100010"と"100011"が格納されている。
【００４６】
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー250h、251hには"101011"と"101100"が格納されている。
【００４７】
以下、上述のツリーからインデックスキー"100010"を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から０、１、２、・・・とする。
まず、ビット列"100010"を検索キーとしてルートノード210aから処理をスタートする。ルートノード210aの弁別ビット位置230aは０であるので、検索キー"100010"の弁別ビット位置０のビット値をみると１である。そこで代表ノード番号の格納された配列番号220aに１を加えた配列番号の配列要素に格納されたノード211bにリンクする。ノード211bの弁別ビット位置231bには２が格納されているので、検索キー"100010"の弁別ビット位置２のビット値をみると０であるから、代表ノード番号の格納された配列番号221bの配列要素に格納されたノード210fにリンクする。
【００４８】
ノード210fの弁別ビット位置230fには５が格納されているので、検索キー"100010"の弁別ビット位置５のビット値をみると０であるから、代表ノード番号の格納された配列番号220fの配列要素に格納されたノード210gにリンクする。
【００４９】
ノード210gのノード種別260gは１でありリーフノードであることを示しているので、インデックスキー250gを読み出して検索キーと比較すると両方とも"100010"であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
【００５０】
次に、図２を参照してカップルドノードツリーの構成の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図２の例で、ルートノード210aの弁別ビット位置が０であるのは、図２に例示されたインデックスキーに０ビット目が０のものと１のものがあるからである。０ビット目が０のインデックスキーのグループはノード210bの下に分類され、０ビット目が１のインデックスキーのグループはノード211bの下に分類されている。
【００５１】
ノード211bの弁別ビット位置が２であるのは、ノード211h、210h、211g、210gに格納された０ビット目が１のインデックスキーの１ビット目がすべて０で等しく、２ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
【００５２】
以下０ビット目の場合と同様に、２ビット目が１であるものはノード211f側に分類され、２ビット目が０であるものはノード210f側に分類される。
そして２ビット目が１であるインデックスキーは３ビット目の異なるものがあるのでノード211fの弁別ビット位置には３が格納され、２ビット目が０であるインデックスキーでは３ビット目も４ビット目も等しく５ビット目で異なるのでノード210fの弁別ビット位置には５が格納される。
【００５３】
ノード211fのリンク先においては、３ビット目が１のものと０のものがそれぞれ1つしかないことから、ノード210h、211hはリーフノードとなり、それぞれインデックスキー250hと251hに"101011"と"101100"が格納されている。
【００５４】
仮にインデックスキーの集合に"101100"の代わりに"101101"か"101110"が含まれていたとしても、３ビット目までは"101100"と等しいので、ノード211hに格納されるインデックスキーが変わるだけで、ツリー構造自体は変わることはない。しかし、"101100"に加えて"101101"が含まれていると、ノード211hはブランチノードとなり、その弁別ビット位置は５になる。追加されるインデックスキーが"101110"であれば、弁別ビット位置は４となる。
【００５５】
以上説明したように、カップルドノードツリーの構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが"101100"であればノード211hに到達することができる。また、上記説明からも想像がつくように、"101101"か"101110"を検索キーとした場合でもノード211hにたどり着き、インデックスキー251hと比較することにより検索が失敗したことが分かる。
【００５６】
また、例えば"100100"で検索した場合でも、ノード210a、211b、210fのリンク経路では検索キーの３ビット目と４ビット目は使われることがなく、"100100"の５ビット目が０なので、"100010"で検索した場合と同様にノード210ｇに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
【００５７】
なお、検索の詳細なアルゴリズム、及びインデックスキーの集合に対してどのようにカップルドノードツリーを構成するかについては、後に詳細に説明をする。
図３は、本発明を実施するためのハードウェア構成例を説明する図である。
【００５８】
本発明の検索装置による検索処理及びデータメンテナンスは中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施される。カップルドノードツリーが配置される配列309と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック310を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。
【００５９】
図３の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309は外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
【００６０】
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
図４は、本発明の一実施形態における検索処理を示すフローチャートである。適宜図２を参照しながら、検索処理のアルゴリズムを説明する。
【００６１】
検索処理を開始するに当たって、検索対象であるカップルドノードツリーのルートノードの配列番号を取得する（ステップS401)。カップルドノードツリーはそのルートノードの配列番号により識別できることから、カップルドノードツリーの管理はルートノードの配列番号を用いて行うことができる。そこで、カップルドノードツリーの管理手段にカップルドノードツリーのルートノードの配列番号が登録されているものとする。
【００６２】
なお、図示の検索処理がコンピュータ上のプログラムにより実現可能であることは明らかであるが、上記カップルドノードツリーの管理手段は、例えば検索処理をコンピュータに実行させるプログラム上の記憶エリアとすることができる。
【００６３】
また、１つのコンピュータシステムに複数のカップルドノードツリーを用いた検索システムが搭載されている場合は、個々の検索プログラムの外部に持つようにすることもできる。
【００６４】
図２の例では、配列番号220を取得することに相当する。なお、ルートノードの配列番号の取得は、上記の方法に限らず、キーボード等から直接配列番号を入力するようにしてもよいし、固定値として予めプログラム上に設定しておいてもよい。
【００６５】
次にステップS402において、ステップS401で取得した配列番号を探索経路スタックに格納する。ステップS403に進み、探索経路スタックの最上部に積まれた配列番号の配列要素をリンク先のノードとして配列から読み出す。ステップS404において、ステップS403で読み出したノードからノード種別を取り出す。
【００６６】
次にステップS405においてノード種別の判定を行う。ステップS405での判定がブランチノードであれば、ステップS406に移行する。ステップS406ではノードから弁別ビット位置を取り出す。次にステップS407において検索キーからステップS406で取り出した弁別ビット位置のビット値を取得する。次にステップS408に進み、ノードから、リンク先のノード対の代表ノードの配列番号を取得する。続いてステップS409に進み、ステップS408で取得した配列番号にステップS407で取得したビット値を加算してリンク先ノードの配列番号を取得し、ステップS402に戻る。
【００６７】
ステップS402ではステップS409で取得した配列番号を探索経路スタックに格納する。
以上のステップS402からS409のループ処理をステップS405での判定がリーフノードとなるまで繰り返す。
【００６８】
ステップS405でノード種別がリーフノードと判定されるとステップS410に移行し、ノードからインデックスキーを取り出す。そしてステップS411に進み、検索キーとインデックスキーが等しいか判定する。等しければ検索成功であり、等しくなければ検索失敗である。
【００６９】
上記の説明では、処理中のノードの配列番号を識別するためにスタックを用いたが、検索だけのためであれば普通のワークエリアを一時記憶として用いることもできる。しかし、以下に説明する挿入処理においては、スタックを用いることが有効であるから、検索処理においてもスタックを用いることが好ましい。
【００７０】
次に、図５〜図８によりカップルドノードツリーにおけるノード挿入処理を説明する。図５〜図７が通常の挿入処理を説明するものであり、図８はルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
【００７１】
図５は挿入処理の前段である検索処理の処理フローを示す図であり、図４に示した検索処理において挿入キーを検索キーとしたものに相当する。ステップS501〜ステップS510の処理は図４のステップS401〜ステップS410に完全に対応するので説明は省略する。
【００７２】
図５のステップS511において挿入キーとインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。等しくなければ次の処理、図６のステップS512以下の処理に進む。
【００７３】
図６は、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
ステップS512において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
【００７４】
ステップS513に進み、挿入キーとステップS510で得たインデックスキーの大小を比較し、挿入キーが大きいときは値１を小さいときは値０のブール値を得る。
ステップS514に進み、ステップS512で得た代表ノードの配列番号にステップS513で得たブール値を加算した配列番号を得る。
【００７５】
ステップS515に進み、ステップS512で得た代表ノードの配列番号にステップS513で得たブール値の論理否定値を加算した配列番号を得る。
ステップS514で得た配列番号は、挿入キーをインデックスキーとして持つリーフノードが格納される配列要素の配列番号であり、ステップS515で得た配列番号は、そのリーフノードと対を成すブランチノードが格納される配列要素のものである。
【００７６】
つまり、前段の検索処理で得られたリーフノードに格納されたインデックスキーと挿入キーの大小により、挿入されるノード対のうちどちらのノードに挿入キーを保持するリーフノードが格納されるかが決定される。
【００７７】
例えば図２のカップルドノードツリーに"011011"を挿入する場合、検索結果のインデックスキーはノード211dに格納された"011010"になる。挿入キー"011011"とノード211dに格納されたインデックスキー"011010"の大小比較によりブール値が求められ、今の例では挿入キーが大きいのでブール値１が得られ、挿入されるノード対の代表ノード番号に１を加えた配列要素に挿入キーを保持するリーフノードが格納される。一方、インデックスキー"011010"は、大小比較で得られたブール値を論理反転した値を代表ノード番号に加算した配列番号の配列要素に格納される。
【００７８】
その際、インデックスキー"011010"と挿入キー"011011"とは５ビット目で異なることから、ノード211dは、弁別ビット位置を５とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。
【００７９】
また図２のカップルドノードツリーに"011001"を挿入しようとする場合も、検索結果のインデックスキーはノード211dに格納された"011010"になる。この場合には挿入キーが小さいのでブール値０が得られ、挿入されるノード対の代表ノード番号に０を加えた配列要素に挿入キーを保持するリーフノードが格納される。そして、インデックスキー"011010"と挿入キー"011001"とは４ビット目で異なることから、ノード211dは、弁別ビット位置を４とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。次に図７のステップS516以下の処理に進む。
【００８０】
図７は図６で準備された配列にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。
ステップS516〜ステップS523までの処理は、挿入するノード対のカップルドノードツリー上の位置を求める処理であり、ステップS524以下の処理は各ノードにデータを設定して挿入処理を完成させる処理である。
【００８１】
ステップS516で、挿入キーとステップS510で得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップS517に進み、ステップS516で得た差分ビット列から、上位０ビット目から見た最初の不一致ビットのビット位置を得る。この処理は、例えばプライオリティエンコーダを有するＣＰＵではそこに差分ビット列を入力し、不一致のビット位置を得ることができる。また、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることも可能である。
【００８２】
次にステップS518に進み、探索経路スタックのスタックポインタがルートノードの配列番号を指しているか判定する。指していればステップS524に移行し、指していなければステップS519に進む。
【００８３】
ステップS519において、探索経路スタックのスタックポインタを１つ戻してそこにスタックされている配列番号を取り出す。
ステップS520に進み、ステップS519で取り出した配列番号の配列要素を配列からノードとして読み出す。
【００８４】
ステップS521に進み、ステップS520で読み出したノードから、弁別ビット位置を取り出す。
次にステップS522に進み、ステップS521で取り出した弁別ビット位置がステップS517で得たビット位置より上位の位置関係か判定する。ここで上位の位置関係とは、ビット列のより左側の位置、すなわちビット位置の値が小さい位置であることとする。
【００８５】
ステップS522の判定結果が否定であれば、ステップS518に戻り、ステップS518での判定が肯定になるかステップS522での判定が肯定になるまで繰り返す。ステップS522での判定が肯定になると、ステップS523で経路探索スタックのスタックポインタを1つ進め、ステップS524以下の処理に移行する。
【００８６】
上記ステップS516〜ステップS523で説明した処理は、挿入するノード対の挿入位置を決定するために、挿入するインデックスキーと検索により取得されたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭の（最上位の）ビット位置と探索経路スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるブランチノードの次のブランチノードのリンク先を挿入するノード対の挿入位置とするものである。
【００８７】
例えば図２のカップルドノードツリーに"111000"を挿入するとき、検索結果のインデックスキーはノード210hに格納された"101011 "になる。挿入キー"111000"とノード210hに格納されたインデックスキー"101011"のビット列比較により異なるビット値となる最上位のビット位置１が得られる。得られたビット位置１と経路探索スタックに積まれた配列番号の配列要素に格納されたブランチノードの弁別ビット位置との位置関係を弁別ビット位置が上位になるまでを順次経路探索スタック逆にたどると、ルートノード210aに至る。そこで探索経路スタックのポインタを１つ進め、ノード211bの配列番号を得る。挿入キー"111000"はノード211bのリンク先に挿入される。
【００８８】
また、経路探索スタック逆にたどりルートノードに至っても、ルートノードの弁別ビット位置が、先に求めたビット列比較で異なるビット値となる最上位のビット位置より上位のビット位置でないということは、そのカップルドノードツリーのインデックスキーの上位ビットで、ルートノードの弁別ビット位置より上位のビットの値は全て等しい場合である。そして、挿入するインデックスキーにおいて、初めてルートノードの弁別ビット位置より上位のビットの値に異なるビット値のものがあるということである。したがって、挿入するノード対はルートノードの直接のリンク先となり、ルートノードの弁別ビット位置は、既存のインデックスキーと異なる値である挿入キーの最上位ビットの位置に変わる。
【００８９】
次に、ステップS524以下の各ノードにデータを設定して挿入処理を完成させる処理
について説明する。
ステップS524では探索経路スタックからスタックポインタの指す配列番号を取り出す。
【００９０】
ステップS525において、ステップS514で得た配列番号の指す配列要素のノード種別に１（リーフノード)を、インデックスキーに挿入キーを書き込む。
ステップS526に進み、配列からステップS524で得た配列番号の配列要素を読み出す。
【００９１】
次にステップS527において、ステップS515で得た配列番号の配列要素にステップS526で読み出した内容を書き込む。
最後にステップS528において、ステップS524で得た配列番号の指す配列要素のノード種別に０(ブランチノード）を、弁別ビット位置にステップS517で得たビット位置を、代表ノード番号にステップS512で得た配列番号を書き込み処理を終了する。
【００９２】
上述の図２のカップルドノードツリーに"111000"を挿入する例では、取得された空ノード対のノード[0]にノード211bの内容を書き込み（ステップS527）、ノード[1]を挿入キー"111000"を保持するリーフノードとする（ステップS525）。そして、ノード211bの弁別ビット位置にビット列比較により異なるビット値となる最上位のビット位置１を格納し、代表ノード番号には取得されたノード対の代表ノードが格納される配列要素の配列番号が格納される（ステップS528）。
【００９３】
図８は、本発明の一実施の形態におけるルートノードの挿入処理を含むインデックスキーを追加する場合のノード挿入処理全体を説明する処理フロー図である。
ステップS551において、取得することを求められたカップルドノードツリーのルートノードの配列番号が登録済みであるか判定される。登録済みであれば、図５〜図７を用いて説明した通常の挿入処理が行われる。
【００９４】
ステップS551での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まることになる。
まず、ステップS552において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップS553において、ステップS552で得た配列番号に０を加えた配列番号を求める。（実際には、ステップS552で取得した配列番号に等しい。)さらにステップS554において、ステップS553で得た配列番号の配列要素に、挿入するルートノードのノード種別に１（リーフノード)とインデックスキーに挿入キーを書き込み、ステップS556でステップS552で取得したルートノードの配列番号を登録して処理を終了する。
【００９５】
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図８及び図５〜図７の処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかである。
【００９６】
次に図９、図１０を参照して、本発明の一実施の形態におけるカップルドノードツリーに係るインデックスキーの集合から、特定のインデックスキーを削除する処理フローを説明する。
【００９７】
図９は、削除処理の前段である検索処理の処理フローを示す図であり、図４に示した検索処理において削除キーを検索キーとしたものに相当する。ステップS901〜ステップS910の処理は図４のステップS401〜ステップS410に完全に対応するので説明は省略する。
【００９８】
図９のステップS911において削除キーとインデックスキーを比較し、等しくなければければ削除するインデックスキーはカップルドノードツリーに存在しないのであるから、削除は失敗となり、処理を終了する。等しければ次の処理、図１０のステップS912以下の処理に進む。
【００９９】
図１０は、削除処理の後段の処理フローを説明する図である。
まず、ステップS912で探索経路スタックに２つ以上の配列番号が格納されているか判定する。２つ以上の配列番号が格納されていないということは、言い換えれば１つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合はステップS918に移行し、ステップS901で得たルートノードの配列番号に係るノード対を削除する。次にステップS919に進み、登録されていたルートノードの配列番号を削除して処理を終了する。
【０１００】
ステップS912において探索経路スタックに２つ以上の配列番号が格納されていると判定されたときはステップS913に進み、ステップS908で得た代表ノード番号にステップS907で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除対象のインデックスキーが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
【０１０１】
次にステップS914において、ステップS913で得た配列番号の配列要素の内容を読み出し、ステップS915において探索経路スタックのスタックポインタを１つ戻して配列番号を取り出す。
【０１０２】
次にステップS916に進み、ステップS914で読み出した配列要素の内容をステップS915で得た配列番号の配列要素に上書きする。この処理は、削除対象のインデックスキーが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
【０１０３】
最後にステップS917においてステップS908で得た代表ノード番号に係るノード対を削除して処理を終了する。
図１１Ａ及び図１１Ｂは、図２に例示したカップルドノードツリーからインデックスキー"011010"を削除する処理を説明する図である。
【０１０４】
図１１Ａに示したカップルドノードツリーは、ノード対201f以下のノードは記載を省略している。削除対象のインデックスキー"011010"は一時記憶エリアである削除キー270に格納されている。探索経路スタック280のスタックポインタは配列番号221c+1を指しており、検索処理が完了したことを示している。図中太枠で囲まれたノードが検索処理でたどられたノードであり、その配列番号がルートノード210aのものからリーフノード211dのものまで探索経路スタック280に積まれている。
【０１０５】
削除キーによる検索処理においては、まず始めにルートノード210aの配列番号220を取得し、それを探索経路スタック280に格納する。ルートノード210aの弁別ビット位置230aが０であり、削除キーのビット位置０のビット値が０であるので、代表ノード番号220a+0=220aが探索経路スタック280に格納される。
【０１０６】
するとノード210bが読み出され、弁別ビット位置230bが１であり、削除キーのビット位置１のビット値が１であるので、代表ノード番号220b+1が探索経路スタック280に格納される。
【０１０７】
次にノード211cが読み出され、弁別ビット位置231cが２であり、削除キーのビット位置２のビット値が１であるので、代表ノード番号221c+1が探索経路スタック280に格納される。配列番号が221c+1の配列要素に格納されたノード211dのノード種別261dは１であり、リーフノードであることを示しているのでインデックスキー251dを取り出すとその値は"011010"であり、削除キー261に格納された削除対象のインデックスキーと一致している。
【０１０８】
図１１Ａに示した状態において、削除対象のインデックスキーを有するノード211dと対をなすノード210dの内容が読み出され、その内容が、探索経路スタック280のスタックポインタを１つ戻したところに格納されている配列番号220b+1の配列要素（ノード221c）に書き込まれる。その後ノード対201dを削除する。ノード対が削除された配列要素は空となり、再利用可能となる。
【０１０９】
図１１Ｂに示したカップルドノードツリーは、削除処理の終了後のものである。ノード211cのノード種別261c、弁別ビット位置231c、代表ノード番号221cには、括弧書きで示すように、ノード210dに格納されていた値がそのまま格納されている。
【０１１０】
次に、図１２Ａ、図１２Ｂ及び図１３〜図１６により、具体例を挙げて挿入処理を更に説明する。
図１２Ａに示すのは、ビット列"0100"、"0001"、"0000"をインデックスキーとして持つカップルドノードツリーとこれから挿入しようとする挿入キー"0011"を保持している一時記憶エリア1250である。図示のツリーはノード対1201a,1201b,1201cで構成されている。
【０１１１】
ノード対1201aの代表ノードはルートノード1210aであり、弁別ビット位置には１が保持されている。ノード対1201aの下位のノード対1201bの代表ノード1210bはブランチノードであり、弁別ビット位置には３が保持され、代表ノード1210bと対になるノード1211bはリーフノードであり、インデックスキー"0100"が保持されている。ブランチノードであるノード1210bはノード対1201cにリンクしている。
【０１１２】
ノード対1201cを構成するノード1210c,1211cはともにリーフノードであり、それぞれインデックスキー"0000"、 "0001"を保持している。
図１２Ｂは、挿入キー"0011"を挿入したカップルドノードツリーを示す図である。新たなノード対1201dがノード対1201bとノード対1201cの間に挿入されている。
【０１１３】
図１２Ａと図１２Ｂを比べると、挿入されたノード1210dの内容は、挿入前のノード1210bのものであり、挿入後のノード1210bの弁別ビット位置が３から２に変化している。
以下、図５〜図７を適宜参照しつつ図１３〜図１６により図１２Ａ及び図１２Ｂに例示した挿入処理を説明する。図１３〜図１６において太線で示す処理のフローは、図１２Ａ及び図１２Ｂの例示に沿ったものである。また、S501等の符号は、その部分の処理が図５〜図７に記載されたステップS501等における処理に対応することを示している。
【０１１４】
図１３は、図５に示した挿入処理の前段である検索処理における処理ブロックのフローを説明する図である。
図１３に示すように、最初の処理ブロックでルートノード設定が行われる。ルートノードの配列番号を取得することによりルートノードの位置を設定する。取得された配列番号1210aを探索経路スタックに格納する。なお、ここでは、配列番号を表す符合をノードを表す符号と兼用している。
【０１１５】
次にステップS503、ステップS504及びステップS505からなるノード読出・判定ブロックでノード1210aがブランチノードであることが判定され、ブランチ処理が行われる。
ブランチ処理においては挿入キー"0011"の１ビット目の"0"とノード1210aの代表ノード番号に格納された配列番号1201bを加算してリンク先のノード位置を算出する。なおここでは、代表ノード番号に格納された配列番号をリンク先のノード対の符号で表している。算出されたノード位置1210bは探索経路スタックに格納される。
【０１１６】
ブランチ処理で算出されたノード位置に基づいて再びノード読出・判定処理が行われ、ノード1210bが読み出され、ブランチノードであることが判定される。
そこで再度ブランチ処理が行われ、挿入キー"0011"の３ビット目の"1"とノード1210bの代表ノード番号に格納された配列番号1201cを加算してリンク先のノード位置を算出する。算出されたノード位置1211cは探索経路スタックに格納される。
【０１１７】
次のノード読出・判定処理においてノード1211cが読み出され、リーフノードであることが判定される。
そこで処理はリーフ処理に分岐し、ノード1211cのインデックスキー"0001"と挿入キー"0011"のビット列比較が行われ、一致していれば挿入失敗となり、不一致であれば次の処理に進む。
【０１１８】
なお、点線の矢印の先に記載された符号D513等の出口マークは点線の一方につながったデータ値が同じ符号のエントリポイントで使用されることを表している。D513のうち513は、ステップS513で用いられることを表している。以上は、図１４〜図１６においても同様である。
【０１１９】
図１４は、図６に示した挿入するノード対のために配列要素を準備する処理ブロックのフローを説明する図である。
空きノード対取得ブロックでは、配列から連続した領域の２つの空き配列要素の配列番号に係る代表ノード番号1201dを取得する。
【０１２０】
次にノード格納位置算出ブロックにおいて、挿入キー"0011"とステップS510で得られたインデックスキー"0001"との大小比較を行い、空きノード対取得ブロックで取得した２つの配列要素のうち、挿入キーを保持するリーフノードがどちらの配列要素に格納されるか決定する。比較の結果挿入キーが大きいので、代表ノード番号1201dに１を加算した配列番号の配列要素にノード1211dとして挿入キーを保持するリーフノードが格納されることになる。
【０１２１】
図１５は、図７に示した処理のうち、前半の挿入するノード対のカップルドノードツリー上の位置を求める処理フローを説明する図である。
差分ビット位置検出ブロックにおいて、挿入キー"0011"とステップS510で得られたインデックスキー"0001"とのビットごとの排他的論理和"0010"が演算され、差分ビット位置が２ビット目であることが求められる。
【０１２２】
挿入ノード位置探索ブロックでは、探索経路スタックのポインタが指す配列番号の配列要素に格納されたノードの弁別ビット位置と差分ビット位置を比較しながら、弁別ビット位置が上位になるまでポインタを順次戻していく。途中でポインタがルートノードの配列番号を指した場合は挿入位置はルートノードのすぐ下になる。
【０１２３】
挿入ノード位置の探索を開始する前の段階では探索経路スタックのポインタは配列番号1211cを指しているから、ポインタを1つ戻して挿入ノード位置探索処理を開始し、ノード1210bの格納位置を取り出してノード1210bを読み出す。ノード1210bの弁別ビット位置は３であり、差分ビット位置２より下位であり、ノード1210bはルートノードではないので、さらに挿入ノード位置の探索を続ける。
【０１２４】
さらにポインタを1つ戻すと、ノード1210aの格納位置が取り出され、ノード1210aが読み出される。ノード1210aの弁別ビット位置は１であり、差分ビット位置２より上位であるので、ポインタの位置を１つ進めて挿入ノード位置読出ブロックの処理を行う。
【０１２５】
挿入位置読出しを行うときには探索経路スタックのポインタは配列番号1210bを指していることから、挿入ノードを挿入する位置として、配列番号1210bが読み出される。
図１６は、図７に示した処理のうち、後半の各ノードにデータを設定して挿入処理を完成させる処理フローを説明する図である。
【０１２６】
リーフノード組立・書込ブロックでは、ノード種別に１、インデックスキーに挿入キー"0011"を格納したリーフノードを組み立て、図１４に示したノード格納位置算出ブロックで算出した配列番号1211dの配列要素に格納する。
【０１２７】
次に、挿入位置のノード読出・書込ブロックにおいて、図１５に示した挿入ノード位置読出ブロックで読み出した配列番号のノード1210bを読み出し、その内容を図１４に示したノード格納位置算出ブロックで算出した配列番号1210dの配列要素に格納する。
【０１２８】
次に、ブランチノード組立・書込ブロックにおいて、ノード種別に０、弁別ビット位置に図１５に示した差分ビット位置検出ブロックで検出した差分ビット位置２を格納し、代表ノード番号には図１４に示した空ノード対取得ブロックで取得した代表ノード番号1201dを格納したブランチノードを組み立てる。そして組み立てたブランチノードを、図１５に示した挿入ノード位置読出ブロックで読み出した配列番号1210bの配列要素に書き込む。
【０１２９】
上記の処理により、図１２Ａに示したカップルドノードツリーに挿入キー"0011"が挿入され、図１２Ａに示したカップルドノードツリーが完成する。
以上本発明を実施するための最良の形態について詳細に説明したが、本発明の実施の形態はそれに限ることなく種々の変形が可能であることは当業者に明らかである。
【０１３０】
また、本発明のビット列検索装置が、カップルドノードツリーを格納する記憶手段と図４に示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。
【０１３１】
さらに、図８、図５〜図７に示したインデックス挿入処理とその均等物をコンピュータに実行させるプログラムにより、本発明のインデックス挿入方法が実現可能であり、図１０及び図１１に示した削除処理とその均等物をコンピュータに実行させるプログラムにより、本発明のインデックス挿入方法が実現可能であることも明らかである。そして、それらのプログラムにより、ブランチノードとリーフノードの識別手段、ブランチノードの弁別ビット位置に応じてリンク先のノード対のどちらかにリンクする手段等がコンピュータ上に実現される。
【０１３２】
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
【０１３３】
以上詳細に説明した、本発明が提供する全く新しいデータ構造であるカップルドノードツリーを用いることにより、より高速なビット列データの検索が可能となり、しかもビット列データの追加削除も容易に実行することができる。
【図面の簡単な説明】
【０１３４】
【図１】配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図２】カップルドノードツリーのツリー構造を説明する図である。
【図３】本発明を実施するためのハードウェア構成例を説明する図である。
【図４】本発明の一実施形態における検索処理を示すフローチャートである。
【図５】本発明の一実施形態における挿入処理の前段である検索処理の処理フローを示す図である。
【図６】本発明の一実施形態における挿入処理における挿入するノード対のための配列要素を準備する処理フローを説明する図である。
【図７】ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。
【図８】本発明の一実施の形態におけるルートノードの挿入処理を含むインデックスキーを追加する場合のノード挿入処理全体を説明する処理フロー図である。
【図９】本発明の一実施形態における削除処理の前段である検索処理の処理フローを示す図である。
【図１０】本発明の一実施形態における削除処理の後段の処理フローを説明する図である。
【図１１Ａ】削除処理前のカップルドノードツリーと削除キー"011010"を説明する図である。
【図１１Ｂ】削除処理後のカップルドノードツリーを説明する図である。
【図１２Ａ】挿入処理前のカップルドノードツリーと挿入キー"0011"を説明する図である。
【図１２Ｂ】挿入処理後のカップルドノードツリーを説明する図である。
【図１３】図５に示した挿入処理の前段である検索処理における処理ブロックのフローを説明する図である。
【図１４】図６に示した挿入するノード対のために配列要素を準備する処理ブロックのフローを説明する図である。
【図１５】図７に示した処理のうち、前半の挿入するノード対のカップルドノードツリー上の位置を求める処理フローを説明する図である。
【図１６】図７に示した処理のうち、後半の各ノードにデータを設定して挿入処理を完成させる処理フローを説明する図である。
【図１７】従来の検索で用いられるパトリシアツリーの一例を示す図である。
【符号の説明】
【０１３５】
10，20，30   配列番号
100          配列
101          ノード
102          ノード種別
103          弁別ビット位置
104          代表ノード番号
111          ノード対
112          ノード[0]、代表ノード
113          ノード[1]、代表ノードと対をなすノード
118          インデックスキー
301          データ処理装置
302          中央処理装置
303          キャッシュメモリ
304          バス
305          主記憶装置
306          外部記憶装置
307          通信装置
308          データ格納装置
309          配列
310          探索経路スタック
【図１】
2008015872.tif 000003
【図２】
2008015872.tif 000004
【図３】
2008015872.tif 000005
【図４】
2008015872.tif 000006
【図５】
2008015872.tif 000007
【図６】
2008015872.tif 000008
【図７】
2008015872.tif 000009
【図８】
2008015872.tif 000010
【図９】
2008015872.tif 000011
【図１０】
2008015872.tif 000012
【図１１Ａ】
2008015872.tif 000013
【図１１Ｂ】
2008015872.tif 000014
【図１２Ａ】
2008015872.tif 000015
【図１２Ｂ】
2008015872.tif 000016
【図１３】
2008015872.tif 000017
【図１４】
2008015872.tif 000018
【図１５】
2008015872.tif 000019
【図１６】
2008015872.tif 000020
【図１７】
2008015872.tif 000021