JP2009134744A - ビット列検索装置 - Google Patents

ビット列検索装置 Download PDF

Info

Publication number
JP2009134744A
JP2009134744A JP2009018907A JP2009018907A JP2009134744A JP 2009134744 A JP2009134744 A JP 2009134744A JP 2009018907 A JP2009018907 A JP 2009018907A JP 2009018907 A JP2009018907 A JP 2009018907A JP 2009134744 A JP2009134744 A JP 2009134744A
Authority
JP
Japan
Prior art keywords
node
array element
stored
array
key
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2009018907A
Other languages
English (en)
Other versions
JP4813575B2 (ja
Inventor
Toshio Shinjo
敏男 新庄
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
S Grants Co Ltd
Original Assignee
S Grants Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by S Grants Co Ltd filed Critical S Grants Co Ltd
Priority to JP2009018907A priority Critical patent/JP4813575B2/ja
Publication of JP2009134744A publication Critical patent/JP2009134744A/ja
Application granted granted Critical
Publication of JP4813575B2 publication Critical patent/JP4813575B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

【課題】記憶容量が小さく検索速度が高速でデータメンテナンスの容易なビット列検索装置を提供する。
【解決手段】インデックスキーの集合のインデックスキーを検索キーとしてリーフノードを検索し、リーフノードに至るリンク経路のブランチノードとリーフノードが格納された配列番号をスタックに格納し、検索キーとリーフノードに含まれるインデックスキーの間で大小比較とビット列比較をし、ビット列比較で異なるビット値となる先頭のビット位置とスタックに格納されているブランチノードの弁別ビット位置の相対的位置関係で挿入するインデックスキーを含むリーフノードのノード対の挿入位置を決定し、大小関係で挿入するインデックスキーを含むリーフノードがノード対のどちらのノードかを決定することを、インデックスキーの集合に含まれるインデックスキーについて繰り返して生成したカップルドノードツリーを用いる。
【選択図】図8

Description

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

Claims (1)

  1. ビット列からなる検索キーにより検索対象であるビット列からなるインデックスキーが格納されたツリーのデータ構造に基づいて前記インデックスキーを検索するビット列検索装置において、
    配列に記憶され、ツリーの始点であるルートノードと、前記配列の隣接した配列要素に配置される2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の一方のノードが格納された前記配列の配列要素の配列番号を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを格納する領域を含むが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の一方のノードが格納された前記配列の配列要素の配列番号を格納する領域を含まないものである、カップルドノードツリーであって、
    前記ビット列検索装置が、
    前記カップルドノードツリーに格納するインデックスキーの集合から1つのインデックスキーを取り出し、該インデックスキーを含むリーフノードをルートノードとするカップルドノードツリーを生成し、
    前記インデックスキーの集合からさらに順次インデックスキーを取り出して該インデックスキーを前記検索キーとして、
    前記ルートノードのノード種別を読み出し、該読みだしたノード種別を判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードからインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードからインデックスキーを読み出すとともに、該リーフノードに至るまでたどったリンク経路のブランチノード及び該リーフノードが格納された配列要素の配列番号をスタックに順次格納し、
    前記リーフノードから読み出したインデックスキーと前記検索キーの間で大小比較とビット列比較を行い、
    前記配列からノード対を格納する空配列要素の組を取得し、その一方の配列要素の配列番号を取得し、
    前記大小比較により検索キーを含むリーフノードを前記取得した空配列要素の組のどちらの空配列要素に格納するかを決定し、
    前記ビット列比較で異なるビット値となる先頭のビット位置と、前記スタックに格納されている配列番号の配列要素に記憶されたブランチノードの弁別ビット位置との相対的位置関係により、該スタックに格納されている配列番号を読み出し、該配列番号の配列要素に格納されるノードを、前記取得した空配列要素の組に格納されるノード対のリンク元として該ノード対の挿入位置を決定し、
    前記決定した空配列要素に配置するリーフノードの、ノード種別を格納する領域にリーフノードであることを示すノード種別を、インデックスキーを格納する領域に前記検索キーを書き込み、もう一方の空配列要素に、前記スタックから読み出した配列番号の配列要素に格納されるノードの内容を読み出して書き込むことで挿入ノード対を生成し、
    前記スタックから読み出した配列番号の配列要素に格納されるノードをブランチノードとし、そのノード種別を格納する領域にブランチノードであることを示すノード種別を、弁別ビット位置を格納する領域に前記ビット列比較で異なるビット値となる先頭のビット位置を、リンク先のノード対の一方のノードが格納された前記配列の配列要素の配列番号を格納する領域に前記取得した配列番号を、それぞれ書き込むことを、前記インデックスキーの集合に含まれるインデックスキーについて繰り返すことにより生成したカップルドノードツリーと、
    前記ルートノードが格納された前記配列の配列要素の配列番号を取得し、該取得した配列番号の配列要素からルートノードを読み出すルートノード読出手段と、
    前記ノードのノード種別を読み出し、該ノード種別が前記リーフノードを示すものであるかブランチノードを示すものであるかを判定するノード種別判定手段と、
    前記リーフノードのインデックスキーを格納する領域から当該インデックスキーを読み出すインデックスキー読出手段と、
    前記ブランチノードの弁別ビット位置を格納する領域とリンク先のノード対の一方のノードが格納された前記配列の配列要素の配列番号を格納する領域からそれぞれ当該弁別ビット位置とリンク先のノード対の一方のノードが格納された前記配列の配列要素の配列番号を読み出し、該読み出した弁別ビット位置の前記検索キーのビット値と前記読み出したリンク先のノード対の一方のノードが格納された前記配列の配列要素の配列番号との演算によりノードが格納された前記配列の配列要素の配列番号を求め、該求めた配列番号の配列要素に配置されたノードをリンク先ノードとして読み出すリンク手段と、
    を備え、
    前記ルートノード読出手段でルートノードのノード種別を読み出し、該読みだしたノード種別を前記ノード種別判定手段で判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードから前記インデックスキー読出手段によりインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンク手段により前記リンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を前記ノード種別判定手段で判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードから前記インデックスキー読出手段によりインデックスキーを読み出すとともに、該リーフノードに至るまでたどったリンク経路のブランチノード及び該リーフノードが格納された配列要素の配列番号をスタックに順次格納する検索ステップと、
    前記インデックスキー読出手段により読み出されたインデックスキーと前記検索キーを比較し、一致すれば検索成功とし、一致しなければ検索失敗とすることを特徴とするビット列検索装置。
JP2009018907A 2009-01-30 2009-01-30 ビット列検索装置 Expired - Fee Related JP4813575B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009018907A JP4813575B2 (ja) 2009-01-30 2009-01-30 ビット列検索装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009018907A JP4813575B2 (ja) 2009-01-30 2009-01-30 ビット列検索装置

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2006187827A Division JP4271214B2 (ja) 2006-07-07 2006-07-07 ビット列検索装置、検索方法及びプログラム

Publications (2)

Publication Number Publication Date
JP2009134744A true JP2009134744A (ja) 2009-06-18
JP4813575B2 JP4813575B2 (ja) 2011-11-09

Family

ID=40866511

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009018907A Expired - Fee Related JP4813575B2 (ja) 2009-01-30 2009-01-30 ビット列検索装置

Country Status (1)

Country Link
JP (1) JP4813575B2 (ja)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07210569A (ja) * 1994-01-19 1995-08-11 Oki Electric Ind Co Ltd 情報検索方法および情報検索装置
JP2001357070A (ja) * 2000-06-13 2001-12-26 Nec Corp 情報検索方法及び装置
JP2003224581A (ja) * 2002-01-31 2003-08-08 Nippon Telegr & Teleph Corp <Ntt> 最長一致検索回路および方法およびプログラムおよび記録媒体

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07210569A (ja) * 1994-01-19 1995-08-11 Oki Electric Ind Co Ltd 情報検索方法および情報検索装置
JP2001357070A (ja) * 2000-06-13 2001-12-26 Nec Corp 情報検索方法及び装置
JP2003224581A (ja) * 2002-01-31 2003-08-08 Nippon Telegr & Teleph Corp <Ntt> 最長一致検索回路および方法およびプログラムおよび記録媒体

Also Published As

Publication number Publication date
JP4813575B2 (ja) 2011-11-09

Similar Documents

Publication Publication Date Title
JP4271214B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4514771B2 (ja) カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
JP4271227B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4439013B2 (ja) ビット列検索方法及び検索プログラム
JP4527753B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4402120B2 (ja) ビット列検索装置、検索方法及びプログラム
CN101657818B (zh) 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质
JP5473893B2 (ja) コード列検索装置、検索方法及びプログラム
US8166043B2 (en) Bit strings search apparatus, search method, and program
JP2011018296A (ja) カップルドノードツリーのインデックスキー挿入/削除方法
WO2009122651A1 (ja) ビット列検索装置、検索方法及びプログラム
JP4567754B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4813575B2 (ja) ビット列検索装置
EP2149845A1 (en) Coupled node tree save/restore method, longest consistence/shortest consistence retrieval method, bit retrieval method and memory medium
JP4417431B2 (ja) カップルドノードツリーの分割/結合方法及びプログラム
JP5220057B2 (ja) ビット列検索装置、検索方法及びプログラム
WO2009093290A1 (ja) ビット列検索装置、検索方法及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090702

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110705

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110727

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110823

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110824

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 4813575

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140902

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140902

Year of fee payment: 3

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140902

Year of fee payment: 3

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees