JP4439013B2 - ビット列検索方法及び検索プログラム - Google Patents

ビット列検索方法及び検索プログラム Download PDF

Info

Publication number
JP4439013B2
JP4439013B2 JP2007114915A JP2007114915A JP4439013B2 JP 4439013 B2 JP4439013 B2 JP 4439013B2 JP 2007114915 A JP2007114915 A JP 2007114915A JP 2007114915 A JP2007114915 A JP 2007114915A JP 4439013 B2 JP4439013 B2 JP 4439013B2
Authority
JP
Japan
Prior art keywords
node
search
storing
key
array element
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.)
Expired - Fee Related
Application number
JP2007114915A
Other languages
English (en)
Other versions
JP2008269503A (ja
JP2008269503A5 (ja
Inventor
敏男 新庄
光裕 國分
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 JP2007114915A priority Critical patent/JP4439013B2/ja
Priority to PCT/JP2008/000983 priority patent/WO2008132806A1/ja
Priority to EP08738589.4A priority patent/EP2149845B1/en
Priority to CN2008800122779A priority patent/CN101657818B/zh
Priority to TW097114278A priority patent/TW200846955A/zh
Publication of JP2008269503A publication Critical patent/JP2008269503A/ja
Priority to US12/588,522 priority patent/US8250076B2/en
Publication of JP2008269503A5 publication Critical patent/JP2008269503A5/ja
Application granted granted Critical
Publication of JP4439013B2 publication Critical patent/JP4439013B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/31Indexing; Data structures therefor; Storage structures
    • G06F16/316Indexing structures
    • G06F16/322Trees

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明はビット列の集合から所望のビット列を検索する技術に関するものであり、特にビット列を記憶するデータ構造に工夫をして、検索速度等の向上を図る技術分野のものである。
近年、社会の情報化が進展し、大規模なデータベースが各所で利用されるようになってきている。このような大規模なデータベースからレコードを検索するには、各レコードの記憶されたアドレスと対応づけられたレコード内の項目をインデックスキーとして検索をし、所望のレコードを探し出すことが通例である。また、全文検索における文字列も、文書のインデックスキーと見なすことができる。
そして、それらのインデックスキーはビット列で表現されることから、データベースの検索はビット列の検索に帰着されるということができる。
上記ビット列の検索を高速に行うために、ビット列を記憶するデータ構造を種々に工夫することが従来から行われている。このようなものの一つとして、パトリシアツリーという木構造が知られている。
図13は、上述の従来の検索処理に用いられているパトリシアツリーの一例を示すものである。パトリシアツリーのノードは、インデックスキー、検索キーの検査ビット位置、左右のリンクポインタを含んで構成される。明示はされていないが、ノードにはインデックスキーに対応するレコードにアクセスするための情報が含まれていることは勿論である。
図13の例では、インデックスキー“100010”を保持するノード1750aがルートノードとなっており、その検査ビット位置1730aは0である。ノード1750aの左リンク1740aにはノード1750bが接続され、右リンク1741aにはノード1750fが接続されている。
ノード1750bの保持するインデックスキーは“010011”であり、検査ビット位置1730bは1である。ノード1750bの左リンク1740bにはノード1750cが、右リンク1741bにはノード1750dが接続されている。ノード1750cが保持するインデックスキーは“000111”、検査ビット位置1730cは3である。ノード1750dが保持するインデックスキーは“011010”、検査ビット位置1730dは2である。
ノード1750cから実線で接続された部分はノード1750cの左右のリンクポインタを示すものであり、点線の接続されていない左ポインタ1740cは、その欄が空欄であることを示している。点線の接続された右ポインタ1741cの点線の接続先は、ポインタの示すアドレスを表しており、今の場合ノード1750cを右ポインタ1741cが指定していることを表している。
ノード1750dの右ポインタ1741dはノード1750d自身を指しており、左リンク1740dにはノード1750eが接続されている。1750eの保持するインデックスキーは“010010”、検査ビット位置1730eは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を指している。
図13の例では、ルートノード1750aからツリーを降りるにしたがって、各ノードの検査ビット位置が大きくなるように構成されている。
ある検索キーで検索を行うとき、ルートノードから順次各ノードに保持される検索キーの検査ビット位置を検査していき、検査ビット位置のビット値が1であるか0であるか判定を行い、1であれば右リンクをたどり、0であれば左リンクをたどる。そして、リンク先のノードの検査ビット位置がリンク元のノードの検査ビット位置より大きくなければ、すなわち、リンク先が下方でなく上方に戻れば(図13において点線で示されたこの逆戻りのリンクをバックリンクという)、リンク先のノードのインデックスキーと検索キーの比較を行う。比較の結果、等しければ検索成功であり、等しくなければ検索失敗であることが保証されている。
上記のように、パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は1回ですむことなどのメリットがあるが、各ノードからの2つのリンクが必ずあることにより記憶容量が増大することや、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
これらのパトリシアツリーの欠点を解消しようとするものとして、例えば下記特許文献1に開示された技術がある。下記特許文献1に記載されたパトリシアツリーにおいては、下位の左右のノードは連続した領域に記憶することによりポインタの記憶容量を削減するとともに、次のリンクがバックリンクであるか否かを示すビットを各ノードに設けることにより、バックリンクの判定処理を軽減している。
しかしながら、下記特許文献1に開示されたものにおいても、1つのノードは必ずインデックスキーの領域とポインタの領域を占めること、下位の左右のノードを連続した領域に記憶するようにしてポインタを1つとしたため、例えば図13に示したパトリシアツリーの最下段の部分である左ポインタ1740c、右ポインタ1741h等の部分にもノードと同じ容量の記憶領域を割り当てる必要があるなど、記憶容量の削減効果はあまり大きいものではない。また、バックリンクによる検索処理の遅延の問題や追加削除等の処理が困難であることも改善されていない。
上述の従来の検索手法における問題点を解決するものとして、本出願人は、特願2006−187827(以下「先の出願」と呼ぶ)において、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対からなるビット列検索に用いるツリーであって、ルートノードはツリーの始点を表すノードであって、該ツリーのノードが1つのときはリーフノード、ツリ
ーのノードが2つ以上のときは前記ブランチノードであり、前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す位置情報を含み、前記リーフノードは検索対象のビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索を提案した。また、上記先の出願には、与えられたインデックスキーを含むリーフノードの挿入を繰り返すことにより与えられたインデックスキーの集合からカップルドノードツリーを生成する方法と、指定された削除キーをインデックスキーとするノードをカップルドノードツリーから削除する方法も示されている。
このカップルドノードツリーには、必要な記憶容量がパトリシアツリーに比べて少なく、高速な検索を可能とする構造であり、ノードの挿入や削除が低コストで実行可能であるという特徴がある。また、上記先の出願には、それぞれ同じ容量の記憶領域が割り当てられた配列要素からなる配列を利用して、カップルドノードツリーの個々のノードを配列要素に記憶し、位置情報として配列番号を利用することにより、位置情報に要するビット数を削減する実施形態が示されている。
特開2001−357070号公報
上記のようなカップルドノードツリーに対して、配列要素の容量を定めた後でその容量の記憶領域に格納しきれない長いインデックスキーを利用しようとした場合に、そのインデックスキーに対応するリーフノードをカップルドノードツリーに効率よく挿入することが望まれる。また、インデックスキーが長い場合に、ブランチノードには過剰な記憶領域を割り当てないようにして記憶領域を有効利用することも望まれる。
そこで本発明の目的は、インデックスキーの長さが予め決められている必要がなく、長いインデックスキーを利用する場合にも有効に記憶領域を利用することが可能なように、カップルドノードツリーの構造を改良することである。また、そのように改良されたカップルドノードツリーを検索する方法、指定されたインデックスキーに対応するノードを該カップルドノードツリーに挿入する方法、及び指定されたインデックスキーに対応するノードを該カップルドノードツリーから削除する方法を提供することも、本発明の目的である。
本発明によれば、以下のデータ構造を持つカップルドノードツリーが提供され、そのカップルドノードツリーを用いてインデックスキーの検索が行われる。また、本発明によれば、指定されたインデックスキーに対応するリーフノードの挿入や削除をそのカップルドノードツリーに対して行う方法が提供される。
本発明のカップルドノードツリーは、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノードまたはブランチノード同士またはリーフノード同士のノード対、からなる。
前記ルートノードは、ツリーの始点を表すノードであって、該ツリーのノードが1つのときは前記リーフノード、ツリーのノードが2つ以上のときは前記ブランチノードである。前記ブランチノードは、ビット列検索を行う検索キーの弁別ビット位置とリンク先のノード対の一方のノードである代表ノードの位置を示す第一の位置情報を含む。前記リーフノードは、検索対象のビット列からなるインデックスキーを格納した記憶領域の位置を示す第二の位置情報を含む。
前記カップルドノードツリーの任意のノードを検索開始ノードとすることにより、前記検索開始ノードをルートノードとする前記カップルドノードツリーの任意の部分木を検索対象として、前記検索キーによる検索を実行することができる。その検索は、前記ブランチノードにおいて該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の代表ノードかあるいはそれと隣接した記憶領域に配置されたノードにリンクすることを順次前記リーフノードに至るまで繰り返すことにより行われ、前記リーフノードに含まれる前記第二の位置情報が示す記憶領域に格納されたインデックスキーが、検索結果キーとして得られる。
挿入キーとして指定された新たなビット列からなるインデックスキーを格納する記憶領域の位置を示す情報を含むリーフノードを前記カップルドノードツリーに挿入するには、まず、前記ルートノードを前記検索開始ノードとし、前記挿入キーを前記検索キーとして、前記ルートノードから前記検索結果キーに対応する前記リーフノードに至る経路を記憶しながら上記の検索を実行する。そして、前記挿入キーと前記検索結果キーの間で大小比較とビット列比較を行う。ビット列比較で異なるビット値となる先頭のビット位置と、前記経路上のブランチノードの弁別ビット位置との相対的位置関係により、挿入される前記リーフノードともう一方のノードからなるノード対の挿入位置を決定する。また、前記大小関係により挿入される前記リーフノードを挿入される前記ノード対のどちらのノードとするかを決定する。さらに、前記挿入キーを格納する記憶領域の位置を示す情報を前記第二の位置情報として前記リーフノードに格納する。
削除キーとして指定されたビット列からなるインデックスキーを格納する記憶領域の位置を示す情報を含むリーフノードを前記カップルドノードツリーから削除するには、まず、前記ルートノードを前記検索開始ノードとし、前記削除キーを前記検索キーとして、上記の検索を実行する。そして、前記検索結果キーに対応する前記リーフノードと対をなすもう一方のノードを、当該ノード対のリンク元のブランチノードに格納する。
本発明によるカップルドノードツリーは、高速な検索を可能とする構造を有し、ノードの挿入や削除が低コストで実行可能であるという、先の出願のカップルドノードツリーの特徴を引き継いでいる。また、前記先の出願のカップルドノードツリーは必要な記憶容量が少ないという特徴を有するが、本発明によるカップルドノードツリーは記憶領域をさらに有効に利用することが可能なように、構造が改良されている。
本発明によれば、インデックスキーの記憶領域がノードの記憶領域から分離されている。よって、予めノードの記憶容量が定められても、利用可能なインデックスキーの長さがその記憶容量により直接制限されるわけではない。また、長いインデックスキーを利用する場合でも各ノードに必要な記憶容量がそれに比例して増えることはないので、各ノードに同じ大きさの記憶領域を割り当てる態様においても、記憶領域が無駄に使われることはない。
以下、本発明を実施するための最良の形態として、カップルドノードツリーを配列に格納する例について説明する。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、代表ノードの位置を示す第一の位置情報の情報量を削減することができる。
図1は、配列に格納されたカップルドノードツリーの構成例を説明する図である。
図1を参照すると、ノード101が配列100の配列番号10の配列要素に配置されている。ノード101はノード種別102、弁別ビット位置103及び代表ノード番号104で構成されている。ノード種別102の値は0であり、ノード101がブランチノードであることを示している。弁別ビット位置103には1が格納されている。代表ノード番号104にはリンク先のノード対の代表ノードの配列番号20が格納されている。配列番号は上記第一の位置情報の具体例である。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
配列番号20の配列要素には、ノード対111の代表ノードであるノード[0]112が格納されている。そして隣接する次の配列要素(配列番号20+1)に代表ノードと対になるノード[1]113が格納されている。ノード[0]112はノード101と同様にブランチノードである。ノード[0]112のノード種別114には0が、弁別ビット位置115には3が、代表ノード番号116には30が格納されている。またノード[1]113は、ノード種別117と参照ポインタ118aで構成されている。ノード種別117には1が格納されており、ノード[1]113がリーフノードであることを示している。参照ポインタ118aには、インデックスキーの記憶領域を参照するポインタが格納されている。参照ポインタ118aに格納されたデータは、上記の第二の位置情報の具体例である。以下では表記の簡略化のため、参照ポインタに格納されたデータのことも参照ポインタという。
パトリシアツリーについて先に述べたと同様に、インデックスキーと対応するレコードにアクセスするためのアクセス先情報も当然必要である。インデックスキーとアクセス先情報との対応づけは、例えば、インデックスキーを記憶している記憶領域に隣接する記憶領域に、当該インデックスキーに対応するアクセス先情報を記憶することによって行ってもよい。以下ではアクセス先情報については省略して説明する。
ここで、弁別ビット位置を表すのに必要なビット長は、最長のインデックスキーのビット長の影響を受けるが、前者は後者の対数なので、非常に長いインデックスキーを利用する場合でも弁別ビット位置を表すのに必要なビット数はそれほど多くない。また、例えばメモリアドレス又は所定のメモリアドレスからのオフセットを参照ポインタとして利用する場合には、参照ポインタのビット長はインデックスキーのビット長とは無関係である。よって、インデックスキーのかわりに参照ポインタを含むようにリーフノードを構成することにより、事実上、カップルドノードツリーのノードに必要な記憶容量を、インデックスキーの長さに関わらず比較的小さな定数値とすることが可能となる。一般に、大規模なデータベースでは多くのレコードを区別する必要から長いインデックスキーが必要となり、そのようなデータベースにおけるインデックスキーのビット長は、配列100の各配列要素に必要なビット長よりも長いことが多い。
また、配列100とは別の不図示の配列の各配列要素にインデックスキーを格納し、その別の配列の配列番号を参照ポインタとして利用することも可能である。例えば、長さがnビットのビット列からなるインデックスキーのうちの限られた一部しか使われないことが予め分かっている場合、配列番号を表すのに必要なビット数mはnより小さいので、リーフノードがインデックスキーのかわりに参照ポインタを含むことにより、リーフノードに必要な記憶容量が削減される。
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号とい
うこともある。さらに、あるリーフノードと、そのリーフノードの参照ポインタが示す記憶領域に格納されたインデックスキーとの関係を示すのに、リーフノードに対応するインデックスキーということもあり、インデックスキーに対応するリーフノードということもある。
配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121の内容は省略されている。
ノード[0]112、ノード[1]113、ノード122、及びノード123の格納された配列要素にそれぞれ付された0あるいは1は、検索キーで検索を行う場合にノード対のどちらのノードにリンクするかを示すものである。前段のブランチノードの弁別ビット位置にある検索キーのビット値である0か1を代表ノード番号に加えた配列番号のノードにリンクする。
したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
なお、上記の例では代表ノード番号をノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
図2は、カップルドノードツリーのツリー構造を概念的に示す図である。
符号210aで示すのがルートノードである。図示の例では、ルートノード210aは配列番号220に配置されたノード対201aの代表ノードとしている。
ツリー構造としては、ルートノード210aの下にノード対201bが、その下層にノード対201cとノード対201fが配置され、ノード対201fの下層にはノード対201hとノード対201gが配置されている。ノード対201cの下にはノード対201dが、さらにその下にはノード対201eが配置されている。
各ノードの前に付された0あるいは1の符号は、図1において説明した配列要素の前に付された符号と同じである。検索キーの弁別ビット位置のビット値に応じてツリーをたどり、検索対象のインデックスキーに対応するリーフノードを見つけることになる。
図示された例では、ルートノード210aのノード種別260aは0でブランチノードであることを示し、弁別ビット位置230aは0を示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列要素の配列番号である。
ノード対201bはノード210bと211bで構成され、それらのノード種別260b、261bはともに0であり、ブランチノードであることを示している。ノード210bの弁別ビット位置230bには1が格納され、リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列要素の配列番号220bが格納されている。
ノード210cのノード種別260cには1が格納されているので、このノードはリーフノードであり、したがって、参照ポインタ250cを含んでいる。参照ポインタ250cには、インデックスキー290cが格納されている記憶領域を参照するポインタを格納する。参照ポインタ250cに格納されたデータのことも参照ポインタといい、符号280cにより表す。他のリーフノードでも同様に、参照ポインタと参照ポインタに格納されたデータを同じ参照ポインタという語で表す。
図2には、複数のインデックスキーの記憶領域が連続して設けられる例を示し、それら連続した記憶領域全体をインデックスキーの記憶領域311として示したが、インデックスキーは連続した領域に格納されなくてもよい。また、リーフノード同士のツリー構造上での関係と、インデックスキーの記憶領域311におけるインデックスキーの配置順は無関係であってもよい。参照ポインタ280cは、“000111XXXXXXXX”というインデックスキー290cが格納された記憶領域を示している。
ここで、“XXXXXXXX”の部分は0ビット以上の長さの、ある特定のビット列である。よって、図2のカップルドノードツリーに係るインデックスキーの中に、0〜5ビット目までの範囲が“000111”のものは1つしか存在しない。したがって、詳しい理由は後述するが、“XXXXXXXX”の部分のビット列のパターンによらず、カップルドノードツリーの構造は変わらない。他のインデックスキーでも同様に、図2のカップルドノードツリー全体で最下位の弁別ビット位置である5よりも下位の6ビット目以降のビットは、カップルドノードツリーの構造に影響しないので“X”と表している。“X”で示されたビットが存在するか否か、そのビットが存在する場合にその値が“0”か“1”かということに関わらず、図2のカップルドノードツリーのツリー構造は変わらない。
ノード対201cに戻ると、もう一方のノード211cのノード種別261cは0、弁別ビット位置231cは2であり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列要素の配列番号221cが格納されている。
ノード210dのノード種別260dは0、弁別ビット位置230dは5であり、代表ノード番号にはノード対201eの代表ノード210eの格納された配列要素の配列番号220dが格納されている。ノード210dと対になるノード211dのノード種別261dは1であり、参照ポインタ251dには、“011010XXXXXXXX”というインデックスキー291dを格納した記憶領域を示す参照ポインタ281dが格納されている。
ノード対201eのノード210e、211eのノード種別260e、261eはともに1であり双方ともリーフノードであることを示す。ノード210e、211eの参照ポインタ250e、251eにはそれぞれ、“010010XXXXXXXX”というインデックスキー290eと、“010011XXXXXXXX”というインデックスキー291eを格納した記憶領域への参照ポインタ280e、281eが格納されている。
ノード対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であり双方ともリーフノードであることを示す。ノード210g、211gのそれぞれの参照ポインタ250g、251gには“100010XXXXXXXX”と“100011XXXXXXXX”というインデックスキー290g、291gを格納した記憶領域への参照ポインタ280g、281gが格納されている。
また同じくノード対201hの代表ノードであるノード[0]210hとそれと対をなすノード[1]211hのノード種別260h、261hはともに1であり双方ともリーフノードであることを示す。ノード210h、211hのそれぞれの参照ポインタ250h、251hには“101011XXXXXXXX”と“101100XXXXXXXX”というインデックスキー290h、291hを格納した記憶領域への参照ポインタ280h、281hが格納されている。
以下、上述のツリーからインデックスキー“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でありリーフノードであることを示しているので、参照ポインタ280gにより示される記憶領域を参照し、そこに格納されたインデックスキー290gを読み出して検索キーと比較する。例えば、“X”と書かれたビットが存在しない場合は、インデックスキー290gと検索キーの両方とも値が“100010”であって一致している。このようにしてカップルドノードツリーを用いた検索が行われる。
次に、図2を参照してカップルドノードツリーの構成の意味について説明する。
カップルドノードツリーの構成はインデックスキーの集合により規定される。図2の例で、ルートノード210aの弁別ビット位置230aが0であるのは、図2に例示されたインデックスキーに0ビット目が0のものと1のものがあるからである。0ビット目が0のインデックスキーのグループはノード210bの下に分類され、0ビット目が1のインデックスキーのグループはノード211bの下に分類されている。
ノード211bの弁別ビット位置231bが2であるのは、ノード211h、210h、211g、210gに対応する0ビット目が1のインデックスキーの1ビット目がすべて0で等しく、2ビット目で初めて異なるものがあるという、インデックスキーの集合の性質を反映している。
以下0ビット目の場合と同様に、2ビット目が1であるものはノード211f側に分類され、2ビット目が0であるものはノード210f側に分類される。
そして2ビット目が1であるインデックスキーは3ビット目の異なるものがあるのでノード211fの弁別ビット位置231fには3が格納され、2ビット目が0であるインデックスキーでは3ビット目も4ビット目も等しく5ビット目で異なるのでノード210fの弁別ビット位置230fには5が格納される。
ノード211fのリンク先においては、3ビット目が1のものと0のものがそれぞれ1
つしかないことから、ノード210h、211hはリーフノードとなり、参照ポインタ250hと251hには、“101011XXXXXXXX”、“101100XXXXXXXX”というインデックスキー290h、291hを格納した記憶領域を指す参照ポインタ280h、281hがそれぞれ格納されている。
仮にインデックスキーの集合に“101100XXXXXXXX”の代わりに“101101XXXXXXXX”か“101110XXXXXXXX”が含まれていたとしても、3ビット目までは“101100XXXXXXXX”と等しいので、ノード211hの参照ポインタ281hにより示される記憶領域に格納されるインデックスキーの値が変わるだけで、ツリー構造自体は変わることはない。しかし、“101100XXXXXXXX”に加えて“101101XXXXXXXX”が含まれていると、ノード211hはブランチノードとなり、その弁別ビット位置は5になる。追加されるインデックスキーが“101110XXXXXXXX”であれば、弁別ビット位置は4となる。
以上説明したように、カップルドノードツリーの構造は、インデックスキーの集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
そしてさらにいえば、異なるビット値となるビット位置ごとにビット値が“1”のノードとビット値が“0”のノードとに分岐していることから、ノード[1]側とツリーの深さ方向を優先させてリーフノードをたどると、それらに格納されたインデックスキーは、ノード211hに対応するインデックスキー291hの“101100XXXXXXXX”、ノード210hに対応するインデックスキー290hの“101011XXXXXXXX”、・・・、ノード210cに対応するインデックスキー290cの“000111XXXXXXXX”となり降順にソートされている。
すなわち、カップルドノードツリーにおいては、インデックスキーはソートされてツリー上に配置されている。
検索キーで検索するときはインデックスキーがカップルドノードツリー上に配置されたルートをたどることになり、例えば検索キーが“101100”であればノード211hに到達することができる。また、上記説明からも想像がつくように、“101101”か“101110”を検索キーとした場合でもノード211hにたどり着き、参照ポインタ281hにより示される記憶領域に格納されたインデックスキー291hと比較することにより、検索が失敗したことが分かる。
また、例えば“100100”で検索した場合でも、ノード210a、211b、210fのリンク経路では検索キーの3ビット目と4ビット目は使われることがなく、“100100”の5ビット目が0なので、“100010”で検索した場合と同様にノード210gに到達することになる。このように、カップルドノードツリーに格納されたインデックスキーのビット構成に応じた弁別ビット位置を用いて分岐が行われる。
図3は、本発明を実施するためのハードウェア構成例を説明する図である。
本発明の検索装置による検索処理及びデータメンテナンスは中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施される。カップルドノードツリーが配置される配列309と検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック310とインデックスキーの記憶領域311を有するデータ格納装置308は、主記憶装置305または外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。図1の配列100は配列309の一例である。また、図2と同様に、インデックスキーの記憶領域311は連続した領域のように図示されているが、不連続の領域でもよいことは当然である。
図3の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309は外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
図3に示したとおり、カップルドノードツリーのノードを格納した配列要素からなる配列309と、インデックスキーの記憶領域311とは別の領域である。したがって、リーフノードを格納した配列要素にインデックスキーが含まれる場合に比べて、図3の構成では、一般に1つの配列要素に必要な記憶領域の量が少ない。つまり、カップルドノードツリーを格納する配列309からインデックスキーの記憶領域311を分離することによって、キャッシュメモリ303へのカップルドノードツリーの読み込みにおいて1キャッシュブロックあたりに格納されるノード数を増やすことが可能となる。それにより、後述する検索処理等においてキャッシュミスの頻度が減って処理がより高速に行われるようになる。
次に、カップルドノードツリーを用いた基本的な操作である、検索、挿入、削除について順に詳しく説明する。これらの操作は、本出願人による上記先の出願における検索、挿入、削除の操作を、カップルドノードツリーの構造の変更に合わせて一部変更したものである。
図4は、一実施形態におけるビット列の検索処理を示すフローチャートである。
まず、ステップS401で、検索開始ノードとしてのルートノードの配列番号を取得する。取得された配列番号に対応する配列要素は、ルートノードを格納している。
次に、ステップS402で、探索経路スタックに取得された配列番号を格納し、ステップS403で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップS404で、読み出したノードから、ノード種別を取り出し、ステップS405で、ノード種別がブランチノードであるか否かを判定する。
ステップS405の判定において、読み出したノードがブランチノードである場合は、ステップS406に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップS407で、取り出した弁別ビット位置に対応するビット値を検索キーから取り出す。そして、ステップS408で、ノードから代表ノード番号を取り出して、ステップS409で、検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップS402に戻る。
以降、ステップS405の判定においてリーフノードと判定されてステップS410aに進むまで、ステップS402からステップS409までの処理を繰り返す。ステップS410aでは、リーフノードから参照ポインタを取り出し、続くステップS410bではインデックスキーの記憶領域から、その参照ポインタが指すインデックスキーを読み出す。そして、続くステップS411において、検索キーと取り出したインデックスキーが等しいか否かを判定する。等しければ検索成功であり、等しくなければ検索失敗である。
なお、図4ではカップルドノードツリーの全体を検索の対象としているが、上記の説明から明らかに、カップルドノードツリーの任意の部分木を検索対象として検索を行うこと
も可能である。その場合、検索対象の部分木のルートノードの配列番号をステップS401で得るように図4の処理を変形すればよい。検索対象の部分木のルートノードは、図4の検索処理を呼び出す応用処理により指定されるので、ステップS401では呼び出し元から検索対象の部分木のルートノードの配列番号を受け取ればよい。本出願人による特願2006−293619号において示された、インデックスキーを昇順に取り出す処理は、そのような応用処理の具体例である。
本出願人による上記先の出願における検索処理と図4の検索処理との違いは、ステップS410aとS410bにおいて、インデックスキーを直接参照するのではなく、参照ポインタを介して間接参照する点である。その結果、ステップS403で配列309に格納されたノードを参照するほかに、ステップS410bでインデックスキーの記憶領域311に格納されたインデックスキーを参照する必要があり、記憶装置への参照回数が1回だけ増えている。
一方、カップルドノードツリーのノード数が多く、ツリーが深くなるほど、ステップS402〜S409のループの繰り返しにかかる計算コストが検索処理全体にかかる計算コストに占める割合が増え、このループの繰り返しの計算コストの削減の影響が大きくなる。つまり、ノード数の多いカップルドノードツリーの検索においては、インデックスキーの記憶領域311を配列309から分離したことによる高速化の利点の方が大きく、増加した間接参照のコストは無視しても問題がない程度に小さい。
次に、図5〜図8によりカップルドノードツリーにおけるノード挿入処理を説明する。図5〜図7が通常の挿入処理を説明するものであり、図8はルートノードの挿入処理を説明するものである。ルートノードの挿入処理と通常の挿入処理により、カップルドノードツリーが生成されることから、ノード挿入処理の説明はカップルドノードツリーの生成処理の説明でもある。
図5は挿入処理の前段である検索処理の処理フローを示す図であり、図4に示した検索処理において挿入キーを検索キーとしたものに相当する。ステップS501〜ステップS510bの処理は図4のステップS401〜ステップS410bに完全に対応するので説明は省略する。
図5のステップS511において、挿入キーとステップS510bで得たインデックスキーを比較し、等しければ挿入キーは既にカップルドノードツリーに存在するのであるから、挿入は失敗となり、処理を終了する。等しくなければ次の処理、図6のステップS512以下の処理に進む。
図6は、挿入するノード対のための配列要素を準備する処理を説明する処理フロー図である。
ステップS512において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
ステップS513に進み、挿入キーとステップS510bで得たインデックスキーの大小を比較し、挿入キーが大きいときは値1を小さいときは値0のブール値を得る。
ステップS514に進み、ステップS512で得た代表ノードの配列番号にステップS513で得たブール値を加算した配列番号を得る。
ステップS515に進み、ステップS512で得た代表ノードの配列番号にステップS513で得たブール値の論理否定値を加算した配列番号を得る。
ステップS514で得た配列番号は、挿入キーをインデックスキーとして格納する記憶
領域への参照ポインタを持つリーフノードが格納される配列要素の配列番号であり、ステップS515で得た配列番号は、そのリーフノードとノード対を成すノードが格納される配列要素のものである。
つまり、前段の検索処理で得られたリーフノードに対応するインデックスキーと挿入キーの大小により、挿入されるノード対のうちどちらのノードに、挿入キーへの参照ポインタを保持するリーフノードが格納されるかが決定される。
例えば図2のカップルドノードツリーに“011011XXXXXXXX”を挿入する場合、検索結果のインデックスキーは、ノード211dに対応する、“011010XXXXXXXX”という値のインデックスキー291dになる。挿入キー“011011XXXXXXXX”とノード211dに対応するインデックスキー“011010XXXXXXXX”の大小比較によりブール値が求められ、今の例では挿入キーの方が大きいのでブール値1が得られ、挿入されるノード対の代表ノード番号に1を加えた配列要素に挿入キーへの参照ポインタを保持するリーフノードが格納される。一方、インデックスキー“011010XXXXXXXX”への参照ポインタは、大小比較で得られたブール値を論理反転した値を代表ノード番号に加算した配列番号の配列要素に格納される。
その際、インデックスキー“011010XXXXXXXX”と挿入キー“011011XXXXXXXX”とは5ビット目で異なることから、ノード211dは、弁別ビット位置を5とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。
また図2のカップルドノードツリーに“011001XXXXXXXX”を挿入しようとする場合も、検索結果は、ノード211dに対応する、“011010XXXXXXXX”という値のインデックスキー291dになる。この場合には挿入キーの方が小さいのでブール値0が得られ、挿入されるノード対の代表ノード番号に0を加えた配列要素に挿入キーへの参照ポインタを保持するリーフノードが格納される。そして、インデックスキー291d“011010XXXXXXXX”と挿入キー“011001XXXXXXXX”とは4ビット目で異なることから、ノード211dは、弁別ビット位置を4とし、代表ノード番号を挿入されたノード対の代表ノードの配列番号とするブランチノードとなる。次に図7のステップS516以下の処理に進む。
図7は図6で準備された配列要素にノードを格納するとともにその挿入位置を求め、既存のノードの内容を変更して挿入処理を完成させる処理フローを示す図である。
ステップS516〜ステップS523までの処理は、挿入するノード対のカップルドノードツリー上の位置を求める処理であり、ステップS524以下の処理は各ノードにデータを設定して挿入処理を完成させる処理である。
ステップS516で、挿入キーとステップS510bで得たインデックスキーのビット列比較を例えば排他的論理和で行い、差分ビット列を得る。
ステップ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で説明した処理は、挿入するノード対の挿入位置を決定するために、挿入するインデックスキーと検索により取得されたインデックスキーの間でビット列比較を行い、ビット列比較で異なるビット値となる先頭の(最上位の)ビット位置と探索経路スタックに格納されているブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるブランチノードの次のブランチノードのリンク先を挿入するノード対の挿入位置とするものである。
例えば図2のカップルドノードツリーに“111000XXXXXXXX”を挿入するとき、検索結果のインデックスキーは、ノード210hに対応する“101011XXXXXXXX”になる。挿入キー“111000XXXXXXXX”とノード210hに対応するインデックスキー290h“101011XXXXXXXX”のビット列比較により異なるビット値となる最上位のビット位置1が得られる。得られたビット位置1と探索経路スタックに積まれた配列番号の配列要素に格納されたブランチノードの弁別ビット位置との位置関係を弁別ビット位置が上位になるまでを順次探索経路スタックを逆にたどると、ルートノード210aに至る。そこで探索経路スタックのポインタを1つ進め、ノード211bの配列番号を得る。挿入キー“111000XXXXXXXX”はノード211bのリンク先に挿入される。
また、探索経路スタックを逆にたどりルートノードに至っても、ルートノードの弁別ビット位置が、先に求めたビット列比較で異なるビット値となる最上位のビット位置より上位のビット位置でないということは、そのカップルドノードツリーのインデックスキーの上位ビットで、ルートノードの弁別ビット位置より上位のビットの値は全て等しい場合である。そして、挿入するインデックスキーにおいて、初めてルートノードの弁別ビット位置より上位のビットの値に異なるビット値のものがあるということである。したがって、挿入するノード対はルートノードの直接のリンク先となり、ルートノードの弁別ビット位置は、既存のインデックスキーと異なる値である挿入キーの最上位ビットの位置に変わる。
次に、ステップS524以下の各ノードにデータを設定して挿入処理を完成させる処理について説明する。
ステップS524では探索経路スタックからスタックポインタの指す配列番号を取り出す。
ステップS525aに進み、挿入キーの格納に必要な記憶領域をインデックスキーの記憶領域上に確保し、確保した記憶領域を指すポインタを取得する。
次にステップS525bにおいて、挿入キーを、ステップS525aで得たポインタの指すインデックスキーの記憶領域に書き込む。
ステップS525cに進み、ステップS514で得た配列番号の指す配列要素のノード種別にリーフノードを示す1を、参照ポインタにステップS525aで得たポインタを書き込む。
ステップS526に進み配列からステップS524で得た配列番号の配列要素を読み出す。
次にステップS527において、ステップS515で得た配列番号の配列要素にステップS526で読み出した内容を書き込む。
最後にステップS528において、ステップS524で得た配列番号の指す配列要素のノード種別にブランチノードを示す0を、弁別ビット位置にステップS517で得たビット位置を、代表ノード番号にステップS512で得た配列番号を書き込み、処理を終了する。
上述の図2のカップルドノードツリーに“111000XXXXXXXX”を挿入する例では、ステップS525cにおいて、取得された空ノード対のノード[1]を挿入キー“111000XXXXXXXX”への参照ポインタを保持するリーフノードとし、ステップS527において、ノード[0]にノード211bの内容を書き込む。そして、ステップS528において、ノード211bの弁別ビット位置にビット列比較により異なるビット値となる最上位のビット位置1を格納し、代表ノード番号には取得されたノード対の代表ノードが格納される配列要素の配列番号が格納される。
図8は、本発明の一実施形態におけるルートノードの挿入処理を含むリーフノードの挿入処理全体の処理フローを説明する図である。
ステップS551において、取得することを求められたカップルドノードツリーのルートノードの配列番号が登録済みであるか判定される。登録済みであれば、図5〜図7を用いて説明した通常の挿入処理が行われる。
ステップS551での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まることになる。
まず、ステップS552において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。次にステップS553において、ステップS552で得た配列番号に0を加えた配列番号を求める。(実際には、ステップS552で取得した配列番号に等しい。)次にステップS554aにおいて、挿入キーの格納に必要な記憶領域をインデックスキーの記憶領域上に確保し、確保した記憶領域を指すポインタを取得する。続くステップS554bでは、挿入キーを、ステップS554aで得たポインタの指す記憶領域に書き込む。さらにステップS554cでは、ステップS553で得た配列番号の配列要素すなわち挿入するルートノードに対応する配列要素の、ノード種別にリーフノードを示す1を、参照ポインタにステップS554aで得たポインタを書き込む。そしてステップS556では、ステップS553で取得したルートノードの配列番号を登録して処理を終了する。
先にも述べたように、インデックスキーの集合があるとき、そこから順次インデックスキーを取り出し、図8及び図5〜図7の処理を繰り返すことにより、インデックスキーの集合に対応した本発明のカップルドノードツリーを構築することができることは明らかで
ある。
本出願人による上記先の出願における挿入処理と図5〜図8の挿入処理との違いは、挿入キーを配列309内に書き込むか、挿入キーはインデックスキーの記憶領域311に書き込んで配列309には参照ポインタを書き込むか、という違いである。
この違いにより、上記先の出願よりも有利になった点は、記憶領域がより効率的に利用されるようになったという点である。図7のステップS525aや図8のステップS554aでは、挿入しようとするインデックスキーの長さに応じて必要最小限の記憶領域を確保すればよい。また、長いインデックスキーを利用する場合でも、配列309の各配列要素に無駄な空き領域が大量に生じることがない。また、インデックスキーの格納領域311は配列309と分離されているため、インデックスキーの長さが予め判明していなくてもよいという利点もある。
一方、この違いのため上記先の出願に比べてステップ数が増えているが、追加されたステップは、図7のステップS525aとS525b、及び図8のS554aとS554bであり、1回の挿入処理につき簡単なステップが2つ追加されるだけである。つまり、挿入処理で増える計算コストは少なく、利点に比べて無視することができる程度である。
次に図9、図10を参照して、本発明の一実施形態におけるカップルドノードツリーから特定のインデックスキーに対応するリーフノードを削除する処理フローを説明する。
図9は、削除処理の前段である検索処理の処理フローを示す図であり、図4に示した検索処理において削除キーを検索キーとしたものに相当する。ステップS901〜ステップS910bの処理は図4のステップS401〜ステップS410bに完全に対応するので説明は省略する。
図9のステップS911において削除キーとステップS910bで得たインデックスキーを比較し、等しくなければ削除するインデックスキーはカップルドノードツリーに存在しないのであるから、削除は失敗となり、処理を終了する。等しければ次の処理、図10のステップS912以下の処理に進む。
図10は、削除処理の後段の処理フローを説明する図である。
まず、ステップS912で探索経路スタックに2つ以上の配列番号が格納されているか判定する。2つ以上の配列番号が格納されていないということは、言い換えれば1つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合はステップS918に移行し、ステップS901で得たルートノードの配列番号に係るノード対を削除する。次にステップS919に進み、登録されていたルートノードの配列番号を削除する。さらにステップS920aに進み、削除キーと等しいインデックスキーが格納されていた記憶領域、すなわちステップS910aで得た参照ポインタの指す記憶領域を解放して、処理を終了する。
ステップS912において探索経路スタックに2つ以上の配列番号が格納されていると判定されたときはステップS913に進み、ステップS908で得た代表ノード番号にステップS907で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除対象のインデックスキーに対応するリーフノードと対をなすノードの配置された配列番号を求めるものである。
次にステップS914において、ステップS913で得た配列番号の配列要素の内容を読み出し、ステップS915において探索経路スタックのスタックポインタを1つ戻して配列番号を取り出す。
次にステップS916に進み、ステップS914で読み出した配列要素の内容をステップS915で得た配列番号の配列要素に上書きする。この処理は、削除対象のインデックスキーが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
続くステップS917において、ステップS908で得た代表ノード番号に係るノード対を削除する。
最後にステップS920aにおいて、上記のとおり、ステップS910aで得た参照ポインタの指す記憶領域を解放し、処理を終了する。
本出願人による上記先の出願における削除処理と図9〜図10の削除処理との違いは、配列309のみを操作対象とするか、さらにインデックスキーの記憶領域311も操作対象とするかという違いである。
この違いにより、ステップS910bでは間接参照の必要があり、ステップS920aが追加されているので、先の出願の削除処理よりも図9〜図10の削除処理ではステップ数が増えている。しかし、それにより増える計算コストに比べて、上述の利点の方が顕著である。
図11A及び図11Bは、図2に例示したカップルドノードツリーにおいて“011010”を削除キーとして削除処理を行う例を説明する図である。
図11Aに示したカップルドノードツリーは、ノード対201f以下のノードは記載を省略している。削除対象のインデックスキー“011010”は一時記憶エリアである削除キー270に格納されている。探索経路スタック310のスタックポインタは配列番号221c+1を指しており、検索処理が完了したことを示している。図中太枠で囲まれたノードが検索処理でたどられたノードであり、その配列番号がルートノード210aのものからリーフノード211dのものまで探索経路スタック310に積まれている。
なお、ノード211dに対応するインデックスキー291dは“011010XXXXXXXX”と表記されているが、図11A及び図11Bの例では、説明の簡単のため、インデックスキー291dにおける“XXXXXXXX”の部分にはビット値が存在せず、“011010XXXXXXXX”と“011010”が等しい場合を説明する。また、図2に示したインデックスキー291d、291e、290e、290cをまとめて図11Aでは290という符号で表している。
削除キーによる検索処理においては、まず始めにルートノード210aの配列番号220を取得し、それを探索経路スタック310に格納する。ルートノード210aの弁別ビット位置230aが0であり、削除キーのビット位置0のビット値が0であるので、代表ノード番号220a+0=220aが探索経路スタック310に格納される。
するとノード210bが読み出され、弁別ビット位置230bが1であり、削除キーのビット位置1のビット値が1であるので、代表ノード番号220b+1が探索経路スタック310に格納される。
次にノード211cが読み出され、弁別ビット位置231cが2であり、削除キーのビット位置2のビット値が1であるので、代表ノード番号221c+1が探索経路スタック310に格納される。配列番号が221c+1の配列要素に格納されたノード211dのノード種別261dは1であり、リーフノードであることを示している。このリーフノードに対応するインデックスキー291dは、参照ポインタ281dにより示される記憶領
域に格納されている。その記憶領域はインデックスキーの記憶領域311の一部である。そこで参照ポインタ281dの参照するインデックスキー291dを取り出すとその値は“011010”であり、削除キー270に格納された削除対象のインデックスキーと一致している。
図11Aに示した状態において、削除対象のインデックスキーに対応するノード211dと対をなすノード210dの内容が読み出され、その内容が、探索経路スタック310のスタックポインタを1つ戻したところに格納されている配列番号220b+1の配列要素(ノード211c)に書き込まれる。その後ノード対201dを削除し、インデックスキー291dを格納していた記憶領域を解放する。ノード対が削除された配列要素は空となり、再利用可能となる。また、解放されたインデックスキーの記憶領域も再利用可能である。
図11Bに示したカップルドノードツリーは、削除処理の終了後のものである。ノード211cのノード種別261c、弁別ビット位置231c、代表ノード番号221cには、括弧書きで示すように、ノード210dに格納されていた値がそのまま格納されている。
次に、図12A及び図12Bを参照して挿入処理の具体例を説明する。
図12Aに示すのは、ビット列“0100XXXXXXXX”、“0001XXXXXXXX”、“0000XXXXXXXX”をインデックスキーとして参照する参照ポインタを持つカップルドノードツリーである。これから挿入しようとする挿入キーは“0011XXXXXXXX”である。図示のツリーはノード対1201a、1201b、1201cで構成されている。
ノード対1201aの代表ノードはルートノード1210aであり、弁別ビット位置には1が保持されている。ノード対1201aの下位のノード対1201bの代表ノード1210bはブランチノードであり、弁別ビット位置には3が保持され、代表ノード1210bと対になるノード1211bはリーフノードであり、インデックスキー1291b“0100XXXXXXXX”への参照ポインタ1281bが保持されている。ブランチノードであるノード1210bはノード対1201cにリンクしている。
ノード対1201cを構成するノード1210cと1211cはともにリーフノードであり、それぞれインデックスキー1290c“0000XXXXXXXX”とインデックスキー1291c“0001XXXXXXXX”への参照ポインタ1280c、1281cが格納されている。
図12Bは、挿入キー“0011XXXXXXXX”を挿入したカップルドノードツリーを示す図である。新たなノード対1201dがノード対1201bとノード対1201cの間に挿入されている。
図12Aと図12Bを比べると、挿入されたノード1210dの内容は、挿入前のノード1210bのものであり、挿入後のノード1210bの弁別ビット位置が3から2に変化している。
以上本発明を実施するための最良の形態について詳細に説明したが、本発明の実施の形態はそれに限ることなく種々の変形が可能であることは当業者に明らかである。
また、本発明のビット列検索方法を実行する装置が、カップルドノードツリーを格納する記憶手段と図4に示した処理をコンピュータに実行させるプログラムによりコンピュータ上に構築可能なことは明らかである。
さらに、図8、図5〜図7に示した挿入処理とその均等物をコンピュータに実行させるプログラムにより、本発明の挿入方法が実現可能であり、図9及び図10に示した削除処理とその均等物をコンピュータに実行させるプログラムにより、本発明の削除方法が実現可能であることも明らかである。そして、それらのプログラムにより、ブランチノードとリーフノードの識別手段、ブランチノードの弁別ビット位置に応じてリンク先のノード対のどちらかにリンクする手段等がコンピュータ上に実現される。
したがって、上記プログラム、及びプログラムを記憶したコンピュータ読み取り可能な記憶媒体は、本発明の実施の形態に含まれる。さらに、本発明のカップルドノードツリーのデータ構造も、本発明の実施の形態に含まれる。
以上詳細に説明した、本発明が提供する新しいデータ構造であるカップルドノードツリーを用いることにより、記憶領域をより有効に利用してより高速なビット列データの検索を行うことが可能となり、しかもビット列データの追加削除も容易に実行することができる。
配列に格納されたカップルドノードツリーの構成例を説明する図である。 カップルドノードツリーのツリー構造を概念的に示す図である。 本発明を実施するためのハードウェア構成例を説明する図である。 本発明の一実施形態における検索処理を示すフローチャートである。 本発明の一実施形態における挿入処理の前段である検索処理の処理フローを示す図である。 本発明の一実施形態における挿入処理における挿入するノード対のための配列要素を準備する処理フローを説明する図である。 ノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理フローを示す図である。 本発明の一実施形態におけるルートノードの挿入処理を含むリーフノードの挿入処理全体の処理フローを説明する図である。 本発明の一実施形態における削除処理の前段である検索処理の処理フローを示す図である。 本発明の一実施形態における削除処理の後段の処理フローを説明する図である。 削除処理前のカップルドノードツリーと削除キー“011010”を説明する図である。 削除処理後のカップルドノードツリーを説明する図である。 挿入処理前のカップルドノードツリーと挿入キー“0011”を説明する図である。 挿入処理後のカップルドノードツリーを説明する図である。 従来の検索で用いられるパトリシアツリーの一例を示す図である。
符号の説明
10、20、30 配列番号
100 配列
101 ノード
102、114、117、124、126、260a〜260h、261b〜261h
ノード種別
103、115、230a〜230f、231b〜231f 弁別ビット位置
104、116、220、220a〜220f、221b〜221f 代表ノード番号
111、121、201a〜201h、1201a〜1201d ノード対
112、122、210a〜210h、1210a〜1210d ノード[0]、代表ノード
113、123、211b〜211h、1211a〜1211d ノード[1]、代表ノードと対をなすノード
118a、250c〜250h、251d〜251h 参照ポインタ
270 削除キー
280c〜280h、281d〜281h、1280c、1281b〜1281d 参照ポインタ
290、290c〜290h、291d〜291h、1290c、1291b〜1291d インデックスキー
301 データ処理装置
302 中央処理装置
303 キャッシュメモリ
304 バス
305 主記憶装置
306 外部記憶装置
307 通信装置
308 データ格納装置
309 配列
310 探索経路スタック
311 インデックスキーの記憶領域
1730a〜1730h 検査ビット位置
1740a〜1740f 左リンク、左ポインタ
1741a〜1741f 右リンク、右ポインタ
1750a〜1750h ノード

Claims (10)

  1. ビット列からなる検索キーにより検索対象であるビット列からなるインデックスキーの位置情報が格納されたツリーのデータ構造に基づいて前記インデックスキーを検索するビット列検索装置において、
    前記ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含むが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域を含まないものである、カップルドノードツリーと、
    前記ノード対のどちらか一方のノードである検索開始ノードの位置を示す位置情報を取得し、該取得した検索開始ノードの位置を示す位置情報により検索開始ノードを読み出す検索開始ノード読出手段と、
    前記ノードのノード種別を格納する領域から当該ノード種別を読み出し、該ノード種別が前記リーフノードを示すものであるかブランチノードを示すものであるかを判定するノード種別判定手段と、
    前記リーフノードに含まれる前記第二の位置情報が示す記憶領域からインデックスキーを読み出すインデックスキー読出手段と、
    前記ブランチノードの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域からそれぞれ当該弁別ビット位置とリンク先のノード対の代表ノードの位置を示す第一の位置情報を読み出し、該読み出した弁別ビット位置の前記検索キーのビット値と前記読み出したリンク先のノード対の代表ノードの位置を示す第一の位置情報との演算によりリンク先のノード対のどちらかのノードの位置を示す位置情報を求め、該求めたノードの位置を示す位置情報により示される記憶領域から、該記憶領域に配置されたノードをリンク先ノードとして読み出すリンク手段と、
    を備え、
    前記検索開始ノード読出手段で読み出した検索開始ノードのノード種別を前記ノード種別判定手段で判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンク手段によりリンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を前記ノード種別判定手段で判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出し、
    前記インデックスキー読出手段により読み出されたインデックスキーを、前記検索開始ノードをそのルートノードとする前記カップルドノードツリーの部分木の前記検索キーによる検索結果である検索結果キーとすることを特徴とするビット列検索装置。
  2. ビット列検索装置が、ビット列からなる検索キーにより検索対象であるビット列からなるインデックスキーの位置情報が格納されたツリーのデータ構造に基づいて前記インデックスキーを検索するビット列検索方法において、
    前記ツリーは、該ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域をむが、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域をむが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域を含まないものである、カップルドノードツリーであって
    前記ビット列検索方法
    前記ノード対のどちらか一方のノードである検索開始ノードの位置を示す位置情報を取得し、該取得した検索開始ノードの位置を示す位置情報により検索開始ノードを読み出す検索開始ノード読出ステップと、
    前記ノードのノード種別を格納する領域から当該ノード種別を読み出し、該ノード種別が前記リーフノードを示すものであるかブランチノードを示すものであるかを判定するノード種別判定ステップと、
    前記リーフノードに含まれる前記第二の位置情報が示す記憶領域からインデックスキーを読み出すインデックスキー読出ステップと、
    前記ブランチノードの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域からそれぞれ当該弁別ビット位置とリンク先のノード対の代表ノードの位置を示す第一の位置情報を読み出し、該読み出した弁別ビット位置の前記検索キーのビット値と前記読み出したリンク先のノード対の代表ノードの位置を示す第一の位置情報との演算によりリンク先のノード対のどちらかのノードの位置を示す位置情報を求め、該求めたノードの位置を示す位置情報により示される記憶領域から、該記憶領域に配置されたノードをリンク先ノードとして読み出すリンクステップと、
    を備え、
    前記検索開始ノード読出ステップで読み出した検索開始ノードのノード種別を前記ノード種別判定ステップで判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出ステップによりインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンクステップにより前記リンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を前記ノード種別判定ステップで判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出ステップによりインデックスキーを読み出し、
    前記インデックスキー読出ステップにより読み出されたインデックスキーを、前記検索開始ノードをそのルートノードとする前記カップルドノードツリーの部分木の前記検索キーによる検索結果である検索結果キーとすることを特徴とするビット列検索方法。
  3. 前記カップルドノードツリーは、配列に記憶され、前記代表ノードの位置を示す第一の位置情報は、該代表ノードが配置された前記配列の配列要素の配列番号であり、
    前記検索開始ノードの配置された配列要素の配列番号及び前記検索開始ノードから前記リーフノードに至るリンク先のノードの格納された配列要素の配列番号は、順次スタックに格納されていくことを特徴とする請求項記載のビット列検索方法。
  4. ビット列からなる検索キーにより検索対象であるビット列からなるインデックスキーの位置情報が格納されたツリーのデータ構造に基づいて前記インデックスキーを検索するビット列検索装置が、前記ツリーに所望のビット列からなる挿入キーの位置情報をインデックスキーの位置情報として格納するインデックスキー挿入方法において、
    前記ツリーは配列に記憶されたツリーであって、該ツリーの始点であるルートノードと、前記配列の隣接した配列要素に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含むが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域を含まないものである、カップルドノードツリーであり、
    前記ビット列検索装置は、
    前記ルートノードが格納された前記配列の配列要素の配列番号を取得し、該取得した配列番号の配列要素からルートノードを読み出すルートノード読出手段と、
    前記ノードのノード種別を格納する領域から当該ノード種別を読み出し、該ノード種別が前記リーフノードを示すものであるかブランチノードを示すものであるかを判定するノード種別判定手段と、
    前記リーフノードに含まれる前記第二の位置情報が示す記憶領域からインデックスキーを読み出すインデックスキー読出手段と、
    前記ブランチノードの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域からそれぞれ当該弁別ビット位置とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を読み出し、該読み出した弁別ビット位置の前記検索キーのビット値と前記読み出したリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号との演算によりリンク先のノード対のどちらかのノードが配置された前記配列の配列要素の配列番号を求め、該求めた配列番号の配列要素に配置されたノードをリンク先ノードとして読み出すリンク手段と、
    を備えたものであり、
    前記インデックスキー挿入方法は、
    前記挿入キーを前記検索キーとして、
    前記ルートノード読出手段でルートノードを読み出し、該読みだしたルートノードのノード種別を前記ノード種別判定手段で判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンク手段により前記リンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を前記ノード種別判定手段で判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出すとともに、該リーフノードに至るまでたどったリンク経路のブランチノード及び該リーフノードが配置された配列要素の配列番号をスタックに順次格納する検索ステップと、
    前記検索ステップで読み出したインデックスキーと前記挿入キーの間で大小比較とビット列比較を行う比較ステップと、
    前記配列からノード対を配置する空配列要素の組を取得し、その一方の配列要素の配列番号を取得する空ノード対取得ステップと、
    前記比較ステップにおける前記大小比較により、挿入キーを記憶する記憶領域の位置を示す位置情報を前記第二の位置情報として含むリーフノードを前記空ノード対取得ステップで取得した空配列要素の組のどちらの空配列要素に配置するかを決定するリーフノード格納位置決定ステップと、
    前記比較ステップにおけるビット列比較で異なるビット値となる先頭のビット位置と、前記スタックに格納されている配列番号の配列要素に配置されたブランチノードの弁別ビット位置との相対的位置関係により、該スタックに格納されている配列番号を読み出し、該配列番号の配列要素に配置されているノードを、前記空ノード対取得ステップで取得した空配列要素の組に配置されるノード対のリンク元として該ノード対の挿入位置を決定するノード対挿入位置決定ステップと、
    前記リーフノード格納位置決定ステップで決定した空配列要素に配置するリーフノードの、ノード種別を格納する領域にリーフノードであることを示すノード種別を、インデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域に前記挿入キーを記憶する記憶領域の位置を示す位置情報を書き込み、もう一方の空配列要素に、前記ノード対挿入位置決定ステップで前記スタックから読み出した配列番号の配列要素に配置されているノードの内容を読み出して書き込むことで挿入ノード対を生成する挿入ノード対生成ステップと、
    前記ノード対挿入位置決定ステップで前記スタックから読み出した配列番号の配列要素に配置されているノードをブランチノードとし、そのノード種別を格納する領域にブランチノードであることを示すノード種別を、弁別ビット位置を格納する領域に前記比較ステップにおけるビット列比較で異なるビット値となる先頭のビット位置を、リンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域に前記空ノード対取得ステップで取得した配列番号を、それぞれ書き込むブランチノード生成ステップと、
    を備えたことを特徴とするインデックスキー挿入方法。
  5. ビット列からなる検索キーにより検索対象であるビット列からなるインデックスキーの位置情報が格納されたツリーのデータ構造に基づいて前記インデックスキーを検索するビット列検索装置が、所望のビット列からなる削除キーと等しいインデックスキーの前記ツリーに格納された位置情報を削除するインデックスキー削除方法において、
    前記ツリーは配列に記憶されたツリーであって、該ツリーの始点であるルートノードと、前記配列の隣接した配列要素に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域をむが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域を含まないものである、カップルドノードツリーであり、
    前記ビット列検索装置は、
    前記ルートノードが格納された前記配列の配列要素の配列番号を取得し、該取得した配列番号の配列要素からルートノードを読み出すルートノード読出手段と、
    前記ノードのノード種別を格納する領域から当該ノード種別を読み出し、該ノード種別が前記リーフノードを示すものであるかブランチノードを示すものであるかを判定するノード種別判定手段と、
    前記リーフノードに含まれる前記第二の位置情報が示す記憶領域からインデックスキーを読み出すインデックスキー読出手段と、
    前記ブランチノードの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を格納する領域からそれぞれ当該弁別ビット位置とリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号を読み出し、該読み出した弁別ビット位置の前記検索キーのビット値と前記読み出したリンク先のノード対の代表ノードが配置された前記配列の配列要素の配列番号との演算によりリンク先のノード対のどちらかのノードが配置された前記配列の配列番号の配列要素を求め、該求めた配列番号の配列要素に配置されたノードをリンク先ノードとして読み出すリンク手段と、
    を備えたものであり、
    前記インデックスキー削除方法は、
    前記削除キーを前記検索キーとして、
    前記ルートノード読出手段でルートノードを読み出し、該読みだしたルートノードのノード種別を前記ノード種別判定手段で判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンク手段により前記リンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を前記ノード種別判定手段で判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出すとともに、該リーフノードに至るまでたどったリンク経路のブランチノード及び該リーフノードが配置された配列要素の配列番号をスタックに順次格納する検索ステップと
    前記検索ステップで読み出したインデックスキーと前記削除キーが等しいとき、
    該インデックスキーを記憶する記憶領域の位置を示す第二の位置情報を含む前記リーフノードと同一ノード対を構成するノードが配置された配列要素の内容を読み出すノード読出ステップと、
    前記リーフノードが配置された配列要素の配列番号の1つ前に前記スタックに格納された配列番号を該スタックから読み出し、該配列番号の配列要素に前記ノード読出ステップで読み出した配列要素の内容を書き込む書込みステップと
    前記ノード対の配置されている配列要素の組を解放するノード対削除ステップと、
    を実行することを特徴とするインデックスキー削除方法。
  6. 請求項〜請求項のいずれか1項に記載の方法をコンピュータに実行させるためのプログラム。
  7. 請求項2〜請求項5のいずれか1項に記載の方法をコンピュータに実行させるためのプログラムを記憶したコンピュータ読み取り可能な記憶媒体。
  8. ビット列からなる検索キーによるビット列検索に用いる、検索対象であるビット列からなるインデックスキーの位置情報が格納されたツリーのデータ構造において、
    前記ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域を含むが、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含まないものであり、前記リーフノードは、前記ノード種別に加えて、前記検索対象のビット列からなるインデックスキーを記憶する記憶領域の位置を示す第二の位置情報を格納する領域を含むが、前記検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域を含まないものであり、
    ビット列検索装置であって、
    前記ツリーを記憶する記憶手段と、
    前記ノード対のどちらか一方のノードである検索開始ノードの位置を示す位置情報を取得し、該取得した検索開始ノードの位置を示す位置情報により前記記憶手段から検索開始ノードを読み出す検索開始ノード読出手段と、
    前記ノードのノード種別を格納する領域から当該ノード種別を読み出し、該ノード種別が前記リーフノードを示すものであるかブランチノードを示すものであるかを判定するノード種別判定手段と、
    前記リーフノードに含まれる前記第二の位置情報が示す記憶領域からインデックスキーを読み出すインデックスキー読出手段と、
    前記ブランチノードの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す第一の位置情報を格納する領域からそれぞれ当該弁別ビット位置とリンク先のノード対の代表ノードの位置を示す第一の位置情報を読み出し、該読み出した弁別ビット位置の前記検索キーのビット値と前記読み出したリンク先のノード対の代表ノードの位置を示す第一の位置情報との演算によりリンク先のノード対のどちらかのノードの位置を示す位置情報を求め、該求めたノードの位置を示す位置情報により示される記憶領域から、該記憶領域に配置されたノードをリンク先ノードとして読み出すリンク手段と、
    を備えたビット列検索装置により、
    前記検索開始ノード読出手段で読み出した検索開始ノードのノード種別を前記ノード種別判定手段で判定し、該ノード種別がリーフノードを示すものであれば、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出し、該ノード種別がブランチノードを示すものであれば、前記リンク手段により前記リンク先ノードを読み出し、該読み出したリンク先ノードのノード種別を前記ノード種別判定手段で判定することを該ノード種別がリーフノードを示すものとなるまで繰り返し、該リーフノードに含まれる前記第二の位置情報が示す記憶領域から前記インデックスキー読出手段によりインデックスキーを読み出し、
    前記インデックスキー読出手段により読み出されたインデックスキーを、前記検索開始ノードをそのルートノードとする前記カップルドノードツリーの部分木の前記検索キーによる検索結果である検索結果キーとする前記検索キーによる検索の実行を可能とすることを特徴とするデータ構造。
  9. 前記データ構造は配列に記憶され、前記第一の位置情報は、該第一の位置情報に対応する前記代表ノードが配置された前記配列の配列要素の配列番号であることを特徴とする請求項記載のデータ構造。
  10. 請求項8又は請求項9記載のデータ構造を記憶したことを特徴とするコンピュータ読み取り可能な記憶媒体。
JP2007114915A 2007-04-19 2007-04-25 ビット列検索方法及び検索プログラム Expired - Fee Related JP4439013B2 (ja)

Priority Applications (6)

Application Number Priority Date Filing Date Title
JP2007114915A JP4439013B2 (ja) 2007-04-25 2007-04-25 ビット列検索方法及び検索プログラム
EP08738589.4A EP2149845B1 (en) 2007-04-19 2008-04-14 Coupled node tree backup/restore apparatus, backup/restore method, and program
CN2008800122779A CN101657818B (zh) 2007-04-19 2008-04-14 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质
PCT/JP2008/000983 WO2008132806A1 (ja) 2007-04-19 2008-04-14 カップルドノードツリーの退避/復元方法、最長一致/最短一致検索方法、ビット列検索方法及び記憶媒体
TW097114278A TW200846955A (en) 2007-04-19 2008-04-18 Coupled node tree save/restore method, longest consistence/shortest consistence retrieval method, bit retrieval method and memory medium
US12/588,522 US8250076B2 (en) 2007-04-25 2009-10-19 Bit string search apparatus, search method, and program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007114915A JP4439013B2 (ja) 2007-04-25 2007-04-25 ビット列検索方法及び検索プログラム

Publications (3)

Publication Number Publication Date
JP2008269503A JP2008269503A (ja) 2008-11-06
JP2008269503A5 JP2008269503A5 (ja) 2009-11-26
JP4439013B2 true JP4439013B2 (ja) 2010-03-24

Family

ID=40048871

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007114915A Expired - Fee Related JP4439013B2 (ja) 2007-04-19 2007-04-25 ビット列検索方法及び検索プログラム

Country Status (2)

Country Link
US (1) US8250076B2 (ja)
JP (1) JP4439013B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4567754B2 (ja) 2008-01-17 2010-10-20 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP5165662B2 (ja) * 2009-10-27 2013-03-21 株式会社高速屋 ビット列キー分類・分配装置、分類・分配方法及びプログラム
JP5220057B2 (ja) * 2010-05-27 2013-06-26 株式会社高速屋 ビット列検索装置、検索方法及びプログラム
JP5220047B2 (ja) * 2009-11-30 2013-06-26 株式会社高速屋 ビット列検索装置、検索方法及びプログラム
WO2011064984A1 (ja) 2009-11-30 2011-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
US8493249B2 (en) 2011-06-03 2013-07-23 Microsoft Corporation Compression match enumeration
US20140101150A1 (en) * 2012-10-05 2014-04-10 Axis Semiconductor, Inc. Efficient high performance scalable pipelined searching method using variable stride multibit tries
US10067966B2 (en) * 2015-09-29 2018-09-04 Vmware, Inc. Leveraging hierarchy in a tree data structure to dynamically allocate keys
US10262016B2 (en) 2015-09-29 2019-04-16 Vmware, Inc. Tuning key space at the time of instantiation of a tree data structure

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6675163B1 (en) * 2000-04-06 2004-01-06 International Business Machines Corporation Full match (FM) search algorithm implementation for a network processor
JP3601416B2 (ja) 2000-06-13 2004-12-15 日本電気株式会社 情報検索方法及び装置
JP4270050B2 (ja) 2004-07-13 2009-05-27 パナソニック株式会社 冷蔵庫
JP4271214B2 (ja) 2006-07-07 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
JP4271227B2 (ja) 2006-10-30 2009-06-03 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム

Also Published As

Publication number Publication date
US20100042596A1 (en) 2010-02-18
JP2008269503A (ja) 2008-11-06
US8250076B2 (en) 2012-08-21

Similar Documents

Publication Publication Date Title
JP4271214B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4439013B2 (ja) ビット列検索方法及び検索プログラム
JP4271227B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4514771B2 (ja) カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
US8332410B2 (en) Bit string merge sort device, method, and program
WO2009084145A1 (ja) データベースのインデックスキー更新方法及びプログラム
JP4402120B2 (ja) ビット列検索装置、検索方法及びプログラム
CN101657818B (zh) 配对节点树保存/复原方法、最长一致/最短一致检索方法、比特序列检索方法以及存储介质
US8250089B2 (en) Bit string search apparatus, search method, and program
JP4567754B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4514810B2 (ja) ビット列検索装置、検索方法及びプログラム
WO2009122651A1 (ja) ビット列検索装置、検索方法及びプログラム
JP2011018296A (ja) カップルドノードツリーのインデックスキー挿入/削除方法
JP4813575B2 (ja) ビット列検索装置
WO2009093290A1 (ja) ビット列検索装置、検索方法及びプログラム

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20090908

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090908

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20090908

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091014

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20091023

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20091110

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091201

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: 20091228

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: 20100104

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

Free format text: PAYMENT UNTIL: 20130115

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

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

Free format text: PAYMENT UNTIL: 20130115

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: 20130115

Year of fee payment: 3

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

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

Free format text: PAYMENT UNTIL: 20160115

Year of fee payment: 6

LAPS Cancellation because of no payment of annual fees