(57)【要約】【課題】カップルドノードツリーを用いて検索対象のビット列の集合から各種の応用的な検索手法であって簡便で高速な手法を提供する。【解決手段】ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対とからなり、ブランチノードは検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す情報を含み、リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを備え、カップルドノードツリーは配列に記憶され、位置情報は位置情報に対応するノードが格納された配列要素の配列番号であり、カップルドノードツリーの任意のノードを検索開始ノードしてノード対のうちの配列番号の小さい方のみをリンクしてリーフノードに至ることにより検索開始ノードをルートノードとする任意の部分木のインデックスキーの最小値を求める。【選択図】図６
2008112240.tif 000002
【特許請求の範囲】
【請求項１】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法において
前記カップルドノードツリーの任意のノードを検索開始ノードとして前記ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより、前記リーフノードに格納されたインデックスキーを前記検索開始ノードをルートノードとする前記カップルドノードツリーの任意の部分木の前記検索キーによる検索結果である検索結果キーとすることを特徴とするビット列検索方法。
【請求項２】
前記カップルドノードツリーは、配列に記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
前記検索開始ノードの格納された配列要素の配列番号及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列要素の配列番号は、順次スタックに保持されていくことを特徴とする請求項１記載のビット列検索方法。
【請求項３】
ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなるビット列検索に用いるツリーであって、
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが１つのときは前記リーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、
前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法において、
前記カップルドノードツリーの任意のノードを検索開始ノードとして前記ノード対のうち、該ノード対を構成する２つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることにより、前記検索開始ノードをルートノードとする任意の部分木のインデックスキーの最小値あるいは最大値を求めることを特徴とするビット列検索方法。
【請求項４】
前記カップルドノードツリーは、配列に記憶され、前記位置情報は、該位置情報に対応する前記代表ノードが格納された前記配列の配列要素の配列番号であり、
前記検索開始ノードの格納された配列要素の配列番号及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列要素の配列番号は、順次スタックに保持されていくことを特徴とする請求項３記載のビット列検索方法。
【請求項５】
請求項４記載のビット列検索方法により前記カップルドノードツリーのルートノードを前記検索開始ノードとして前記カップルドノードツリーのインデックスキーの最大値あるいは最小値を取得し、
前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素に格納されたノードを含むノード対の格納された配列要素の配列番号の大きい方となるまであるいは小さい方となるまで順次該スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法を順次行っていくことにより、前記カップルドノードツリーに格納されたインデックスキーを昇順あるいは降順に取り出すことを特徴とするビット列検索方法。
【請求項６】
請求項４記載のビット列検索方法により前記カップルドノードツリーのルートノードを前記検索開始ノードとして前記カップルドノードツリーのインデックスキーの最小値を取得し、
前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素に格納されたノードを含むノード対の格納された配列要素の配列番号の大きい方となるまであるいは小さい方となるまで前記スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法を行うことにより、該検索開始ノードをルートノードとする部分木のインデックスキーの最小値を取得し、
前記スタックのポップ動作から前記部分木のインデックスキーの最小値の取得に至る処理を繰り返すことにより、前記カップルドノードツリーに格納されたインデックスキーを昇順に取り出すことを特徴とするビット列検索方法。
【請求項７】
請求項４記載のビット列検索方法により前記カップルドノードツリーのルートノードを前記検索開始ノードとして前記カップルドノードツリーのインデックスキーの最大値を取得し、
前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素に格納されたノードを含むノード対の格納された配列要素の配列番号の大きい方となるまであるいは小さい方となるまで前記スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法を行うことにより、該検索開始ノードをルートノードとする部分木のインデックスキーの最大値を取得し、
前記スタックのポップ動作から前記部分木のインデックスキーの最大値の取得に至る処理を繰り返すことにより、前記カップルドノードツリーに格納されたインデックスキーを降順に取り出すことを特徴とするビット列検索方法。
【請求項８】
検索範囲の下限を指定する下限キーを取得し、
請求項４記載のビット列検索方法により前記カップルドノードツリーのルートノードを前記検索開始ノードとして前記カップルドノードツリーのインデックスキーの最小値を求め、
前記下限キーが前記インデックスキーの最小値より大きければ、前記下限キーを検索キーとするとともに前記カップルドノードツリーのルートノードを前記検索開始ノードとして請求項２記載のビット列検索方法により前記検索結果キーを取り出し、
前記検索キーが前記検索結果キーより大きければ、前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素に格納されたノードを含むノード対の格納された配列要素の配列番号の大きい方となるまであるいは小さい方となるまで前記スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法により前記検索開始ノードをルートノードとする部分木のインデックスキーの最小値を前記検索結果キーとし、
前記検索キーが前記検索結果キーより小さくなるまで、前記スタックのポップ動作から前記部分木のインデックスキーの最小値を求めて該インデックスキーの最小値を前記検索結果キーとするまでの処理を繰り返すことにより、
前記指定された下限キーに対する前記カップルドノードツリーの下限値を求めることを特徴とするビット列検索方法。
【請求項９】
検索範囲の上限を指定する上限キーを取得し、
請求項４記載のビット列検索方法により前記カップルドノードツリーのルートノードを前記検索開始ノードとして前記カップルドノードツリーのインデックスキーの最大値を求め、
前記上限キーが前記インデックスキーの最大値より小さければ、前記上限キーを検索キーとするとともに前記カップルドノードツリーのルートノードを前記検索開始ノードとして請求項２記載のビット列検索方法により前記検索結果キーを取り出し、
前記検索キーが前記検索結果キーより小さければ、前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素に格納されたノードを含むノード対の格納された配列番号の大きい方となるまであるいは小さい方となるまで前記スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法により前記検索開始ノードをルートノードとする部分木のインデックスキーの最大値を前記検索結果キーとし、
前記検索キーが前記検索結果キーより大きくなるまで、前記スタックのポップ動作から前記部分木のインデックスキーの最大値を求めて該インデックスキーの最大値を前記検索結果キーとするまでの処理を繰り返すことにより、
前記指定された上限キーに対する前記カップルドノードツリーの上限値を求めることを特徴とするビット列検索方法。
【請求項１０】
検索範囲の上限を指定する上限キー及び検索範囲の下限を指定する下限キーを取得し、
前記指定された上限キーに基づいて請求項９記載のビット列検索方法によりカップルドノードツリーの上限値を求めるとともに、前記指定された下限キーに基づいて請求項８記載のビット列検索方法により前記カップルドノードツリーの下限値を求め、
該下限値を検索キーとするとともに前記カップルドノードツリーのルートノードを前記検索開始ノードとして請求項２記載のビット列検索方法により前記検索結果キーを検索して前記下限値に相当するインデックスキーを取り出し、
前記上限値と前記取り出したインデックスキーが等しくなければ、前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素に格納されたノードを含むノード対の格納された配列番号の大きい方となるまであるいは小さい方となるまで前記スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法により該検索開始ノードをルートノードとする部分木のインデックスキーの最小値を取り出し、
前記インデックスキーの最小値と前記上限値が等しくなるまで、前記スタックのポップ動作から前記部分木のインデックスキーの最小値の取り出しに至る処理を繰り返すことにより、前記カップルドノードツリーに格納されたインデックスキーを指定された下限キーと上限キーの範囲で昇順に取り出すことを特徴とするビット列検索方法。
【請求項１１】
検索範囲の上限を指定する上限キー及び検索範囲の下限を指定する下限キーを取得し、
前記指定された上限キーに基づいて請求項９記載のビット列検索方法によりカップルドノードツリーの上限値を求めるとともに、前記指定された下限キーに基づいて請求項８記載のビット列検索方法により前記カップルドノードツリーの下限値を求め、
該上限値を検索キーとするとともに前記カップルドノードツリーのルートノードを前記検索開始ノードとして請求項２記載のビット列検索方法により前記検索結果キーを検索して前記上限値に相当するインデックスキーを取り出し、
前記下限値と前記取り出したインデックスキーが等しくなければ、前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
該配列番号が、該配列番号の配列要素の格納されたノードを含むノード対の格納された配列番号の大きい方となるまであるいは小さい方となるまで前記スタックのポップ動作を繰り返し、
前記ポップ動作の繰り返しにより読み出された前記大きい方あるいは小さい方の配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして請求項４記載のビット列検索方法により該検索開始ノードをルートノードとする部分木のインデックスキーの最大値を取り出し、
前記インデックスキーの最大値と前記下限値が等しくなるまで、前記スタックのポップ動作から前記部分木のインデックスキーの最大値の取り出しに至る処理を繰り返すことにより、前記カップルドノードツリーに格納されたインデックスキーを指定された上限キーと下限キーの範囲で降順に取り出すことを特徴とするビット列検索方法。
【請求項１２】
ビット列の前方一致検索を行うために指定された前方一致キーの無意ビットの値を０として下限キーを求めるとともに前記無意ビットの値を１として上限キーを求め、
該上限キーと下限キーに基づき、請求項１０又は請求項１１記載のビット列検索方法を行い、前記カップルドノードツリーに格納されたインデックスキーを取り出すことにより、前記前方一致キーによる前方一致検索を行うことを特徴とするビット列検索方法。
【請求項１３】
前記カップルドノードツリーのルートノードを前記検索開始ノードとして請求項４記載のビット列検索方法を行い、
前記スタックのポップ動作を行って該スタックから配列番号を読み出し、
前記ポップ動作により読み出された前記配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとして該検索開始ノードをルートノードとする請求項４記載のビット列検索方法を行うことにより、前記カップルドノードツリーのインデックスキーの検索を行う
ことを特徴とするビット列検索方法。
【請求項１４】
請求項１から１３いずれか１項記載のビット列検索方法をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はビット列の集合から所望のビット列を検索する検索装置に関するものであり、特にビット列を記憶するデータ構造に工夫をして、検索速度等の向上を図る技術分野のものである。
【背景技術】
【０００２】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【０００３】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
上記ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
【０００４】
図２４は、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
【０００５】
図２４の例では、インデックスキー“１０００１０”を保持するノード１７５０ａがルートノードとなっており、その検査ビット位置は０である。ノード１７５０ａの左リンク１７４０ａにはノード１７５０ｂが接続され、右リンク１７４１ａにはノード１７５０ｆが接続されている。
【０００６】
ノード１７５０ｂの保持するインデックスキーは“０１００１１”であり、検査ビット位置１７３０ｂは１である。ノード１７５０ｂの左リンク１７４０ｂにはノード１７５０ｃが、右リンク１７４１ｂにはノード１７５０ｄが接続されている。ノード１７５０ｃが保持するインデックスキーは“０００１１１”、検査ビット位置は３である。ノード１７５０ｄが保持するインデックスキーは“０１１０１０”、検査ビット位置は２である。
【０００７】
ノード１７５０ｃから実線で接続された部分はノード１７５０ｃの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ１７４０ｃは、その欄が空欄であることを示している。点線の接続された右ポインタ１７４１ｃの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード１７５０ｃを右ポインタが指定していることを表している。
【０００８】
ノード１７５０ｄの右ポインタ１７４１ｄはノード１７５０ｄ自身を指しており、左リンク１７４０ｄにはノード１７５０ｅが接続されている。１７５０ｅの保持するインデックスキーは“０１００１０”、検査ビット位置は５である。ノード１７５０ｅの左ポインタ１７４０ｅはノード１７５０ｂを、右ポインタ１７４１ｅはノード１７５０ｅを指している。
【０００９】
また、ノード１７５０ｆの保持するインデックスキーは“１０１０１１”であり、検査ビット位置１７３０ｆは２である。ノード１７５０ｆの左リンク１７４０ｆにはノード１７５０ｇが、右リンク１７４１ｆにはノード１７５０ｈが接続されている。
【００１０】
ノード１７５０ｇの保持するインデックスキーは“１０００１１”であり、検査ビット位置１７３０ｇは５である。ノード１７５０ｇの左ポインタ１７４０ｇはノード１７５０ａを、右ポインタ１７４１ｇはノード１７５０ｇを指している。
【００１１】
ノード１７５０ｈの保持するインデックスキーは“１０１１００”であり、検査ビット位置１７３０ｈは３である。ノード１７５０ｈの左ポインタ１７４０ｈはノード１７５０ｆを、右ポインタ１７４１ｈはノード１７５０ｈを指している。
【００１２】
図２４の例では、ルートノード１７５０ａからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が１であるか０であるか判定を行い、１であれば右リンクをたどり、０であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば（図２４において点線で示されたこの逆戻りのリンクをバックリンクという）、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
【００１３】
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は１回ですむことなどのメリットがあるが、各ノードからの２つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
【００１４】
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献１に開示された技術がある。下記特許文献１に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
【００１５】
しかしながら、下記特許文献１に開示されたものにおいても、１つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを１つとしたため、例えば図２４に示したパトリシアツリーの最下段の部分である左ポインタ１７４０ｃ、右ポインタ１７４１ｈ等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
【００１６】
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願２００６−１８７８２７において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであって、該ツリーのノードが１つのときはリーフノード、ツリーのノードが２つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。
【００１７】
上記出願においては、与えられたインデックスキーの集合からカップルドノードツリーを生成する方法と、カップルドノードツリーから単一のインデックスキーを検索する手法等の、カップルドノードツリーを用いた基本的な検索手法が示されている。
【００１８】
しかし、ビット列の検索には、最小値、最大値を求めたり、ある範囲の値のものを求める等の各種の検索要求が存在する。
【特許文献１】特開２００１−３５７０７０号公報
【発明の開示】
【発明が解決しようとする課題】
【００１９】
そこで本発明の目的は、必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスの容易なデータ構造であるカップルドノードツリーを用いて、検索対象のビット列の集合から最大値、最小値を求めたり、ある範囲の値のものを求めたりする等の応用的な検索手法であって簡便で高速な手法を提供することである。
【課題を解決するための手段】
【００２０】
まず、本発明の基礎的な態様として、上記出願において提案されたビット列検索を、検索開始ノードを指定することによりカップルドノードツリーの任意の部分木における検索に拡張したビット列検索方法が提供される。
【００２１】
本発明の一つの態様によれば、カップルドノードツリーの任意のノードを検索開始ノードとして前記ノード対のうち、該ノード対を構成する２つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることにより、検索開始ノードをルートノードとする任意の部分木のインデックスキーの最小値あるいは最大値を求める。
【００２２】
また、本発明の別の態様によれば、前記カップルドノードツリーは、配列に記憶され、前記位置情報は、該位置情報に対応するノードが格納された前記配列の配列要素の配列番号であり、前記検索開始ノードの格納された配列要素の配列番号及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列要素の配列番号は、順次スタックに保持される。そして、カップルドノードツリーのインデックスキーの最小値あるいは最大値を求めた後、スタックのポップ動作を実行して前記インデックスキーの最小値あるいは最大値の次に小さい値あるいは次に大きい値をとるインデックスキーを順次求めることにより、前記カップルドノードツリーに含まれるインデックスキーを昇順あるいは降順に出力する。
【００２３】
また、本発明の別の態様によれば、検索範囲の下限を指定するために入力された下限キーと前記インデックスキーの最小値との比較をし、前記下限キーが前記インデックスキーの最小値よりも大きい場合は、該下限キー以上の値をとるインデックスキーを、順次インデックスキーを前記昇順に取り出して該下限キーとの比較をする処理により求め、該下限キー以上の値をとるインデックスキーのうち最小のインデックスキーを前記検索範囲の下限値として設定する。あるいは、検索範囲の上限を指定するために入力された上限キーと前記インデックスキーの最大値との比較をし、前記上限キーが前記インデックスキーの最大値と等しい場合は、該インデックスキーの最大値を前記検索範囲の上限値として設定し、前記上限キーが前記インデックスキーの最大値よりも小さい場合は、該上限キー以下の値をとるインデックスキーを、順次インデックスキーを前記降順に取り出して該上限キーとの比較をする処理により求め、該上限キー以下の値をとるインデックスキーのうち最大のインデックスキーを前記検索範囲の上限値として設定する。
【００２４】
また、本発明の別の態様によれば、前記上限値から下限値までの検索範囲内のインデックスキーについて、上記昇順あるいは降順で取り出す処理を実行する。
また、本発明の別の態様によれば、前方から指定された数のビット以降については０を設定したビット列を、前記下限値を設定するために入力された下限キーとし、前方から前記指定された数のビット以降については１を設定したビット列を、前記上限値を設定するために入力された上限キーとして検索範囲を決定し、該検索範囲について昇順あるいは降順でインデックスキーを取り出すことにより、前方から前記指定された数のビットについて一致するビット列からなるインデックスキーを出力する前方一致検索を提供する。
【発明の効果】
【００２５】
本発明によれば、カップルドノードツリーを用いることにより、任意のビット列の集合から、最大値／最小値、昇順／降順でのインデックスキーの取り出し及び検索範囲の下限値／上限値の設定を、簡便で高速な手法で求めることができ、更には、これらの手法を組み合わせて、検索範囲を設定してから昇順降順でのインデックスキーの取り出し処理や、検索キーと一部一致するインデックスキーの取り出し処理を高速に実行することが可能となる。
【発明を実施するための最良の形態】
【００２６】
最初に、本出願人により先の上記出願において提案された、本発明の前提となるカップルドノードツリーについて、カップルドノードツリーを配列に格納する例を説明する。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
【００２７】
図１は、配列に格納されたカップルドノードツリーの構成例を説明する図である。
図１を参照すると、ノード１０１が配列１００の配列番号１０の配列要素に配置されている。ノード１０１はノード種別１０２、弁別ビット位置１０３及び代表ノード番号１０４で構成されている。ノード種別１０２は０であり、ノード１０１がブランチノードであることを示している。弁別ビット位置１０３には１が格納されている。代表ノード番号１０４にはリンク先のノード対の代表ノードの配列番号２０が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
【００２８】
配列番号２０の配列要素には、ノード対１１１の代表ノードであるノード［０］１１２が格納されている。そして隣接する次の配列要素（配列番号２０＋１）に代表ノードと対になるノード［１］１１３が格納されている。ノード［０］１１２のノード種別１１４には０が、弁別ビット位置１１５には３が、代表ノード番号１１６には３０が格納されている。またノード［１］１１３のノード種別１１７には１が格納されており、ノード［１］１１３がリーフノードであることを示している。インデックスキー１１８には、“０００１”が格納されている。パトリシアツリーについて先に述べたと同様に、リーフノードにインデックスキーと対応するレコードにアクセスする情報が含まれることは当然であるが、表記は省略している。
【００２９】
なお、代表ノードをノード［０］で表し、それと対になるノードをノード［１］で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
【００３０】
配列番号３０及び３１の配列要素に格納されたノード１２２とノード１２３からなるノード対１２１の内容は省略されている。
ノード［０］１１２、ノード［１］１１３、ノード１２２、及びノード１２３の格納された配列要素にそれぞれ付された０あるいは１は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である０か１を代表ノード番号に加えた配列番号のノードにリンクする。
【００３１】
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
【００３２】
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図２は、カップルドノードツリーのツリー構造を概念的に示す図である。図示の６ビットのインデックスキーは、図２４に例示されたパトリシアツリーのものと同じである。
【００３３】
符号２１０ａで示すのがルートノードである。図示の例では、ルートノード２１０ａは配列番号２２０に配置されたノード対２０１ａの代表ノードとしている。
ツリー構造としては、ルートノード２１０ａの下にノート対２０１ｂが、その下層にノード対２０１ｃとノード対２０１ｆが配置され、ノード対２０１ｆの下層にはノード対２０１ｈとノード対２０１ｇが配置されている。ノード対２０１ｃの下にはノード対２０１ｄが、さらにその下にはノード対２０１ｅが配置されている。
【００３４】
各ノードの前に付された０あるいは１の符号は、図１において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
【００３５】
図示された例では、ルートノード２１０ａのノード種別２６０ａは０でブランチノードであることを示し、弁別ビット位置２３０ａは０を示している。代表ノード番号は２２０ａであり、それはノード対２０１ｂの代表ノード２１０ｂの格納された配列要素の配列番号である。
【００３６】
ノード対２０１ｂはノード２１０ｂと２１１ｂで構成され、それらのノード種別２６０ｂ、２６１ｂはともに０であり、ブランチノードであることを示している。ノード２１０ｂの弁別ビット位置２３０ｂには１が格納され、リンク先の代表ノード番号にはノード対２０１ｃの代表ノード２１０ｃの格納された配列要素の配列番号２２０ｂが格納されている。
【００３７】
ノード２１０ｃのノード種別２６０ｃには１が格納されているので、このノードはリーフノードであり、したがって、インデックスキーを含んでいる。インデックスキー２５０ｃには“０００１１１”が格納されている。一方ノード２１１ｃのノード種別２６１ｃは０、弁別ビット位置２３１ｃは２であり、代表ノード番号にはノード対２０１ｄの代表ノード２１０ｄの格納された配列要素の配列番号２２１ｃが格納されている。
【００３８】
ノード２１０ｄのノード種別２６０ｄは０、弁別ビット位置２３０ｄは５であり、代表ノード番号にはノード対２０１ｅの代表ノード２１０ｅの格納された配列要素の配列番号２２０ｄが格納されている。ノード２１０ｄと対になるノード２１１ｄのノード種別２６１ｄは１であり、インデックスキー２５１ｄには“０１１０１０”が格納されている。
【００３９】
ノード対２０１ｅのノード２１０ｅ、２１１ｅのノード種別２６０ｅ、２６１ｅはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー２５０ｅ、２５１ｅにはインデックスキーとして“０１００１０”と“０１００１１”が格納されている。
【００４０】
ノード対２０１ｂのもう一方のノードであるノード２１１ｂの弁別ビット位置２３１ｂには２が格納され、リンク先の代表ノード番号にはノード対２０１ｆの代表ノード２１０ｆの格納された配列要素の配列番号２２１ｂが格納されている。
【００４１】
ノード対２０１ｆのノード２１０ｆ、２１１ｆのノード種別２６０ｆ、２６１ｆはともに０であり双方ともブランチノードである。それぞれの弁別ビット位置２３０ｆ、２３１ｆには５、３が格納されている。ノード２１０ｆの代表ノード番号にはノード対２０１ｇの代表ノード２１０ｇの格納された配列要素の配列番号２２０ｆが格納され、ノード２１１ｆの代表ノード番号にはノード対２０１ｈの代表ノードであるノード［０］２１０ｈの格納された配列要素の配列番号２２１ｆが格納されている。
【００４２】
ノード対２０１ｇのノード２１０ｇ、２１１ｇのノード種別２６０ｇ、２６１ｇはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー２５０ｇ、２５１ｇには“１０００１０”と“１０００１１”が格納されている。
【００４３】
また同じくノード対２０１ｈの代表ノードであるノード［０］２１０ｈとそれと対をなすノード［１］２１１ｈのノード種別２６０ｈ、２６１ｈはともに１であり双方ともリーフノードであることを示し、それぞれのインデックスキー２５０ｈ、２５１ｈには“１０１０１１”と“１０１１００“が格納されている。
【００４４】
以下、上述のツリーからインデックスキー“１０００１０”を検索する処理の流れを簡単に説明する。弁別ビット位置は、左から０、１、２、・・・とする。
まず、ビット列“１０００１０”を検索キーとしてルートノード２１０ａから処理をスタートする。ルートノード２１０ａの弁別ビット位置２３０ａは０であるので、検索キー“１０００１０”の弁別ビット位置が０のビット値をみると１である。そこで代表ノード番号の格納された配列番号２２０ａに１を加えた配列番号の配列要素に格納されたノード２１１ｂにリンクする。ノード２１１ｂの弁別ビット位置２３１ｂには２が格納されているので、検索キー“１０００１０”の弁別ビット位置が２のビット値をみると０であるから、代表ノード番号の格納された配列番号２２１ｂの配列要素に格納されたノード２１０ｆにリンクする。
【００４５】
ノード２１０ｆの弁別ビット位置２３０ｆには５が格納されているので、検索キー“１０００１０”の弁別ビット位置が５のビット値をみると０であるから、代表ノード番号の格納された配列番号２２０ｆの配列要素に格納されたノード２１０ｇにリンクする。
【００４６】
ノード２１０ｇのノード種別２６０ｇは１でありリーフノードであることを示しているので、インデックスキー２５０ｇを読み出して検索キーと比較すると両方とも“１０００１０”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
【００４７】
次に、図２を参照してカップルドノードツリーの構成の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図２の例で、ルートノード２１０ａの弁別ビット位置が０であるのは、図２に例示されたインデックスキーに０ビット目が０のものと１のものがあるからである。０ビット目が０のインデックスキーのグループはノード２１０ｂの下に分類され、０ビット目が１のインデックスキーのグループはノード２１１ｂの下に分類されている。
【００４８】
ノード２１１ｂの弁別ビット位置が２であるのは、ノード２１１ｈ、２１０ｈ、２１１ｇ、２１０ｇに格納された０ビット目が１のインデックスキーの１ビット目がすべて０で等しく、２ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
【００４９】
以下０ビット目の場合と同様に、２ビット目が１であるものはノード２１１ｆ側に分類され、２ビット目が０であるものはノード２１０ｆ側に分類される。
そして２ビット目が１であるインデックスキーは３ビット目の異なるものがあるのでノード２１１ｆの弁別ビット位置には３が格納され、２ビット目が０であるインデックスキーでは３ビット目も４ビット目も等しく５ビット目で異なるのでノード２１０ｆの弁別ビット位置には５が格納される。
【００５０】
ノード２１１ｆのリンク先においては、３ビット目が１のものと０のものがそれぞれ１つしかないことから、ノード２１０ｈ、２１１ｈはリーフノードとなり、それぞれインデックスキー２５０ｈと２５１ｈに“１０１０１１”と“１０１１００”が格納されている。
【００５１】
仮にインデックスキーの集合に“１０１１００”の代わりに“１０１１０１”か“１０１１１０”が含まれていたとしても、３ビット目までは“１０１１００”と等しいので、ノード２１１ｈに格納されるインデックスキーが変わるだけで、ツリー構造自体は変わることはない。しかし、“１０１１００”に加えて“１０１１０１”が含まれていると、ノード２１１ｈはブランチノードとなり、その弁別ビット位置は５になる。追加されるインデックスキーが“１０１１１０”であれば、弁別ビット位置は４となる。
【００５２】
以上説明したように、カップルドノードツリーの構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
そしてさらにいえば、異なるビット値となるビット位置ごとにビット値が“１”のノードとビット値が“０”のノードとに分岐していることから、ノード［１］側とツリーの深さ方向を優先させてリーフノードをたどると、それらに格納されたインデックスキーは、ノード２１１ｈのインデックスキー２５１ｈの“１０１１００”、ノード２１０ｈのインデックスキー２５０ｈの“１０１０１１”、・・・、ノード２１０ｃのインデックスキー２５０ｃの“０００１１１”となり降順にソートされている。
【００５３】
すなわち、カップルドノードツリーにおいては、インデックスキーはソートされてツリー上に配置されている。
検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが“１０１１００”であればノード２１１ｈに到達することができる。また、上記説明からも想像がつくように、“１０１１０１”か“１０１１１０”を検索キーとした場合でもノード２１１ｈにたどり着き、インデックスキー２５１ｈと比較することにより検索が失敗したことが分かる。
【００５４】
また、例えば“１００１００”で検索した場合でも、ノード２１０ａ、２１１ｂ、２１０ｆのリンク経路では検索キーの３ビット目と４ビット目は使われることがなく、“１００１００”の５ビット目が０なので、“１０００１０”で検索した場合と同様にノード２１０ｇに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
【００５５】
図３は、本発明を実施するためのハードウェア構成例を説明する図である。
本発明の検索装置による検索処理及びデータメンテナンスは中央処理装置３０２及びキャッシュメモリ３０３を少なくとも備えたデータ処理装置３０１によりデータ格納装置３０８を用いて実施される。カップルドノードツリーが配置される配列３０９と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック３１０を有するデータ格納装置３０８は、主記憶装置３０５または外部記憶装置３０６で実現することができ、あるいは通信装置３０７を介して接続された遠方に配置された装置を用いることも可能である。
【００５６】
図３の例示では、主記憶装置３０５、外部記憶装置３０６及び通信装置３０７が一本のバス３０４によりデータ処理装置３０１に接続されているが、接続方法はこれに限るものではない。また、主記憶装置３０５をデータ処理装置３０１内のものとすることもできるし、探索経路スタック３１０を中央処理装置３０２内のハードウェアとして実現することも可能である。あるいは、配列３０９は外部記憶装置３０６に、探索経路スタック３１０を主記憶装置３０５に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
【００５７】
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
以下、上記のカップルドノードツリーに格納されたインデックスキーを検索するための各種動作について、図面を用いて具体的に説明する。
【００５８】
図４は、本実施形態に係るビット列検索の基本動作を示したフローチャートである。
まず、ステップＳ４０１で、検索開始ノードの配列番号を取得する。取得された配列番号に対応する配列は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、後に説明する各種応用検索において行われる。
【００５９】
次に、ステップＳ４０２で、探索経路スタック３１０に取得された配列番号を格納し、ステップＳ４０３で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップＳ４０４で、読み出したノードから、ノード種別を取り出し、ステップＳ４０５で、ノード種別がブランチノードであるか否かを判定する。
【００６０】
ステップＳ４０５の判定において、読み出したノードがブランチノードである場合は、ステップＳ４０６に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップＳ４０７で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップＳ４０８で、ノードから代表ノード番号を取り出して、ステップＳ４０９で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップＳ４０２に戻る。
【００６１】
以降、ステップＳ４０５の判定においてリーフノードと判定されてステップＳ４１０に進むまで、ステップＳ４０２からステップＳ４０９までの処理を繰り返す。ステップＳ４１０で、リーフノードからインデックスキーを取り出して、処理を終了する。
【００６２】
なお、図４に示す処理は、本出願人により上記先の出願において提案されたカップルドノードツリーよる検索処理とは、検索開始ノードがルートノードに限らず、カップルドノードツリー上の任意のノードとしている点と、検索結果のノードに格納されたインデックスキーと検索キーの比較による検索の成功失敗を判定することなく、検索結果のノードからインデックスキーを取り出す点とで異なる。
【００６３】
上記第１の相違点の理由は、本発明の提供する応用検索において、後に説明するとおり、カップルドノードツリーの部分木を検索する場合があるからであり、第２の相違点の理由は、同じく本発明の提供する応用検索例である最小値検索や範囲検索等はツリーから単一の検索キーを探索するものとは異なるからである。
【００６４】
図５は、図４のフローチャートにより示した本実施形態に係るビット列検索の基本動作を、図２に例示したカップルドノードツリーにより説明する図である。図５においては、カップルドノードツリー、検索キー設定エリア２７０及び探索経路スタック３１０を示す。以下に図５を用いてカップルドノードツリー上の参照されるノード及び探索経路スタックの状態について説明する。
【００６５】
なお、図５においては、図２に示すカップルドノードツリーのうち、図４の処理を説明するために必要な一部分のみを示し、残りのノード（代表ノード番号２２１ｂ以下のノード）については省略している。以降の説明においてカップルドノードツリー上の参照されるノードを説明するための図面についても同様である。
【００６６】
まず、検索を開始するノードの配列番号として、配列番号２２０が設定されたとする。このとき、対応する配列番号２２０が探索経路スタック３１０にプッシュされると共に、配列要素の各種情報が参照される。
【００６７】
配列に格納された情報に基づいて、配列番号２２０のノードがブランチノードであってインデックスキーが格納されていないと認識されると、更にその配列番号２２０の配列に格納されている情報（代表ノード番号や弁別ビット位置）等を参照して、次に参照すべき配列番号が算出される。ここでは、まず配列番号２２０を探索経路スタック３１０に格納するとともに、配列番号２２０のノード２１０ａからノード種別を取り出す。取り出したノード種別はブランチノードであるため、更にノード２１０ａから弁別ビット位置「０」を取り出し、更に検索キー設定エリア２７０の検索キー“０１１０１０”における弁別ビット位置のビット値「０」を取り出す。そして、ノード２１０ａに格納されている代表ノード番号「２２０ａ」を取り出して、先に検索キーの弁別ビット位置から取り出したビット値を加算して得られた値「２２０ａ」を探索経路スタック３１０に格納する。
【００６８】
続いて、配列番号２２０ａのノードからノード種別を読み出すと、配列番号２２０ａのノード２１０ｂはブランチノードであるため、ノード弁別ビット位置「１」に対応するビット値を検索キー“０１１０１０”から取り出すと、値は「１」である。そこで、ノード２１０ｂの代表ノード番号「２２０ｂ」に得られたビット値「１」を加算して、探索経路スタック３１０に「２２０ｂ＋１」を格納する。
【００６９】
配列番号（２２０ｂ＋１）のノード２１１ｃから読み出したノード種別はブランチノードであるため、更にノード弁別ビット位置「２」に対応するビット値を検索キー“０１１０１０”から取り出すと、値は「１」である。ノード２１１ｃの代表ノード番号「２２１ｃ」に得られたビット値「１」を加算して得られる値「２２１ｃ＋１」を、探索経路スタック３１０に格納する。
【００７０】
配列番号（２２１ｃ＋１）のノード２１１ｄからノード種別を取り出すと、ノード２１１ｄはリーフノードである。そこで、ノード２１１ｄからインデックスキー“０１１０１０”を取り出し、処理を終了する。
【００７１】
このように、順次各ノードの情報を参照していくリンク処理を実行することにより、探索経路スタック３１０には、検索開始ノードであるノード２１０ａの配列番号「２２０」からリーフノード２１１ｄの配列番号「２２１ｃ＋１」までが、リンク順にプッシュされていくことになる。
【００７２】
以上、本発明による応用検索の基礎となるカップルドノードツリーについてとビット列検索の基本動作について詳細に説明した。カップルドノードツリーの生成処理については、特に図示はしていないが、本出願人による上記先の出願において説明したように、ビット列の集合があるとき、そこから任意のビット列を順次取り出してインデックスキーとして挿入する処理を繰り返すことにより可能である。
【００７３】
先に述べたように、カップルドノードツリーに格納されたインデックスキーの値は、ノード［１］側とツリーの深さ方向をたどることにより降順にソートされてツリー上に配置されていることから、インデックスキーの挿入処理は、挿入するインデックスキーを検索キーとしてカップルドノードツリーから該当するリーフノードを検索するとともに、該リーフノードに至るまでたどったリンク経路のブランチノード及び該リーフノードが格納された配列要素の配列番号をスタックに順次格納し、検索キーと該当するリーフノードに含まれるインデックスキーの間で大小比較とビット列比較を行い、ビット列比較で異なるビット値となる先頭のビット位置と上記スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係により挿入されるインデックスキーを含むリーフノードともう一方のノードからなるノード対の挿入位置を決定し、上記大小関係により挿入するインデックスキーを含むリーフノードを上記挿入されるノード対のどちらのノードとするかを決定することにより実施することができる。
【００７４】
次に、本発明による各種応用的検索処理について説明をする。
図６は、カップルドノードツリー（部分木を含む）に格納されたインデックスキーの最小値を求める処理を示したフローチャートである。先に述べたようなインデックスキーのツリー上の配置から、インデックスキーの最小値を求める処理は検索開始ノードからノード［０］をリーフノードに至るまでツリー上でたどることに相当する。
【００７５】
まず、ステップＳ５０１の検索開始ノードの配列番号の取得からステップＳ５０５のノード種別の判定までは、それぞれ上述の図４のステップＳ４０１からステップＳ４０５の処理と同様である。
【００７６】
ステップＳ５０５のノード種別の判定においてノード種別がブランチノードと判定されると、ステップＳ５０６に進み、ノードから配列の代表ノード番号を取り出し、ステップＳ５０７で、取り出した代表ノード番号に値「０」を加算してその結果を新たな配列番号とし、ステップＳ５０２に戻る。以降、ステップＳ５０５においてそのノードがリーフノードと判定されるまでステップＳ５０２からステップＳ５０７までの処理を繰り返し、ステップＳ５０８で、リーフノードからインデックスキーを取り出し、処理を終了する。
【００７７】
上記の図６に示す処理においては、ノード［０］をたどるため、代表ノード番号に一律「０」を加算している。すなわち、図６の処理によれば、リンク先のノードは、ノード対のうち必ずノード［０］とし、より小さい値のインデックスキーが格納されているノードのほうに分岐している。これにより、ツリー構造が先に述べたように順列構成であるカップルドノードツリーの最小のインデックスキーを取り出すことができる。
【００７８】
図７は、図６のフローチャートにより示したインデックスキーの最小値を求める処理を、図２に例示したカップルドノードツリーにより説明する図である。図７は、配列番号２２０のノード２１０ａを検索開始ノードとする場合に読み出される配列番号及び探索経路スタック３１０の状態を示す。
【００７９】
検索開始ノードであるノード２１０ａから順次、代表ノード番号により表されるノード対のうちノード種別１０２として「０」が設定されているノード（ノード［０］）にリンクしていく。リンク先の配列番号２２０、２２０ａ及び２２０ｂが探索経路スタック３１０にプッシュされていき、配列番号２２０ｂのリーフノードのインデックスキー“０００１１１”を取り出すと、処理を終了する。
【００８０】
探索経路スタック３１０には、ノード対のうち、ノード［０］の配列番号が順次プッシュされていく。このとき、配列の配列要素（ノード種別）のみを参照することによりリンク処理及び探索経路スタック３１０へのプッシュ動作が行われる。
【００８１】
図８は、カップルドノードツリー（部分木を含む）に格納されたインデックスキーの最大値を求める処理を示したフローチャートである。図９は、図２に例示したカップルドノードツリーを用いた同処理についての説明図である。インデックスキーの最大値を求める処理は、ツリー上のノードのうちノード［１］について、リーフノードに至るまで順次たどっていくことに相当する。以下、最大のインデックスキーを求める処理について、上記最小のインデックスキーを求める処理と比較しながら、異なる点を中心に説明する。
【００８２】
図８に示す一連の処理のうち、ステップＳ６０１からステップＳ６０６及びステップＳ６０８については、図６のステップ５０１からステップＳ５０６及びステップＳ５０８にそれぞれ対応しており、同様の処理が実行される。図６の最小値を求める処理と異なる点は、ステップＳ６０７において、代表ノード番号に、値「１」を加算する点である。これにより、代表ノード番号が表すノード対のうち、ノード［１］に常にリンクすることとなり、リーフノードに至るまで順次ステップＳ６０２からステップＳ６０７の処理を繰り返すことにより、インデックスキーの最大値を得ることができる。
【００８３】
図９は、図８のフローチャートにより示したインデックスキーの最大値を求める処理を、図２に例示したカップルドノードツリーにより説明する図である。図９に示すように、カップルドノードツリーのリンク処理は、検索開始ノードを図７の例と同様に配列番号２２０のノード２１０ａとすると、ノード対のうち常にノード［１］にリンクしていき、探索経路スタック３１０には、リンク先の配列番号２２０、（２２０ａ＋１）、（２２１ｂ＋１）及び（２２１ｆ＋１）がプッシュされていく。
【００８４】
図４から図９に示すように、検索キーと一致するインデックスキーを検索する基本動作やインデックスキーの最小値／最大値の検索処理を実行する際には、探索経路スタック３１０に参照した配列の配列番号が順次格納されていく。
【００８５】
なお、上述の図６から図９を参照したインデックスキーの最小値／最大値の検索処理では、カップルドノードツリーは配列に記憶されたものとして説明したが、カップルドノードツリーが配列に記憶されることは必須ではなく、ノード対を構成する２つのノードのうちの代表ノードのみあるいは代表ノードと隣接した記憶領域に配置されたノードのみをリンクしてリーフノードに至ることによりインデックスキーの最小値／最大値の検索が可能であることは明らかである。
【００８６】
次に、上記インデックスキーの最小値／最大値を求める検索処理及び探索経路スタック３１０の情報を用いた応用検索について説明する。
図１０は、カップルドノードツリーに格納されたインデックスキーを昇順に取り出す処理を示したフローチャートである。インデックスキーを昇順に取り出す処理は、ノード対をなすノードのうちノード［０］側及びツリーの深さを優先させてノードから順次リーフノードをたどり、各リーフノードからインデックスキーを取り出していくことに相当する。
【００８７】
まず、ステップＳ７０１で、検索開始ノードの配列番号にルートノードの配列番号を設定し、ステップＳ７０２で、上記図６及び図７を参照して説明した最小のインデックスキーを求める処理を実行して、カップルドノードツリーに含まれるインデックスキーの中で最小のインデックスキーを取得する。そして、ステップＳ７０３で、取得したインデックスキーを取り出し、ステップＳ７０４に進む。
【００８８】
ステップＳ７０４で、探索経路スタック３１０を参照し、スタックポインタがルートノードの配列番号を指しているか否かを判定する。ポインタが指す配列番号がルートノード以外である場合は、ステップＳ７０５に進む。そして、ステップＳ７０５で、探索経路スタック３１０からポインタの指す配列番号を取り出してから、ポインタを１減らす。上記ステップＳ７０４で探索経路スタック３１０を参照すること、及びステップＳ７０５で探索経路スタック３１０からポインタの指す配列番号を取り出してからポインタを１減らすことは、スタックのポップ動作により実行される。以下の各実施態様におけるスタックからの配列番号の読み出しにおいても同様である。
【００８９】
ステップＳ７０６で、ステップＳ７０５で取り出した配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置を得る。例えばノード［０］については偶数番号の配列の配列要素に格納する等により、配列番号からノード位置を求めることができる。そして、ステップＳ７０７で、ステップＳ７０６で得たノード位置がノード［１］側であるか否かを判定する。ステップＳ７０７においてノード［１］側と判定された場合は、ステップＳ７０４に戻り、ポインタの指す配列番号のノードがノード［０］あるいはルートノードとなるまで、ステップＳ７０４からステップＳ７０７までの処理を繰り返す。
【００９０】
ステップＳ７０７においてノード［０］側と判定されると、ステップＳ７０８に進み、配列番号に１を加算し、そのノードと対をなすノード［１］の配列番号を得る。そして、ステップＳ７０９で、検索開始ノードにステップＳ７０８で得たノード［１］の配列番号を設定し、ステップＳ７１０で、検索開始ノードをルートノードとする部分木の最小のインデックスキーを求める処理を実行する。ステップＳ７１０の処理は、ステップＳ７０２と同様であり、図６に示す最小値検索処理が用いられる。
【００９１】
ステップＳ７１０で最小のインデックスキーを求めると、ステップＳ７０３に戻り、求めたインデックスキーを取り出し、以降ステップＳ７０４においてポインタがルートノードの配列番号を指していると判定されるまで、同様の処理を繰り返す。
【００９２】
このように、探索経路スタック３１０のポインタが指す配列番号を参照し、探索経路スタック３１０に格納されている配列番号のノード［０］と対をなすノード［１］について、そのノードを検索開始ノードとしてそのノード配下で最小のインデックスキーを求める。ステップＳ７０２で最小値が求められた段階においては、探索経路スタック３１０のポインタは、カップルドノードツリーの最小のインデックスキーを含むノードの配列番号を指している。続いて探索経路スタック３１０のポップ動作を行い、取り出した配列番号のノードのうちノード［１］を検索開始ノードとして該検索開始ノードをルートノードとする部分木のインデックスキーの最小値を求める処理を行い、探索経路スタック３１０のポップ動作の結果カップルドノードツリーのルートノードの配列番号が取り出されるまでポップ動作と最小値検索処理を繰り返す。
【００９３】
探索経路スタック３１０には、先にステップＳ７０２においてルートノード配下のノードについて最小値を求める処理を行っていることにより、リンク経路についての配列番号が順次格納されている。このため、探索経路スタック３１０のポインタを１減らして新たにポインタが指す配列番号のノードのうち、ノード［０］について、そのノードと対をなすノード［１］を求め、ノード［１］のノード配下について順次最小値検索の処理を行っていくと、インデックスキーは昇順に取り出されることとなる。
【００９４】
図１１は、図１０のフローチャートにより示したインデックスキーを昇順に取り出す処理について説明する図である。図１１において、インデックスキーを昇順に取り出す処理を実行する各段階における探索経路スタック３１０の状態及び取り出されるインデックスキーを示し、図中の探索経路スタック３１０に格納されている配列番号は、図２に示すカップルドノードツリーと対応付けられている。図１１を参照して、図２に示すカップルドノードツリーについてインデックスキーを昇順に取り出す場合における探索経路スタック３１０に格納される配列番号について説明する。
【００９５】
まず、ルートノードから検索を開始して、最小値検索を行い、カップルドノードツリーのノード対のノード［０］をたどっていくと、配列番号２２０ｂにたどり着く。このとき、探索経路スタック３１０には、ルートノード２１０ａの配列番号２２０から順に、２２０ａ、２２０ｂが格納されている。
【００９６】
図１１（ａ）は、配列番号２２０を検索開始ノードとして最小値検索処理まで実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２０ｂの指すノードはリーフノードであるため、このノードのインデックスキー “０００１１１”が取り出される。そして、配列番号２２０ｂはノード［０］を指しているので、このノード［０］と対をなすノード［１］の配列番号（２２０ｂ＋１）を、次の検索開始ノードの配列番号とする。
【００９７】
図１１（ｂ）は、配列番号（２２０ｂ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２０ｄの指すノードはリーフノードであるため、このインデックスキー“０１００１０”が取り出される。そして、配列番号２２０ｄはノード［０］を指しているので、このノード［０］と対をなすノードの配列番号（２２０ｄ＋１）を、次の検索開始ノードの配列番号とする。
【００９８】
図１１（ｃ）は、配列番号（２２０ｄ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２０ｄ＋１）の指すノードはリーフノードであるため、このノードのインデックスキー“０１００１１”が取り出される。次に、配列番号（２２０ｄ＋１）はノード［１］を指しているので、ノード［０］の配列番号が求まるまでポップ動作及び配列番号の取り出しを繰り返す。そして、ノード［０］を指す配列番号２２１ｃが求まると、このノード［０］と対をなすノード［１］の配列番号（２２１ｃ＋１）を次の検索開始ノードの配列番号とする。
【００９９】
図１１（ｄ）は、配列番号（２２１ｃ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０の状態及び取り出されるインデックスキーを示す。ここでは、配列番号（２２１ｃ＋１）のノードはリーフノードであるため、このノードのインデックスキー“０１１０１０”が取り出される。次に、配列番号（２２１ｃ＋１）はノード［１］を指しているので、ノード［０］の配列番号が求まるまで、探索経路スタック３１０のポップ動作及び配列番号の取り出しを繰り返す。そして、ノード［０］を指す配列番号２２１ａが求まると、このノード［０］と対をなすノード［１］の配列番号（２２１ａ＋１）を次の検索開始ノードの配列番号とする。
【０１００】
図１１（ｅ）は、配列番号（２２０ａ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２１ｆの指すノードはリーフノードであるため、このノードのインデックスキー“１０００１０”が取り出される。そして、配列番号２２０ｆはノード［０］を指しているので、このノード［０］と対をなすノード［１］の配列番号（２２０ｆ＋１）を、次の検索開始ノードの配列番号とする。
【０１０１】
図１１（ｆ）は、配列番号（２２０ｆ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２０ｆ＋１）の指すノードはリーフノードであるため、このノードのインデックスキー“１０００１１”が取り出される。次に、配列番号（２２０ｆ＋１）はノード［１］を指しているので、ノード［０］の配列番号が求まるまで、探索経路スタック３１０のポップ動作及び配列番号の取り出しを繰り返す。そして、ノード［０］を指す配列番号２２１ｂが求まると、このノード［０］と対をなすノード［１］の配列番号（２２１ｂ＋１）を次の検索開始ノードの配列番号とする。
【０１０２】
図１１（ｇ）は、配列番号（２２１ｂ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２１ｆの指すノードはリーフノードであるため、このノードのインデックスキー“１０１０１１”が取り出される。そして、配列番号２２１ｆはノード［０］を指しているので、このノード［０］と対をなすノード［１］の配列番号（２２１ｆ＋１）を、次の検索開始ノードの配列番号とする。
【０１０３】
図１１（ｈ）は、配列番号（２２１ｆ＋１）を検索開始ノードの配列番号として最小値検索を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２１ｆ＋１）の指すノードはリーフノードであるため、このノードのインデックスキー“１０１１００”が取り出される。以降、順に探索経路スタック３１０のポップ動作及び配列番号の取り出しを繰り返し、配列番号がルートノードを指していると判断すると、処理を終了する。
【０１０４】
図１２は、カップルドノードツリーに格納されたインデックスキーを降順に取り出す処理を示したフローチャートである。インデックスキーを降順に取り出す処理は、ノード対をなすノードのうちノード［１］及びツリーの深さを優先させてルートノードから順次リーフノードをたどっていくことに相当する。ここでは、図１０のインデックスキーを昇順に取り出す処理と比較して、異なる点を中心に説明する。
【０１０５】
上記のインデックスキーを昇順に取り出す処理においては、図１０のステップＳ７０２及びステップＳ７１０においてポインタが指す配列番号のノード配下の最小値をとるインデックスキーを求めていたのに対し、図１２のステップＳ８０２及びステップＳ８１０において求めるのは、ポインタが指す配列番号のノード配下の最大値をとるインデックスキーである。
【０１０６】
また、図１０においてはステップＳ７０３で所望のインデックスキーを取り出した後、探索経路スタック３１０に格納されている配列番号のうち、ノード［０］の配列番号を求め、そのノードと対をなすノード［１］を検索開始ノードとして設定して、最小値検索処理を行っている。これに対して、図１２の降順取り出し処理においては、ステップＳ８０３において所望のインデックスキーを取り出した後、探索経路スタック３１０に格納されている配列番号のうち、ノード［１］の配列番号を求め、そのノードと対をなすノード［０］を検索開始ノードとして設定して、最大値検索処理を行っている。
【０１０７】
図１３は、図１２のフローチャートにより示したインデックスキーを降順に取り出す処理について説明する図である。図１３において、インデックスキーを降順に取り出す処理を実行する各段階における探索経路スタック３１０の状態及び取り出されるインデックスキーを示し、図中の探索経路スタック３１０に格納されている配列番号は、図２に示すカップルドノードツリーと対応付けられている。図１３を参照して、図２に示すカップルドノードツリーについてインデックスキーを降順に取り出す場合における探索経路スタック３１０に格納される配列番号について説明する。
【０１０８】
まず、ルートノードから検索を開始して、最大値検索を行い、カップルドノードツリーのノード対のノード［１］をたどっていくと、配列番号（２２１ｆ＋１）にたどり着く。このとき、探索経路スタック３１０には、ルートノード２１０ａの配列番号２２０から順に、（２２０ａ＋１）、（２２１ｂ＋１）、（２２１ｆ＋１）が格納されている。
【０１０９】
図１３（ａ）は、配列番号（２２１ｆ＋１）を検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２１ｆ＋１）の指すノードはリーフノードであるため、このノードのインデックスキー“１０１１００”が取り出される。そして、配列番号（２２１ｆ＋１）はノード［１］を指しているので、このノード［１］と対をなすノード［０］の配列番号２２１ｆを、次の検索開始ノードの配列番号とする。
【０１１０】
図１３（ｂ）は、配列番号２２１ｆを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２１ｆの指すノードはリーフノードであるので、このノードのインデックスキー“１０１０１１”が取り出される。つぎに、配列番号２２１ｆはノード［０］を指しているので、ノード［１］の配列番号が求まるまで、探索経路スタック３１０のポップ動作及び配列番号の取り出しを繰り返す。そして、ノード［１］を指す配列番号（２２１ｂ＋１）が求まると、このノード［１］と対をなすノード［０］の配列番号２２１ｂを、次の検索開始ノードの配列番号とする。
【０１１１】
図１３（ｃ）は、配列番号２２１ｂを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２０ｆ＋１）の指すノードはリーフノードであるため、このノードのインデックスキー“１０００１１”が取り出される。そして、配列番号（２２０ｆ＋１）はノード［１］を指しているので、このノード［１］と対をなすノード［０］の配列番号２２０ｆを、次の検索開始ノードの配列番号とする。
【０１１２】
図１３（ｄ）は、配列番号２２０ｆを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２０ｆの指すノードはリーフノードであるため、このノードのインデックスキー“１０００１０”が取り出される。次に、配列番号２２０ｆはノード［０］を指しているので、ノード［１］の配列番号が求まるまで、探索経路スタック３１０のポップ動作及び配列番号の取り出しを繰り返す。そして、ノード［１］を指す配列番号（２２０ａ＋１）が求まると、このノード［１］と対をなすノード［０］の配列番号２２０ａを、次の検索開始ノードの配列番号とする。
【０１１３】
図１３（ｅ）は、配列番号２２０ａを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２１ｃ＋１）はリーフノードであるため、このノードのインデックスキー“０１１０１０”が取り出される。そして、配列番号（２２１ｃ＋１）はノード［１］を指しているので、このノード［１］と対をなすノード［０］の配列番号２２１ｃを、次の検索開始ノードの配列番号として設定する。
【０１１４】
図１３（ｆ）は、配列番号２２１ｃを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号（２２０ｄ＋１）の指すノードはリーフノードであるため、このノードのインデックスキー“０１００１１”が取り出される。そして、配列番号（２２０ｄ＋１）はノード［１］を指しているので、このノード［１］と対をなすノード［０］の配列番号２２０ｄを、次の検索開始ノードの配列番号とする。
【０１１５】
図１３（ｇ）は、配列番号２２０ｄを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２０ｄの指すノードはリーフノードであるため、このノードのインデックスキー“０１００１０”が取り出される。次に、配列番号２２０ｄはノード［０］を指しているので、ノード［１］の配列番号が求まるまで、探索経路スタック３１０のポップ動作および配列番号の取り出しを繰り返す。そして、ノード［１］を指す配列番号（２２０ｂ＋１）が求まると、このノード［１］と対をなすノード［０］の配列番号２２０ｂを、次の検索開始ノードの配列番号とする。
【０１１６】
図１３（ｈ）は、配列番号２２０ｂを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０及び取り出されるインデックスキーを示す。ここでは、配列番号２２０ｂの指すノードはリーフノードであるため、このノードのインデックスキー“０００１１１”が取り出される。以降、順に探索経路スタック３１０のポップ動作及び配列番号の取り出しを繰り返し、配列番号がルートノードを指していると判断すると、処理を終了する。
【０１１７】
図１４Ａ及び図１４Ｂは、カップルドノードツリーに格納されたインデックスキーの下限値を求める処理を示したフローチャートである。ここで下限値とは、指定された下限キー以上のインデックスキーの最小値である。図１４Ａ及び図１４Ｂに示す下限値を求める処理は、ユーザ等が指定する検索範囲について検索を行う際に、実際にはインデックスキーが取り得ない範囲については対象外とし、実際にインデックスキーが含まれる範囲について検索を行う処理に応用される。なお、図１４Ａ及び図１４Ｂでは、指定された下限キー及び上限キーの取得処理は省略されている。以降の各種応用検索においても同様である。
【０１１８】
まず、ステップＳ９０１で、検索開始ノードの配列番号に、ルートノードの配列番号を設定し、ステップＳ９０２で最小値検索処理を行いインデックスキーの最小値を求める。そして、ステップＳ９０３で、下限キーと、ステップＳ９０２で求めた最小値との比較をし、下限キーが最小値より大きいか否かを判定する。下限キーが最小値以下の値をとる場合、ステップＳ９０４に進み、ステップＳ９０２で求めた最小値を下限値として設定し、処理を終了する。
【０１１９】
ステップＳ９０３において、下限キーはステップＳ９０２で求めた最小値よりも大きいと判定された場合は、ステップＳ９０５に進み、下限キーを検索キーとして設定する。そして、ステップＳ９０６で、検索開始ノードの配列番号にルートノードの配列番号を設定して、ステップＳ９０７で、図４及び図５により説明したビット列検索方法によりインデックスキーを検索する。そして、ステップＳ９０８で、検索キーとステップＳ９０７の検索の結果得られたインデックスキーとを比較して値が一致するか否かを判定する。検索キーとインデックスキーとが等しいと判定された場合は、ステップＳ９０９に進み、検索により得られたインデックスキーを上記下限値として設定し、処理を終了する。検索キーとインデックスキーとは等しくないと判定された場合は、図１４ＢのステップＳ９１０に進む。
【０１２０】
ステップＳ９１０で、検索キーとインデックスキーの大小関係を判定する。ここで、検索キーがインデックスキーよりも大きい場合は、そのインデックスキーは検索キーすなわち下限キーよりも小さく、ユーザ等により指定された検索範囲に含まれないことを意味する。一方、検索キーがインデックスキーよりも小さい場合は、そのインデックスキーは指定された検索範囲に含まれることを意味する。そこで、検索キーがインデックスキーよりも小さいと判定されると、ステップＳ９１８に進み、そのインデックスキーを下限値に設定して、処理を終了する。
【０１２１】
ステップＳ９１０において、検索キーがインデックスキーよりも大きいと判定されると、ステップＳ９１１に進む。ステップＳ９１１からステップＳ９１７までの処理は、昇順にインデックスキーを取り出す処理であり、図１０のステップＳ７０４からステップＳ７１０までの処理にそれぞれ対応している。ステップＳ９１１からステップＳ９１７の処理により、カップルドノードツリーに格納されているインデックスキーが順に取り出されていき、検索キーすなわち下限キーよりも大きい値をとるインデックスキーが得られると、そのインデックスキーが下限値として設定される。
【０１２２】
図１５は、図１４Ａ及び図１４Ｂのフローチャートにより示される、インデックスキーの下限値を求める処理を説明する図であり、このうち図１５（ａ）はカップルドノードツリーと検索キー設定エリア２７０を示し、図１５（ｂ）は探索経路スタック３１０を示す。図１５（ａ）に示すように、検索キー設定エリア２７０には下限キーとして“０１０１１０”が設定されている。なお、図１５（ａ）においては、図２に示すカップルドノードツリーのうち、下限値の検索に関わる部分を抽出して記載している。
【０１２３】
図１４Ａ及び図１４Ｂを参照して説明したように、インデックスキーの下限値を求める処理においては、まずルートノードを検索開始ノードとしてインデックスキーの最小値が求められる。図１５（ａ）に示す例によれば、配列番号２２０ｂのノードに含まれるインデックスキー“０００１１１”が最小値として求められる。得られた最小値と下限キー“０１０１１０”とを比較すると、下限キーの方が大きいため、下限キーを検索キーとしてカップルドノードツリーのインデックスキーを検索すると、得られるインデックスキーは配列番号２２０ｄのノードに含まれるインデックスキー“０１００１０”である。配列番号２２０ｄのノードに含まれるインデックスキーを得た段階、すなわちステップＳ９０７まで処理が実行された段階における探索経路スタック３１０の状態を図１５（ｂ）の（１）に示す。
【０１２４】
配列番号２２０ｄのノードに含まれるインデックスキー“０１００１０”は、下限キー“０１０１００”よりも小さく、検索範囲に含まれないため、次に大きい値をとるインデックスキーを検索すると、配列番号（２２０ｄ＋１）のノードに含まれるインデックスキー“０１００１１”を得る。ステップＳ９１１からステップＳ９１７までの処理を実行することにより配列番号（２２０ｄ＋１）のノードに含まれるインデックスキー“０１００１１”を得た段階における探索経路スタック３１０の状態を図１５（ｂ）の（２）に示す。
【０１２５】
配列番号（２２０ｄ＋１）のノードに含まれるインデックスキー“０１００１１”についても、依然下限キー“０１０１００”よりも小さく、検索範囲に含まれない。そこで、更に昇順にインデックスキーを取り出す処理を行い、得られたインデックスキーと下限キーとを比較する処理を行う。図１５（ａ）に示すカップルドノードツリーにおいては、次に得られるインデックスキー“０１１０１０”が下限キー“０１０１００”よりも大きいため、この配列番号（２２１ｃ＋１）のノードに含まれるインデックスキーを下限値として設定し、処理を終了する。配列番号（２２１ｃ＋１）のノードに含まれるインデックスキー“０１１０１０”を得た段階における探索経路スタック３１０の状態を図１５（ｂ）の（３）に示す。
【０１２６】
図１６Ａ及び図１６Ｂは、カップルドノードツリーに格納されたインデックスキーの上限値を求める処理を示したフローチャートである。ここで上限値とは、指定された上限キー以下のインデックスキーの最大値である。図１６Ａ及び図１６Ｂに示す上限値を求める処理は、上記下限値を求める処理と同様に、ユーザ等が指定する検索範囲について検索を行う際に、実際にはインデックスキーが取り得ない範囲については対象外とし、実際にインデックスキーが含まれる範囲について検索を行う処理に応用される。
【０１２７】
まず、ステップＳ１００１でルートノードを検索開始ノードとして検索する処理についてはインデックスキーの下限値を求める処理と同様であり、また、ステップＳ１００２以降の処理については、上記ステップＳ９０２以降の処理とそれぞれ対応している。
【０１２８】
すなわち、図１４Ａ及び図１４Ｂを用いて説明した下限値を求める処理においては、ステップＳ９０２以降の処理により、ユーザ等により指定された下限キーと、カップルドノードツリーに含まれるインデックスキーのうち下限キー以上で、且つ最も下限キーに近い値をとるインデックスキーを検索している。これに対し、図１６Ａ及び図１６Ｂに示す上限値を求める処理においては、ステップＳ１００２以降の処理により、検索範囲の上限としてユーザ等により指定された上限キー以下の値をとり、且つ上限キーに最も上限キーに近い値をとるインデックスキーを検索している。
【０１２９】
図１４Ａ及び図１４Ｂに示す処理と比較すると、指定されたキー（下限キー／上限キー）とインデックスキーとを比較する際の大小関係（ステップＳ９０３とステップＳ９１０、及びステップＳ１００３とステップＳ１０１０）や、指定されたキーを検索キーとしてカップルドノードツリーを検索する際にインデックスキーの最小値／最大値をそれぞれ求める（ステップＳ９０７及びステップＳ１００７）点、及びインデックスキーを求める順序がそれぞれ昇順／降順である（ステップＳ９１１及びステップＳ１０１１以降の処理）点については逆であるが、下限値及び上限値を求めるまでの手順は基本的に上記と同様である。
【０１３０】
ステップＳ１００２以降の処理について具体的に説明する。
ステップＳ１００２でカップルドノードツリーに含まれるインデックスキーの最大値を求めると、ステップＳ１００３で、ステップＳ１００２で求めた最大値と上限キーとを比較し、上限キーが最大値より大きいか否かを判定する。上限キーがインデックスキーの最大値以上であるときは、ステップＳ１００４に進み、ステップＳ１００２で求めた最大値を上限値として設定し、処理を終了する。
【０１３１】
上限キーが最大値よりも小さい場合は、ステップＳ１００５に進み、上限キーを検索キーに設定する。そして、ステップＳ１００６で、検索開始ノードの配列番号としてルートノードの配列番号を設定し、ステップＳ１００７で、検索キーについての検索処理を行い、ステップＳ１００８に進む。
【０１３２】
ステップＳ１００８で、検索キーとステップＳ１００７で取得したインデックスキーとが等しいか否かを判定する。ステップＳ１００８でこれらの値が等しいと判定された場合は、ステップＳ１００９に進み、ステップＳ１００７の処理で得られたインデックスキーを上記上限値に設定し、処理を終了する。ステップＳ１００８で等しくないと判定された場合は、図１６ＢのステップＳ１０１０に進む。
【０１３３】
ステップＳ１０１０で、検索キーとインデックスキーとの大小関係を判定する。ここで、検索キーがインデックスキーよりも小さい場合は、そのインデックスキーは検索キーすなわち上限キーよりも小さく、ユーザ等により指定された検索範囲に含まれないことを意味する。一方、検索キーがインデックスキーよりも大きい場合は、そのインデックスキーは指定された検索範囲に含まれることを意味する。そこで、検索キーがインデックスキーよりも大きいと判定されると、ステップＳ１０１８に進み、そのインデックスキーを上限値に設定して、処理を終了する。
【０１３４】
ステップＳ１０１０において、検索キーがインデックスキーよりも小さいと判定されると、ステップＳ１０１１に進む。ステップＳ１０１１以降の処理は、降順にインデックスキーを取り出す処理であり、検索キーがインデックスキーよりも大きいと判定されるまで、ステップＳ１０１０からステップＳ１０１７までの処理を繰り返す。
【０１３５】
図１７は、図１６Ａ及び図１６Ｂのフローチャートにより示される、インデックスキーの上限値を求める処理を説明する図であり、このうち図１７（ａ）はカップルドノードツリーと検索キー設定エリア２７０を示し、図１７（ｂ）は探索経路スタック３１０を示す。図１７（ａ）に示すように、検索キー設定エリア２７０には上限キーとして“１０１００１”が設定されている。図１７（ａ）においては、図２に示すカップルドノードツリーのうち、上限値の検索に関わる部分を抽出して記載している。
【０１３６】
図１６Ａ及び図１６Ｂを参照して説明したように、インデックスキーの上限値を求める処理においては、まず配列番号２２０のルートノードについて最大値が求められる。図１７（ａ）に示す例によれば、配列番号（２２１ｆ＋１）のノードに含まれるインデックスキー“１０１１００”が最大値として求められる。しかし、上限キー“１０１００１”と大きさを比較すると、上限キーの方が小さいため、上限キーを検索キーとして更にカップルドノードツリーを検索する。検索の結果、配列番号２２１ｆのノードに含まれるインデックスキー“１０１０１１”が得られる。ステップＳ１００７の処理で配列番号２２１ｆのノードに含まれるインデックスキー“１０１０１１”を得た段階における探索経路スタック３１０の状態を、図１７（ｂ）の（１）に示す。
【０１３７】
配列番号２２１ｆのノードに含まれるインデックスキー“１０１０１１”は、上限キーよりも大きいため、次に大きいインデックスキーを検索する。検索の結果、配列番号（２２０ｆ＋１）のノードに含まれるインデックスキー“１０００１１”を得る。ここで配列番号（２２０ｆ＋１）のノードを検索する処理は、図１６Ａ及び図１６Ｂに示す処理のうち、ステップＳ１０１１からステップＳ１０１７までの処理に相当する。ステップＳ１０１７の処理まで実行された段階における探索経路スタック３１０の状態を図１７（ｂ）の（２）に示す。配列番号（２２０ｆ＋１）のノードに含まれるインデックスキー“１０００１１”は、上限キー“１０１００１”よりも小さいため、ステップＳ１０１０からステップＳ１０１８に進む。これにより、図１６（ａ）に示すカップルドノードツリーにおいて上限キーを“１０１００１”として上限値を求めた場合は、配列番号（２２０ｆ＋１）のノードに含まれるインデックスキー“１０００１１”が上限値として設定される。
【０１３８】
なお、上記の上限値および下限値の検索処理においては上限キーまたは下限キーを含む検索例を示したが、勿論、上限キーまたは下限キーを含まない検索も可能である。
上記の応用検索を複数組み合わせて、以下に示すような検索処理を行うことも可能である。
【０１３９】
図１８Ａ及び図１８Ｂは、検索範囲を指定して昇順でカップルドノードツリーに格納されたインデックスキーを検索する処理を示したフローチャートである。図１８Ａ及び図１８Ｂを参照して、検索範囲の上限及び下限についてユーザ等により指定された場合における昇順での範囲検索処理について説明する。
【０１４０】
まず、ステップＳ１１０１で、下限キーによりカップルドノードツリーを検索し、インデックスキーの下限値を得る。ステップＳ１１０１の処理は、図１４Ａ及び図１４Ｂを参照して説明したとおりである。
【０１４１】
次に、ステップＳ１１０２で、上限キーによりカップルドノードツリーを検索し、インデックスキーの上限値を得る。ステップＳ１１０２の処理は、図１６Ａ及び図１６Ｂを参照して説明したとおりである。
【０１４２】
そして、ステップＳ１１０３で、検索開始ノードの配列番号にルートノードの配列番号を設定して、ステップＳ１１０４で、上記下限値を用いてカップルドノードツリーを検索し、インデックスキーを得る。カップルドノードツリーの検索処理については、図４を参照して説明したとおりである。このステップＳ１１０４においては、先にステップＳ１１０１及びステップＳ１１０２において下限値及び上限値をそれぞれ求めた上でその下限値を用いて検索を行っている。このため、検索の結果得られるインデックスキーは、指定された下限キーから上限キーまでの範囲のうちで、実際にインデックスキーの含まれる範囲における最小値をとることとなる。
【０１４３】
ステップＳ１１０５で、インデックスキーを取り出すと、以降は昇順にインデックスキーを取り出す処理を実行する。昇順でのインデックスキーの取り出し処理は、ステップＳ１１０６でインデックスキーが上限値に至るまで、あるいは、ステップＳ１１０７においてポインタがルートノードの配列番号を指すようになるまで繰り返される。
【０１４４】
図１９は、検索範囲を指定して昇順でカップルドノードツリーに格納されたインデックスキーを検索する処理を説明するための図であり、図１９（ａ）はカップルドノードツリーを示し、図１９（ｂ）は探索経路スタック３１０を示す。以下の説明において、第１の検索キー設定エリア２７０には下限キー“０１０１００”が設定され、第２の検索キー設定エリア２７１には上限キー“１０１００１”が設定されているとする。
【０１４５】
まず、ステップＳ１１０１及びステップＳ１１０２の処理を実行することにより、下限値及び上限値については、それぞれ配列番号（２２１ｃ＋１）のノードのインデックスキー“０１１０１０”及び配列番号（２２０ｆ＋１）のノードのインデックスキー“１０００１１”と決定される。下限値の格納されている配列番号（２２１ｃ＋１）のノードを検索開始ノードとして昇順でインデックスキーを求めていくと、図１９（ａ）に示すツリーにおいては、配列番号（２２１ｃ＋１）、２２０ｆ及び（２２０ｆ＋１）のノードが順次取り出される。
【０１４６】
昇順でこれらのノードのインデックスキーを取得する各段階における探索経路スタック３１０の状態を、図１９（ｂ）の（１）、（２）及び（３）にそれぞれ示す。図１９（ｂ）の（１）は、ルートノードの配列番号２２０を検索開始ノードの配列番号として、検索範囲内での上記最小値検索処理を実行した段階における探索経路スタック３１０および取り出されるインデックスキーを示し、（２）及び（３）は、それぞれ配列番号（２２０ａ＋１）及び（２２０ｆ＋１）を検索開始ノードの配列番号として最小値検索処理を実行した段階における探索経路スタック３１０および取り出されるインデックスキーを示す。ここで実行される処理については、既述の昇順での検索処理を下限値から上限値の範囲内で行うものであるため、詳細については割愛する。
【０１４７】
図１９に示す例においては、ステップＳ１１０６の判定においてインデックスキーと上限値とを比較しているが、配列番号（２２０ｆ＋１）のノードのインデックスキー“１０００１１”と上限値との比較においてはこれらの値が等しくなることから、配列番号（２２０ｆ＋１）のノードのインデックスキー“１０００１１”をステップＳ１１０５で取り出した後、昇順検索を終了している。
【０１４８】
図２０Ａ及び図２０Ｂは、検索範囲を指定して降順でカップルドノードツリーに格納されたインデックスキーを検索する処理を示したフローチャートである。図２０Ａ及び図２０Ｂを参照して、検索の上限及び下限についてユーザ等により指定された場合における降順での範囲検索処理について、上記昇順での検索処理と異なる点を中心に説明する。
【０１４９】
ステップＳ１２０１及びステップＳ１２０２において、指定された上限キー及び下限キーに基づいて、インデックスキーの上限値及び下限値を取得する処理については、それぞれ図１８ＡのステップＳ１１０２及びステップＳ１１０１の処理と同様である。
【０１５０】
ステップＳ１２０３においては、図１８ＡのステップＳ１１０３と同様に、ルートノードの配列番号を検索開始ノードの配列番号として設定し、ステップＳ１２０４で、求めた上限値を検索キーとしてカップルドノードツリーの検索処理を実行し、インデックスキーを取得する。ステップＳ１２０５以降の処理においては、上限値から下限値までの範囲に含まれるインデックスキーについて、順次降順に取り出していき、ステップＳ１２０６において、取り出したインデックスキーと下限値とが等しいと判定された場合か、あるいは、ステップＳ１２０７において、探索経路スタック３１０のポインタがルートノードの配列番号を指していると判定された場合は、降順でのインデックスキーの取り出し処理を終了する。
【０１５１】
図２１は、検索範囲を指定して降順でカップルドノードツリーに格納されたインデックスキーを検索する処理を説明するための図であり、図２１（ａ）はカップルドノードツリーを示し、図２１（ｂ）は探索経路スタック３１０を示す。以下の説明において、第１の検索キー設定エリア２７０には上限キー“１０１００１”が設定され、第２の検索キー設定エリア２７１には下限キー“０１１００１”が設定されているとする。
【０１５２】
まず、ステップＳ１２０１及びステップＳ１２０２の処理を実行することにより、上限値及び下限値として、それぞれ配列番号（２２０ｆ＋１）のノードのインデックスキー“１０００１１”及び配列番号（２２１ｃ＋１）のノードのインデックスキー“０１１０１０”を得る。そして、上限値の格納されている配列番号（２２０ｆ＋１）のノードを検索開始ノードとして、降順でインデックスキーを順次求めていくと、図２１（ａ）に示すツリーにおいては、配列番号（２２０ｆ＋１）のノードに続き、配列番号２２０ｆ及び（２２１ｃ＋１）のノードが順次取り出される。
【０１５３】
降順でこれらのノードのインデックスキーを取得する各段階における探索経路スタック３１０の状態を、図２１（ｂ）の（１）、（２）及び（３）にそれぞれ示す。図２１（ｂ）の（１）は、ルートノードの配列番号２２０を検索開始ノードの配列番号として、検索範囲内での上記最大値検索処理を実行した段階における探索経路スタック３１０および取り出されるインデックスキーを示し、（２）及び（３）は、それぞれ配列番号２２０ｆ及び２２０ａを検索開始ノードの配列番号として最大値検索処理を実行した段階における探索経路スタック３１０および取り出されるインデックスキーを示す。ここで実行される処理については、既述の降順での検索処理を上限値から下限値の範囲内で行うものであるため、詳細については割愛する。
【０１５４】
図２１に示す例においては、ステップＳ１２０６の判定においてインデックスキーと下限値とを比較しているが、配列番号（２２１ｃ＋１）のノードのインデックスキー“０１１０１０”と下限値との比較においてはこれらの値が等しくなることから、このノードのインデックスキー“０１１０１０”をステップＳ１２０５で取り出した後、降順検索を終了している。
【０１５５】
検索範囲について上限値と下限値を定めた上で昇順あるいは降順での検索処理は、検索キーの一部と一致するインデックスキーを取り出す処理にも応用することができる。以下、一部一致検索の例として、前方一致検索処理について説明する。
【０１５６】
図２２は、カップルドノードツリーに格納されたインデックスキーについての前方一致検索処理を示したフローチャートである。図２２を参照して、カップルドノードツリーに格納されているインデックスキーのうち、ビット位置＜ｎ＞（ｎは０以上の整数）までが一致するビット列からなるインデックスキーを全て取り出す処理について説明する。
【０１５７】
まず、ステップＳ１３０１で、下限キーを取得する。下限キーの各ビットの値については、先頭（ビット位置＜０＞）からビット位置＜ｎ＞までは検索キーの各ビットとそれぞれ一致する値が設定され、ビット列のビット位置＜ｎ＋１＞以降のビットについては全て“０”が設定される。
【０１５８】
次に、ステップＳ１３０２で、上限キーを取得する。上限キーの各ビットの値については、先頭からビット位置＜ｎ＞までは検索キーの各ビットとそれぞれ一致する値が設定され、ビット列のビット位置＜ｎ＋１＞以降のビットについては全て“１”が設定される。
【０１５９】
そして、ステップＳ１３０３で、先のステップにおいて設定した下限キー及び上限キーを用いて配列を範囲検索し、インデックスキーを取得し、処理を終了する。なお、ここでの範囲検索処理については、先に図１８Ａ及び図１８Ｂを用いて説明したとおりである。
【０１６０】
図２３は、図２２のフローチャートにより示した前方一致検索処理を説明する図であり、図２３（ａ）はカップルドノードツリーを示し、図２３（ｂ）は探索経路スタック３１０を示す。図２３（ａ）に示すように、前方一致検索を行うための検索キーである前方一致キーは、“１０ｘｘｘｘ（ｘは任意のビット値）”であるものとする。すなわち、前方一致検索のビット列として、ユーザ等から“１０”が指定されたとする。
【０１６１】
先に説明したとおり、前方一致キーが“１０ｘｘｘｘ”である場合、下限キー及び上限キーはそれぞれ“１０００００”及び“１０１１１１”と図示の設定エリアに設定される。この下限キー及び上限キーを用いてインデックスキーの検索範囲となる下限値及び上限値を設定すると、それぞれノード２１０ｇのインデックスキー“１０００１０”が下限値として設定され、ノード２１１ｈのインデックスキー“１０１１００”が上限値として設定される。例えば図１８Ａ及び図１８Ｂに示すように、検索範囲内のインデックスキーについて昇順でインデックスキーを順次取り出すと、既述のとおりカップルドノードツリーにおいてインデックスキーはソートされて格納されていることから、所望の前方一致のインデックスキーを得ることができる。昇順でインデックスキーを取り出す処理を実行する際の探索経路スタック３１０の状態を、図２３（ｂ）の（１）から（４）に示す。もちろん、前方一致検索の検索結果を、図２０Ａ及び図２０Ｂに示す検索方法により降順に取り出すことも可能である。また、前方一致検索の終了判定は、インデックスキーが上限キーより大きいかの判定でもよい。
【０１６２】
図１０から図２３を参照して、インデックスキーの最小値／最大値を求める検索処理及び探索経路スタック３１０の情報を用いた応用検索について詳細に説明したが、以上の応用検索は、カップルドノードツリーのルートノードを検索開始ノードとしてカップルドノードツリーのインデックスキーの最小値／最大値を求める検索処理を行い、探索経路スタック３１０のポップ動作を行って探索経路スタック３１０から配列番号を読み出し、ポップ動作により読み出された配列番号の配列要素に格納されたノードと対をなすノードを検索開始ノードとしてその検索開始ノードをルートノードとするインデックスキーの最小値／最大値を求める検索処理を行うことによりカップルドノードツリーのインデックスキーの検索を行うビット列検索方法としてまとめることができる。
【０１６３】
また、上記応用検索においては、探索経路スタック３１０のポップ動作を行って配列番号を読み出し、読み出された配列番号から、その配列番号のノードがノード対のどちらの配列要素に格納されているかのノード位置について、ノード［１］側か、あるいはノード［０］側かの判定を行っているが、この判定は代表ノード側か、それと対をなすノード側かの判定をしているものである。先に述べたように、代表ノードはノード対のうち、上記各実施例のように配列番号の小さい方の配列要素に格納されたものとすることに限らず、配列番号の大きい方の配列要素に格納されたものとすることも同様に可能であることから、上記ノード位置の判定は、探索経路スタック３１０から読み出された配列番号が、その配列番号の配列要素に格納されたノードを含むノード対の格納された配列要素の配列番号の大きい方であるか小さい方であるかの判定に相当する。
【０１６４】
以上本発明を実施するための最良の形態について詳細に説明したが、本発明の実施の形態は上記に限ることなく種々の変形が可能であることは当業者に明らかである。また、本発明のビット列検索方法をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。
【０１６５】
以上説明したように、本発明によれば、カップルドノードツリーを用いることにより、任意のビット列の集合から、最大値、最小値、昇順／降順でのインデックスキーの取り出し及び検索範囲の下限値／上限値の設定を簡便で高速な手法で求めることができ、更には、これらの手法を用いて、検索範囲を設定してから昇順／降順でのインデックスキーの取り出しや一部一致のインデックスキーの取り出しを高速に求めることが可能となる。
【図面の簡単な説明】
【０１６６】
【図１】配列に格納されたカップルドノードツリーの構成例を説明する図である。
【図２】カップルドノードツリーのツリー構造を概念的に示す図である。
【図３】本発明を実施するためのハードウェア構成例を説明する図である。
【図４】本実施形態に係るビット列検索の基本動作を示したフローチャートである。
【図５】本実施形態に係るビット列検索の基本動作をカップルドノードツリーにより説明する図である。
【図６】カップルドノードツリーに格納されたインデックスキーの最小値を求める処理を示したフローチャートである。
【図７】インデックスキーの最小値を求める処理をカップルドノードツリーにより説明する図である。
【図８】カップルドノードツリーに格納されたインデックスキーの最大値を求める処理を示したフローチャートである。
【図９】インデックスキーの最小値を求める処理をカップルドノードツリーにより説明する図である。
【図１０】カップルドノードツリーに格納されたインデックスキーを昇順に取り出す処理を示したフローチャートである。
【図１１】インデックスキーを昇順に取り出す処理について説明する図である。
【図１２】カップルドノードツリーに格納されたインデックスキーを降順に取り出す処理を示したフローチャートである。
【図１３】インデックスキーを降順に取り出す処理について説明する図である。
【図１４Ａ】インデックスキーの下限値を求める処理の前段を示したフローチャートである。
【図１４Ｂ】インデックスキーの下限値を求める処理の後段を示したフローチャートである。
【図１５】インデックスキーの下限値を求める処理を説明する図である。
【図１６Ａ】インデックスキーの上限値を求める処理の前段を示したフローチャートである。
【図１６Ｂ】インデックスキーの上限値を求める処理の後段を示したフローチャートである。
【図１７】インデックスキーの上限値を求める処理を説明する図である。
【図１８Ａ】検索範囲を指定して昇順でインデックスキーを検索する処理の前段を示したフローチャートである。
【図１８Ｂ】検索範囲を指定して昇順でインデックスキーを検索する処理の後段を示したフローチャートである。
【図１９】検索範囲を指定して昇順でインデックスキーを検索する処理を説明するための図である。
【図２０Ａ】検索範囲を指定して降順でインデックスキーを検索する処理の前段を示したフローチャートである。
【図２０Ｂ】検索範囲を指定して降順でインデックスキーを検索する処理の後段を示したフローチャートである。
【図２１】検索範囲を指定して降順でインデックスキーを検索する処理を説明するための図である。
【図２２】カップルドノードツリーに格納されたインデックスキーについての前方一致検索処理を示したフローチャートである。
【図２３】インデックスキーの前方一致検索処理を説明する図である。
【図２４】従来の検索で用いられるパトリシアツリーの一例を示す図である。
【符号の説明】
【０１６７】
１０、２０、３０   配列番号
１００      配列
１０１      ノード
１０２      ノード種別
１０３      弁別ビット位置
１０４      代表ノード番号
１１１      ノード対
１１２      ノード［０］、代表ノード
１１３      ノード［１］、代表ノードと対をなすノード
１１８      インデックスキー
３０１      データ処理装置
３０２      中央処理装置
３０３      キャッシュメモリ
３０４      バス
３０５      主記憶装置
３０６      外部記憶装置
３０７      通信装置
３０８      データ格納装置
３０９      配列
３１０      探索経路スタック
【図１】
2008112240.tif 000003
【図２】
2008112240.tif 000004
【図３】
2008112240.tif 000005
【図４】
2008112240.tif 000006
【図５】
2008112240.tif 000007
【図６】
2008112240.tif 000008
【図７】
2008112240.tif 000009
【図８】
2008112240.tif 000010
【図９】
2008112240.tif 000011
【図１０】
2008112240.tif 000012
【図１１】
2008112240.tif 000013
【図１２】
2008112240.tif 000014
【図１３】
2008112240.tif 000015
【図１４Ａ】
2008112240.tif 000016
【図１４Ｂ】
2008112240.tif 000017
【図１５】
2008112240.tif 000018
【図１６Ａ】
2008112240.tif 000019
【図１６Ｂ】
2008112240.tif 000020
【図１７】
2008112240.tif 000021
【図１８Ａ】
2008112240.tif 000022
【図１８Ｂ】
2008112240.tif 000023
【図１９】
2008112240.tif 000024
【図２０Ａ】
2008112240.tif 000025
【図２０Ｂ】
2008112240.tif 000026
【図２１】
2008112240.tif 000027
【図２２】
2008112240.tif 000028
【図２３】
2008112240.tif 000029
【図２４】
2008112240.tif 000030