JP5473893B2 - コード列検索装置、検索方法及びプログラム - Google Patents

コード列検索装置、検索方法及びプログラム Download PDF

Info

Publication number
JP5473893B2
JP5473893B2 JP2010293635A JP2010293635A JP5473893B2 JP 5473893 B2 JP5473893 B2 JP 5473893B2 JP 2010293635 A JP2010293635 A JP 2010293635A JP 2010293635 A JP2010293635 A JP 2010293635A JP 5473893 B2 JP5473893 B2 JP 5473893B2
Authority
JP
Japan
Prior art keywords
node
code string
search
bit
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.)
Expired - Fee Related
Application number
JP2010293635A
Other languages
English (en)
Other versions
JP2012141760A (ja
JP2012141760A5 (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.)
Kousokuya Inc
Original Assignee
Kousokuya Inc
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 Kousokuya Inc filed Critical Kousokuya Inc
Priority to JP2010293635A priority Critical patent/JP5473893B2/ja
Priority to PCT/JP2011/079375 priority patent/WO2012090763A1/ja
Publication of JP2012141760A publication Critical patent/JP2012141760A/ja
Priority to US13/926,545 priority patent/US20130297641A1/en
Publication of JP2012141760A5 publication Critical patent/JP2012141760A5/ja
Application granted granted Critical
Publication of JP5473893B2 publication Critical patent/JP5473893B2/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/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing
    • G06F16/90344Query processing by using string matching techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees

Landscapes

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

Description

本発明は、ビット列で構成される文字コードあるいは文字コード列を検索する文字列検索のように、コンピュータにより、ビット列で構成されるコードあるいはコード列を検索するコード列検索装置、検索方法及びプログラムに関する。
近年、ビジネス文書を作成するためにワードプロセッサを使用することが通例となり、またインターネットが普及したことにより、ビット列からなる文字コードを用いた、コンピュータで処理可能な電子文書が世の中に大量に存在するようになっている。そのため、これら大量の電子文書の中からコンピュータを利用して必要なものを探し出すために、各種の文字列検索手法が開発されている。
これらの文字列検索手法の1つとして、図1Aを参照して、可変長文字列を検索対象とする最長一致検索(以下、可変長文字列の最長一致検索、のように表記する。)の例について説明する。なお、ここでいう最長一致検索とは、検索文字列に前方一致する最長の文字列を検索対象文字列の集合から検索するものである。このような最長一致検索は、例えばルータにおけるルーティング先の検索や電子辞書の辞書引きに用いられている。
図1Aに示す例では、検索対象文字列(登録パターン)10として「BEAB」、「BAB」、「ABEAB」、「AB」及び「A」の各文字列が登録されている。検索対象文字列は、ルーティング先の検索ではルーティング先であり、辞書引きでは辞書の見出しである。
この検索対象文字列10を検索文字列40a「ABEABC」で検索すると、検索文字列40aに前方一致する検索対象文字列は「A」、「AB」、「ABEAB」となる。それらのうち最長の検索対象文字列は「ABEAB」なので、「ABEAB」が最長一致検索の検索結果文字列50aである。
また、検索対象文字列10を検索文字列40b「ABE」で検索すると、前方一致する検索対象文字列は「A」、「AB」となるが、そのうち最長の検索対象文字列は「AB」なので、「AB」が検索結果文字列50bである。なお、検索文字列40b「ABE」は検索対象文字列10に含まれる文字列「ABEAB」に前方一致するが、本願の最長一致検索は、先に述べたとおり、検索文字列に前方一致する最長の文字列を検索対象文字列の集合から検索するものであり、文字列「ABEAB」は検索文字列40b「ABE」に前方一致しないので、検索結果文字列にはなり得ない。
さらに、検索対象文字列10を検索文字列40c「AB」で検索すると、前方一致する検索対象文字列は上と同じ「A」、「AB」となる。そのうち最長の検索対象文字列は「AB」であるので、上記と同じ「AB」が検索結果文字列50bである。
上述の可変長文字列の最長一致検索には、可変長文字列のある長さの前半の部分をプレフィックスとし、後半の部分をサフィックスとして分割し、プレフィックスをインデックスとして検索して絞り込んでからサフィックス部分を照合する手法が存在する。このような手法において、複数の長さのプレフィックスをインデックスとして適当な長さのインデックスを選択可能とすることにより、検索対象である登録パターンの文字列の重複部分の長さにばらつきがある場合にも検索効率を高くしようとする可変長文字列検索装置及び検索方法が提案されている(特許文献1)。
また、検索を高速に行うために、パトリシアツリーと呼ばれるデータ構造を用いることが知られている。パトリシアツリーは2分木の一種であり、エントリをもつ有効ノードと木を分岐させるための中継ノードから構成されている。
パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は1回ですむことなどのメリットがあるが、各ノードから2つのリンクが必ずあることによる記憶容量の増大、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
そこで本出願人は、パトリシアツリーの欠点を解消し、必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスの容易なカップルドノードツリーと呼ぶデータ構造を備えたビット列検索装置及び検索方法を提案した(特許文献2及び特許文献3)。
特許文献2及び特許文献3に開示されたカップルドノードツリーは、リンク先のデータを有するブランチノードと検索対象であるインデックスキーを有するリーフノードを備える。そしてそのツリー構造は、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノード、ブランチノード同士又はリーフノード同士のノード対から構成される。
ブランチノードは、検索キーの弁別ビット位置とリンク先のノード対のうちの一方である代表ノードにリンクするための代表ノード番号を含み、前記リーフノードは検索対象であるビット列からなるインデックスキーを含む。ルートノードは、ツリーのノードがただ1つのときを除いてはブランチノードである。
検索キーの弁別ビット位置は、検索キーのその位置のビット値を用いる点ではパトリシアツリーの検査ビット位置と同様であるが、パトリシアツリーでは検査ビット位置のビット値を判定してリンク先を求めるのに対して、カップルドノードツリーでは弁別ビット位置のビット値をリンク先のノードを求める演算に用いる点で異なる。
検索キーによる検索の実行は、ルートノードを含む各ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の一方のノードにリンクすることを順次リーフノードに至るまで繰り返すことにより行われる。
リーフノードに至ると、リーフノードの保持するインデックスキーを取り出す。取り出したインデックスキーと検索キーを比較し、一致すれば検索は成功し、一致しなければ、検索対象のインデックスキーには検索キーと一致するものはなかったので検索は失敗とすることができる。また、単に、取り出したインデックスキーを検索結果キーとすることもできる。
また、本出願人は、カップルドノードツリーのリーフノードが、検索対象であるインデックスキーを直接含むのではなく、インデックスキーの記憶された領域へのポインタである参照ポインタを含むものを提案した(特許文献4)。
なお、以下の説明においては、記載を簡略化するため、リーフノードがインデックスキーに替えて参照ポインタを含むものであっても、インデックスキーを含むリーフノード、リーフノードに含まれるインデックスキーということがある。また、インデックスキーを含むリーフノードを有するカップルドノードツリーについて、インデックスキーが格納されたカップルドノードツリー、あるいはカップルドノードツリーに格納されたインデックスキーのような表現を用いることがある。さらに、リーフノードがインデックスキーを含む場合及びインデックスキーへの参照ポインタを含む場合の双方について、リーフノードに係るインデックスキー、あるいはインデックスキーに係るリーフノードということがある。
図1Bに示すのは、特許文献4で提案したカップルドノードツリーを配列に格納する例を説明するものである。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
図1Bを参照すると、ノード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には、検索対象コード列の記憶領域を参照するポインタが格納されている。以下では表記の簡略化のため、参照ポインタに格納されたデータのことも参照ポインタということもある。
なお、代表ノードをノード[0]で表し、それと対になるノードをノード[1]で表すことがある。なお、代表ノードと対になるノードを非代表ノードということがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
配列番号30及び31の配列要素に格納されたノード122とノード123からなるノード対121の内容は省略されている。
ノード[0]112、ノード[1]113、ノード122及びノード123の格納された配列要素にそれぞれ付された“0”あるいは“1”は、検索キーで検索を行う場合にノード対のどちらの側のノードにリンクするかを示すものである。“0”の付された側の位置にあるノードを[0]側のノード、“1”の付された側の位置にあるノードを[1]側のノードということがある。また、ノード対のうち“0”の付された側の位置をノード[0]側、“1”の付された側の位置をノード[1]側ということがある。
カップルドノードツリーを用いた検索においては、前段のブランチノードの弁別ビット位置にある検索キーのビット値である“0”か“1”に応じて[0]側のノードあるいは[1]側のノードにリンクする。したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
なお、上記の例では代表ノード番号としてノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
さらに、本出願人は、ドントケアビットを含むビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法も提案している(特許文献5)。
特開2005−165598号公報 特開2008−015872号公報 特開2008−112240号公報 特開2008−269503号公報 特開2009−015530号公報
カップルドノードツリーを用いたビット列検索は、ツリーに必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスが容易であるという特徴があるが、可変長文字列あるいは可変長コード列の最長一致検索にカップルドノードツリーを応用した技術は存在しない。
そこで本発明は、可変長コード列の最長一致検索に適用可能なカップルドノードツリーを提供し、カップルドノードツリーが有する本来の特徴を生かした可変長コード列の最長一致検索を実現することを目的としている。
上記目的を達成するために、本発明においては、コード列からなる検索キーを符号化したビット列である符号化検索キーにより、検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定される構造を有するカップルドノードツリーを用いて検索が行われる。
前記カップルドノードツリーは、上述のとおり、検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定される構造を有し、ルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有するツリーの構成要素としてのノード対とを有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含んでいる。なお、リーフノードが検索対象コード列を含む場合及び検索対象コード列への参照ポインタを含む場合の双方について、リーフノードに係る検索対象コード列、あるいは検索対象コード列に係るリーフノードということがある。
前記符号化検索キーは、前記検索キーであるコード列に含まれる各コードのビット列に対して、識別ビットであって、該識別ビットに後続するコードが有ることを示す識別ビット(以下、有意コード識別ビットということがある。)を先頭に付加し、コード列の末尾に、後続するコードがないことを示す識別ビット(以下、無意コード識別ビットということがある。)を接続したビット列である。また、前記インデックスキーは、検索対象コード列に含まれる各コードのビット列に対して、有意コード識別ビットを先頭に付加し、コード列の末尾に無意コード識別ビットを接続したビット列である。
したがって、長さが0である無意のコードが前期検索キーであるコード列及び検索対象コード列の末尾に存在すると考えると、前記識別ビットは、該識別ビットに後続するコードが有意のコードか無意のコードかを識別するものである。また、識別ビットは、後続するコードの有無を示すものということもできる。
本発明によれば、まず、前記カップルドノードツリーを符号化検索キーにより検索し、検索結果コード列としての検索対象コード列を得るとともに、検索の過程においてたどったブランチノードのうち、その弁別ビット位置の値が、符号化検索キーを構成するビット列のうちいずれかの識別ビットが存在する位置と一致するブランチノード(以下、コード列区切りブランチノードということがある。)の位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納する初期検索が実行される。コード列区切りブランチノードのリンク先のノード対を構成するノードを該ブランチノードの子ノード、該リンク元のブランチノードを親ノードと定義すると、スタックには、コード列区切りブランチノードの位置を示す情報が親ノードの位置を示す情報として格納される。また、例えば、コード列区切りブランチノードの子ノードのうち一方のノードの位置を示す情報をコード列終端側ノードに係る検索対象コード列にアクセスするための情報とすると、それは子ノードの位置を示す情報として格納される。コード列区切りブランチノードの定義により、子ノードのうち、[0]側のノードあるいは[1]側の一方のノードはリーフノードである。
次に、検索結果コード列をインデックスキーに符号化し、符号化検索キーと比較することにより、検索結果コード列が最長一致コード列(以下、最長一致キーということがある。)であるか判定し、検索結果コード列が最長一致キーでなければ、スタックからコード列終端側ノードに係る検索対象コード列にアクセスするための情報を読み出して検索対象コード列を探索し、該検索対象コード列から最長一致キーを求める最長一致検索が実行される。
本発明によれば、カップルドノードツリーの構造を、検索対象コード列を後続するコードの有無を示す識別ビットとコードに対応するビット列の組み合わせで符号化したインデックスキーにより決定されるものとし、検索キーを検索対象コード列と同様に符号化した符号化検索キーにより検索するとともに、検索の過程でたどった経路をスタックに記憶している。そして、コード列からなる検索キーによる最長一致検索を、符号化検索キーによる検索結果のコード列とスタックに記憶した検索経路の情報によりアクセスする検索対象コード列を探索することで実現することができる。
可変長文字列の最長一致検索の例について説明する図である。 カップルドノードツリーを配列に格納する例を説明する図である。 本発明の一実施形態におけるコード列の符号化方法の一例について説明する図である。 本発明の一実施形態におけるカップルドノードツリーのツリー構造を概念的に示す図である。 本発明を実施するためのハードウェア構成例を説明する図である。 本発明の一実施形態における基本検索処理の処理フロー例を説明する図である。 本発明の一実施形態におけるコード列検索の処理フロー例を説明する図である。 本発明の一実施形態における符号化処理の処理フロー例を説明する図である。 符号化検索キーによる初期検索の流れを概念的に示す図である。 初期検索の処理フロー例を説明する図である。 最長一致検索の流れを概念的に示す図である。 最長一致検索における初段の処理フロー例を説明する図である。 最長一致検索における中段の処理フロー例を説明する図である。 最長一致検索における後段の処理フロー例を説明する図である。 探索経路スタックの格納例とインデックスキーの関係を説明する図である。 初期検索で得られたインデックスキーが符号化検索キーに前方一致する場合の最長一致検索の例を概念的に説明する図である。 初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも短い場合の最長一致検索の例を概念的に説明する図である。 初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも長い場合の最長一致検索の例を概念的に説明する図である。 本発明の一実施形態におけるカップルドノードツリーを生成する処理フロー例を説明する図である。 本発明の一実施形態における挿入処理の前段の処理フロー例を説明する図である。 本発明の一実施形態における挿入処理の中段の処理フロー例を説明する図である。 本発明の一実施形態における挿入処理の後段の処理フロー例を説明する図である。 本発明の一実施形態における削除処理の前段の処理フロー例を説明する図である。 本発明の一実施形態における削除処理の後段の処理フロー例を説明する図である。 本発明の一実施形態におけるコード列検索装置の機能ブロック構成例を示す図である。
次に、本発明の実施の形態について詳細に説明する。以下では、コード列の符号化方法の例と、カップルドノードツリーの例を説明してから、検索、挿入、削除の各処理について説明する。なお、以下の説明においては、リーフノードは検索対象コード列が格納された記憶領域を指す参照ポインタを含むものとしているが、リーフノードが検索対象コード列を直接含むものであっても、同様な説明が成り立つことは、当業者に明らかである。
本発明においては、文字に限らず任意の記号や項目などを識別するために用いられるコードからなるコード列を対象とする。そして、本発明においては、コード列そのものを直接取り扱うのではなく、コード列に含まれる各コードを符号化した符号化コードの列を取り扱う。先に述べたように、各コードは、後続するコードが存在するか否かを示す識別ビットと各コードをビット表現した複数のビットを組み合わせることで符号化される。本発明においては、コード列の各コードを符号化した符号化コードの列である符号化コード列により検索等の処理を行う。
図2を参照して、本発明のコード列検索装置、検索方法及びプログラムにおけるコード列の符号化方法の一例について説明する。
図2に示す例では、「A」、「B」、「C」、「D」、「E」、「F」及び「G」の各コード、並びに、コード列の終端を示すコード「*」の8種類のコードが存在するものとしている。各コードはそれぞれ複数のビットからなるビット列で表現されており、この例では、それぞれ、コード表13に示される3ビットの値で表現されている。
なお、コード「*」は、後の説明から理解されるように、先に述べた長さが0である無意のコードと等価なものである。
ここで、コード「A」、「B」、「E」、「A」及び「B」を連結したコード列50を符号化する場合について説明する。図中52はコード位置(この例では、P1〜P6)である。図示するようにコード列50は、コード位置P1にコード「A」、コード位置P2にコード「B」、コード位置P3にコード「C」、コード位置P4にコード「A」、コード位置P5にコード「B」、コード位置P6にコード列の終端を示すコード「*」の6個のコードからなる。
前記コード列50「ABEAB*」は、前記コード表13に記載されたコードのビット値により、図中60で示すビット表現されたコード列となる。この例では、ビット表現されたコード列60は、“001 010 101 001 010 000”である。
先に述べたように、コード列の各コードは、後続するコードが存在するか否かを示す識別ビットと各コードをビット表現した複数のビットを組み合わせることで符号化される。図2に示すように、終端を示すコード以外のコード列50に含まれる各コードは、1ビットの有意コード識別ビット73aと各コードのビット値(3ビット)72からなる4ビットの符号化コード74に符号化される。図2の例では、有意コード識別ビット73aのビット値は“1”である。また、コード列の終端を示すコード「*」は、終端を示す無意コード識別ビット73b(値は“0”)に符号化される。
このようにして、前記コード列50は、1ビットの有意コード識別ビット73aと有意の各コードのビット値(3ビット)72からなる4ビットの符号化コード74と終端を示す無意コード識別ビット73bから構成される符号化コード列70に符号化される。以下の説明においては、ビット表現された符号化コード列を符号化ビット列という場合もある。
なお、符号化コード列の長さを示す「符号化ビット長」には、終端を示す無意コード識別ビット73bを含まないものとする。したがって、図2に示すように、コード列50を符号化した符号化コード列70の符号化ビット長は20ビットである。
この符号化方法によれば、符号化前のコード列において後続の有意のコードがあるか否かを、符号化コード列のビット表現から簡単に判断することができる。すなわち、符号化コード列中の第((コードに対応するビット数(この例では3)+1)×n)ビット(nは0以上の整数)が識別ビットの位置であり、その位置のビット値が“0”であるか“1”であるかによって、後続する有意のコードの有無を判定することができる。
なお、上記においては有意コード識別ビットの値を“1”、無意コード識別ビットの値を“0”としたが、逆にしてもよい。さらに、複数ビットからなる識別ビットを用いるようにしてもよい。
本発明においては、検索対象コード列を上記符号化方法で符号化した符号化ビット列であるインデックスキーの集合によりカップルドノードツリーを構成し、コード列からなる検索キーを上記符号化方法で符号化した符号化ビット列である符号化検索キーを用いて検索等の処理を行う。
次に、本発明の一実施形態におけるカップルドノードツリーの例について説明する。
図3は、カップルドノードツリーのツリー構造を概念的に示す図である。ここでは、検索対象コード列「BEAB*」、「BAB*」、「ABEAB*」、「AB*」、「A*」及び「*」を符号化したインデックスキーを格納するカップルドノードツリー200を例にとって説明する。これらのコード列は、前記図1Aに示した例の各コード列にコード列の終端を示すものとして無意のコード「*」を付加し、さらにコード列として、コード「*」のみからなるコード列が加えられている。
ここで、カップルドノードツリー200が、無意のコード「*」のみからなるコード列も含むようにしている理由は、後に詳細に説明する最長一致検索において、検索キーに前方一致する検索対象コード列が1つも存在しないことがないようにするためである。
もちろん、検索キーに前方一致する検索対象コード列が1つも存在しないことを許容し、カップルドノードツリー200が、無意のコード「*」のみからなるコード列を含まないようにすることも可能である。
カップルドノードツリー200が、無意のコード「*」のみからなるコード列も含むようにすることにより、どのような検索キーで検索しても、必ず検索結果キーを得ることができることについては、後の最長一致検索の説明において詳細に説明する。
図中、符号210aで示すのがルートノードである。図示の例では、ルートノード210aは配列番号220に配置されたノード対201aの代表ノードとされている。
ツリー構造としては、ルートノード210aの下にノード対201bが配置され、その下層にノード対201cが配置され、さらにその下層にノード対201dとノード対201fが配置され、ノード対201dの下層にはノード対201eが配置されている。
各ノードの前に付された“0”あるいは“1”の符号は、図1Bに関して前述した配列要素の前に付された符号と同じである。
図示された例では、ルートノード210aのノード種別260aは“0”でブランチノードであることを示し、弁別ビット位置230aは“0”を示している。代表ノード番号は220aであり、それはノード対201bの代表ノード210bの格納された配列要素の配列番号である。
ノード対201bはノード210bと211bで構成されている。ノード210bのノード種別260bには“1”が格納されているので、このノードはリーフノードであり、参照ポインタ250bを含んでいる。参照ポインタ250bには、コード列の格納領域311における、無意のコード「*」のみからなるコード列290bが格納されている領域を参照するポインタが格納されている。先に述べたように、参照ポインタ250bに格納されているポインタも参照ポインタといい、符号280bで表す。他のリーフノードについても同様に、参照ポインタに格納されたポインタを参照ポインタと呼ぶ。なお、参照ポインタ250bの近傍に記載された0は参照ポインタ280bで参照されるコード列を符号化した符号化コード列のビット表現であり、(*)は、そのビット表現がコード列「*」のビット表現であることを示している。他のリーフノードにおいても同様である。以下の説明においては、任意のコード列「ABC」に対して、そのビット表現を(ABC)と表記することがある。
また、ノード211bのノード種別261bは“0”であり、このノードがブランチノードであることを示している。ノード211bの弁別ビット位置231bには“2”が格納され、リンク先の代表ノード番号にはノード対201cの代表ノード210cの格納された配列要素の配列番号221bが格納されている。
ノード対201cはノード210cとノード211cで構成され、それらのノード種別260c、216cはともに“0”であり、プランチノードであることを示している。ノード210cの弁別ビット位置230cは“4”であり、代表ノード番号にはノード対201dの代表ノード210dの格納された配列要素の配列番号220cが格納されている。
ノード210dのノード種別260dには“1”が格納されているので、このノードはリーフノードであり、参照ポインタ250dには、符号290dで示すコード列「A*」が格納されている領域を指す参照ポインタ280dが格納されている。
ノード210dと対になるノード211dのノード種別261dは“0”であり、弁別ビット位置231dには“8”が格納されている。そして、代表ノード番号には、ノード対201eの代表ノード210eの格納された配列要素の配列番号221dが格納されている。
ノード対201eはノード210eとノード211eで構成され、それらのノード種別260e、261eはともに“1”であり、双方ともリーフノードであることを示している。ノード210eの参照ポインタ250eには、符号290eで示すコード列「AB*」が格納されている領域を指す参照ポインタ280eが格納されており、ノード211eの参照ポインタ251eには符号291eで示すコード列「ABEAB*」が格納されている領域を指す参照ポインタ281eが格納されている。
前記ノード対201cのもう一方のノードであるノード211cの弁別ビット位置231cは“5”であり、代表ノード番号にはノード対201fの代表ノード210fの配列要素の配列番号221cが格納されている。
ノード対201fはノード210fとノード211fで構成され、それらのノード種別260f、261fはともに“1”であり、双方ともリーフノードである。ノード210fの参照ポインタ250fには符号290fで示すコード列「BAB*」が格納されている領域を指す参照ポインタ280fが格納されており、ノード211fの参照ポインタ251fには符号291fで示すコード列「BEAB*」が格納されている領域を指す参照ポインタ281fが格納されている。
次に、カップルドノードツリーの構成の意味について説明する。
図3に示したカップルドノードツリー200における検索対象コード列と、各検索対象コード列を前記図2に関して説明した符号化方法により符号化した符号化ビット列(インデックスキー)は次の表1のようになる。
Figure 0005473893
上記表1において、コード列「*」以外の有意のコード列はその符号化ビット列の0ビット目が“1”であり、コード列「*」の符号化ビット列は0ビット目の値が“0”となっている。そこで、符号化ビット列の0ビット目の値を判定することにより、コード列「*」とその他のコード列を弁別することができる。図3において、ルートノード210aの弁別ビット位置230aが“0”であるのは、カップルドノードツリーにコード列「*」が含まれていることによる。符号化ビット列の0ビット目の値が“0”のときのリンク先であるノード210bには、コード列「*」が格納されている領域を指す参照ポインタ280bが格納されている。
次に、有意のコード列の符号化ビット列をみていくと、符号化ビット列の1ビット目は全て“0”で等しく、2ビット目はコード列「BEAB*」と「BAB*」については“1”であり、コード列「ABEAB*」、「AB*」及び「A*」については“0”である。
符号化ビット列のなかに、2ビット目のビット値が互いに異なるものがあることから、符号化ビット列の0ビット目の値が“1”のときのリンク先であるブランチノード211bの弁別ビット位置231bの値は“2”であり、符号化ビット列の2ビット目の値が“0”のときはノード対201cの代表ノード210cにリンクし、“1”のときはノード211cにリンクしている。
上記ブランチノード211bでの分岐をコード列の観点からみると、該分岐は、検索対象コード列中のコード列には、1番目のコード位置に位置するコードが「A」であるものと「B」であるものが存在することを反映している。以下の説明において、ブランチノード211bのように、その弁別ビット位置の値が識別ビットの位置と一致しないブランチノードをコード弁別ブランチノードということがある。なお、上述の例では、コード弁別ブランチノード211bにおいて、1番目のコードが「A」であるコード列と「B」であるコード列のように1番目のコードが完全に弁別されて分岐が行われるが、一般には、コード弁別ブランチノードでコードが完全に弁別されて分岐が行われるわけではない。
符号化ビット列の2ビット目の値が“0”のときのリンク先であるノード210cの弁別ビット位置230cには“4”が格納されている。これは、上記表1において符号化ビット列の2ビット目が“0”であるコード列「ABEAB*」、「AB*」及び「A*」の符号化ビット列の3ビット目以降をみていくと、3ビット目の値はいずれも“1”であるが、4ビット目の値が、コード列「ABEAB*」と「AB*」は“1”、コード列「A*」は“0”となっていることに基づいている。すなわち、有意のコードの数が1のコード列と有意のコードの数が2以上のコード列があることに基づいている。そして、符号化ビット列の4ビット目の値が“0”であるときのリンク先であるノード対201dの代表ノード210dにはコード列「A*」が格納されている領域を指す参照ポインタ280dが格納されている。
また、符号化ビット列の4ビット目が“1”であるときのリンク先であるノード211dには弁別ビット位置231dに“8”が格納されている。これは、符号化ビット列の2ビット目が“0”であり、4ビット目が“1”であるコード列「ABEAB*」と「AB*」の符号化ビット列の5ビット目以降をみていくと、5ビット目から7ビット目は同じ値となっているが、8ビット目が異なっていることによる。すなわち、有意のコードの数が2のコード列と有意のコードの数が3以上のコード列があることが反映されている。
そして、ノード211dからのリンク先であるノード対201eの代表ノード210e(符号化ビット列の8ビット目が“0”であるときのリンク先)には、コード列「AB*」が格納されている領域を指す参照ポインタ280eが格納されており、8ビット目が“1”であるときのリンク先であるノード211eにはコード列「ABEAB*」が格納されている領域を指す参照ポインタ281eが格納されている。
前記符号化ビット列の2ビット目が“1”であるときのリンク先であるノード211cには弁別ビット位置231cとして“5”が格納されている。これは、符号化ビット列の2ビット目が“1”であるコード列「BEAB*」と「BAB*」の符号化ビット列の3番目以降のビット列をみていくと、3ビット目と4ビット目は同じであるが、5ビット目が異なる値となっていることによる。そして、5ビット目が“0”であるときのリンク先であるノード210fにはコード列「BAB*」が格納されている領域を指す参照ポインタ280fが格納されており、5ビット目が“1”であるときのリンク先であるノード211fにはコード列「BEAB*」が格納されている領域を指す参照ポインタ281fが格納されている。コード識別ブランチノードであるノード211cにおける分岐は、その下位の検索対象コード列中のコード列には、2番目のコード位置に位置するコードが「E」であるものと「A」であるものが存在することを反映している。
このように、カップルドノードツリーの構造は、インデックスキー(検索対象コード列を符号化した符号化ビット列)の集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
すなわち、カップルドノードツリーにインデックスキーの差分情報が登録されているということができる。
そして、インデックスキーの先頭に近いビット位置から順に、互いに異なるビット値となるビット位置ごとに、ビット値が“1”のノードとビット値が“0”のノードに分岐している。また、符号化によりコード列の大小関係が変わることはない。このことから、ノード[1]側とツリーの深さ方向を優先させてリーフノードをたどり、そのリーフノードに格納されている参照ポインタにより参照される検索対象コード列を見ると、検索対象コード列は降順にソートされている。
また、本発明のカップルドノードツリーは、検索対象コード列を符号化した符号化ビット列を格納したものであることから、コード列区切りブランチノードのリンク先のノード[0]はリーフノードであるという特徴を有する。図3に示すカップルドノードツリー200の例では、コード列区切りブランチノードはルートノード210a、ノード210c、ノード211dであり、それぞれのリンク先のノード[0]はノード210b、ノード210d、ノード210eであって、すべてリーフノードである。その理由は、コード列区切りブランチノードのリンク先のノード[0]以下に配置されるリーフノードに係る符号化ビット列の、該コード列区切りブランチノードの弁別ビット位置に該当するビット位置のビット値は“0”、すなわち符号化ビット列の識別ビットの値は“0”である。したがって、ノード[0]以下に配置されるリーフノードに係る符号化ビット列はただ1つであり、ノード[0]においてそれ以上分岐することはないからである。
さらに、上記ノード[0]に係るコード列は、該ノード[0]と対をなす[1]側の子ノード以下に配置されたリーフノードに係るコード列に前方一致する。
なお、上述のコード列区切りブランチノードの子ノードのうちノード[0]はリーフノードであるという事項は、コード「*」を“0”と符号化することと対応している。コード「*」を“1”と符号化すると、コード列区切りブランチノードの子ノードのうちノード[1]がリーフノードとなることは明らかである。そこで、コード列区切りブランチノードの子ノードのうち、後続するコードが存在しないことを示すビット値により分岐するリーフノードをコード列終端側ノードあるいはコード列終端側子ノードといい、それと対をなすノードをコード列連結側ノードあるいはコード列連結側子ノードという。すると、コード列終端側ノードは、リーフノードである。また、コード列終端側ノードに係るコード列は、該コード列終端側ノードと対をなすコード列連結側ノード以下に配置されたリーフノードに係るコード列に前方一致する。さらに、コード列終端側ノードに係るコード列の長さは、該コード列終端側ノードと対をなすコード列連結側ノード以下に配置されたリーフノードに係るコード列の長さより短いことは明らかである。
なお、カップルドノードツリーはそのルートノードの配列番号により識別できることから、カップルドノードツリーの管理はルートノードの配列番号を用いて行うことができる。そこで、カップルドノードツリーの管理手段には、カップルドノードツリーのルートノードの配列番号が登録されているものとする。
図4は、本発明を実施するためのハードウェア構成例を説明する図である。
本発明のコード列検索装置による検索処理及びデータメンテナンスは中央処理装置302及びキャッシュメモリ303を少なくとも備えたデータ処理装置301によりデータ格納装置308を用いて実施される。カップルドノードツリーが配置される配列309、検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック310及びコード列の格納領域311を有するデータ格納装置308は、主記憶装置305又は外部記憶装置306で実現することができ、あるいは通信装置307を介して接続された遠方に配置された装置を用いることも可能である。図1Bの配列100は、配列309の一例である。
図4の例示では、主記憶装置305、外部記憶装置306及び通信装置307が一本のバス304によりデータ処理装置301に接続されているが、接続方法はこれに限るものではない。また、主記憶装置305をデータ処理装置301内のものとすることもできるし、探索経路スタック310を中央処理装置302内のハードウェアとして実現することも可能である。あるいは、配列309又はコード列の格納領域311は外部記憶装置306に、探索経路スタック310を主記憶装置305に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
このようなカップルドノードツリーを用いた基本的な検索処理について、図5を参照して説明する。この図5に例示する基本的な検索処理は、後に図12、図13A〜図13Cを参照して説明する挿入処理、及び図14A〜図14Bを参照して説明する削除処理の中で実行されるものである。そして、図5に例示する処理フローは、先に述べた特許文献4において例示された検索処理の処理フローを変形したものである。なお、処理を実行するときに、配列番号などの各種変数を一時的に記憶する領域を設けて対応する情報を格納して処理を進めていくことが行われるが、それら変数を格納する領域をその変数名で呼ぶことがある。例えば、「配列番号に検索開始ノードの配列番号を設定する。」といったときは、配列番号を格納する領域に検索開始ノードの配列番号を設定する、あるいは、配列番号という名称の変数に検索開始ノードの配列番号を設定することを意味する。
本発明の好ましい一実施形態においては、カップルドノードツリーを検索中にたどる経路を記憶するための手段として、検索中に通過するノードが格納されている配列要素の配列番号を格納するための探索経路スタックが設けられている。図5に示すように、検索処理を開始するにあたって、ステップS501で、配列番号に検索開始ノードの配列番号を設定する。設定された配列番号に対応する配列要素は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、図5に例示する基本的な検索処理を利用する各種の処理に応じて行われる。
次に、ステップS502で、ステップS501で設定された、あるいは後記ステップS509で得た配列番号を前記探索経路スタックに格納し、ステップS503で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップS504で、読み出したノードから、ノード種別を取り出し、ステップS505で、ノード種別がブランチノードであるか否かを判定する。
ステップS505の判定において、読み出したノードがブランチノードである場合は、ステップS506に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップS507で、取り出した弁別ビット位置に対応するビット値を符号化検索キーから取り出す。そして、ステップS508で、ノードから代表ノード番号を取り出して、ステップS509で、符号化検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップS502に戻る。
以降、ステップS505の判定においてリーフノードと判定されてステップS510に進むまで、ステップS502からステップS509までの処理を繰り返す。ステップS510で、リーフノードから参照ポインタを取り出して、処理を終了する。
このように、リーフノードに到達したときに検索が終了し、検索中に前記リーフノードに至るまでにたどったブランチノードが格納された配列要素の配列番号が順次、探索経路スタックに格納される。
次に、本発明の一実施形態におけるコード列検索処理について、図6のフローチャートを参照して説明する。図6の検索処理では、所望のコード列が検索キーとして設定され、その検索キーを符号化した符号化検索キーによりカップルドノードツリーが検索される。
図6の検索処理は、以下に述べる「最長一致キー」の条件を満たすインデックスキーがカップルドノードツリーに格納されていれば、その最長一致キーに対応する検索結果コード列を得る処理である。もし、最長一致キーの条件を満たすインデックスキーがカップルドノードツリーに格納されていなければ、検索失敗として処理を終了することになるが、後に説明するように、本発明の一実施形態においては、検索対象のコード列にコード「*」を含めるので、実質的に最長一致キーの条件を満たすインデックスキーがカップルドノードツリーに格納されていなくても、コード「*」に対応するインデックスキーが形式的な最長一致キーとして得られる。
本実施の形態において最長一致キーとは、検索キーを符号化した符号化検索キーに前方一致するインデックスキーの中で、最長のインデックスキーである。符号化検索キーに前方一致するインデックスキーは、そのインデックスキーの長さの範囲で符号化検索キーと完全に一致している。符号化検索キーと全く同一のインデックスキーは、符号化検索キーと前方一致するインデックスキーの中で最長のインデックスキーであるので、最長一致キーとなる。
図6に示すように、まずステップS601で、コード列に所望のコード列を検索キーとして設定する。次に、ステップS602に進み、コード列に設定された検索キーを、前記図2を用いて説明した符号化方法を用いて符号化して符号化コード列を作成し、その符号化コード列の符号化ビット長の情報を得る符号化処理を行う。なお、符号化処理の詳細については図7を参照して後述する。
次にステップS603において、ステップS602で作成した符号化コード列を符号化検索キーに設定し、ステップS602で得た符号化コード列の符号化ビット長を符号化検索キーの符号化ビット長に設定する。
上述のステップS601とステップS603の処理は、ステップS602の符号化処理を図7に示す各種コード列に共通な符号化処理を検索キーに適用するためのものである。図7に示す共通な符号化処理を用いることに替えて、図7に示す処理を検索キーの符号化処理用のもののように特定のコード列の符号化に変更して符号化処理を行うことも可能である。以下の符号化処理の説明においては、そのような場合についても、図7に示す処理フローにより実現されると表記する場合がある。
続いて、ステップS604で、検索対象のカップルドノードツリーのルートノードを検索開始ノードに設定し、次に、ステップS605で初期検索処理を実行する。この処理は、カップルドノードツリーのノードを格納する配列を、符号化検索キーにより検索開始ノードから検索し、検索結果としての参照ポインタを得るとともに、検索が終了するまでにたどったコード列区切りブランチノードの配列番号とコード列連結側ノードの配列番号を探索経路スタック310に格納する処理である。このステップS605の処理の詳細については、後に図8A及び図8Bを参照して説明する。
次にステップS606に進み、符号化検索キーにより最長一致キーを得る最長一致検索を実行して処理を終了する。この最長一致検索処理は、前記初期検索処理により検索結果として得られた参照ポインタ及び前記探索経路スタック310に格納された配列番号のコード列連結側ノードと対になるコード列終端側ノードに格納されている参照ポインタにより参照されるコード列に対応するインデックスキーの中から、符号化検索キーに最も長く前方一致するインデックスキー、すなわち、最長一致キーを求める処理である。ステップS606の処理の詳細については、後に図9A〜図9Dを参照して説明する。
図7は、本発明の一実施形態における符号化の処理フロー例を説明する図である。本発明の一実施形態における符号化処理では、設定されたコード列を図2に例示したように符号化して符号化コード列を生成するとともに符号化ビット長を設定する。
この符号化処理は、図6のステップS602及び後に説明する図9BのステップS902において実行される処理である。
まず、ステップS701において、コードビット長にコード列に設定された各コードのビット長(前記図2に示した例においては、“3”)を設定する。
次に、ステップS702に進み、コード列中のコードのうち次に処理すべきコードの位置を示すコード位置を初期化する。本実施の形態では第0番目のコードから順に処理するために、コード位置を“0”に初期化する。
そして、ステップS703において、この符号化処理により生成される符号化コード列の符号化コードが格納される符号化コードの格納位置を初期値にセットする。
続いて、ステップS704において、コード位置はコードの終端か否か、すなわち、コード位置の指すコードがコード列の終端を示すコード「*」であるか否かを判定し、コード列の終端を示すコード「*」でないときはステップS705へ進み、「*」であるときはステップS709へ進む。
ステップS705では、コード列からコード位置の指すコードに対応するビット値を取り出す。
そして、ステップS706aで、符号化コードに、後続するコードが存在することを示す識別ビット(この例では、“1”)を設定する。
次に、ステップS706bで、該符号化コードの末尾に前記ステップS705で得たコードのビット値を連結する。
続いて、ステップS707で、符号化コード列の符号化コードの格納位置の指す位置に、ステップS706bでビット値が連結された符号化コードを格納する。
そして、ステップS708aでコード位置を次のコード位置に進め、ステップS708bで符号化コードの格納位置を次の符号化コードの格納位置に進めて、前記ステップS704に戻る。図2に示す例では、次の符号化コードの格納位置は、識別ビット分の1ビットとコードのビット長分の3ビットの和である4ビット分進められる。
ステップS704でコード位置がコード列の終端であると判定されたときは、ステップS709に進み、符号化コード列の符号化コードの格納位置の指す位置に、終端を示す識別ビット(この例では、“0”)を格納する。
そして、ステップS710で符号化ビット長に符号化コードの格納位置を設定して、処理を終了する。
以上の処理により、設定されたコード列から前記図2に示した符号化方法により符号化された符号化コード列と、その符号化ビット長を得ることができる。
なお、先に述べたように、図7に示す符号化処理は、各種コード列に共通な符号化処理であり、一時記憶領域であるコード列に設定された検索キーなどのコード列を符号化して符号化コード列に設定するものである。しかし、図7に示す処理フローの一時記憶領域であるコード列及び符号化コード列を符号化しようとする特定のコード列のものとすることにより、該特定のコード列を符号化できることは明らかである。後に説明する挿入処理における挿入コード列及び符号化挿入キー、削除処理における削除コード列及び符号化削除キーはその一例である。
また、本実施の形態では、図7に例示するようにコード列を構成する全てのコードを一括して符号化しているが、検索キーであるコード列が検索対象コード列に比べて長いものである場合には、検索処理において、探索経路上のブランチノードの弁別ビット位置の範囲までのコードを逐次符号化してもよい。
次に、図8A及び図8Bを参照して、本発明の一実施形態における初期検索について説明する。
図8Aは、符号化検索キーによる初期検索の流れを概念的に示す図である。図8Aには、符号化検索キー270と図3に示すカップルドノードツリー200の一部と探索経路スタック310が記載されている。
符号化検索キー270には、検索キー「ACE*」を符号化した符号化検索キー(ACE*)である符号化ビット
1001101111010”(以下、符号化検索キー70ということもある。)が格納されている。
カップルドノードツリー200のノード211cより下位の部分は省略され、符号化検索キー70でルートノード210aから初期検索を行ったときの探索経路が太線の枠と矢印で示されている。
初期検索においては、まず検索開始ノードとして配列番号220のルートノード210aが設定される。ルートノード210aの弁別ビット位置230aの値は“0”、符号化検索キー70のビット位置0のビット値は“1”であるので、ノード対201bの[1]側のノードであるノード211bにリンクする。また、ルートノード210aの弁別ビット位置230aの値“0”は、符号化ビット列70の識別ビットが存在するビット位置、0、4,8、・・・ の一つに一致する、すなわちルートノードはコード列区切りブランチノードであるので、探索経路スタック310に、ルートノード210a(親ノード)の配列番号220と、ルートノード210aの子ノードのうちコード列連結側ノードである[1]側のノード211bの配列番号220a+1が探索経路スタック310に格納される。
次に、ノード211bの弁別ビット位置231bの値は“2”、符号化検索キー70のビット位置2のビット値は“0”であるので、ノード対201cの[0]側のノードであるノード210cにリンクする。ノード211bの弁別ビット位置231bの値“2”は、符号化ビット列70の識別ビットが存在するビット位置と一致しないので、ここではノードの配列番号の探索経路スタック310への格納は行われない。
次に、ノード210cの弁別ビット位置230cの値は“4”、符号化検索キー70のビット位置4のビット値は“1”であるので、ノード対201dの[1]側のノードであるノード211dにリンクする。ノード210cの弁別ビット位置230cの値“4”は、符号化ビット列70の識別ビットが存在するビット位置と一致するので、ノード210cは先に述べたコード列区切りブランチノードである。したがって、ノードノード210c(親ノード)の配列番号221bと、ノード210cの子ノードのうち[1]側のノード211dの配列番号220c+1が探索経路スタック310に格納される。
次に、ノード211dの弁別ビット位置231dの値は“8”、符号化検索キー70のビット位置8のビット値は“1”であるので、ノード対201eの[1]側のノードであるノード211eにリンクする。ノード211dは、コード列区切りブランチノードであるので、ノード211d(親ノード)の配列番号220c+1と、ノード211dの子ノードのうち[1]側のノード211eの配列番号221d+1が探索経路スタック310に格納される。
ノード211eのノード種別261eの値は“1”であり、ノード211eがリーフノードであることを示している。そこで、参照ポインタ251eに格納されている参照ポインタ281eを取り出すことにより、初期検索が完了する。図に示すように、参照ポインタ281eの指す記憶領域には、コード列「ABEAB*」が格納されている。コード列「ABEAB*」を符号化した符号化コード列のビット表現は、“1001101011011…”となる。
上述の初期検索において、コード列区切りブランチノード(親ノード)の配列番号と該ブランチノードの子ノードのうちコード列連結側ノードの配列番号を探索経路スタック310に格納するのは、次の最長一致検索において、初期検索においてたどったコード列区切りブランチノードのコード列終端側子ノード(先に述べたようにリーフノードである。)を探索し、その参照ポインタの指すコード列を読み出すためである。
図8Aに示す初期検索の例では、コード列終端側ノードは、カップルドノードツリー200の下位の階層の側から、ノード210e、ノード210d、ノード210bである。[0]側のノードと[1]側のノードは隣接した記憶領域に配置されているので、探索経路スタックに格納されたコード列連結側ノードの配列番号により、コード列終端側ノードの配列番号を得ることができる。勿論、コード列連結側ノードの配列番号に替えて、コード列終端側ノードの配列番号を探索経路スタックに格納することにより、直接コード列終端側ノードの配列番号を得ることもできる。
また、コード列連結側ノードあるいはコード列終端側ノードの配列番号に替えて、リーフノードであるコード列終端側ノード自体を格納することも、参照ポインタあるいは該リーフノードに係るコード列を格納することも可能である。要するに、親ノードに関する情報とともに、コード列終端側子ノードに係るコード列にアクセスするための情報を格納すればよい。
次に初期検索の処理フローについて説明する。
図8Bは、前記図6のステップS605の処理の詳細を示すものであり、符号化検索キーによる初期検索の処理フロー例を説明する図である。
まず、ステップS801において、探索経路スタック310のスタックポインタの値を初期値に設定する。この初期値は、探索経路スタック310に何も格納されていないときの値である。本実施の形態の図8Bの処理におけるスタックポインタは、後述のステップS813において次の配列番号を格納する探索経路スタック310上の位置を示すものとして以下では説明する。
続いてステップS802で、配列番号に、検索開始ノードの配列番号を設定する。図8Bの処理が実行されるのは、図6のステップS604が実行された後なので、ステップS802では具体的にはルートノードの配列番号が設定される。
次に、ステップS803で、カップルドノードツリーのノードを格納する配列から、配列番号の指す配列要素をノードとして読み出す。
そして、ステップS804で、ステップS803で読み出したノードからノード種別の情報を取り出し、ステップS805で、そのノードがブランチノードであるか否かを判定する。
ステップS805の判定において、読み出したノードがブランチノード(ノード種別が“0”)である場合は、ステップS806に進み、そのノードから弁別ビット位置の情報を取り出す。
そして、ステップS807で、取り出した弁別ビット位置に対応するビット値を符号化検索キーから取り出し、ステップS808で、そのノードから代表ノード番号の情報を取り出す。
続いてステップS811で、ステップS806で取り出した弁別ビット位置が符号化ビット列の識別ビットの存在するいずれかの位置と一致するか否かを判定する。この判定は、先に述べた表記によれば、ステップS803で読み出したノードがコード列区切りブランチノードであるかを判定するものである。
なお、前述のように、識別ビットの位置は符号化方法に依存する。前記図2に示した例のように固定長コードの場合には、計算等により識別ビットの位置を求めることができるが、可変長コードの場合には、弁別ビット位置により識別ビットと可変長コードの位置をマップしたビットマップを索引する方法などを用いても良い。
ステップS811の判定の結果、弁別ビット位置が識別ビットの位置である場合は、符号化検索キーに後続するビット(有意のコードに対応するビット)が含まれるか否かの判定のためにステップS812に進み、ステップS807で取り出した識別ビットのビット値が“1”であるか否かを判定する。
識別ビットのビット値が“1”の場合、符号化検索キーには、弁別ビット位置より下位のビット位置に有意のコードに対応する値を有するビットが存在することを示している。
この場合は、ステップS813に進んで、ステップS803で読み出したノードの配列番号を親ノードの配列番号として探索経路スタック310に格納する。
続いてステップS814で、ステップS808で取り出した代表ノード番号に1を加えた値を新たな配列番号として設定する。
そして、ステップS815で、ステップS814で得た配列番号を子ノードの配列番号として探索経路スタック310に格納し、スタックポインタの値を1つ増やしてから、ステップS803に戻る。
なおここで「1つ増やす」という表現は、図8Aの例示のように探索経路スタック310を2列に分けて図示する説明に合わせた表現であり、具体的な探索経路スタック310及びスタックポインタの実装方法を限定する趣旨のものではない。
すなわち、本実施の形態における探索経路スタック310には、スタックポインタの一つの値により指定される記憶場所に、コード列区切りブランチノードの配列番号と、そのコード列区切りブランチノードの子ノードのうちコード列連結側ノードの配列番号の2つの配列番号からなる組が格納される。
ステップS815の処理については、ステップS814で得た配列番号に替えて、ステップS808で取り出した代表ノード番号を子ノードの配列番号として探索経路スタック310に格納する、すなわち先に述べたようにコード列終端側ノードの配列番号を子ノードの配列番号として探索経路スタック310に格納する実施の形態も可能である。
また、コード列終端側ノード自体、あるいはコード列終端側ノードから取り出した参照ポインタあるいは参照ポインタの指すコード列を探索経路スタック310に格納する実施の形態も可能である。
いずれにしろ、ステップS815の処理は、コード列終端側ノードに係る検索対象コード列にアクセスするための情報を探索経路スタックに格納する処理ということができる。
一方、ステップS811で弁別ビット位置が識別ビットの位置でないと判定された場合、及び、ステップS811で弁別ビット位置が識別ビットの位置であると判定されたがステップS812で弁別ビット位置の識別ビットの値が“0”と判定された場合は、いずれもステップS809に進み、ステップS807で符号化検索キーから取り出したビット値を、ステップS808で取り出した代表ノード番号に加算し、その加算の結果を新たな配列番号として設定してステップS803に戻る。
以降、ステップS805の判定においてリーフノードと判定されるまで、ステップS803からステップS815までのループ処理を繰り返す。このループ処理においては、ステップS809又はステップS814で設定された配列番号がステップS803で使われる。
ステップS805おいて、ステップS803で読み出したノードがブランチノードでない、すなわち、リーフノード(ノード種別が“1”)であると判定された場合は、ステップS810に進み、そのリーフノードに含まれている参照ポインタを取り出して処理を終了する。
以上のように、本実施の形態の初期検索によれば、符号化検索キーによりカップルドノードツリーをリーフノードに到達するまで検索し、該リーフノードに格納されている参照ポインタを読み出すとともに、検索中にたどったコード区切ブランチノードの配列番号とそのコード列連結側子ノードの配列番号を順次探索経路スタック310に格納する。
次に、図9A〜図9Dを参照して本発明の一実施形態に係る最長一致検索について説明する。
図9Aは最長一致検索の処理の流れを概念的に示す図である。図9Aには、図8Aと同様にカップルドノードツリー200、符号化検索キー270及び探索経路スタック310が記載されており、図8Aに例示する初期検索が終了した後の最長一致検索の流れが概念的に示されている。
図9Aに示すように、符号化検索キー270には、図8Aに示す符号化検索キーと同一のビット列である、検索キー「ACE*」を符号化した符号化検索キー70が格納されている。探索経路スタック310には、図8Aと同一のコード区切ブランチノードの配列番号とコード列連結側ノードの配列番号が格納されている。しかし、太線の矢印で示すスタックポインタは、初期検索終了時の位置から1つ戻ったノード210cに係る配列番号を指している。
カップルドノードツリー200については、図8Aに示すものと同様に、ノード211cより下位の部分は省略されている。初期検索においてノード211eに到達したこと、ノード211eからの差分ビット位置探索によりコード区切ブランチノードであるブランチノード210cに至り、ブランチノード210cのコード列終端側ノードであるリーフノード210dに係るインデックスキーが最長一致キーとして決定される探索経路が太線の枠と矢印で示されている。
最長一致検索においては、まず初期検索で得られた検索対象コード列「ABEAB*」を符号化したインデックスキー(ABEAB*)と符号化検索キー(ACE*)の符号化ビット長が比較される。上記の例においてはインデックスキー(ABEAB*)の符号化ビット長は20、符号化検索キー(ACE*)の符号化ビット長は12である。したがって、インデックスキーの符号化ビット長が符号化検索キーの符号化ビット長より長いので、コード列「ABEAB*」は検索キー「ACE*」に前方一致しない。
そこで、次に探索経路スタック310から初期検索終了時にスタックポインタが指しているノード[1]側の子ノードの配列番号221d+1を取り出し、それからノード[0]側の子ノード、すなわちコード列終端側子ノード210eの配列番号221dを求めてノード210eを読み出す。そして、ノード210eから参照ポインタを介してコード列「AB*」を読み出し、それを符号化した(AB*)を新たなインデックスキーとしてその符号化ビット長を符号化検索キー(ACE*)の符号化ビット長と比較する。
すると、インデックスキー(AB*)の符号化ビット長は8であって符号化検索キー(ACE*)の符号化ビット長12より短いので、以後、インデックスキーと符号化検索キーの差分ビット位置と、インデックスキーに係るコード列終端側子ノードの親ノードの弁別ビット位置との相対的位置関係によりコード列終端側子ノードを特定し、その特定されたコード列終端側子ノードの参照ポインタの指すコード列を最長一致キーとする。
すなわち、探索経路スタックから順次親ノードの配列番号を読み出して該配列番号の指す配列要素に配置されたコード列区切りブランチノードから弁別ビット位置を取り出す。そして、該弁別ビット位置が上記差分ビット位置と等しいかあるいは上位の位置関係であれば、該コード列区切りブランチノードのコード列終端側子ノードの参照ポインタの指すコード列を最長一致キーとする。
図9Aの太線の矢印で示す弁別ビット位置探索は、上述の差分ビット位置と等しいかあるいは上位の位置関係にある弁別ビット位置を探索する処理の流れを示すものである。
また、図9Aの太線の矢印で示す最長一致キー決定は、弁別ビット位置が差分ビット位置と上述の位置関係にあるコード列区切りブランチノードのコード列終端側子ノードの参照ポインタの指すコード列を最長一致キーとする処理の流れを示すものである。
図9Aに示す例では、インデックスキー(AB*)と符号化検索キー(ACE*)の差 分ビット位置は7であり、探索経路スタック310から最初に読み出される親ノードの配列番号である配列番号220c+1はブランチノード211dの配列番号である。ブランチノード211dの弁別ビット位置231dの値は8であり、差分ビット位置7より下位の位置関係にあるので、探索経路スタック310より次の親ノードの配列番号として配列番号221bが読み出される。配列番号221bな指す配列要素に配置されたブランチノード210cの弁別ビット位置230cの値は4であり、差分ビット位置7より上位の位置関係にあるので、ブランチノード210cのコード列終端側子ノード210dの参照ポインタ280dの指すコード列「A*」が最長一致キーである。
次に、上述の手法により求められた最長一致キーが、検索対象コード列のうち検索キーに前方一致する最長のコード列であることを説明する。
最初に、以下の説明のため、用語の定義を行う。
初期検索において、探索経路スタックに、親ノードの配列番号として格納された配列番号のコード列区切ブランチノードのコード列終端側子ノードに係るコード列を、初期検索の探索経路のコード列という。図8Aに示す例では、初期検索の探索経路のコード列は、「*」、「A*」「AB*」である。
すると、先に述べたように、初期検索の探索経路のコード列は、該コード列に係るコード列終端側子ノードと対をなすコード列連結側子ノード以下の階層に配置されたリーフノードに係るコード列に前方一致する。また、初期検索の探索経路のコード列の長さは、該コード列に係るコード列終端側子ノードと対をなすコード列連結側子ノード以下の階層に配置されたリーフノードに係るコード列の長さより短い。
もし、初期検索の検索結果キーが検索キーに前方一致すれば、初期検索の探索経路のコード列は、検索結果キーに前方一致するので、検索キーに前方一致するが、それらの長さは、検索結果キーの長さ以下である。そして、本願発明に係るカップルドノードツリーの特徴により、初期検索の探索経路のコード列以外に、検索キーに前方一致するコード列はカップルドノードツリーに格納されていない。したがって、初期検索の検索結果キーが検索キーに前方一致すれば、該検索結果キーは、最長一致キーである。
次に、初期検索の検索結果キーが検索キーに前方一致せず、かつ、カップルドノードツリーに検索キーに前方一致するコード列が格納されているならば、そのコード列は初期検索の探索経路のコード列に含まれる。したがって、探索経路のコード列のうち検索キーに前方一致するコード列の最長のものが最長一致キーである。
以上のとおりであるから、上述の手法により求められた最長一致キーが、検索対象コード列のうち検索キーに前方一致する最長のコード列である。
次に、初期検索の結果に基づいて最長一致キーを求める最長一致検索の処理フローについて、図6のステップS606の処理の詳細を示す図9B〜図9Dを参照して説明する。
図9Bは、最長一致検索の初段の処理フロー例を説明する図である。図9Bに示す初段の処理の内容は、インデックスキーを初期検索の検索結果コード列を符号化したものから符号化ビット長の短いものに順次更新し、該インデックスキーの符号化ビット長を符号化検索キーの符号化ビット長以下のものとすることにより、符号化検索キーに前方一致することのないインデックスキーを図9C以下の処理で扱わないようにするものである。
図9Bに示すように、まずステップS901で、コード列の格納領域から、参照ポインタの指すコード列を読み出し、コード列に設定する。参照ポインタは、ステップS901の最初の処理においては、図6に示すステップS605の初期検索で得られたものである。図8A及び図9Aの例示では、参照ポインタ281eが得られ、コード列「ABEAB*」が読み出される。
次に、ステップS902に進み、ステップS901で設定されたコード列を、図2を用いて説明した符号化方法を用いて符号化して符号化コード列を作成し、その符号化コード列の符号化ビット長の情報を得る符号化処理を行う。符号化処理の詳細は図7を参照して説明したものである。
次にステップS903において、ステップS902で作成した符号化コード列をインデックスキーに設定するとともに、ステップS902で得た符号化コード列の符号化ビット長をインデックスキーの符号化ビット長に設定する。図9Aの例示では、ステップS902とステップS903の最初の処理において、インデックスキーには(ABEAB*)、すなわち“100110101101100110100”が、インデックスキーの符号化ビット長には20が設定される。
上述のステップS901とステップS903の処理は、図6におけるステップS601とステップS603の処理と同様に、ステップS902の符号化処理を図7に示す各種コード列に共通な符号化処理を検索キーに適用するためのものである。図6の場合と同様に、図7に示す共通な符号化処理を用いることに替えて、図7に示す処理をインデックスキーの符号化処理用のもののように特定のコード列の符号化に変更して符号化処理を行うことも可能である。
なお、ステップS901の最初の処理で設定されたコード列を初期検索の検索結果コード列ということがある。また、ステップS902とステップS903の最初の処理において設定されるインデックスキーを、初期検索で得られたインデックスキーということがある。
次にステップS904において、インデックスキーの符号化ビット長は符号化検索キーの符号化ビット長以下であるか判定する。ここで、符号化検索キーの符号化ビット長は、図6に示すステップS603で設定したものである。図9Aの例示では、符号化検索キーである(ACE*)の符号化ビット長は12である。
インデックスキーの符号化ビット長が符号化検索キーの符号化ビット長以下でなければ、すなわち符号化前の検索対象コード列のコード数が検索キーのコード数より大きければ、その検索対象コード列が検索キーに前方一致することはない。
そこでステップS904の判定が否定的なものであると、ステップS905〜ステップS909の処理を行ってステップS901に戻り、初期検索の探索経路のコード列に順次アクセスすることを、ステップS904での判定が肯定的になるまで繰り返す。
ステップS905では、探索経路スタックからスタックポインタの指す子ノードの配列番号を読み出し、ステップS906で、探索経路スタックのスタックポインタを1つ戻す。
次に、ステップS907で、前記読み出した子ノードの配列番号と対をなす配列番号を得る。そしてステップS908に進み、カップルドノードツリーのノードを格納する配列から、ステップS907で得た配列番号の指す配列要素をノードとして読み出す。
続いて、ステップS909で、ステップS908で読み出したノードから参照ポインタを取り出して、ステップS901に戻る。ステップS901の2回目以降の処理においては、参照ポインタは、ステップS909で取り出されたものである。
初期検索において、子ノードの配列番号としてコード列終端側ノードの配列番号を探索経路スタックに格納する場合には、上記ステップS907は必要なく、ステップS908では、ステップS905で得た配列番号の指す配列要素をノードとして読み出すことになる。
また、初期検索において、コード列終端側ノードを探索経路スタックに格納する場合には、ステップS905において、探索経路スタックからスタックポインタの指すコード列終端側ノードを読み出し、ステップS907〜ステップS908をスキップし、ステップS909において、ステップS905で読み出したコード列終端側ノードから参照ポインタを取り出して、ステップS901に戻ることになる。
さらに初期検索において、探索経路スタックに参照ポインタが格納される場合、あるいは検索対象コード列が格納される場合に図9Bの処理フローをどのように変更すればよいかは以上の説明から当業者に明らかである。
上記ステップS901〜ステップS909のループ処理においてステップS904での判定が肯定的なものになると、図9Cに示すステップS910に移行する。
図9Aの例示では、ステップS904の最初の判定時にはインデックスキーの符号化ビット長は20であり、符号化検索キーの符号化ビット長は12であるから、判定は否定的となる。したがって、ステップS905〜ステップS909及びステップS901の処理により初期検索の探索経路上のコード列「AB*」が読み出される。そのコード列を符号化したインデックスキー(AB*)の符号化ビット長は8であるから、2回目のステップS904における判定は肯定的なものになり、図9CのステップS910に進む。探索経路スタック310のスタックポインタは、ステップS906の処理により、配列番号221bを指している。
図9Cは、最長一致検索における中段の処理フロー例を説明する図である。図9Cに示す中段の処理の内容は、図9Bに示す初段の処理においてその符号化ビット長が符号化検索キーの符号化ビット長以下であると判定されたインデックスキーの符号化ビット長の範囲の符号化検索キーとインデックスキーのビット列を比較し、等しければインデックスキーに符号化されたコード列を最長一致キーとし、等しくなければ上記符号化ビット長の範囲での符号化検索キーとインデックスキーの差分ビット位置を求めるものである。
図9Cに示すように、まずステップS910において、インデックスキーの符号化ビット長を比較ビット長に設定する。図9Aに示す例では、ステップS910の処理においては、比較イット長にインデックスキー(AB*)の符号化ビット長である8が設定される。
そして、ステップS911で、符号化検索キーとインデックスキーのビット値が、前記比較ビット長の範囲において等しいか否かを判定する。これは、検索キーと検索結果コード列が検索結果コード列の長さの範囲で一致するか否かを判定することに相当する。この判定の結果、符号化検索キーとインデックスキーが比較ビット長の範囲、すなわちインデックスキーの符号化ビット長の範囲で一致している場合(前方一致)は、ステップS911aに進み、そのインデックスキーに符号化されたコード列を検索結果コード列に設定して処理を終了する。この検索結果コード列が検索キーに最長一致するコード列である。
一方、ステップS911の判定の結果、符号化検索キーとインデックスキーが比較ビット長の範囲で一致していないときは、ステップS912に進む。
ステップS912では、符号化検索キーとインデックスキーを比較ビット長の範囲でビット比較して、比較ビット長の差分ビット列を得る。差分ビット列は、例えば、符号化検索キーとインデックスキーで値が一致する位置のビットは値が“0”で、一致しない位置のビットは値が“1”となるビット列であり、例えば符号化検索キーとインデックスキーの排他的論理和演算によって得ることができる。
続いて、ステップS912aで、差分ビット列における最上位の位置、すなわち0ビット目からみて最初の不一致ビットのビット位置を、差分ビット位置に設定して図9Dに示すステップS913以降の処理に進む。ステップS912aの処理は、例えばプライオリティエンコーダを有するCPUではそこに差分ビット列を入力し、不一致のビット位置を得ること、あるいは、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることなどにより行うことができる。
図9Aに示す例では、符号化検索キー(ACE*)の比較ビット長8の指すビット列のビット値は(AC)であり、インデックスキー(AB*)の比較ビット長8の指すビット列のビット値は(AB)であるから、ステップS911の判定処理は否定的なものになる。
そして、差分ビット位置には、“7”が設定される。
図9Dは、最長一致検索における後段の処理フロー例を説明する図である。図9Dに示す後段の処理の内容は、図9Cに示す中段の処理において求めた差分ビット位置と探索経路スタックにその配列番号が格納されたコード列区切りブランチノードの弁別ビット位置の相対的位置関係により最長一致キーを求めるものである。
図に示すように、ステップS913において、探索経路スタックから配列番号を取り出して、スタックポインタを1つ戻す。そして、ステップS914で、配列から配列番号の指す配列要素をノードとして読み出し、ステップS915において、該ノードから弁別ビット位置を取り出す。
次にステップS916において、該取り出した弁別ビット位置が、ステップS912aで設定した差分ビット位置よりも上位の位置関係にあるか否かを判定する。そして、弁別ビット位置が差分ビット位置よりも上位の場合はステップS916aに進み、そうでない場合はステップS912に戻る。すなわち、探索経路スタック310から取り出した配列番号のノードに含まれる弁別ビット位置が差分ビット位置より上位の位置でないときは、弁別ビット位置が差分ビット位置よりも上位の位置であるノードが読み出されるまで探索経路スタックを遡って配列番号を取り出すループ処理が実行される。このループ処理が、図9Aに例示する差分ビット位置探索に相当する。
図9Aの例示では、先のステップS906の処理により探索経路スタック310のスタックポインタは配列番号221bを指しているので、ステップS914ではブランチノード210cが読み出され、ステップS915では弁別ビット位置“4”が取り出される。取り出した弁別ビット位置“4”は、ステップS912aで設定した差分ビット位置“7”よりも上位にあるので、ステップS916の判定結果は「はい」となり、ステップS916aに進む。
ステップS916aでは、ステップS913で戻されていた探索経路スタックのスタックポインタを1つ進めることで1つ前の状態に戻し、ステップS917で、探索経路スタックのスタックポインタの指す子ノードの配列番号を読み出す。
次に、ステップS918で、該子ノードの配列番号と対をなすノードの配列番号を得て、ステップS919で、該対をなすノードの配列番号の指すノードを読み出す。
そして、ステップS920で、該ノードから参照ポインタを取り出し、ステップS921で、コード列の格納領域311から、参照ポインタの指すコード列を読み出して、検索結果コード列に設定する。
図9Aの例示では、ステップS916aにおいて探索経路スタックのスタックポインタは再び親ノードの配列番号221bを指すものとなり、ステップS917では該スタックポインタの指す子ノードの配列番号220c+1が読み出される。そして、ステップS918〜S921の処理で、ノード210dが読み出され、参照ポインタ280dの指すコード列「A*」が検索結果コード列に設定される。ステップS916a〜ステップS921の処理が、図9Aに例示する最長一致キー決定に相当する。
なお、初期検索において、子ノードの配列番号としてコード列終端側ノードの配列番号を探索経路スタックに格納する場合には、上記ステップS918の処理は必要なく、ステップS919では、ステップS917で得た配列番号の指す配列要素をノードとして読み出すことになる。
また、初期検索において、コード列終端側ノードを探索経路スタックに格納する場合には、ステップS917において、探索経路スタックからスタックポインタの指すコード列終端側ノードを読み出し、ステップS918〜ステップS919をスキップし、ステップS920において、ステップS917で読み出したコード列終端側ノードから参照ポインタを取り出すことになる。
さらに初期検索において、探索経路スタックに参照ポインタが格納される場合、あるいは検索対象コード列が格納される場合に図9Dの処理フローをどのように変更すればよいかは以上の説明から当業者に明らかである。
次に、カップルドノードツリーが、無意のコード「*」のみからなるコード列も含むようにすることにより、どのような検索キーで検索しても、必ず検索結果キーを得ることができることについて説明する。
任意の検索キーを符号化した符号化検索キーで初期検索を実施し、次に最長一致検索を行うと、図9Bに示す処理の後、図9Cに示すステップS910において、あるインデックスキーの符号化ビット長が比較ビット長に設定される。もし、符号化検索キーとインデックスキーの比較ビット長の範囲のビット列のビット値が等しければ、図9Cに示すように、検索結果キーが得られる。
一方、符号化検索キーとインデックスキーの比較ビット長の範囲のビット列のビット値が等しくなければ、図9Cに示すように、差分ビット位置が得られる。そして、図9Dに示すステップS913〜ステップS916の処理に至り、弁別ビット位置探索が実行される。
今、カップルドノードツリーが、無意のコード「*」のみからなるコード列を含むことから、ルートノードはコード列区切りブランチノードであり、その弁別ビット位置は0である。また、検索キーが有意のコードからなる限り、上記差分ビット位置は0より下位の位置である。したがって、図9DのステップS916の判定がいずれ肯定的になることは保障されているので、ステップS921において、必ず検索結果コード列にコード列が設定される。
もし、カップルドノードツリーが、無意のコード「*」のみからなるコード列を含まないものとすると、その場合の最長一致検索は、図9B及び図9Dのループ処理に探索経路スタックのスタックポインタが初期値を指しているかの判定処理を挿入し、スタックポインタが初期値を指していれば検索失敗とすればよい。
以上、本発明の最長一致検索に係る実施形態について詳細に説明した。以下においては、本発明の最長一致検索についての理解をさらに容易にするため、図10、図11A〜図11Cを参照して、最長一致検索の具体例を説明する。
以下説明する具体例のカップルドノードツリーは、図3に例示したものである。符号化検索キーは、3つのタイプのものが例示される。図11Aに示す例では、符号化検索キーとして、(ABEABC*)が用いられる。図11B、図11Cに示す例では、それぞれ符号化検索キーとして、(ACEABC*)、(ACE*)が用いられる。それぞれの符号化検索キーによる初期検索の結果は図9Aの例示と同一である。
図10は、上記初期検索において前記探索経路スタック310に格納されるデータとコード列終端側子ノードに係るインデックスキーの関係を示す図である。
探索経路スタック310には、図11A、図11B、図11Cに示す例の符号化検索キーによる初期検索の結果、図9Aに示すものと同一の配列番号が格納されている。
図10に示すように、親ノードの配列番号及びノード[1]側の子ノードの配列番号として、最初に配列番号220と配列番号220a+1が探索経路スタック310に格納されている。点線の矢印で示すように、配列番号220a+1と符号61dで示すインデックスキー(*)が対応し、図9Bに示すステップS905で配列番号220a+1が読み出されると、ステップS903において、(*)すなわち“0”がインデックスキーに設定される。
次に、下向きの矢印で示すように、配列番号221bと配列番号220c+1が、さらに配列番号220c+1と配列番号221d+1が探索経路スタック310に格納される。
点線の矢印でそれぞれ示すように、配列番号220c+1と符号61cで示すインデックスキー(A*)が対応し、図9Bに示すステップS905で配列番号220c+1が読み出されると、ステップS903において、(A*)すなわち“10010”がインデックスキーに設定され、配列番号221d+1と符号61bで示すインデックスキー(AB*)が対応し、図9Bに示すステップS905で配列番号221d+1が読み出されると、ステップS903において、(AB*)すなわち“100110100”がインデックスキーに設定される。また、太線の矢印で示すように、スタックポインタは、親ノードの配列番号220c+1を指す。
図11Aは、初期検索で得られたインデックスキーが符号化検索キーに前方一致する場合の最長一致検索の例を概念的に説明する図である。
先に述べたように、符号化検索キー51aは、検索キー「ABEABC*」を符号化した(ABEABC*)である。ビット表現では、“1001101011011001101010110”となり、その符号化ビット長52aは24ビットとなる。
この符号化検索キー51aで、図3に示したカップルドノードツリー200を用いて初期検索を実行すると、符号化検索キー51aの0ビット目の値が“1”、2ビット目の値は“0”、4ビット目の値は“1”、8ビット目の値は“1”であるので、図8Aの例示と同様に初期検索の結果としてノード211eから、コード列「ABEAB*」が記憶されている記憶領域を指す参照ポインタ281eが取り出され、探索経路スタック310には、図10に示す内容が格納される。
そして、図9Bに示す最長一致検索のステップS901〜ステップS903の最初の処理において、コード列「ABEAB*」が読み出され、符号61aで示すインデックスキー(ABEAB*)に符号化されるとともに、インデックスキーの符号化ビット長62aとして、図11Aに示すように20ビットが設定される。
続いてステップS904において、インデックスキーの符号化ビット長62aと符号化検索キーの符号化ビット長52aの大小が比較され、インデックスキーの符号化ビット長62aは符号化検索キーの符号化ビット長52a以下であることから、インデックスキーの符号化ビット長62aが比較ビット長71aに設定される。
そして、図11Aに示すように、比較ビット長71aの範囲において、符号化検索キー51aとインデックスキー61aのビット値が等しい、すなわちインデックスキー61aが符号化検索キーに前方一致することがステップS911で判定される。続いてステップS911aで、インデックスキー61aに符号化されたコード列「ABEAB*」が最長一致キーとして検索結果コード列に設定される。先に説明したとおり、初期検索の検索結果キーが検索キーに前方一致すれば、該検索結果キーは最長一致キーである。
図11Bは、初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも短い場合の最長一致検索の例を概念的に説明する図である。
先に述べたように、符号化検索キー51bは、検索キー「ACEABC*」を符号化した(ACEABC*)である。ビット表現では、“1001101111011001101010110”となり、その符号化ビット長52bは24ビットとなる。
図11Bに示すように、符号化検索キー51bによる最長一致検索においては、符号91b、92b、93bで示すビット列比較1、ビット列比較2、ビット列比較3を行うことにより、最長一致キーが求められる。
符号化検索キー51bの0ビット目、2ビット目、4ビット目及び8ビット目の値は、符号化検索キー51aのそれぞれのビット位置の値と等しいから、初期検索の結果は符号化検索キー51aによる初期検索の結果と同一である。したがって、図11Aに示す例と同様に、初期検索と図9Bに示す最長一致検索のステップS901〜ステップS903の最初の処理において、コード列「ABEAB*」が読み出され、符号61aで示すインデックスキー(ABEAB*)に符号化されるとともに、インデックスキーの符号化ビット長62aとして、図11Bのビット列比較1(91b)に示すように20ビットが設定される。また、インデックスキーの符号化ビット長62aが比較ビット長71bに設定される。
ビット列比較1(91b)においては、比較ビット長71bの範囲において、符号化検索キー51aとインデックスキー61aのビット値は等しくないことがステップS911で判定され、ステップS912〜ステップS912aの処理により、差分ビット位置72bに7ビット目のビット位置が設定される。
次に図9Dに示すステップS913〜S916のループ処理により、差分ビット位置より上位の位置となる弁別ビット位置を有するコード列区切りブランチノードの配列番号を求める弁別ビット位置探索が行われる。まず、スタックポインタに最後に積まれた配列番号220c+1のコード区切りブランチノード211dが読み出され、その弁別ビット位置231dの値“8”が取り出され、図11Bに示すビット列比較2(92b)が行われる。
ビット列比較2(92b)に示すのは、符号化検索キー51bと、符号61bで示す、上記コード区切りブランチノード211dのコード列終端側子ノードに係るインデックスキー(AB*)である。インデックスキー61bのビット表現は、”100110100” であり、符号化ビット長62bは、8ビットである。
ビット列比較2(92b)には、符号化検索キー51bとインデックスキー61bのビット位置のうち差分ビット位置72bに該当するビット位置を示す矢印と、インデックスキー61bのビット位置のうちその値が“8”である弁別ビット位置81bに該当するビット位置を示す矢印が記載されている。
ビット列比較2(92b)においては、弁別ビット位置81bが差分ビット位置72bより上位の位置関係にないことが判定される。すると図に示すように、初期検索の探索経路のコード列「AB*」のうち弁別ビット位置81bより上位に位置する有意のコードを符号化した部分は、符号化検索キー51bと差分ビット位置72bのビット値で異なるから、符号化検索キー51bに前方一致しない。
そこで、図9Dに示すステップS913〜S916のループ処理が繰り返され、スタックポインタに積まれた配列番号221bのコード区切りブランチノード210cが読み出され、その弁別ビット位置230cの値“4”が取り出され、図11Bに示すビット列比較3(93b)が行われる。
ビット列比較3(93b)に示すのは、符号化検索キー51bと、符号61cで示す、上記コード区切りブランチノード210cのコード列終端側子ノードに係るインデックスキー(A*)である。インデックスキー61cのビット表現は、”10010” であり、符号化ビット長62cは、4ビットである。
ビット列比較3(93b)には、インデックスキー61bのビット位置のうちその値が“4”である弁別ビット位置81bに該当するビット位置を示す矢印と、インデックスキー61cの、弁別ビット位置81cより上位に位置する有意のコードを符号化した部分が、符号化検索キー51bに前方一致することを示す矢印とが記載されている。
ビット列比較3(93b)においては、弁別ビット位置81cが差分ビット位置72bより上位の位置関係にあることが判定される。すると差分ビット位置72bより上位に位置する符号化検索キー51bとインデックスキー61cのビットの値は一致することから、初期検索の探索経路のコード列「A*」のうち弁別ビット位置81cより上位に位置する有意のコードを符号化した部分は、符号化検索キー51bのうち弁別ビット位置81cより上位に位置する有意のコードを符号化した部分と一致し、符号化検索キー51bに前方一致する。また、インデックスキー61cは、符号化検索キー51bに前方一致するものの中で最長のものであり、最長一致キーである。
図11Cは、初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも長い場合の最長一致検索の例を概念的に説明する図である。
先に述べたように、符号化検索キー51cは、検索キー「ACE*」を符号化した(ACE*)である。ビット列表現では、“1001101111010”となり、その符号化ビット長52cは12ビットとなる。
図11Cに示すように、符号化検索キー51cによる最長一致検索においては、符号91c、92c、93cで示すビット列比較1、ビット列比較2、ビット列比較3を行うことにより、最長一致キーが求められる。
符号化検索キー51cの0ビット目、2ビット目、4ビット目及び8ビット目の値は、符号化検索キー51a及び符号化検索キー51bのそれぞれのビット位置の値と等しいから、初期検索の結果は符号化検索キー51a及び符号化検索キー51bによる初期検索の結果と同一である。したがって、図11A及び図11Bに示す例と同様に、初期検索と図9Bに示す最長一致検索のステップS901〜ステップS903の最初の処理において、コード列「ABEAB*」が読み出され、符号61aで示すインデックスキー(ABEAB*)に符号化されるとともに、インデックスキーの符号化ビット長62aとして、図11Cのビット列比較1(91c)に示すように20ビットが設定される。
ビット列比較1(91c)においては、インデックスキー61aの符号化ビット長62aが符号化検索キー51cの符号化ビット長52cより長いことがステップS904で判定される。
ステップS904での判定により、ステップS905〜ステップS909の処理を介して再びステップS901〜ステップS903の処理が実行され、その結果、スタックポインタに最後に積まれた配列番号220c+1のコード区切りブランチノード211dのコード列終端側子ノード210eに係るインデックスキー(AB*)とその符号化ビット長62bが設定されて、図11Cに示すビット列比較2(92c)が行われる。
ビット列比較2(92c)に示すのは、符号化検索キー51cと、符号61bで示す、上記コード区切りブランチノード211dのコード列終端側子ノードに係るインデックスキー(AB*)である。インデックスキー61bのビット表現は、”100110100” であり、符号化ビット長62bは、8ビットである。
ビット列比較2(92c)においては、まずステップS904で、インデックスキー61bの符号化ビット長62bは、符号化検索キー51cの符号化ビット長62aより短いことが判定される。そこで、ステップS910の処理により、インデックスキー61bの符号化ビット長62bが比較ビット長71cに設定される。
また、ビット列比較2(92c)には、符号化検索キー51cとインデックスキー61bのビット位置のうち差分ビット位置72cに該当するビット位置を示す矢印と、インデックスキー61bのビット位置のうちその値が“8”である弁別ビット位置81bに該当するビット位置を示す矢印が記載されている。
そしてビット列比較2(92c)においては、さらに、弁別ビット位置81bが差分ビット位置72cより上位の位置関係にないことが判定される。すると図に示すように、初期検索の探索経路のコード列「AB*」のうち弁別ビット位置81bより上位に位置する有意のコードを符号化した部分は、符号化検索キー51cと差分ビット位置72cのビット値で異なるから、符号化検索キー51cに前方一致しない。
そこで、図9Dに示すステップS913〜S916のループ処理が実行され、スタックポインタに積まれた配列番号221bのコード区切りブランチノード210cが読み出され、その弁別ビット位置230cの値“4”が取り出され、図11Cに示すビット列比較3(93c)が行われる。
図11Cに示すビット列比較3(93c)と図11Bに示すビット列比較3(93b)を対比すれば明らかなように、ビット列比較3(93c)における処理は、図11Bに示すビット列比較3(93b)における処理と同様である。したがって、繰り返しとなるので、その説明を省略する。
次に、図12〜図13Cを参照して、本発明の一実施形態に係るカップルドノードツリーに、挿入キーの指定にしたがって、リーフノードを挿入する処理について説明する。この挿入処理は、挿入キー及び検索対象コード列を符号化することを除いて、特許文献2に開示したものと類似するものである。なお、特許文献2に開示したものと同様に、ルートノードの挿入処理と、ルートノード以外のノードを既存のカップルドノードツリーに挿入する通常の挿入処理によりカップルドノードツリーが生成されることから、ノードの挿入処理の説明はカップルドノードツリーを生成する処理の説明でもある。
図12は、本発明の一実施形態におけるカップルドノードツリーを生成する処理フロー例を説明する図である。
まず、ステップS1201で、カップルドノードツリーに挿入するコード列(挿入キー)を記憶した記憶領域のポインタを取得する。
続いて、ステップS1202において、カップルドノードツリーのルートノードの配列番号が登録済みであるか否かを判定する。前述のように、本発明の一実施形態においては、カップルドノードツリーの管理手段にカップルドノードツリーのルートノードの配列番号が登録されるようになされており、このステップS1202で、ルートノードの配列番号が登録されているか否かがチェックされる。その結果、登録済みであればステップS1203へ進む。
ステップS1203では、挿入コード列に、ステップS1201で取得したポインタの指す記憶領域に記憶された挿入キーを設定し、次に、ステップS1203aにおいて、挿入コード列から、符号化挿入キーを作成する。ステップS1203aにおける符号化処理は、図7に示す処理フローにより実現可能である。
次にステップS1204に進み、符号化挿入キーにより、ルートノードからカップルドノードツリーが格納された配列を検索し、挿入キーが格納されている領域を指す参照ポインタを含むリーフノードを挿入する処理を行い、この挿入処理を終了する。なお、このステップS1204の処理の詳細については、後に図13A〜図13Cを参照して説明する。
一方、ステップS1202での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まる。
すなわち、ステップS1205に進み、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
次に、ステップS1206において、ステップS1205で得た配列番号に値“0”を加えた配列番号を求める(本実施の形態では、ステップS1205で取得した配列番号に等しい配列番号がここで得られるので、ステップS1206は省略可能である)。
続いて、ステップS1207において、挿入するルートノード用に、ステップS1206で得た配列番号の配列要素のノード種別にリーフノードであることを示す“1”を書き込むとともに、参照ポインタに前記ステップS1201で取得した挿入キーが記憶されている記憶領域を指すポインタを書き込む。
そして、ステップS1208で、ステップS1206で取得した配列番号をルートノードの配列番号としてカップルドノードツリーの管理手段に登録して、図12の処理を終了する。
次に、前記ステップS1204の処理、すなわち、既存のカップルドノードツリーに挿入コード列が記憶されている記憶領域を指す参照ポインタを格納するリーフノードを挿入する処理について、図13A〜図13Cを参照して説明する。図13Aは挿入処理の前段の処理である検索処理の処理フローを示す図、図13Bは挿入処理の中段の処理である挿入するノード対のための配列要素を準備する処理の処理フロー例を示す図、図13Cは挿入処理の後段の処理であるノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理の処理フロー例を示す図である。
まず、図13AのステップS1301において、検索開始ノードの配列番号に、ルートノードの配列番号を設定する。そして、ステップS1302で、符号化検索キーとして前記ステップS1203aにおいて作成した符号化挿入キーを設定する。
次に、ステップS1310aに進み、符号化検索キーにより、前記検索開始ノードからカップルドノードツリーが格納された配列を検索し、参照ポインタを得る。この処理は、前記図5示す基本検索処理により実現される。
そして、ステップS1310bで、コード列の格納領域311から前記ステップS1310aで取得した参照ポインタの指すコード列を読み出し、ステップS1310cで、該読み出したコード列を符号化して符号化ビット列(インデックスキー)を作成する。ステップS1310cにおける符号化処理は、図7に示す処理フローにより実現可能である。
次に、ステップS1311において、符号化挿入キーと前記ステップS1310cで作成したインデックスキーとが等しいか否かを判定する。符号化挿入キーとインデックスキーとが等しい場合は、挿入キーに対応する検索対象コード列に係るリーフノードは既にカップルドノードツリー内に存在するのであるから、挿入は失敗となり、処理を終了する。
符号化挿入キーとインデックスキーとが等しくないときは、図13BのステップS1312に進む。
このステップS1312において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
次に、ステップS1313に進み、符号化挿入キーとステップS1310cで作成したインデックスキーの大小を比較し、符号化挿入キーの方が大きいときは値“1”(真)、小さいときは値“0”(偽)のブール値を得る。
そして、ステップS1314に進み、ステップS1312で得た代表ノードの配列番号にステップS1313で得たブール値を加算した配列番号を得る。後述するように、このステップS1314で得られた配列番号は、挿入キーが記憶されている記憶領域を指す参照ポインタを保持するリーフノードが格納される配列要素の配列番号となる。
続いて、ステップS1315に進み、ステップS1312で得た代表ノードの配列番号にステップS1313で得たブール値をビット反転した値(ブール値の論理否定値)を加算した配列番号を得る。この配列番号は、挿入キーが記憶されている記憶領域を指す参照ポインタを保持するリーフノードと対を成すノードが格納される配列要素の配列番号となる。
すなわち、図13Aに示した検索処理で得られたリーフノードに格納された参照ポインタにより参照されるコード列を符号化して得られるインデックスキーと符号化挿入キーとの大小比較の結果により、挿入されるノード対のうちどちらのノードが、挿入キーが記憶されている記憶領域を指す参照ポインタを保持するリーフノードとされるかが決定される。
次に、図13Cに示すステップS1316以降の処理に進む。
図13Cに示すように、ステップS1316で、符号化挿入キーとステップS1310cで作成したインデックスキーのビット列比較を行い、差分ビット列を得る。次に、ステップS1317に進み、ステップS1316で得た差分ビット列から、上位0ビット目から見た最初の不一致ビットのビット位置を得る。
そして、ステップS1318において、探索経路スタック310のスタックポインタがルートノードの配列番号を指しているか否かを判定する。ルートノードの配列番号を指していればステップS1324に進み、指していなければステップS1319に進む。
ステップS1319では、探索経路スタック310のスタックポインタを1つ戻してそこに格納されている配列番号を取り出す。続いて、ステップS1320に進み、ステップS1319で取り出した配列番号の配列要素を配列からノードとして読み出す。次に、ステップS1321に進み、ステップS1320で読み出したノードから、弁別ビット位置を取り出す。
そして、ステップS1322に進み、ステップS1321で取り出した弁別ビット位置がステップS1317で得たビット位置より上位の位置関係にあるか否かを判定する。ステップS1322の判定結果が「いいえ」であれば、ステップS1318に戻り、ステップS1318での判定結果が「はい」になるかステップS1322での判定結果が「はい」になるまで、ステップS1318〜ステップS1322のループ処理を繰り返す。ステップS1322での判定結果が「はい」になると、ステップS1323で探索経路スタックのスタックポインタを1つ進め、ステップS1324以下の処理に移行する。
このステップS1316〜ステップS1322のループ処理は、差分ビット列の最初の不一致ビットのビット位置と、探索経路スタック310に格納されている配列番号の配列要素に格納されたブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるまで順次探索経路スタックを逆にたどることにより、挿入するノード対のカップルドノードツリー上の挿入位置を決定する処理である。
ステップS1324においては、探索経路スタック310からスタックポインタの指す配列番号を取り出す。そして、ステップS1325において、ステップS1314で得た配列番号の指す配列要素のノード種別に“1”(リーフノード)を、参照ポインタに挿入キーが記憶されている記憶領域を指すポインタを書き込む。これにより、リーフノードに挿入コード列を指す参照ポインタが書き込まれる。
次に、ステップS1326に進み、配列からステップS1324で得た配列番号の配列要素を読み出す。続いて、ステップS1327において、ステップS1315で得た配列番号の配列要素にステップS1326で読み出した内容を書き込む。
最後にステップS1328において、ステップS1324で得た配列番号の指す配列要素のノード種別に“0”(ブランチノード)を、弁別ビット位置にステップS1317で得たビット位置を、代表ノード番号にステップS1312で得た配列番号を書き込み、処理を終了する。
このように、ステップS1324以下の処理で、各ノードにデータを設定して挿入処理が完成する。
次に、図14A〜図14Bを参照して、本発明の一実施形態に係るカップルドノードツリーから、削除キーの指定にしたがって、リーフノードを削除する処理について説明する。この削除処理は、削除キー及び検索対象コード列を符号化することを除いて、特許文献2に開示したものと類似するものである。
図14Aは、本発明の一実施形態における削除処理の前段の処理フロー例を説明する図である。
まず、ステップS1401で、カップルドノードツリーから削除するコード列(削除キー)を削除コード列に設定する。次に、ステップS1402で、削除コード列を符号化して符号化削除キーを作成する。ステップS1402における符号化処理は、図7に示す処理フローにより実現可能である。
次にステップS1403において、検索開始ノードの配列番号にルートノードの配列番号を設定し、ステップS1404で、符号化検索キーに符号化削除キーを設定してステップS1405に進む。ステップS1405では、符号化検索キーにより、検索開始ノードから配列を検索し、参照ポインタを得る。この処理は、図5に示す基本検索処理により実現される。
次に、ステップS1406に進み、コード列の格納領域311から前記ステップS1405において得られた参照ポインタの指すコード列を読み出す。そして、ステップS1407で、ステップS1406で読み出したコード列から符号化コード列(インデックスキー)を作成する。ステップS1407における符号化処理は、図7に示す処理フローにより実現可能である。
そして、ステップS1408で、前記ステップS1404で設定した符号化削除キーと前記ステップS1407で作成したインデックスキーとを比較し、等しくなければ削除キーに対応する検索対象コード列に係るリーフノードはカップルドノードツリーに存在しないのであるから、削除は失敗として、処理を終了する。等しければ、図14BのステップS1412以下の処理に進む。
図14Bは、本発明の一実施形態における削除処理の後段の処理フロー例を説明する図である。図に示すように、ステップS1412において、探索経路スタック310に2つ以上の配列番号が格納されているか否かを判定する。
該判定結果が「いいえ」のときは、格納されている配列番号は1つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合は、ステップS1418に進み、ステップS1403で設定したルートノードの配列番号に係るノード対を削除する。そして、ステップS1419に進み、カップルドノードツリーに管理手段に登録されていたルートノードの配列番号を削除して処理を終了する。
一方、ステップS1412において探索経路スタック310に2つ以上の配列番号が格納されていると判定されたときはステップS1413に進み、ステップS1405でコールしている図5のステップS508で得た代表ノード番号に図5のステップS507で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除キーが格納されている領域を指す参照ポインタが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
次にステップS1414において、ステップS1413で得た配列番号の配列要素の内容を配列から読み出し、ステップS1415において探索経路スタックのスタックポインタを1つ戻して配列番号を取り出す。
次にステップS1416に進み、ステップS1414で読み出した配列要素の内容をステップS1415で得た配列番号の配列要素に上書きする。この処理は、削除キーが格納されている領域を指す参照ポインタが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
最後にステップS1417においてステップS1405でコールしている図5のステップS508で得た代表ノード番号の指すノード対を削除して、削除処理を終了する。
以上説明したとおり、本発明においては、上述した挿入処理と削除処理において影響を受ける既存のノードの範囲は最小限であり、挿入や削除による保守コストが低いというカップルドノードツリーの長所は保たれている。また、上記のような符号化方法を採用することにより、この長所を保ちつつ、高速な最長一致検索が可能となる。
以上、本発明の実施の形態に係るコード列検索方法を実現する処理フローについて説明をした。これらの処理フローを図4に例示するデータ処理装置301のようなコンピュータに実行させるプログラムにおり、本発明に係るビット列検索装置をコンピュータ上に構築可能なことは明らかである。
そこで、本発明に係るコード列検索装置の機能構成について、以下に説明する。
図15は、本発明の一実施形態におけるコード列検索装置の機能ブロック構成例を説明する図である。
図15に示すように、コード列検索装置500は、図4に例示するデータ処理装置301により実現される初期検索部510と最長一致検索部520、及びカップルドノードツリー200が配置される配列309、探索経路スタック310、コード列の格納領域311が設けられたデータ格納装置308を含む。
初期検索部510は、検索結果コード列取得手段511と探索経路記憶手段512を備えている。最長一致検索部520は、前方一致判定手段521、第1の最長一致キー取得手段522及び第2の最長一致キー手段523を備えている。
初期検索部510の機能は、図6のステップS605、すなわち図8Bに例示する初期検索処理と図9Bに示すステップS901の最初の処理により実現される。また、最長一致検索部520の機能は、図9B〜図9Dに例示する最長一致検索処理により実現される。
なお、上述した実施の形態においては、図9Aに示すように、探索経路スタック310を2列に分けて、スタックポインタの一つの値により指定される記憶場所に、コード列区切りブランチノードの配列番号と、コード列区切りブランチノードの子ノードのうちノード[1]の配列番号の2つの配列番号からなる組を格納するように構成していたが、これに限られることはない。
コード列区切りブランチノードの配列番号と子ノードの配列番号を格納する探索経路スタック310を、コード列区切りブランチノードの配列番号を格納する領域と子ノードの配列番号を格納する領域に分け、格納処理ではそれぞれのスタックポインタを操作して格納し、取り出し処理ではスタックポインタを同期させて取り出すようにしてもよい。例えば、図8BのステップS813とS815において、コード列区切りブランチノードの配列番号と子ノードの配列番号をそれぞれのスタックポインタを操作してそれぞれの格納領域に格納し、また、図9B〜図9Dに示す処理において、それぞれのスタックポインタの操作を同期させるようにすればよい。
また、上述の実施の形態においては、カップルドノードツリーのリーフノードは、検索対象コード列あるいは検索対象コード列が記憶された記憶領域を指す参照ポインタを含むものとし、符号化検索キーとのビット列比較においては検索結果コード列を符号化しているが、検索対象コード列を初めから符号化しておき、検索結果として符号化されたコード列であるインデックスキーを直接求めるようにしてもよい。それらのどちらを採用するかは、検索対象コード列に必要な記憶容量と検索実行時に要する符号化の処理コストを勘案して決定すべきものである。
10
検索対象文字列
13
コード表
50
コード列
60
コード列(ビット表現)
70
符号化コード列(ビット表現)
100 配列
101 ルートノード
102、114、117、124、126 ノード種別
103、115 弁別ビット位置
104、116 代表ノード番号
111、121 ノード対
118 参照ポインタ
200
カップルドノードツリー
301
データ処理装置
302
中央処理装置
303
キャッシュメモリ
304
バス
305
主記憶装置
306
外部記憶装置
307
通信装置
308
データ格納装置
309
配列
310
探索経路スタック
311
コード列の格納領域
500
コード列検索装置
510
初期検索部
511 検索結果コード列取得手段
512 探索経路記憶手段
520 最長一致検索部
521
前方一致判定手段
522
第1の最長一致キー取得手段
523
第2の最長一致キー取得手段


Claims (15)

  1. コード列からなる検索キーを符号化したビット列である符号化検索キーによりツリーのデータ構造に基づいて検索対象コード列を検索するコード列検索装置において、
    前記ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含むものであって、前記検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定されるデータ構造を有する、カップルドノードツリーと、
    前記符号化検索キーにより前記カップルドノードツリーのデータ構造に基づいて、前記検索対象コード列を検索して初期検索における検索結果コード列を求めるとともに、該初期検索でたどる前記カップルドノードツリー上の経路を記憶する初期検索部と、
    前記初期検索における検索結果コード列と、前記記憶された前記カップルドノードツリー上の経路に存在するリーフノードに含まれる検索対象コード列あるいは該リーフノードに含まれる参照ポインタの指す記憶領域に記憶された検索対象コード列から、前記検索キーに前方一致する最長の検索対象コード列を最長一致キーとして求める最長一致検索部を備え、
    前記コード列からなる検索キーと検索対象コード列の符号化は、それぞれのコード列を構成する各コードを表すビット列の先頭に該コードが後続することを示す識別ビットである有意コード識別ビットを付加し、かつ、それぞれのコード列の終端に該コード列の終端を示す識別ビットである無意コード識別ビットを付加するものであり、
    前記初期検索部は、
    前記ルートノードを検索開始ノードとして、前記ブランチノードにおいて、その弁別ビット位置の情報とリンク先のノード対の代表ノードの位置を示す情報を読み出し、前記符号化検索キーの該読み出した弁別ビット位置のビット値と該読み出した代表ノードの位置を示す情報との演算によりノードの位置を示す情報を求め、該求めた位置のノードをリンク先ノードとして読み出すことを、該読み出したリンク先ノードのノード種別がリーフノードとなるまで繰り返し、該到達したリーフノードに含まれる検索対象コード列を初期検索の検索結果コード列として取得する、あるいは到達したリーフノードに含まれる参照ポインタを取得して該参照ポインタの指す記憶領域に記憶された検索対象コード列を初期検索の検索結果コード列として取得する検索結果コード列取得手段と、
    前記リーフノードに到達する過程でたどったブランチノードのうち、その弁別ビット位置の値が、前記符号化検索キーを構成するビット列のうちいずれかの前記識別ビットが存在する位置と一致するブランチノードであるコード列区切りブランチノードの位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納することで、前記初期検索でたどる前記カップルドノードツリー上の経路を記憶する探索経路記憶手段を含み、
    前記最長一致検索部は、
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致するか判定する前方一致判定手段と
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致すると判定された場合に、該検索結果コード列を前記最長一致キーとして求める第1の最長一致キー取得手段と、
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致しないと判定された場合に、前記スタックから前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報を最後に格納されたものから順次取り出し、該取り出された情報によりアクセスされる検索対象コード列を符号化したインデックスキーのビット長が前記符号化検索キーのビット長以下となる最初のインデックスキーの無意コード識別ビットを除いた範囲のビット列と前記符号化検索キーの無意コード識別ビットを除いた範囲のビット列を比較して上位から見て最初にビット値が不一致となるビット位置である差分ビット位置を取得し、さらに前記スタックからコード列区切りブランチノードの位置を示す情報を順次取り出し、該取り出した位置を示す情報の位置にあるコード列区切りブランチノードの弁別ビット位置が最初に前記差分ビット位置より上位となるコード区切りブランチノードのリンク先のノード対のうちのコード列終端側ノードに係る検索対象コード列にアクセスするための情報を取り出し、該取り出した情報に基づいてアクセスされる検索対象コード列を前記最長一致キーとして求める第2の最長一致キー取得手段を含む、
    ことを特徴とするコード列検索装置。
  2. 請求項1に記載のコード列検索装置において、前記カップルドノードツリーは配列に配置され、前記代表ノードの位置を示す情報及びコード列区切りブランチノードの位置を示す情報は、それぞれのノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索装置。
  3. 請求項2に記載のコード列検索装置において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードが格納された前記配列の配列要素の配列番号、あるいは該コード列終端側ノードと対をなすノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索装置。
  4. 請求項1に記載のコード列検索装置において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードに係る検索対象コード列あるいは該コード列終端側ノードに係る検索対象コード列が記憶された記憶領域を指す参照ポインタであることを特徴とするコード列検索装置。
  5. コード列検索装置が、コード列からなる検索キーを符号化したビット列である符号化検索キーによりツリーのデータ構造に基づいて検索対象コード列を検索するコード列検索方法において、
    前記ツリーは、該ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含むものであって、前記検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定されるデータ構造を有する、カップルドノードツリーであり、
    前記符号化検索キーへの符号化と後記検索対象コード列の符号化は、それぞれのコード列を構成する各コードを表すビット列の先頭に該コードが後続することを示す識別ビットである有意コード識別ビットを付加し、かつ、それぞれのコード列の終端に該コード列の終端を示す識別ビットである無意コード識別ビットを付加するものであって、
    前記ルートノードを検索開始ノードとして、前記ブランチノードにおいて、その弁別ビット位置の情報とリンク先のノード対の代表ノードの位置を示す情報を読み出し、前記符号化検索キーの該読み出した弁別ビット位置のビット値と該読み出した代表ノードの位置を示す情報との演算によりノードの位置を示す情報を求め、該求めた位置のノードをリンク先ノードとして読み出すことを、該読み出したリンク先ノードのノード種別がリーフノードとなるまで繰り返し、該到達したリーフノードに含まれる検索対象コード列を初期検索の検索結果コード列として取得する、あるいは到達したリーフノードに含まれる参照ポインタを取得して該参照ポインタの指す記憶領域に記憶された検索対象コード列を初期検索の検索結果コード列として取得するとともに、前記リーフノードに到達する過程でたどったブランチノードのうち、その弁別ビット位置の値が、前記符号化検索キーを構成するビット列のうちいずれかの前記識別ビットが存在する位置と一致するブランチノードであるコード列区切りブランチノードの位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納する初期検索ステップと、
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致するか判定する前方一致判定ステップと
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致すると判定された場合に、該検索結果コード列を前記検索キーに前方一致する最長の検索対象コード列である最長一致キーとして求める第1の最長一致キー取得ステップと、
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致しないと判定された場合に、前記スタックから前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報を最後に格納されたものから順次取り出し、該取り出された情報によりアクセスされる検索対象コード列を符号化したインデックスキーのビット長が前記符号化検索キーのビット長以下となる最初のインデックスキーの無意コード識別ビットを除いた範囲のビット列と前記符号化検索キーの無意コード識別ビットを除いた範囲のビット列を比較して上位から見て最初にビット値が不一致となるビット位置である差分ビット位置を取得し、さらに前記スタックからコード列区切りブランチノードの位置を示す情報を順次取り出し、該取り出した位置を示す情報の位置にあるコード列区切りブランチノードの弁別ビット位置が最初に前記差分ビット位置より上位となるコード区切りブランチノードのリンク先のノード対のうちのコード列終端側ノードに係る検索対象コード列にアクセスするための情報を取り出し、該取り出した情報に基づいてアクセスされる検索対象コード列を前記最長一致キーとして求める第2の最長一致キー取得ステップを含む、
    ことを特徴とするコード列検索方法。
  6. 請求項5に記載のコード列検索方法において、前記カップルドノードツリーは配列に配置され、前記代表ノードの位置を示す情報及びコード列区切りブランチノードの位置を示す情報は、それぞれのノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法。
  7. 請求項6に記載のコード列検索方法において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードが格納された前記配列の配列要素の配列番号、あるいは該コード列終端側ノードと対をなすノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法。
  8. 請求項5に記載のコード列検索方法において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードに係る検索対象コード列あるいは該コード列終端側ノードに係る検索対象コード列が記憶された記憶領域を指す参照ポインタであることを特徴とするコード列検索方法。
  9. 請求項5〜請求項8のいずれか1項に記載のコード列検索方法をコンピュータに実行させるためのプログラム。
  10. 請求項9に記載のプログラムを記録したコンピュータ読み取り可能な記憶媒体。
  11. コード列検索装置が、コード列からなる検索キーを符号化したビット列である符号化検索キーにより検索対象コード列を検索するコード列検索方法のためのデータ構造において、
    ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである2つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含むものであって、前記検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定されるデータ構造を有し、前記符号化検索キーへの符号化と前記検索対象コード列の符号化は、それぞれのコード列を構成する各コードを表すビット列の先頭に該コードが後続することを示す識別ビットである有意コード識別ビットを付加し、かつ、それぞれのコード列の終端に該コード列の終端を示す識別ビットである無意コード識別ビットを付加するものである、カップルドノードツリー
    を備え、
    前記コード列検索装置が、
    前記ルートノードを検索開始ノードとして、前記ブランチノードにおいて、その弁別ビット位置の情報とリンク先のノード対の代表ノードの位置を示す情報を読み出し、前記符号化検索キーの該読み出した弁別ビット位置のビット値と該読み出した代表ノードの位置を示す情報との演算によりノードの位置を示す情報を求め、該求めた位置のノードをリンク先ノードとして読み出すことを、該読み出したリンク先ノードのノード種別がリーフノードとなるまで繰り返し、該到達したリーフノードに含まれる検索対象コード列を初期検索の検索結果コード列として取得する、あるいは到達したリーフノードに含まれる参照ポインタを取得して該参照ポインタの指す記憶領域に記憶された検索対象コード列を初期検索の検索結果コード列として取得するとともに、前記リーフノードに到達する過程でたどったブランチノードのうち、その弁別ビット位置の値が、前記符号化検索キーを構成するビット列のうちいずれかの前記識別ビットが存在する位置と一致するブランチノードであるコード列区切りブランチノードの位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納する初期検索ステップと、
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致するか判定する前方一致判定ステップと
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致すると判定された場合に、該検索結果コード列を前記検索キーに前方一致する最長の検索対象コード列である最長一致キーとして求める第1の最長一致キー取得ステップと、
    前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致しないと判定された場合に、前記スタックから前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報を最後に格納されたものから順次取り出し、該取り出された情報によりアクセスされる検索対象コード列を符号化したインデックスキーのビット長が前記符号化検索キーのビット長以下となる最初のインデックスキーの無意コード識別ビットを除いた範囲のビット列と前記符号化検索キーの無意コード識別ビットを除いた範囲のビット列を比較して上位から見て最初にビット値が不一致となるビット位置である差分ビット位置を取得し、さらに前記スタックからコード列区切りブランチノードの位置を示す情報を順次取り出し、該取り出した位置を示す情報の位置にあるコード列区切りブランチノードの弁別ビット位置が最初に前記差分ビット位置より上位となるコード区切りブランチノードのリンク先のノード対のうちのコード列終端側ノードに係る検索対象コード列にアクセスするための情報を取り出し、該取り出した情報に基づいてアクセスされる検索対象コード列を前記最長一致キーとして求める第2の最長一致キー取得ステップを含む、コード列検索方法を実行可能とする
    ことを特徴とするコード列検索方法のためのデータ構造。
  12. 請求項11に記載のコード列検索方法のためのデータ構造において、前記カップルドノードツリーは配列に配置され、前記代表ノードの位置を示す情報及びコード列区切りブランチノードの位置を示す情報は、それぞれのノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法のためのデータ構造。
  13. 請求項12に記載のコード列検索方法のためのデータ構造において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードが格納された前記配列の配列要素の配列番号、あるいは該コード列終端側ノードと対をなすノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法のためのデータ構造。
  14. 請求項11に記載のコード列検索方法のためのデータ構造において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードに係る検索対象コード列あるいは該コード列終端側ノードに係る検索対象コード列が記憶された記憶領域を指す参照ポインタであることを特徴とするコード列検索方法のためのデータ構造。
  15. 請求項11〜請求項14のいずれか1項に記載のコード列検索方法のためのデータ構造を有するデータを記録したことを特徴とするコンピュータ読み取り可能な記憶媒体。

JP2010293635A 2010-12-28 2010-12-28 コード列検索装置、検索方法及びプログラム Expired - Fee Related JP5473893B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2010293635A JP5473893B2 (ja) 2010-12-28 2010-12-28 コード列検索装置、検索方法及びプログラム
PCT/JP2011/079375 WO2012090763A1 (ja) 2010-12-28 2011-12-19 コード列検索装置、検索方法及びプログラム
US13/926,545 US20130297641A1 (en) 2010-12-28 2013-06-25 Code string search apparatus, search method, and program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010293635A JP5473893B2 (ja) 2010-12-28 2010-12-28 コード列検索装置、検索方法及びプログラム

Publications (3)

Publication Number Publication Date
JP2012141760A JP2012141760A (ja) 2012-07-26
JP2012141760A5 JP2012141760A5 (ja) 2013-12-19
JP5473893B2 true JP5473893B2 (ja) 2014-04-16

Family

ID=46382874

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010293635A Expired - Fee Related JP5473893B2 (ja) 2010-12-28 2010-12-28 コード列検索装置、検索方法及びプログラム

Country Status (3)

Country Link
US (1) US20130297641A1 (ja)
JP (1) JP5473893B2 (ja)
WO (1) WO2012090763A1 (ja)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8654966B2 (en) * 2007-01-24 2014-02-18 Audiocodes Ltd. Method for dial plan parsing and a system incorporating the same
WO2014045318A1 (ja) * 2012-09-21 2014-03-27 富士通株式会社 圧縮プログラム、圧縮方法及び圧縮装置
US9680749B2 (en) * 2015-02-27 2017-06-13 Arista Networks, Inc. System and method of using an exact match table and longest prefix match table as a combined longest prefix match
US10516613B1 (en) 2015-10-14 2019-12-24 Innovium, Inc. Network device storage of incremental prefix trees
US10528488B1 (en) * 2017-03-30 2020-01-07 Pure Storage, Inc. Efficient name coding
US10230639B1 (en) * 2017-08-08 2019-03-12 Innovium, Inc. Enhanced prefix matching
US10528556B1 (en) * 2017-12-31 2020-01-07 Allscripts Software, Llc Database methodology for searching encrypted data records
US11140078B1 (en) 2018-10-18 2021-10-05 Innovium, Inc. Multi-stage prefix matching enhancements
US11106657B2 (en) * 2018-11-20 2021-08-31 International Business Machines Corporation Optimizing hash storage and memory during caching
CN110222143B (zh) * 2019-05-31 2022-11-04 北京小米移动软件有限公司 字符串匹配方法,装置,存储介质及电子设备
CN110909212B (zh) * 2019-10-11 2024-04-09 中国平安财产保险股份有限公司 一种银行标识代码的匹配方法和设备

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH11136287A (ja) * 1997-10-25 1999-05-21 Masaya Yoneda 検索装置およびそれを用いたデータ転送システム
US6993025B1 (en) * 1999-12-30 2006-01-31 Nortel Networks Limited Method and apparatus for encoding a plurality of pre-defined codes into a search key and for locating a longest matching pre-defined code
JP3691018B2 (ja) * 2002-01-31 2005-08-31 日本電信電話株式会社 最長一致検索回路および方法およびプログラムおよび記録媒体
JP3660311B2 (ja) * 2002-02-07 2005-06-15 日本電信電話株式会社 テーブル検索装置および方法およびプログラムおよび記録媒体
US7079056B2 (en) * 2003-01-15 2006-07-18 Delphi Technologies, Inc. Method of encoding and storing in a machine control computer a compressed data lookup table
JP4514771B2 (ja) * 2007-05-18 2010-07-28 株式会社エスグランツ カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
JP4514768B2 (ja) * 2007-04-19 2010-07-28 株式会社エスグランツ カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
JP4527753B2 (ja) * 2007-07-03 2010-08-18 株式会社エスグランツ ビット列検索装置、検索方法及びプログラム
US9009655B2 (en) * 2008-09-28 2015-04-14 KOUSOKUYA, Inc. Code string search apparatus, search method, and program

Also Published As

Publication number Publication date
JP2012141760A (ja) 2012-07-26
WO2012090763A1 (ja) 2012-07-05
US20130297641A1 (en) 2013-11-07

Similar Documents

Publication Publication Date Title
JP5473893B2 (ja) コード列検索装置、検索方法及びプログラム
JP4271214B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4527753B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4271227B2 (ja) ビット列検索装置、検索方法及びプログラム
CN102541995B (zh) 对散列序列矩阵的索引和查询
JP4514768B2 (ja) カップルドノードツリーの退避/復元装置、退避/復元方法及びプログラム
JP4402120B2 (ja) ビット列検索装置、検索方法及びプログラム
JP4514771B2 (ja) カップルドノードツリーの最長一致/最短一致検索装置、検索方法及びプログラム
JP5165662B2 (ja) ビット列キー分類・分配装置、分類・分配方法及びプログラム
JP2009140161A (ja) ビット列のマージソート方法及びプログラム
EP2149845B1 (en) Coupled node tree backup/restore apparatus, backup/restore method, and program
WO2009122651A1 (ja) ビット列検索装置、検索方法及びプログラム
EP2249257B1 (en) Bit string retrieval device, retrieval method and program
JP4417431B2 (ja) カップルドノードツリーの分割/結合方法及びプログラム
JP2011018296A (ja) カップルドノードツリーのインデックスキー挿入/削除方法
WO2010125742A1 (ja) インデックス更新データ作成装置、作成方法及びプログラム
JP4813575B2 (ja) ビット列検索装置
KR102326105B1 (ko) 워드 추출 방법 및 장치
JP5220057B2 (ja) ビット列検索装置、検索方法及びプログラム
JP2000029884A (ja) 文字コード登録探索装置、及び文字コード登録探索方法

Legal Events

Date Code Title Description
A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A712

Effective date: 20121010

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20131101

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20131101

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20131101

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20131202

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20131210

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20131218

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140204

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees