説明

ビット列検索装置、検索方法及びプログラム

【課題】より記憶容量の小さい記憶手段に収容可能なカップルドノードツリーのツリー構造を提供する。
【解決手段】ブランチノードは弁別ビット位置を含み、そのリンク先のノード対の代表ノードは、ブランチノードの配置された配列のノード参照番号の2倍のノード参照番号の配列要素に配置する。リーフノードはインデックスキーを含みツリーの最下段にのみ配置する。検索キーの弁別ビット位置のビット値を分岐先情報として全てのブランチノードについて求めておき、リンク先のノードの配置された配列要素のノード参照番号は、リンク元のブランチノードのノード参照番号を2倍し、分岐先情報と加算して求める。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ビット列検索の技術に関し、特にカップルドノードツリーを用いたビット列検索に関する。
【背景技術】
【0002】
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
【0003】
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列データの検索に帰着されるということができる。
ビット列データを検索するビット列検索に関するものとして、下記特許文献1、特許文献2及び特許文献3等に開示されたカップルドノードツリーを用いた検索技術がある。
【0004】
図1Aに示すのは、従来の、配列に配置されたカップルドノードツリーの構成例を説明する図である。
図1Aを参照すると、ノード101が配列100の配列番号10の配列要素に配置されている。ノード101はノード種別102、弁別ビット位置103及び代表ノード番号104で構成されている。ノード種別102は0であり、ノード101がブランチノードであることを示している。弁別ビット位置103には1が格納されている。代表ノード番号104にはリンク先のノード対の代表ノードの配列番号20が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
【0005】
配列番号20の配列要素には、ノード対111の代表ノードであるノード[0]112が格納されている。そして隣接する次の配列要素(配列番号20+1)に代表ノードと対になるノード[1]113が格納されている。ノード[0]112のノード種別114には0が、弁別ビット位置115には3が、代表ノード番号116には30が格納されている。またノード[1]113のノード種別117には1が格納されており、ノード[1]113がリーフノードであることを示している。インデックスキー118には、“0001”が格納されている。
【0006】
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121の内容は省略されている。
【0007】
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された0あるいは1は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である0か1を代表ノード番号に加えた配列番号のノードにリンクする。
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
【0008】
図1Bは、従来のカップルドノードツリーのツリー構造を概念的に示す図である。
符号210aで示すのが図1Bに例示するカップルドノードツリー200のルートノードである。図示の例では、ルートノード210aは配列番号220に配置されたノード対201aの代表ノードとしている。
【0009】
ツリー構造としては、ルートノード210aの下にノート対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
【0010】
各ノードの前に付された0あるいは1の符号は、図1において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のリーフノードを見つけることになる。
【0011】
図示された例では、ルートノード210aのノード種別260aは0でブランチノードであることを示し、弁別ビット位置230aは0を示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列要素の配列番号である。
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに0であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには1が格納され、リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列要素の配列番号220bが格納されている。
【0012】
ノード210cのノード種別260cには1が格納されているので、このノードはリーフノードであり、したがって、インデックスキーを含んでいる。インデックスキー250cには“000111”が格納されている。一方ノード211cのノード種別261cは0、弁別ビット位置231cは2であり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列要素の配列番号221cが格納されている。
ノード210dのノード種別260dは0、弁別ビット位置230dは5であり、代表ノード番号にはノード対201eの代表ノード210eの格納された配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは1であり、インデックスキー251dには“011010”が格納されている。
ノード対201eのノード210e、211eのノード種別260e、261eはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250e、251eにはインデックスキーとして“010010”と“010011”が格納されている。
【0013】
ノード対201bのもう一方のノードであるノード211bの弁別ビット位置231bには2が格納され、リンク先の代表ノード番号にはノード対201fの代表ノード210fの格納された配列要素の配列番号221bが格納されている。
ノード対201fのノード210f、211fのノード種別260f、261fはともに0であり双方ともブランチノードである。それぞれの弁別ビット位置230f、231fには5、3が格納されている。ノード210fの代表ノード番号にはノード対201gの代表ノード210gの格納された配列要素の配列番号220fが格納され、ノード211fの代表ノード番号にはノード対201hの代表ノードであるノード[0]210hの格納された配列要素の配列番号221fが格納されている。
ノード対201gのノード210g、211gのノード種別260g、261gはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250g、251gには“100010”と“100011”が格納されている。
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに1であり双方ともリーフノードであることを示し、それぞれのインデックスキー250h、251hには“101011”と“101100“が格納されている。
【0014】
次に、上述のカップルドノードツリーを用いた基本的な検索処理について説明する。以下の説明においては、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶領域が用いられる。また、あるデータ格納領域に格納されるデータ自体にデータ格納領域の符号を付して説明する場合があるし、データ自体の名前をそのデータを格納する一時記憶領域の名前として用いることもある。
【0015】
まず、検索開始ノードの配列番号を取得する。取得された配列番号に対応する配列は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、オペレータからの入力によってもよいし、検索処理の結果を利用するアプリケーションプログラムによるものでもよい。
取得された検索開始ノードの配列番号は、図示しない検索開始ノード設定エリアに設定されるが、この検索開始ノード設定エリアは、先に述べた「処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶領域」の一つである。以下の説明では、「図示しない検索開始ノード設定エリアに設定する」のような表現に変えて、「検索開始ノードの配列番号を得る。」、「検索開始ノードとして設定する」あるいは単に「検索開始ノードに設定する」のように記述することもある。
【0016】
次に、探索経路スタックに取得された配列番号を格納し、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、読み出したノードから、ノード種別を取り出し、ノード種別がブランチノードであるか否かを判定する。
この判定において、読み出したノードがブランチノードである場合は、ノードから弁別ビット位置についての情報を取り出し、更に、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ノードから代表ノード番号を取り出して、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、上述の探索経路スタックに取得された配列番号を格納する処理に戻るループ処理を実行する。
【0017】
以降、ノード種別の判定においてリーフノードと判定されるまで、上述のループ処理を繰り返す。ノード種別の判定においてリーフノードと判定されると、リーフノードからインデックスキーを検索結果キーとして取り出して、処理を終了する。
【0018】
次に、ルートノードを検索開始ノードとして図1Bに例示するカップルドノードツリー200からインデックスキー“100010”を検索する処理を簡単に説明する。弁別ビット位置は、最上位ビットの位置から0、1、2、・・・とする。
【0019】
検索開始ノードがルートノードであるので、ビット列“100010”を検索キーとしてルートノード210aから処理をスタートする。ルートノード210aの弁別ビット位置230aは0であるので、検索キー“100010”の弁別ビット位置が0のビット値をみると1である。そこで代表ノード番号の格納された配列番号220aに1を加えた配列番号の配列要素に格納されたノード211bにリンクする。ノード211bの弁別ビット位置231bには2が格納されているので、検索キー“100010”の弁別ビット位置が2のビット値をみると0であるから、代表ノード番号の格納された配列番号221bの配列要素に格納されたノード210fにリンクする。
ノード210fの弁別ビット位置230fには5が格納されているので、検索キー“100010”の弁別ビット位置が5のビット値をみると0であるから、代表ノード番号の格納された配列番号220fの配列要素に格納されたノード210gにリンクする。
ノード210gのノード種別260gは1でありリーフノードであることを示しているので、インデックスキー250gを検索結果キーとして読み出す。このようにしてカップルドノードツリーを用いた検索が行われる。なお、検索結果キーを検索キーと比較すると両方とも“100010”であって一致している。
【0020】
上述の検索処理の説明では、検索処理をノードからインデックスキーを検索結果キーとして取り出すことで終了しているが、さらに検索結果キーと検索キーの一致判定を行い、一致すれば検索成功とし、一致しなければ検索失敗とすることもできる。
【0021】
図1A及び図1Bに示すカップルドノードツリーのリーフノードは、リーフノードインデックスキーを直接含むものであり、上述の検索処理は、リーフノードからインデックスキーを取り出すものである。このリーフノードの構成と検索処理におけるインデックスキーの取り出しは、特許文献1及び特許文献2に開示されたものと同様である。
【0022】
一方、特許文献3に開示されたカップルドノードツリーのリーフノードには、インデックスキーに替えて、インデックスキーの記憶された記憶領域の位置を示すポインタである参照ポインタが格納されている。そして、検索処理におけるインデックスキーの取り出しは、リーフノードから参照ポインタを取り出し、参照ポインタの指す記憶領域にアクセスすることにより行われる。
【先行技術文献】
【特許文献】
【0023】
【特許文献1】特開2008−015872号公報
【特許文献2】特開2008−112240号公報
【特許文献3】特開2008−269503号公報
【発明の概要】
【発明が解決しようとする課題】
【0024】
カップルドノードツリーは、それ以前に検索処理に用いられていたツリーと比べてツリーを記憶する記憶容量が少ないという特徴を有する。しかしながら、検索対象のデータサイズが非常に大きくなると、より小さい容量の記憶手段に配置可能なツリー構造であることが望ましい。
そこで、本発明が解決しようとする課題は、より小さい容量の記憶手段に配置可能なカップルドノードツリーのツリー構造を提供することである。
【課題を解決するための手段】
【0025】
本発明によれば、カップルドノードツリーの各ノードは、ツリー上の位置に応じた配列の配列要素に配置される。ルートノードの配置される配列要素の仮想的な配列番号であるノード参照番号は1とされ、ブランチノードのリンク先のノード対の代表ノードの配置された配列要素のノード参照番号は、ブランチノードが配置された配列要素のノード参照番号を2倍することにより求められる。したがって、本発明によるブランチノードは、代表ノード番号を含む必要がない。
【0026】
また、本発明によれば、検索対象のインデックスキーのある特定のビット位置に特定のビット値“0”あるいは“1”を挿入したものによりカップルドノードツリーを構成し、同様に検索キーの、検索対象のインデックスキーと同一の特定のビット位置に同一の特定のビット値“0”あるいは“1”を挿入したものにより検索を行う。そして、ブランチノードとリーフノードはノード種別を含まず、ブランチノードは弁別ビット位置を含むが代表ノード番号は含まず、リーフノードはインデックスキーあるいはインデックスキーにアクセスするための情報を含む。
【0027】
リーフノードは、カップルドノードツリーの最大段数をNとしたとき、N段目にのみ存在し、かつN段目にはリーフノードしか存在しないようにツリーを構成することにより、ノードの種別の判別を可能としている。
【0028】
さらに、本発明によれば、検索キーによる検索処理の始めに、ブランチノードの弁別ビット位置と検索キーのビット値により、各ブランチノードにおけるリンク先においてノード位置[0]とノード位置[1]のどちらに分岐するかを示す分岐先情報を求める。そして、検索処理は、ルートノードから最終段であるN段目のノードまでの各段の分岐先情報をたどるリンク動作を繰り返すことで行われる。
【発明の効果】
【0029】
本発明によれば、ブランチノードはリンク先を識別する代表ノード番号を含まないので、ノードのサイズを小さくすることができる。例えばインデックキーの数が16とすると、リーフノードのサイズを規定するインデックスキーを表現するためのビット数は4である。一方、従来のブランチノードのサイズを規定する弁別ビット位置に必要なビット数は2、代表ノード番号に必要なビット数は、ルートノードを含めたリンク先となるノード対の数が1+1+2+4+8=16であることから4であるので、必要なビット数は合計で6となる。
【0030】
したがって、従来のブランチノードは、リーフノードと比べて大きな記憶容量を必要としていた。この記憶容量の差は、インデックスキーの数が大きくなるとさらに拡大する。しかし、本発明によれば、代表ノード番号を格納する記憶領域が必要なくなることから、カップルドノードツリーを配置する配列のサイズを小さくすることができる。
【0031】
さらに、本発明によれば、カップルドノードツリーを配置する配列のサイズを小さくすることに加えて、検索処理におけるノード種別の判定による分岐動作が削除されるので、処理速度を向上させることができる。
【図面の簡単な説明】
【0032】
【図1A】従来の、配列に配置されたカップルドノードツリーの構成例を説明する図である。
【図1B】従来のカップルドノードツリーのツリー構造を概念的に示す図である。
【図2A】本発明の一実施形態における配列に配置されたカップルドノードツリーの構成例を説明する図である。
【図2B】本発明の一実施形態におけるカップルドノードツリーのツリー構造を概念的に示す図である。
【図3】本発明を実施するためのハードウェア構成例を説明する図である。
【図4】本発明の一実施形態における検索処理の概念を説明する図である。
【図5】本発明の一実施形態における検索処理の処理フロー例を説明する図である。
【図6A】検索キーによりブランチノード配列から分岐先配列を求める処理フロー例を説明する図である。
【図6B】弁別ビット位置と検索キーにより、分岐先配列に分岐先情報を設定する処理フロー例を説明する図である。
【図7A】分岐先配列をもとにリーフノード配列のノード参照番号を求める処理フロー例を説明する図である。
【図7B】分岐先情報により次段のノードの配列番号を求める処理フロー例を説明する図である。
【図7C】分岐先情報によりリーフノード配列のノード参照番号を求める処理フロー例を説明する図である。
【図8】本発明の一実施形態におけるビット列検索装置の機能ブロック構成例を説明する図である。
【図9A】本発明の一実施形態におけるポインタレスツリーを生成する処理の前段の処理フロー例を説明する図である。
【図9B】本発明の一実施形態におけるポインタレスツリーを生成する処理の後段の処理フロー例を説明する図である。
【図10】本発明の一実施形態におけるブランチノードを生成する処理の処理フロー例を説明する図である。
【図11】本発明の一実施形態におけるリーフノードを生成する処理の処理フロー例を説明する図である。
【図12A】変換前のツリーの最大段数を求める処理の前段の処理フロー例を説明する図である。
【図12B】変換前のツリーの最大段数を求める処理の後段の処理フロー例を説明する図である。
【発明を実施するための形態】
【0033】
次に図2A〜図4を参照して、本発明の基本的な概念について説明する。
図2Aは、本発明の一実施形態における配列に配置されたカップルドノードツリーの構成例を説明する図である。図1Aに示す構成例と比べると、リーフノード、ブランチノードからノード種別を格納する領域を削除し、またブランチノードから代表ノード番号を格納する領域がなくなっている。また、図2Aに示す構成例では、後に説明する仮想的な配列番号は、配列番号と一致するものとしているので、表示されていない。
【0034】
本構成例は、リーフノードをツリーの最下段にのみに配置している。また、各ノードが配置される配列要素は、配列番号が、1から15への連続した番号のものが使用されている。そして、インデックスキー、検索キーは、本来のインデックスキー、検索キーに対して、ある特定のビット位置である最上位ビットに0を挿入したものとしている。なお、最上位ビットとして付加するビット値は、0ではなく1とすることもできる。要するに、同一のビット値を最上位ビットとして付加すればよい。また、特定のビット値を挿入するある特定のビット位置も、最上位のビット位置に限ることなく、任意のビット位置とすることができる。同一のビット値を挿入したビット位置は、カップルドノードツリーの本来のブランチノードの弁別ビット位置に現れることはない。そこで、上記特定のビット位置を、後に説明するダミーのブランチノードの弁別ビット位置として用い、そのダミーのブランチノードをツリーに挿入することにより、リーフノードをツリーの最下段にのみに配置することを可能としている。
【0035】
図2Aを参照すると、ルートノード401が配列400の配列番号1の配列要素に配置されている。ルートノード401は弁別ビット位置403で構成されている。弁別ビット位置403には2が格納されている。
【0036】
配列番号が1であるルートノード401からの点線の矢印410で示すリンク先ノード対411の代表ノードであるノード[0]412は、ツリー上で直近上位に位置する親ノードであるルートノード401の配列番号1の2倍の値を持つ配列番号2の配列要素に配置されている。そして隣接する次の配列要素(配列番号3)に代表ノードと対になるノード[1]413が配置されている。
【0037】
ノード[0]412の弁別ビット位置には0が格納されており、そのリンク先は、点線の矢印440で示すように、ノード[0]412の配列番号2の2倍の配列番号4の配列要素に格納されたノード442である。また、ノード442の弁別ビット位置には0が格納されており、そのリンク先は、点線の矢印450で示すように、ノード442の配列番号4の2倍の配列番号4の配列要素に格納されたノード452である。
【0038】
ノード452は、図2Aに例示するカップルドノードツリーの最下段に位置するので、リーフノードであり、インデックスキー418には最上位ビットに0が挿入されたインデックスキー“00001”が格納されている。
図2Aに示す例では、インデックスキー“00001”は、ルートノード401の弁別ビット位置403のビット位置2におけるビット値0によりすでに他の配列要素に格納されたインデックスキーとは弁別されている。したがって、ルートノードの直近下位の配列番号2の配列要素に格納されたノードが本来のリーフノードの位置であるが、本実施形態においてはリーフノードであることを識別するノード種別を用いないので、弁別ビット位置が最上位ビット位置の0であるダミーのブランチノード412、442を挿入して最下段に位置するようにしている。なお、図2Aに示す配列番号5の配列要素が空きとなっているように、2段目のダミーのブランチノード442と対をなすノードは実質的に存在しない空きノードとなる。
【0039】
一方、ノード[1]413の弁別ビット位置には4が格納されている。配列番号が3であるブランチノード413からの点線の矢印420で示すリンク先ノード対421の代表ノードであるノード422は、親ノードであるノード413の配列番号3の2倍の値を持つ配列番号6の配列要素に配置されている。そして隣接する次の配列要素(配列番号7)に代表ノードと対になるノード423が配置されている。ノード422の弁別ビット位置には5が格納されている。また、ノード423の弁別ビット位置には6が格納されている。
【0040】
配列番号が6であるブランチノード422からの点線の矢印430で示すリンク先ノード対431の代表ノードであるノード432は、配列番号12の配列要素に配置されている。そして隣接する次の配列要素(配列番号13)に代表ノードと対になるノード433が配置されている。ノード432及びノード433の内容の記載は省略されている。また、ブランチノード423のリンク先の記載も省略されている。
【0041】
図2Bは、本発明の一実施形態におけるカップルドノードツリーのツリー構造を概念的に示す図である。図2Bに示すツリー構造を、図1Bに示すツリー構造と比較すると、先に述べたように、ブランチノードとリーフノードからノード種別がなくなり、ブランチノードからは代表ノード番号もなくなっている。代表ノード番号は、ブランチノードの配列番号を2倍することにより得られるので、代表ノード番号によるリンク先への結合を、代表ノード番号の符号を付した点線の矢印により表している。また、各ノードの近傍に、各ノードが配置される配列要素の配列番号を、ルートノード210aに対して、[1]のように表示している。また、図2Bの説明においても、図2Aの例示と同様に、後に説明する仮想的な配列番号は、配列番号と一致するものとしているので、表示されていない。
【0042】
さらに、図2Bに示すツリー構造を、図1Bに示すツリー構造と比較すると、図2Bに示すツリー構造では、リーフノードに格納された各インデックスキーの最上位のビット位置に0が追加され、ビット長が6ビットから7ビットになっている。それに伴い、図1Bに示すブランチノードと同一の符号を付したブランチノードの弁別ビット位置は1つシフトされ、値が1つ大きくなっている。
【0043】
また、図1Bに示すツリー構造における段数は5段であるので、図2Bに示すツリー構造においては、最下段である5段目にのみリーフノードが位置している。そして、図1Bに示すツリー構造において5段目より上位の階層に位置するリーフノードは、弁別ビット位置が0のダミーのブランチノードとなっている。そして、ダミーのブランチノードの直近下位のノードが5段目のノードとなるまで、ダミーのブランチノードが挿入されている。
【0044】
なお、図2Bに示す例示では、最上位ビットとして0を付加しているため、例えば本来的なインデックスキー“000111”はリーフノード210jに格納されているが、最上位ビットとして1を付加した場合はリーフノード211jに格納することは明らかである。
【0045】
図3は、本発明を実施するためのハードウェア構成例を説明する図である。本発明の検索装置による検索処理は中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施することができる。カップルドノードツリーが配置される配列309と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック310、及びカップルドノードツリーに格納されたブランチノードの弁別ビット位置と検索キーの該弁別ビット位置のビット値により決定される分岐先を示す分岐先情報を格納する分岐先配列311を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。
なお、リーフノードにインデックスキーではなくインデックスキーにアクセスするための情報を格納する場合には、データ格納装置には、インデックスキーを記憶する記憶領域が設けられる。
【0046】
図3の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309は外部記憶装置306に、探索経路スタック310と分岐先配列311を主記憶装置305に、持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
【0047】
図4は、本発明の一実施形態による検索処理の概念を説明する図である。
図3に示すカップルドノードツリーを格納する配列309は、ブランチノードを格納するブランチノード配列309aとリーフノードを格納するリーフノード配列309bに分離されている。それぞれの配列には、図2Bに示すカップルドノードツリー200bのブランチノードとリーフノードが格納されている。
【0048】
ブランチノード配列309aとリーフノード配列309bの配列要素には、それぞれの配列番号730a、730bに加えて、それぞれノード参照番号720a、720bが付されている。そして、ブランチノード配列309aとリーフノード配列309bには、さらにベース番号700a、700bがそれぞれ付されている。ノード参照番号は、いわば仮想的なあるいは論理的な配列番号であり、1から始まる連続番号である。
【0049】
ベース番号は配列の配列要素のノード参照番号を1番から開始するためのものである。ベース番号とノード参照番号の和が配列番号となる。図4の例では、ブランチノード配列309aの配列番号730aの先頭の値は11であるから、ベース番号700aの値を10とすることにより、ノード参照番号720aの値は1から始まるものとなる。リーフノード配列309bの配列番号730bの先頭の値は51であるから、ベース番号700bの値を50とすることにより、ノード参照番号720bの値は、ノード参照番号720aと同様に、1から始まるものとなる。
ベース番号とノード参照番号を導入することにより、ブランチノード配列309aとリーフノード配列309bの配列内での配置の自由度を高めることができる。また、ブランチノード配列309aとリーフノード配列309bを格納する記憶手段の選択度も高めることができる。
なお、ベース番号を0とするとノード参照番号と配列番号は等しくなる。ブランチノード配列とリーフノード配列を分離せず、ベース番号を0とした配列に格納されたカップルドノードツリーの構成例が、図2Aに例示するものである。また、ブランチノード配列とリーフノード配列を分離せず、ベース番号を0とした配列に格納されたカップルドノードツリーのツリー構造を概念的に示す図が、図2Bである。
【0050】
図4には、さらに、検索キー280と分岐先配列311が記載されている。検索キー280にはビット列“0011010”が格納されている。
ブランチノード配列309aのノード参照番号720aの値1の配列要素(以下、ノード参照番号1の配列要素のようにいう。)には、ルートノード220aの弁別ビット位置の値1(以下、弁別ビット位置1のようにいう。)が格納され、検索キー280に格納されたビット列のビット位置1のビット値が0であるので、分岐先配列の配列番号1の配列要素には0が格納される。
この分岐先配列の配列番号1の配列要素に格納された分岐先情報0は、検索キー280で図2Bに示すカップルドノードツリーを検索すると、ルートノード210aの直近下位のノード対210bにおいて、ノード位置が0であるノード210bにサーチパスが分岐することを示している。
【0051】
次に、ブランチノード配列309aのノード参照番号2の配列要素には、ノード210bの弁別ビット位置2が格納され、検索キー280に格納されたビット列のビット位置2のビット値が1であるので、分岐先配列の配列番号2の配列要素には1が格納される。
以下同様に、ブランチノード配列309aのノード参照番号3の配列要素には、ノード211bの弁別ビット位置3が格納され、検索キー280に格納されたビット列のビット位置3のビット値が1であるので、分岐先配列の配列番号3の配列要素には1が格納される。
【0052】
ブランチノード配列309aのノード参照番号5の配列要素には、ノード211cの弁別ビット位置3が格納され、検索キー280に格納されたビット列のビット位置3のビット値が1であるので、分岐先配列の配列番号5の配列要素には1が格納される。
ブランチノード配列309aのノード参照番号6の配列要素には、弁別ビット位置6が格納され、検索キー280に格納されたビット列のビット位置6のビット値が0であるので、分岐先配列の配列番号6の配列要素には0が格納される。
【0053】
ブランチノード配列309aのノード参照番号7の配列要素には、弁別ビット位置4が格納され、検索キー280に格納されたビット列のビット位置4のビット値が0であるので、分岐先配列の配列番号4の配列要素には0が格納される。
ブランチノード配列309aのノード参照番号10の配列要素には、弁別ビット位置6が格納され、検索キー280に格納されたビット列のビット位置6のビット値が0であるので、分岐先配列の配列番号10の配列要素には0が格納される。
【0054】
ブランチノード配列309aのノード参照番号11の配列要素には、ノード211dの弁別ビット位置0が格納され、検索キー280に格納されたビット列のビット位置0のビット値が0であるので、分岐先配列の配列番号11の配列要素には0が格納される。同様に、その他のブランチノード配列309aの、弁別ビット位置0が格納された配列要素のノード参照番号と同一の値の配列番号が指す分岐先配列311の配列要素には0が格納される。
【0055】
本発明の一実施形態においては、ビット列検索の対象となるビット列の集合からブランチノード配列309aとリーフノード配列309bが生成されており、検索キー280が指定されると、検索キー280とブランチノード配列により分岐先配列311が生成される。
そして、分岐先配列により、検索結果であるインデックスキーが格納されたリーフノード配列の配列番号を求める。
【0056】
まず、分岐先配列311の配列番号1の太枠で示した配列要素に格納された分岐先情報(以下、配列番号1の分岐先情報のようにいう。)を読み出し、配列番号を2倍した値に加えて、次に読み出す分岐先情報が格納されて配列要素の配列番号を求める。図4の例示では、図2Bにおける表記と同様に符号を付した点線の矢印220aで示すように、配列番号1を2倍して0を加えて配列番号2を求める。太枠で示した配列要素に格納された分岐先情報の値1を読み出す。
【0057】
次に、点線の矢印220bで示すように、配列番号2の太枠で示した配列要素に格納された分岐先情報の値1を読み出し、配列番号2を2倍した値に加えて配列番号5を求める。
さらに、点線の矢印221cで示すように、配列番号5の太枠で示した配列要素に格納された分岐先情報の値1を読み出し、配列番号5を2倍した値に加えて配列番号11を求める。
【0058】
次の分岐先は、カップルドノードツリーの最下段である。点線の矢印221iで示すように、配列番号11の太枠で示した配列要素に格納された分岐先情報の値0を読み出し、それを、配列番号11を2倍した値に加えて求められる値からブランチノード配列309aの最大のノード参照番号である15を減じてリーフノード配列309bのノード参照番号7を得る。太枠で示したリーフノード配列309bのノード参照番号7の配列要素に格納されたリーフノード210iからインデックスキー“0011010”を取り出して、検索処理を終了する。
【0059】
なお、上述の図4の例示では、ブランチノード配列309aとリーフノード配列309bが分離されたものとして説明し、リーフノード配列309bのノード参照番号7を求めるために、分岐先情報0を分区先配列の配列番号11を2倍した値に加えて求められる値からブランチノード配列309aの最大のノード参照番号である15を減じたが、ブランチノードとリーフノードを1つの配列に格納する場合は、ノード参照番号は一連の番号となるので、リーフノードの格納された配列要素のノード参照番号を求めるときに、ブランチノードを格納する最後の配列要素のノード参照番号を減じる必要はない。
【0060】
次に、図5〜図7を参照して、本発明の一実施形態における検索処理について詳細に説明する。
図5は、本発明の一実施形態における検索処理の処理フロー例を示す図である。
【0061】
図5に示すように、まずステップS501において、検索キーを設定する。この検索キーの設定は、図4に示す例では、検索キー280にビット列“0011010”を設定することに相当する。
次にステップS502において、検索キーをもとに、ブランチノード配列から分岐先配列を求める。この処理は、図4に示す例では、先に説明した検索キー280とブランチノード配列309aから分岐先配列311を生成する処理に相当する。ステップS502の詳細な処理フローは、後に図6A及び図6Bを参照して説明する。
【0062】
次にステップS503において、分岐先配列をもとに、リーフノード配列のノード参照番号を求める。この処理は、図4に示す例では、先に説明した分岐先配列の配列番号1の配列要素に格納された分岐先情報から配列番号11までの配列要素に格納された分岐先情報を順次読み出し、配列番号11の配列要素に格納された分岐先情報とブランチノード配列のノード参照番号の最大値にもとづいてリーフノード配列のノード参照番号を求める処理に相当する。ステップS503の詳細な処理フローは、後に図7A及び図7Bを参照して説明する。
【0063】
最後に、ステップS504において、ステップS503で求めたノード参照番号の指すリーフノード配列の配列要素の内容をインデックスキーとして取り出し、処理を終了する。ここで、ステップS504で取り出したインデックスキーを検索結果キーとすることもできるし、該インデックスキーを検索キーと比較し、一致すれば検索成功とし、一致しなければ検索失敗とすることもできる。
【0064】
図6Aは、検索キーによりブランチノード配列から分岐先配列を求める処理フロー例を説明する図であり、図5に示すステップS502の詳細な処理フローを説明する図である。図6Aに示す例では、ブランチノード配列に配置されたブランチノードの数はmとする。
【0065】
まず、ステップS600において、配列番号及びノード参照番号に1を設定する。
次にステップS601において、ノード参照番号1の指すブランチノード配列の配列要素に格納された弁別ビット位置と検索キーにより、配列番号1の指す分岐先配列の配列要素に分岐先情報を示すビット値を設定する。
【0066】
続いてステップS602において、ノード参照番号2の指すブランチノード配列の配列要素に格納された弁別ビット位置と検索キーにより、配列番号2の指す分岐先配列の配列要素に分岐先情報を示すビット値を設定する。
【0067】
以下同様に、ステップS603〜ステップS60mにおいて、ノード参照番号3〜mの指すブランチノード配列の配列要素に格納された弁別ビット位置と検索キーにより、配列番号3〜mの指す分岐先配列の配列要素に分岐先情報を示すビット値をそれぞれ設定する。
【0068】
なお、図6Aに例示する処理フロー例は、特定の数であるm個のブランチノードが配置されたブランチノード配列により分岐先配列を生成するものであるが、個数mをパラメータとしたアセンブラマクロにより、任意の個数のブランチノードが配置されたブランチノード配列により分岐先配列を生成する処理を実現するための処理フローを生成することが可能である。
【0069】
また、図6Aに例示するように、ブランチノード配列に配置された各弁別ビット位置に対応して、該弁別ビット位置を用いた処理を順次直列的に実行する処理フローに替えて、ブランチノード配列に配置された弁別ビット位置に対応する処理が全て終了したかを判定する判定処理を設け、終了していなければ次の弁別ビット位置を用いた処理を繰り返すループ処理を含む処理フローにより、同一の処理結果が得られることは明らかである。ステップS601〜ステップS60mの処理の詳細は、次に図6Bを参照して説明する。
【0070】
図6Bは、ブランチノード配列の配列要素に格納された弁別ビット位置と検索キーにより、分岐先配列の配列要素に分岐先情報を示すビット値を設定する処理フロー例を説明する図である。
【0071】
まずステップS610において、ブランチノード配列から、ノード参照番号の指す配列要素の内容を弁別ビット位置として読み出す。ステップS610の最初の処理では、図6AのステップS600における処理で、ノード参照番号に1が設定されている。
【0072】
次にステップS611において、検索キーから、ステップS610で読み出した弁別ビット位置の指すビット値を取り出し、ステップS612において、該取り出したビット値を、配列番号の指す分岐先配列の配列要素に分岐先情報として設定する。ステップS612の最初の処理では、図6AのステップS600における処理で、配列番号に1が設定されている。
【0073】
次にステップS613において、配列番号に1を加え、ステップS614において、ノード参照番号に1を加えて処理を終了する。以上説明したステップS610〜ステップS614の処理がブランチノード配列の配列要素毎に順次実行されることにより、分岐先配列の配列要素に分岐先情報を順次設定することができる。
【0074】
図7Aは、分岐先配列をもとにリーフノード配列のノード参照番号を求める処理フロー例を説明する図であり、図5に示すステップS503の詳細な処理フローを説明する図である。図7Aに示す例では、カップルドノードツリーの段数はnとする。
【0075】
まず、ステップS700で、配列番号に1を設定する。次にステップS701において、1段目のノード(ルートノード)に対応する配列番号(以下、1段目のノードの配列番号のようにいう。)、すなわち配列番号1の指す分岐先配列に格納された分岐先情報により、2段目のノードの配列番号を求める。
【0076】
続いてステップS702において、2段目のノードの配列番号の指す分岐先配列に格納された分岐先情報により、3段目のノードの配列番号を求める。
以下同様に、ステップS703〜ステップS70n−2において、3段目〜n−2段目のノードの配列番号の指す分岐先配列に格納された分岐先情報により、それぞれ4段目〜n−1段目のノードの配列番号を求める。ステップS701〜ステップS70n−2の処理の詳細は、後に図7Bを参照して説明する。
【0077】
最後にステップS70n−1において、n−1段目のノードの配列番号の指す分岐先配列に格納された分岐先情報により、リーフノード配列のノード参照番号を求めて処理を終了する。ステップS70n−1の処理の詳細は、後に図7Cを参照して説明する。
なお、図7Aに例示する処理フロー例は、特定の段数nを有する本実施形態のカップルドノードツリーを用いたものであるが、段数nをパラメータとしたアセンブラマクロにより、本実施形態の任意の段数のカップルドノードツリーを用いた検索処理を実現するための処理フローを生成することが可能である。
【0078】
また、図7Aに例示するように、分岐先配列に配置されたカップルドノードツリーの各段のノードの分岐先情報に対応して、該分岐先情報を用いた処理を順次直列的に実行する処理フローに替えて、最下段の1つ上位の段のノードの分岐先情報に対応する処理が終了したかを判定する判定処理を設け、終了していなければ次の段のノードの分岐先情報を用いた処理を繰り返すループ処理を含む処理フローにより、同一の処理結果が得られることは明らかである。
【0079】
図7Bは、分岐先情報により次段のノードの配列号を求める処理フロー例を説明する図であり、図7Aに示すステップS702〜ステップS70n−2の処理の詳細な処理フローを説明する図である。
【0080】
図に示すように、まずステップS711において、分岐先配列から、配列番号の指す分岐先情報を読み出す。ステップS711の最初の処理では、図7AのステップS700における処理で、配列番号に1が設定されている。
【0081】
次にステップS712において、配列番号を2倍し、ステップS713において、配列番号にステップS711で得た分岐先情報を加えて処理を終了する。
上述の図7Bの処理は、図4に示す例示では、点線の矢印220a、220b、221cで示す処理である。例えば点線の矢印220bで示すように、配列番号2の太枠で示した配列要素に格納された分岐先情報の値1を読み出し、配列番号2を2倍した値に加えて配列番号5を求める処理である。
【0082】
図7Cは、分岐先情報によりリーフノード配列のノード参照番号を求める処理フロー例を説明する図であり、図7Aに示すステップS70n−1の詳細な処理フローを説明する図である。
【0083】
図に示すように、まずステップS721において、分岐先配列から、(n−1)段目のノードの配列番号の指す分岐先情報を読み出す。(n−1)段目のノードの配列番号は、図7AのステップS70n−2における処理で、設定されている。
【0084】
次にステップS722において、配列番号を2倍し、ステップS723において、配列番号にステップS711で得た分岐先情報を加えた値をリーフノード配列のノード参照番号に設定する。
【0085】
そしてさらにステップS724において、ステップS723で設定したリーフノード配列のノード参照番号からブランチノード配列のノード参照番号の最大値を減じた値をリーフノード配列のノード参照番号に設定して処理を終了する。
【0086】
上述の図7Cの処理は、図4に示す例示では、点線の矢印221iで示す処理である。
先に述べたように、ブランチノードとリーフノードを1つの配列に格納する場合は、ノード参照番号は一連の番号となるので、リーフノードの格納された配列要素のノード参照番号を求めるときに、ブランチノードを格納する最後の配列要素のノード参照番号を減じる必要はない。したがって、その場合には、図7Cに示すステップS724の処理は処理フローから削除される。
【0087】
図8は、本発明の一実施形態におけるビット列検索装置の機能ブロック構成例を説明する図である。
図8に例示する本実施態様に係るビット列検索装置800は、検索ツリー記憶手段810、検索開始位置設定手段820、検索キー設定手段850、分岐先情報設定実行部802、分岐先情報記憶手段812、初段ノード分岐先情報格納位置設定手段880、次段ノード分岐先情報格納位置計算実行部804、及びリーフノード出力実行部806を備えている。
【0088】
検索ツリー記憶手段810の記憶領域には配列が確保され、その配列に本発明の一実施形態に係るカップルドノードツリーが配置される。カップルドノードツリーは、図4に例示するように、ブランチノードを格納するブランチノード配列とリーフノードを格納するリーフノード配列に分離して配置することもできる。
検索開始位置設定手段820は、検索開始ノードのノード参照番号に、ルートノードのノード参照番号である1を設定するとともに、分岐先情報を格納する分岐先配列の配列番号に1を設定する。検索開始位置設定手段820の機能は、図6Aに示すステップS600の処理に対応する。また、検索キー設定手段850には、検索キーが設定される。
【0089】
分岐先情報設定実行部802は、ブランチノード読出手段8301〜830m及び分岐先情報抽出手段8601〜860mを含む。mは検索ツリー記憶手段810に格納されたブランチノードの数である。図4に示す例では、m=15である。
ブランチノード読出手段8301〜830mは、検索ツリー記憶手段810に配置されたブランチノード配列から、ノード参照番号の指す配列要素の内容を弁別ビット位置として読み出し、分岐先配列の配列番号とともに分岐先情報抽出手段に出力する。そして、分岐先配列の配列番号とブランチノード配列のノード参照番号にそれぞれ1を加えて次のブランチノード読出手段に出力する。
【0090】
分岐先情報抽出手段8601〜860mは、検索キー設定手段850に設定された検索キーから、ブランチノード読出手段8301〜830mが出力した弁別ビット位置の指すビット値を取り出し、該ビット値を、ブランチノード読出手段8301〜830mが出力した配列番号が指す分岐先配列の配列要素に、分岐先情報として設定する。ブランチノード読出手段8301と分岐先情報抽出手段8601の機能は、図6Aに示すステップS601の処理に対応する。同様に、ブランチノード読出手段830mと分岐先情報抽出手段860mまでの各ブランチノード読出手段と分岐先情報抽出手段の機能は、図6Aに示すステップS60mまでの各処理に対応する。
分岐先配列は、分岐先情報記憶手段812の記憶領域に確保される。
【0091】
初段ノード分岐先情報格納位置設定手段880は、分岐先配列の配列番号に1を設定する。初段ノード分岐先情報格納位置設定手段880の機能は、図7Aに示すステップS700の処理に対応する。
【0092】
次段ノード分岐先情報格納位置計算実行部804は、次段ノード分岐先情報格納位置計算算手段8401〜840n−2を含む。nは、カップルドノードツリーの段数である。
【0093】
次段ノード分岐先情報格納位置計算手段8401〜840n−2は、分岐先配列から、配列番号の指す分岐先情報を読み出し、配列番号を2倍し、2倍した配列番号に分岐先情報を加えた値を次段のノードに対応する分岐先情報の格納された分岐先配列の配列要素の配列番号として求める。次段ノード分岐先情報格納位置計算手段8401〜840n−2の機能は、図7Aに示すステップS701〜S70n−2の処理にそれぞれ対応する。
【0094】
次段ノード分岐先情報格納位置計算手段8401が分岐先情報を読み出すための配列番号は、初段ノード分岐先情報格納位置設定手段880が設定したものである。次段ノード分岐先情報格納位置計算手段8402〜840n−2が分岐先情報を読み出すための配列番号は、それぞれ前の段の次段ノード分岐先情報格納位置計算手段が求めた配列番号である。
次段ノード分岐先情報格納位置計算手段840n−2が求めた配列番号は、次に説明するリーフノード出力実行部806に入力され、リーフノードの読み出しに用いられる。
【0095】
リーフノード出力実行部806は、リーフノード格納位置計算手段8061及び検索結果出力手段8062を含む。
リーフノード格納位置計算手段8061は、次段ノード分岐先情報格納位置計算手段840n−2が求めた配列番号の指す分岐先情報を読み出し、配列番号を2倍し、2倍した配列番号に分岐先情報を加えた値をリーフノード配列の配列要素の仮のノード参照番号として求める。そして、仮のノード参照番号からブランチノード配列のノード参照番号の最大値、すなわち検索ツリー記憶手段810に格納されたブランチノードの数mを減じた値をリーフノード配列の配列要素のノード参照番号として求める。リーフノード格納位置計算手段8061の機能は、図7AのステップS70n−1、すなわち図7Cに示す処理に対応する。
【0096】
検索結果出力手段8062は、リーフノード格納位置計算手段8061が求めたリーフノード配列の配列要素のノード参照番号により、検索ツリー記憶手段810からリーフノードを読み出し、インデックスキーあるいはインデックスキーにアクセスするための情報を取り出す。リーフノードから取り出すものがインデックスキーであるときは、そのインデックスキーを検索結果キーとして出力する。リーフノードから取り出すものがインデックスキーにアクセスするための情報であるときは、取り出したインデックスキーにアクセスするための情報に基づき、インデックスキーを読み出して検索結果キーとして出力する。
また、検索結果キーと検索キーを比較し、一致すれば検索成功とし、一致しなければ検索失敗とする検索結果を出力することも可能である。
【0097】
次に、本発明の一実施形態に係るカップルドノードツリーの生成について説明する。なお、以下の説明において、本発明の一実施形態に係るカップルドノードツリーをポインタレスツリーといい、従来のカップルドノードツリーを単にツリー、あるいは変換前のツリーということがある。
本発明のポインタレスツリーの生成は、例えば次のようにして実現することができる。すなわち、ポインタレスツリーを生成する際には、ポインタレスツリーに格納されるインデックスキーにより、図1A及び図1Bに例示する形態のツリーが生成されているものとする。そして、ポインタレスツリーの生成は、ツリーのノードをルートノードから順次巡回し、本発明の一実施形態のノードに変換することにより、実現される。
ツリーの生成は、前記特許文献1として引用した特開2008−15872号公報の図5〜図8及びそれに関連した明細書の記載に開示され、詳細に説明されているので、ここでの説明は省略する。
【0098】
図9Aは、本発明の一実施形態におけるポインタレスツリーを生成する処理の前段の処理フロー例を説明する図である。図9Aに示すように、まずステップS901において、ポインタレスツリーを生成するための配列(ブランチノード配列とリーフノード配列)を取得し、ステップS902おいて、配列要素を初期化する。このステップS902の処理は、ダミーのブランチノードを用いるために必要となるものである。
【0099】
次にステップS902aにおいて変換前のツリーの最大段数を求め、ステップS902bにおいて該最大段数を段数カウンタの上限値に設定する。
ステップS1802aの処理の詳細については、後に図12A及び図12Bを参照して説明する。
【0100】
次にステップS903において、ブランチノード配列とリーフノード配列のベース番号を設定し、ステップS905において、段数カウンタに1を設定する。次にステップS906において、ノード参照番号に1を設定し、ステップS907において、配列番号に、ツリーのルートノードの配列番号を設定する。さらにステップS908において、探索経路スタックに配列番号と段数カウンタのカウント値を格納して図9Bに示すステップS913に進む。
【0101】
図9Bは、本発明の一実施形態におけるポインタレスツリーを生成する処理の後段の処理フロー例を示す図である。図9Bに示すように、ステップS913において、変換前のツリーが格納された配列から、配列番号の指す配列要素をノードとして読み出す。ステップS913の最初の処理においては、配列番号にはステップS907でルートノードの配列番号が設定されている。2回目以降の処理においては、後に説明するステップS928で設定される。以下の説明において、ステップS913で読み出されたノードを巡回開始ノードということがある。
【0102】
次にステップS915において、ステップS913で読み出したノードからノード種別を取り出し、ステップS916で、該取り出したノード種別はブランチノードを示すものか判定する。ステップS916の判定が、ノード種別はブランチノードを示すものではなくリーフノードを示すものであればステップS922に進み、ブランチノードを示すものであれば、ステップS916aに進む。
【0103】
ステップS916aでは、ノード参照番号をもとに、ブランチノード配列の配列要素にノードを書き込む。ステップS916aの処理の詳細は、後に図10を参照して説明する。
【0104】
次にステップS917において、段数カウンタに値1を加え、ステップS918に進み、ノード参照番号を2倍にする。さらにステップS919において、ステップS913で読み出したノードから、代表ノード番号を取り出し、ステップS920で、該取り出した代表ノード番号に値0を加えた値を配列番号に設定する。
そして、ステップS921において、探索経路スタックに、配列番号と段数カウンタのカウント値を格納してステップS913に戻る。ここで探索経路スタックに格納される配列番号は、ステップS920で代表ノード番号に値0を加えた値のものであるから、ノード[0]の配列番号である。
【0105】
上述のステップS913〜ステップS921のループ処理を、ステップS916においてノード種別がリーフノードを示すまで繰り返す。つまり、ひとまとまりの処理として、巡回開始ノードから最初のリーフノードまでノードを巡回してノードを読み出し、それを変換してポインタレスツリーのノードを書き込む。図9Bに示す処理フロー例では、ステップS920において、代表ノード番号に値0を加えて配列番号に設定していることから、ノード[0]側を優先してノードを巡回しているが、ノード[1]側を優先してノードを巡回することも可能であることは、以上の説明から当業者に明らかである。
【0106】
一方ステップS916において、ノード種別はブランチノードを示すものではなくリーフノードを示すものと判定され、ステップS922に進むと、ノード参照番号をもとに、リーフノード配列の配列要素にノードを書き込む。ステップS922の処理の詳細は、後に図11を参照して説明する。
【0107】
次にステップS923において、探索経路スタックのスタックポインタはツリーのルートノードの配列番号を指しているか判定する。
探索経路スタックのスタックポインタはツリーのルートノードの配列番号を指していれば、ツリーの全てのノードの処理は完了しているので処理を終了する。そうでなければ、ステップS924に進む。
【0108】
ステップS924では、探索経路スタックから配列番号と段数カウンタのカウント値を取り出し、探索経路スタックのスタックポインタを1つ減らす。次にステップS928において、ステップS924で取り出した配列番号に値1を加えて、巡回開始ノードの配列番号としてノード[1]の配列番号を得る。そして、ステップS930で、ノード参照番号に1を加えてステップS913に戻る。
【0109】
上述のステップS913〜ステップS930のループ処理を、ステップS923において探索経路スタックのスタックポインタがツリーのルートノードの配列番号を指していると判定されるまで繰り返すことにより、ツリー上のすべてのノードの巡回が行われ、各ノードがポインタレスツリーのノードに変換されてポインタレスツリーが生成される。
【0110】
図10は、本発明の一実施形態におけるブランチノードを生成する処理の処理フロー例を説明する図であり、図9Bに示すステップS916aの処理の詳細を説明する図である。
【0111】
図に示すように、まずステップS1025において、配列番号に、ノード参照番号にブランチノード配列のベース番号を加えた値を設定する。そしてステップS1026で、ノードから弁別ビット位置を取り出し、ステップS1027で、該弁別ビット位置に値1を加え、ステップS1028において、ステップS1025で設定した配列番号の指すブランチノード配列の配列要素に弁別ビット位置を書き込み、ブランチノードを生成して処理を終了する。
【0112】
図11は、本発明の一実施形態におけるリーフノードを生成する処理の処理フロー例を説明する図であり、図9Bに示すステップS922の処理の詳細を説明する図である。
【0113】
図に示すように、まずステップS1129において、ノード参照番号と段数カウンタを退避し、ステップS1130に進む。
ステップS1130では、段数カウンタは上限値か判定し、上限値でなければ、ステップS1131でノード参照番号を2倍し、ステップS1132で段数カウンタに値1を加えてステップS1130に戻る。
【0114】
上述のステップS1130〜S1132のループ処理は、リーフノードをポインタレスツリーの最下段のレベルに配置するためのものである。図1B、図2Bの例示では、例えば図1Bの変換前のツリーでは3段目にあるリーフノード210cは、図2Bでは5段目のノード210jに変換されている。そして、図2Bにおけるノード210cの位置情報は、図11のステップS1129の処理により、退避される。
【0115】
なお、段数カウンタの上限値については、図9Aに示すステップS902bで設定されているが、それに替えて、変換前のツリーを生成するときに、リーフノードを挿入するごとにそのリーフノードの段数をカウントし、その最大値をツリーの属性として記憶しておき、本発明の一実施形態のポインタレスツリーを生成するときに、その最大値を段数カウンタの上限値とすることができる。
【0116】
上述のステップS1130で、段数カウンタは上限値であると判定されると、ステップS1134に進む。ステップS1134では、段数カウンタの上限値から1を減じた値による2のべき乗数を求め、該べき乗数から1を減じた値とリーフノード配列のベース番号との和をノード参照番号から減じた値を、リーフノード配列の配列番号に設定する。図2Bの例示では、段数カウンタの上限値は5であり、該上限値から1を減じた値による2のべき乗数は16となる。この値から1を減じた値15は、ブランチノード配列に配置されたブランチノードの数になる。ここでノード参照番号はブランチノード配列のノード参照番号であるから、このノード参照番号から15を減じた値は図4の例示で説明したように、リーフノード配列のノード参照番号である。そして、ノード参照番号とベース番号の和により、配列番号が求められる。
【0117】
そしてステップS1135で、図9Bに示すステップS913で読み出されているノードからインデックスキーを取り出し、ステップS1136で、該インデックスキーの最上位のビット位置にビット値“0”を挿入し、ステップS1137において、ステップS1134で設定した配列番号の指すリーフノード配列の配列要素にインデックスキーを書き込み、リーフノードを生成してステップS1138に進む。
ステップS1138では、ノード参照番号と段数カウンタに、ステップS1129で退避したノード参照番号と段数カウンタをそれぞれ設定して処理を終了する。
【0118】
次に、変換前のツリーの最大段数を求める処理について図12A及び図12Bを参照して説明する。図12A及び図12Bに示す処理フロー例は、図9Aに示すステップS902aの処理の詳細を説明するものである。
図12Aは、変換前のツリーの最大段数を求める処理の前段の処理フロー例を説明する図である。
【0119】
図12Aに示すように、まずステップS1201において、段数カウンタに値1を設定し、ステップS1202において、最大段数カウンタに、段数カウンタに設定された値を設定する。すなわち、段数カウンタ及び最大段数カウンタには、初期値として値1が設定される。
次にステップS1207において、配列番号に、ツリーのルートノードの配列番号を設定して図12Bに示すステップS1213に進む。
【0120】
図12Bは、変換前のツリーの最大段数を求める処理の前段の処理フロー例を説明する図である。図12Bに示すように、ステップS1213において、変換前のツリーが格納された配列から、配列番号の指す配列要素をノードとして読み出す。ステップS1213の最初の処理においては、配列番号にはステップS1207でルートノードの配列番号が設定されている。2回目以降の処理においては、後に説明するステップS1228で設定される。図9Bにおける説明と同様に、以下の説明において、ステップS1213で読み出されたノードを巡回開始ノードということがある。
【0121】
次にステップS1215において、ステップS1213で読み出したノードからノード種別を取り出し、ステップS1216で、該取り出したノード種別はブランチノードを示すものか判定する。ステップS1216の判定が、ノード種別はブランチノードを示すものではなくリーフノードを示すものであればステップS1221に進み、ブランチノードを示すものであれば、ステップS1217に進む。
【0122】
ステップS1217では、段数カウンタに値1を加え、ステップS1219に進み、ステップS1213で読み出したノードから、代表ノード番号を取り出し、ステップS1220で、該取り出した代表ノード番号に値0を加えた値を配列番号に設定する。
そして、ステップS1220aにおいて、探索経路スタックに、配列番号と段数カウンタのカウント値を格納してステップS1213に戻る。ここで探索経路スタックに格納される配列番号は、ステップS1220で代表ノード番号に値0を加えた値のものであるから、ノード[0]の配列番号である。
【0123】
上述のステップS1213〜ステップS1220aのループ処理を、ステップS1216においてノード種別がリーフノードを示すまで繰り返す。つまり、ひとまとまりの処理として、巡回開始ノードから最初のリーフノードまでノードを巡回してリーフノードの段数を求める。図12Bに示す処理フロー例では、ステップS1220において、代表ノード番号に値0を加えて配列番号に設定していることから、ノード[0]側を優先してノードを巡回しているが、ノード[1]側を優先してノードを巡回することも可能であることは、以上の説明から当業者に明らかである。
【0124】
一方ステップS1216において、ノード種別はブランチノードを示すものではなくリーフノードを示すものと判定されると、ステップS1221に進み、段数カウンタのカウント値は最大段数カウンタに設定された値より大きいか判定する。ステップS1216の判定結果が、段数カウンタのカウント値は最大段数カウンタに設定された値より大きい、であれば、ステップS1222で、最大段数カウンタに、段数カウンタのカウント値を設定してステップS1223に進み、前記判定結果が、段数カウンタのカウント値は最大段数カウンタに設定された値より大きくない、であれば、ステップS1223に進む。
【0125】
ステップS1223では、探索経路スタックのスタックポインタはツリーのルートノードの配列番号を指しているか判定する。
探索経路スタックのスタックポインタはツリーのルートノードの配列番号を指していれば、ツリーの全てのリーフノードについての段数の処理は完了しているので処理を終了する。そうでなければ、ステップS1224に進む。
【0126】
ステップS1224では、探索経路スタックから配列番号と段数カウンタのカウント値を取り出し、探索経路スタックのスタックポインタを1つ減らす。次にステップS1228において、ステップS1224で取り出した配列番号に値1を加えて、巡回開始ノードの配列番号としてノード[1]の配列番号を得てステップS1213に戻る。
【0127】
上述のステップS1213〜ステップS1228のループ処理を、ステップS1223において探索経路スタックのスタックポインタがツリーのルートノードの配列番号を指していると判定されるまで繰り返すことにより、ツリー上のすべてのノードの巡回が行われ、ツリーの最大段数が求められる。
【0128】
以上本発明を実施するための形態について詳細に説明したが、本発明の実施の形態はそれに限ることなく種々の変形が可能であることは当業者に明らかである。
また、本発明の一実施形態に係るビット列検索装置が、図5〜図7Cに例示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
【符号の説明】
【0129】
100、400 配列
101 ノード
102 ノード種別
103、403 弁別ビット位置
104 代表ノード番号
118、418 インデックスキー
200、200b カップルドノードツリー
210a、401 ルートノード
280 検索キー
301 データ処理装置
302 中央処理装置
303 キャッシュメモリ
304 バス
305 主記憶装置
306 外部記憶装置
307 通信装置
308 データ格納装置
309 配列
309a ブランチノード配列
309b リーフノード配列
310 探索経路スタック
311 分岐先配列
700a、700b ベース番号
720a、720b ノード参照番号
730a、730b 配列番号
800 ビット列検索装置
802 分岐先情報設定実行部
804 次段ノード分岐先情報格納位置計算実行部
806 リーフノード出力実行部
810 検索ツリー記憶手段
812 分岐先情報記憶手段
820 検索開始位置設定手段

【特許請求の範囲】
【請求項1】
ビット列からなる検索キーにより、検索対象であるビット列からなるインデックスキーあるいは該インデックスキーにアクセスするための情報が格納されたツリーのデータ構造に基づいて、前記インデックスキーを検索するビット列検索装置において、
前記インデックスキーは、本来のインデックスキーのある特定のビット位置に特定のビット値を挿入したものであり、
前記検索キーは、本来の検索キーの、前記本来のインデックスキーと同一の特定のビット位置に前記特定のビット値を挿入したものであり、
前記ツリーは配列に記憶され、n段目(nは正整数)までのツリーの構成要素を有するものであり、
該ツリーの始点であるルートノードであって、ノード参照番号1に、前記配列の先頭の配列要素の位置を定める番号であるベース番号を加えた値の配列番号の配列要素に配置されるルートノードと、前記配列の隣接した配列要素に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ブランチノードは、前記検索キーの弁別ビット位置を格納する領域を含むが、ブランチノードとリーフノードを識別するノード種別を格納する領域、リンク先である直近下位のノード対の代表ノードの配置された配列要素の配列番号を格納する領域、及び前記インデックスキーあるいは該インデックスキーにアクセスするための情報を格納する領域を含まないものであり、前記リーフノードは、前記インデックスキーあるいは該インデックスキーにアクセスするための情報を格納する領域を含むが、前記ノード種別を格納する領域、及び前記検索キーの弁別ビット位置を格納する領域を含まないものであって、前記代表ノードは該代表ノードの直近上位のブランチノードのノード参照番号の2倍の値のノード参照番号に、前記ベース番号を加えた値の配列番号の配列要素に配置され、前記リーフノードはn段目にのみ位置する、カップルドノードツリーを記憶する検索ツリー記憶手段と、
前記検索キーの、各ブランチノードの前記弁別ビット位置と一致するビット位置のビット値を分岐先情報として前記ブランチノードに対応して格納する分岐先配列を記憶する分岐先情報記憶手段と、
前記検索ツリー記憶手段に記憶されたカップルドノードツリーからブランチノードをノード参照番号順に読み出し、該ブランチノードの弁別ビット位置と前記検索キーにより前記分岐先情報を抽出して前記分岐先配列の配列番号1の配列要素から順次各配列要素に設定する分岐先情報設定実行部と、
前記分岐先配列に設定された配列番号1の配列要素に格納された分岐先情報を前記カップルドノードツリーの第1段のノードの分岐先情報として読み出し、該読み出した分岐先情報に前記配列番号1を2倍した値を加えて得られる値を、前記カップルドノードツリーの第2段のノードの分岐先情報が格納された前記分岐先配列の配列要素の配列番号とし、以下、第2段のノードの分岐先情報に該第2段のノードの分岐先情報が格納された前記配列要素の配列番号を2倍した値を加えて得られる値を、前記カップルドノードツリーの第3段のノードの分岐先情報が格納された前記分岐先配列の配列要素の配列番号とするように、自段のノードの分岐先情報に該自段のノードの分岐先情報が格納された前記配列要素の配列番号を2倍した値を加えて得られる値を、前記カップルドノードツリーの次段のノードの分岐先情報が格納された前記分岐先配列の配列要素の配列番号とすることを前記カップルドノードツリーの第n−2段のノードまで繰り返して前記カップルドノードツリーの第n−1段のノードの分岐先情報の格納された前記分岐先配列の配列要素の配列番号を求める次段ノード分岐先情報格納位置計算実行部と、
前記次段ノード分岐先情報格納位置計算実行部が求めた配列番号により、前記分岐先配列から前記カップルドノードツリーの第n−1段のノードの分岐先情報を読み出し、該読み出した分岐先情報と該配列番号に基づいてリーフノードの格納位置を求め、前記検索ツリー記憶手段に記憶されたカップルドノードツリーから該格納位置に格納されたリーフノードを読み出すリーフノード出力実行部と、
を備えることを特徴とするビット列検索装置
【請求項2】
請求項1記載のビット列検索装置において、
前記カップルドノードツリーを記憶する配列は、ブランチノードを記憶するブランチノード配列とリーフノードを記憶するリーフノード配列から構成され、該ブランチノード配列は、前記カップルドノードツリーを記憶する配列のうち、前記カップルドノードツリーのn−1段目までのツリーの構成要素を記憶する部分と一致するものであり、
前記リーフノード出力実行部は、前記次段ノード分岐先情報格納位置計算実行部が求めた配列番号により、前記分岐先配列から前記カップルドノードツリーの第n−1段のノードの分岐先情報を読み出し、該読み出した分岐先情報と該配列番号を2倍した値の和から前記ブランチノード配列のノード参照番号の最大値を減じたリーフノード配列のノード参照番号を求め、該リーフノード配列のノード参照番号に該リーフノード配列の先頭の配列要素の位置を定める番号であるベース番号を加えた値の配列番号を前記リーフノードの格納位置として求め、前記検索ツリー記憶手段に記憶されたカップルドノードツリーから該格納位置に格納されたリーフノードを読み出し、該リーフノードからインデックスキーを読み出す、あるいはインデックスキーにアクセスするための情報に基づき当該インデックスキーを読み出すことを特徴とするビット列検索装置。
【請求項3】
請求項1記載のビット列検索装置が実行するビット列検索方法において、
前記検索ツリー記憶手段に記憶されたカップルドノードツリーからブランチノードをノード参照番号順に読み出し、該ブランチノードの弁別ビット位置と前記検索キーにより前記分岐先情報を抽出して前記分岐先配列の配列番号1の配列要素から順次各配列要素に設定する分岐先情報設定ステップと、
前記分岐先配列に設定された配列番号1の配列要素に格納された分岐先情報を前記カップルドノードツリーの第1段のノードの分岐先情報として読み出し、該読み出した分岐先情報に前記配列番号1を2倍した値を加えて得られる値を、前記カップルドノードツリーの第2段のノードの分岐先情報が格納された前記分岐先配列の配列要素の配列番号とし、以下、第2段のノードの分岐先情報に該第2段のノードの分岐先情報が格納された前記配列要素の配列番号を2倍した値を加えて得られる値を、前記カップルドノードツリーの第3段のノードの分岐先情報が格納された前記分岐先配列の配列要素の配列番号とするように、自段のノードの分岐先情報に該自段のノードの分岐先情報が格納された前記配列要素の配列番号を2倍した値を加えて得られる値を、前記カップルドノードツリーの次段のノードの分岐先情報が格納された前記分岐先配列の配列要素の配列番号とすることを前記カップルドノードツリーの第n−2段のノードまで繰り返して前記カップルドノードツリーの第n−1段のノードの分岐先情報の格納された前記分岐先配列の配列要素の配列番号を求める次段ノード分岐先情報格納位置計算ステップと、
前記次段ノード分岐先情報格納位置計算ステップで求めた配列番号により、前記分岐先配列から前記カップルドノードツリーの第n−1段のノードの分岐先情報を読み出し、該読み出した分岐先情報と該配列番号に基づいてリーフノードの格納位置を求め、前記検索ツリー記憶手段に記憶されたカップルドノードツリーから該格納位置に格納されたリーフノードを読み出すリーフノード出力ステップと、
を備えることを特徴とするビット列検索方法。
【請求項4】
請求項3記載のビット列検索方法において、
前記カップルドノードツリーを記憶する配列は、ブランチノードを記憶するブランチノード配列とリーフノードを記憶するリーフノード配列から構成され、該ブランチノード配列は、前記カップルドノードツリーを記憶する配列のうち、前記カップルドノードツリーのn−1段目までのツリーの構成要素を記憶する部分と一致するものであり、
前記リーフノード出力ステップは、前記次段ノード分岐先情報格納位置計算ステップで求めた配列番号により、前記分岐先配列から前記カップルドノードツリーの第n−1段のノードの分岐先情報を読み出し、該読み出した分岐先情報と該配列番号を2倍した値の和から前記ブランチノード配列のノード参照番号の最大値を減じたリーフノード配列のノード参照番号を求め、該リーフノード配列のノード参照番号に該リーフノード配列の先頭の配列要素の位置を定める番号であるベース番号を加えた値の配列番号を前記リーフノードの格納位置として求め、前記前記検索ツリー記憶手段に記憶されたカップルドノードツリーから該格納位置に格納されたリーフノードを読み出し、該リーフノードからインデックスキーを読み出す、あるいはインデックスキーにアクセスするための情報に基づき当該インデックスキーを読み出すことを特徴とするビット列検索方法。
【請求項5】
請求項3又は請求項4記載のビット列検索方法をコンピュータに実行させることを特徴とするプログラム。
【請求項6】
請求項3又は請求項4記載のビット列検索方法をコンピュータに実行させるプログラムを記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。

【図1A】
image rotate

【図1B】
image rotate

【図2A】
image rotate

【図2B】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6A】
image rotate

【図6B】
image rotate

【図7A】
image rotate

【図7B】
image rotate

【図7C】
image rotate

【図8】
image rotate

【図9A】
image rotate

【図9B】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12A】
image rotate

【図12B】
image rotate


【公開番号】特開2011−248626(P2011−248626A)
【公開日】平成23年12月8日(2011.12.8)
【国際特許分類】
【出願番号】特願2010−121153(P2010−121153)
【出願日】平成22年5月27日(2010.5.27)
【出願人】(506235616)株式会社エスグランツ (32)
【Fターム(参考)】