(57)【特許請求の範囲】
【請求項１】
コード列からなる検索キーを符号化したビット列である符号化検索キーによりツリーのデータ構造に基づいて検索対象コード列を検索するコード列検索装置において、
前記ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである２つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含むものであって、前記検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定されるデータ構造を有する、カップルドノードツリーと、
前記符号化検索キーにより前記カップルドノードツリーのデータ構造に基づいて、前記検索対象コード列を検索して初期検索における検索結果コード列を求めるとともに、該初期検索でたどる前記カップルドノードツリー上の経路を記憶する初期検索部と、
前記初期検索における検索結果コード列と、前記記憶された前記カップルドノードツリー上の経路に存在するリーフノードに含まれる検索対象コード列あるいは該リーフノードに含まれる参照ポインタの指す記憶領域に記憶された検索対象コード列から、前記検索キーに前方一致する最長の検索対象コード列を最長一致キーとして求める最長一致検索部を備え、
前記コード列からなる検索キーと検索対象コード列の符号化は、それぞれのコード列を構成する各コードを表すビット列の先頭に該コードが後続することを示す識別ビットである有意コード識別ビットを付加し、かつ、それぞれのコード列の終端に該コード列の終端を示す識別ビットである無意コード識別ビットを付加するものであり、
前記初期検索部は、
前記ルートノードを検索開始ノードとして、前記ブランチノードにおいて、その弁別ビット位置の情報とリンク先のノード対の代表ノードの位置を示す情報を読み出し、前記符号化検索キーの該読み出した弁別ビット位置のビット値と該読み出した代表ノードの位置を示す情報との演算によりノードの位置を示す情報を求め、該求めた位置のノードをリンク先ノードとして読み出すことを、該読み出したリンク先ノードのノード種別がリーフノードとなるまで繰り返し、該到達したリーフノードに含まれる検索対象コード列を初期検索の検索結果コード列として取得する、あるいは到達したリーフノードに含まれる参照ポインタを取得して該参照ポインタの指す記憶領域に記憶された検索対象コード列を初期検索の検索結果コード列として取得する検索結果コード列取得手段と、
前記リーフノードに到達する過程でたどったブランチノードのうち、その弁別ビット位置の値が、前記符号化検索キーを構成するビット列のうちいずれかの前記識別ビットが存在する位置と一致するブランチノードであるコード列区切りブランチノードの位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納することで、前記初期検索でたどる前記カップルドノードツリー上の経路を記憶する探索経路記憶手段を含み、
前記最長一致検索部は、
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致するか判定する前方一致判定手段と
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致すると判定された場合に、該検索結果コード列を前記最長一致キーとして求める第１の最長一致キー取得手段と、
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致しないと判定された場合に、前記スタックから前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報を最後に格納されたものから順次取り出し、該取り出された情報によりアクセスされる検索対象コード列を符号化したインデックスキーのビット長が前記符号化検索キーのビット長以下となる最初のインデックスキーの無意コード識別ビットを除いた範囲のビット列と前記符号化検索キーの無意コード識別ビットを除いた範囲のビット列を比較して上位から見て最初にビット値が不一致となるビット位置である差分ビット位置を取得し、さらに前記スタックからコード列区切りブランチノードの位置を示す情報を順次取り出し、該取り出した位置を示す情報の位置にあるコード列区切りブランチノードの弁別ビット位置が最初に前記差分ビット位置より上位となるコード区切りブランチノードのリンク先のノード対のうちのコード列終端側ノードに係る検索対象コード列にアクセスするための情報を取り出し、該取り出した情報に基づいてアクセスされる検索対象コード列を前記最長一致キーとして求める第２の最長一致キー取得手段を含む、
ことを特徴とするコード列検索装置。
【請求項２】
請求項１に記載のコード列検索装置において、前記カップルドノードツリーは配列に配置され、前記代表ノードの位置を示す情報及びコード列区切りブランチノードの位置を示す情報は、それぞれのノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索装置。
【請求項３】
請求項２に記載のコード列検索装置において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードが格納された前記配列の配列要素の配列番号、あるいは該コード列終端側ノードと対をなすノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索装置。
【請求項４】
請求項１に記載のコード列検索装置において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードに係る検索対象コード列あるいは該コード列終端側ノードに係る検索対象コード列が記憶された記憶領域を指す参照ポインタであることを特徴とするコード列検索装置。
【請求項５】
コード列検索装置が、コード列からなる検索キーを符号化したビット列である符号化検索キーによりツリーのデータ構造に基づいて検索対象コード列を検索するコード列検索方法において、
前記ツリーは、該ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである２つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含むものであって、前記検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定されるデータ構造を有する、カップルドノードツリーであり、
前記符号化検索キーへの符号化と後記検索対象コード列の符号化は、それぞれのコード列を構成する各コードを表すビット列の先頭に該コードが後続することを示す識別ビットである有意コード識別ビットを付加し、かつ、それぞれのコード列の終端に該コード列の終端を示す識別ビットである無意コード識別ビットを付加するものであって、
前記ルートノードを検索開始ノードとして、前記ブランチノードにおいて、その弁別ビット位置の情報とリンク先のノード対の代表ノードの位置を示す情報を読み出し、前記符号化検索キーの該読み出した弁別ビット位置のビット値と該読み出した代表ノードの位置を示す情報との演算によりノードの位置を示す情報を求め、該求めた位置のノードをリンク先ノードとして読み出すことを、該読み出したリンク先ノードのノード種別がリーフノードとなるまで繰り返し、該到達したリーフノードに含まれる検索対象コード列を初期検索の検索結果コード列として取得する、あるいは到達したリーフノードに含まれる参照ポインタを取得して該参照ポインタの指す記憶領域に記憶された検索対象コード列を初期検索の検索結果コード列として取得するとともに、前記リーフノードに到達する過程でたどったブランチノードのうち、その弁別ビット位置の値が、前記符号化検索キーを構成するビット列のうちいずれかの前記識別ビットが存在する位置と一致するブランチノードであるコード列区切りブランチノードの位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納する初期検索ステップと、
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致するか判定する前方一致判定ステップと
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致すると判定された場合に、該検索結果コード列を、前記検索キーに前方一致する最長の検索対象コード列である最長一致キーとして求める第１の最長一致キー取得ステップと、
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致しないと判定された場合に、前記スタックから前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報を最後に格納されたものから順次取り出し、該取り出された情報によりアクセスされる検索対象コード列を符号化したインデックスキーのビット長が前記符号化検索キーのビット長以下となる最初のインデックスキーの無意コード識別ビットを除いた範囲のビット列と前記符号化検索キーの無意コード識別ビットを除いた範囲のビット列を比較して上位から見て最初にビット値が不一致となるビット位置である差分ビット位置を取得し、さらに前記スタックからコード列区切りブランチノードの位置を示す情報を順次取り出し、該取り出した位置を示す情報の位置にあるコード列区切りブランチノードの弁別ビット位置が最初に前記差分ビット位置より上位となるコード区切りブランチノードのリンク先のノード対のうちのコード列終端側ノードに係る検索対象コード列にアクセスするための情報を取り出し、該取り出した情報に基づいてアクセスされる検索対象コード列を前記最長一致キーとして求める第２の最長一致キー取得ステップを含む、
ことを特徴とするコード列検索方法。
【請求項６】
請求項５に記載のコード列検索方法において、前記カップルドノードツリーは配列に配置され、前記代表ノードの位置を示す情報及びコード列区切りブランチノードの位置を示す情報は、それぞれのノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法。
【請求項７】
請求項６に記載のコード列検索方法において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードが格納された前記配列の配列要素の配列番号、あるいは該コード列終端側ノードと対をなすノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法。
【請求項８】
請求項５に記載のコード列検索方法において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードに係る検索対象コード列あるいは該コード列終端側ノードに係る検索対象コード列が記憶された記憶領域を指す参照ポインタであることを特徴とするコード列検索方法。
【請求項９】
請求項５〜請求項８のいずれか１項に記載のコード列検索方法をコンピュータに実行させるためのプログラム。
【請求項１０】
請求項９に記載のプログラムを記録したコンピュータ読み取り可能な記憶媒体。
【請求項１１】
コード列検索装置が、コード列からなる検索キーを符号化したビット列である符号化検索キーにより検索対象コード列を検索するコード列検索方法のためのデータ構造において、
ツリーの始点であるルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである２つのノードを有する、ツリーの構成要素としてのノード対を有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含むものであって、前記検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定されるデータ構造を有し、前記符号化検索キーへの符号化と前記検索対象コード列の符号化は、それぞれのコード列を構成する各コードを表すビット列の先頭に該コードが後続することを示す識別ビットである有意コード識別ビットを付加し、かつ、それぞれのコード列の終端に該コード列の終端を示す識別ビットである無意コード識別ビットを付加するものである、カップルドノードツリー
を備え、
前記コード列検索装置が、
前記ルートノードを検索開始ノードとして、前記ブランチノードにおいて、その弁別ビット位置の情報とリンク先のノード対の代表ノードの位置を示す情報を読み出し、前記符号化検索キーの該読み出した弁別ビット位置のビット値と該読み出した代表ノードの位置を示す情報との演算によりノードの位置を示す情報を求め、該求めた位置のノードをリンク先ノードとして読み出すことを、該読み出したリンク先ノードのノード種別がリーフノードとなるまで繰り返し、該到達したリーフノードに含まれる検索対象コード列を初期検索の検索結果コード列として取得する、あるいは到達したリーフノードに含まれる参照ポインタを取得して該参照ポインタの指す記憶領域に記憶された検索対象コード列を初期検索の検索結果コード列として取得するとともに、前記リーフノードに到達する過程でたどったブランチノードのうち、その弁別ビット位置の値が、前記符号化検索キーを構成するビット列のうちいずれかの前記識別ビットが存在する位置と一致するブランチノードであるコード列区切りブランチノードの位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納する初期検索ステップと、
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致するか判定する前方一致判定ステップと
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致すると判定された場合に、該検索結果コード列を、前記検索キーに前方一致する最長の検索対象コード列である最長一致キーとして求める第１の最長一致キー取得ステップと、
前記初期検索の検索結果コード列を符号化したインデックスキーが前記符号化検索キーに前方一致しないと判定された場合に、前記スタックから前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報を最後に格納されたものから順次取り出し、該取り出された情報によりアクセスされる検索対象コード列を符号化したインデックスキーのビット長が前記符号化検索キーのビット長以下となる最初のインデックスキーの無意コード識別ビットを除いた範囲のビット列と前記符号化検索キーの無意コード識別ビットを除いた範囲のビット列を比較して上位から見て最初にビット値が不一致となるビット位置である差分ビット位置を取得し、さらに前記スタックからコード列区切りブランチノードの位置を示す情報を順次取り出し、該取り出した位置を示す情報の位置にあるコード列区切りブランチノードの弁別ビット位置が最初に前記差分ビット位置より上位となるコード区切りブランチノードのリンク先のノード対のうちのコード列終端側ノードに係る検索対象コード列にアクセスするための情報を取り出し、該取り出した情報に基づいてアクセスされる検索対象コード列を前記最長一致キーとして求める第２の最長一致キー取得ステップを含む、コード列検索方法を実行可能とする
ことを特徴とするコード列検索方法のためのデータ構造。
【請求項１２】
請求項１１に記載のコード列検索方法のためのデータ構造において、前記カップルドノードツリーは配列に配置され、前記代表ノードの位置を示す情報及びコード列区切りブランチノードの位置を示す情報は、それぞれのノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法のためのデータ構造。
【請求項１３】
請求項１２に記載のコード列検索方法のためのデータ構造において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードが格納された前記配列の配列要素の配列番号、あるいは該コード列終端側ノードと対をなすノードが格納された前記配列の配列要素の配列番号であることを特徴とするコード列検索方法のためのデータ構造。
【請求項１４】
請求項１１に記載のコード列検索方法のためのデータ構造において、前記コード列終端側ノードに係る検索対象コード列にアクセスするための情報は、該コード列終端側ノードに係る検索対象コード列あるいは該コード列終端側ノードに係る検索対象コード列が記憶された記憶領域を指す参照ポインタであることを特徴とするコード列検索方法のためのデータ構造。
【請求項１５】
請求項１１〜請求項１４のいずれか１項に記載のコード列検索方法のためのデータ構造を有するデータを記録したことを特徴とするコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ビット列で構成される文字コードあるいは文字コード列を検索する文字列検索のように、コンピュータにより、ビット列で構成されるコードあるいはコード列を検索するコード列検索装置、検索方法及びプログラムに関する。
【背景技術】
【０００２】
近年、ビジネス文書を作成するためにワードプロセッサを使用することが通例となり、またインターネットが普及したことにより、ビット列からなる文字コードを用いた、コンピュータで処理可能な電子文書が世の中に大量に存在するようになっている。そのため、これら大量の電子文書の中からコンピュータを利用して必要なものを探し出すために、各種の文字列検索手法が開発されている。
【０００３】
これらの文字列検索手法の１つとして、図１Ａを参照して、可変長文字列を検索対象とする最長一致検索（以下、可変長文字列の最長一致検索、のように表記する。）の例について説明する。なお、ここでいう最長一致検索とは、検索文字列に前方一致する最長の文字列を検索対象文字列の集合から検索するものである。このような最長一致検索は、例えばルータにおけるルーティング先の検索や電子辞書の辞書引きに用いられている。
【０００４】
図１Ａに示す例では、検索対象文字列（登録パターン）１０として「ＢＥＡＢ」、「ＢＡＢ」、「ＡＢＥＡＢ」、「ＡＢ」及び「Ａ」の各文字列が登録されている。検索対象文字列は、ルーティング先の検索ではルーティング先であり、辞書引きでは辞書の見出しである。
この検索対象文字列１０を検索文字列４０ａ「ＡＢＥＡＢＣ」で検索すると、検索文字列４０ａに前方一致する検索対象文字列は「Ａ」、「ＡＢ」、「ＡＢＥＡＢ」となる。それらのうち最長の検索対象文字列は「ＡＢＥＡＢ」なので、「ＡＢＥＡＢ」が最長一致検索の検索結果文字列５０ａである。
【０００５】
また、検索対象文字列１０を検索文字列４０ｂ「ＡＢＥ」で検索すると、前方一致する検索対象文字列は「Ａ」、「ＡＢ」となるが、そのうち最長の検索対象文字列は「ＡＢ」なので、「ＡＢ」が検索結果文字列５０ｂである。なお、検索文字列４０ｂ「ＡＢＥ」は検索対象文字列１０に含まれる文字列「ＡＢＥＡＢ」に前方一致するが、本願の最長一致検索は、先に述べたとおり、検索文字列に前方一致する最長の文字列を検索対象文字列の集合から検索するものであり、文字列「ＡＢＥＡＢ」は検索文字列４０ｂ「ＡＢＥ」に前方一致しないので、検索結果文字列にはなり得ない。
さらに、検索対象文字列１０を検索文字列４０ｃ「ＡＢ」で検索すると、前方一致する検索対象文字列は上と同じ「Ａ」、「ＡＢ」となる。そのうち最長の検索対象文字列は「ＡＢ」であるので、上記と同じ「ＡＢ」が検索結果文字列５０ｂである。
【０００６】
上述の可変長文字列の最長一致検索には、可変長文字列のある長さの前半の部分をプレフィックスとし、後半の部分をサフィックスとして分割し、プレフィックスをインデックスとして検索して絞り込んでからサフィックス部分を照合する手法が存在する。このような手法において、複数の長さのプレフィックスをインデックスとして適当な長さのインデックスを選択可能とすることにより、検索対象である登録パターンの文字列の重複部分の長さにばらつきがある場合にも検索効率を高くしようとする可変長文字列検索装置及び検索方法が提案されている（特許文献１）。
【０００７】
また、検索を高速に行うために、パトリシアツリーと呼ばれるデータ構造を用いることが知られている。パトリシアツリーは２分木の一種であり、エントリをもつ有効ノードと木を分岐させるための中継ノードから構成されている。
パトリシアツリーを用いた検索処理では、必要なビットの検査だけで検索できること、キー全体の比較は１回ですむことなどのメリットがあるが、各ノードから２つのリンクが必ずあることによる記憶容量の増大、バックリンクの存在による判定処理の複雑化、バックリンクにより戻ることで初めてインデックスキーと比較することによる検索処理の遅延及び追加削除等データメンテナンスの困難性などの欠点がある。
【０００８】
そこで本出願人は、パトリシアツリーの欠点を解消し、必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスの容易なカップルドノードツリーと呼ぶデータ構造を備えたビット列検索装置及び検索方法を提案した（特許文献２及び特許文献３）。
特許文献２及び特許文献３に開示されたカップルドノードツリーは、リンク先のデータを有するブランチノードと検索対象であるインデックスキーを有するリーフノードを備える。そしてそのツリー構造は、ルートノードと、隣接した記憶領域に配置されるブランチノードとリーフノード、ブランチノード同士又はリーフノード同士のノード対から構成される。
【０００９】
ブランチノードは、検索キーの弁別ビット位置とリンク先のノード対のうちの一方である代表ノードにリンクするための代表ノード番号を含み、前記リーフノードは検索対象であるビット列からなるインデックスキーを含む。ルートノードは、ツリーのノードがただ１つのときを除いてはブランチノードである。
検索キーの弁別ビット位置は、検索キーのその位置のビット値を用いる点ではパトリシアツリーの検査ビット位置と同様であるが、パトリシアツリーでは検査ビット位置のビット値を判定してリンク先を求めるのに対して、カップルドノードツリーでは弁別ビット位置のビット値をリンク先のノードを求める演算に用いる点で異なる。
【００１０】
検索キーによる検索の実行は、ルートノードを含む各ブランチノードにおいて、該ブランチノードに含まれる弁別ビット位置の検索キーのビット値に応じてリンク先のノード対の一方のノードにリンクすることを順次リーフノードに至るまで繰り返すことにより行われる。
リーフノードに至ると、リーフノードの保持するインデックスキーを取り出す。取り出したインデックスキーと検索キーを比較し、一致すれば検索は成功し、一致しなければ、検索対象のインデックスキーには検索キーと一致するものはなかったので検索は失敗とすることができる。また、単に、取り出したインデックスキーを検索結果キーとすることもできる。
【００１１】
また、本出願人は、カップルドノードツリーのリーフノードが、検索対象であるインデックスキーを直接含むのではなく、インデックスキーの記憶された領域へのポインタである参照ポインタを含むものを提案した（特許文献４）。
なお、以下の説明においては、記載を簡略化するため、リーフノードがインデックスキーに替えて参照ポインタを含むものであっても、インデックスキーを含むリーフノード、リーフノードに含まれるインデックスキーということがある。また、インデックスキーを含むリーフノードを有するカップルドノードツリーについて、インデックスキーが格納されたカップルドノードツリー、あるいはカップルドノードツリーに格納されたインデックスキーのような表現を用いることがある。さらに、リーフノードがインデックスキーを含む場合及びインデックスキーへの参照ポインタを含む場合の双方について、リーフノードに係るインデックスキー、あるいはインデックスキーに係るリーフノードということがある。
【００１２】
図１Ｂに示すのは、特許文献４で提案したカップルドノードツリーを配列に格納する例を説明するものである。ブランチノードが保持するリンク先の位置を示すデータとして、記憶装置のアドレス情報とすることもできるが、ブランチノードあるいはリーフノードのうち占有する領域の記憶容量の大きい方を格納可能な配列要素からなる配列を用いることにより、ノードの位置を配列番号で表すことができ、位置情報の情報量を削減することができる。
【００１３】
図１Ｂを参照すると、ノード１０１が配列１００の配列番号１０の配列要素に配置されている。ノード１０１はノード種別１０２、弁別ビット位置１０３及び代表ノード番号１０４で構成されている。ノード種別１０２の値は“０”であり、これはノード１０１がブランチノードであることを示している。弁別ビット位置１０３にはこの例では“１”が格納されている。代表ノード番号１０４にはリンク先のノード対の代表ノードの配列番号２０が格納されている。なお、以下では表記の簡略化のため、代表ノード番号に格納された配列番号を代表ノード番号ということもある。また、代表ノード番号に格納された配列番号をそのノードに付した符号あるいはノード対に付した符号で表すこともある。
【００１４】
配列番号２０の配列要素には、ノード対１１１の代表ノードであるノード［０］１１２が格納されている。そして隣接する次の配列要素（配列番号２０＋１）に代表ノードと対になるノード［１］１１３が格納されている。ノード［０］１１２はノード１０１と同様にブランチノードである。ノード［０］１１２のノード種別１１４には“０”が、弁別ビット位置１１５にはこの例では“３”が、代表ノード番号１１６にはリンク先のノード対の代表ノードの配列番号３０が格納されている。またノード［１］１１３は、ノード種別１１７と参照ポインタ１１８ａで構成されている。ノード種別１１７には“１”が格納されており、ノード［１］１１３がリーフノードであることを示している。参照ポインタ１１８ａには、検索対象コード列の記憶領域を参照するポインタが格納されている。以下では表記の簡略化のため、参照ポインタに格納されたデータのことも参照ポインタということもある。
【００１５】
なお、代表ノードをノード［０］で表し、それと対になるノードをノード［１］で表すことがある。なお、代表ノードと対になるノードを非代表ノードということがある。また、ある配列番号の配列要素に格納されたノードを、その配列番号のノードということがあり、ノードの格納された配列要素の配列番号を、ノードの配列番号ということもある。
配列番号３０及び３１の配列要素に格納されたノード１２２とノード１２３からなるノード対１２１の内容は省略されている。
【００１６】
ノード［０］１１２、ノード［１］１１３、ノード１２２及びノード１２３の格納された配列要素にそれぞれ付された“０”あるいは“１”は、検索キーで検索を行う場合にノード対のどちらの側のノードにリンクするかを示すものである。“０”の付された側の位置にあるノードを［０］側のノード、“１”の付された側の位置にあるノードを［１］側のノードということがある。また、ノード対のうち“０”の付された側の位置をノード［０］側、“１”の付された側の位置をノード［１］側ということがある。
カップルドノードツリーを用いた検索においては、前段のブランチノードの弁別ビット位置にある検索キーのビット値である“０”か“１”に応じて［０］側のノードあるいは［１］側のノードにリンクする。したがって、前段のブランチノードの代表ノード番号に、検索キーの弁別ビット位置のビット値を加えることにより、リンク先のノードが格納された配列要素の配列番号を求めることができる。
なお、上記の例では代表ノード番号としてノード対の配置された配列番号のうち小さい方を採用しているが、大きいほうを採用することも可能であることは明らかである。
【００１７】
さらに、本出願人は、ドントケアビットを含むビット列からなるインデックスキーを含むカップルドノードツリーを用いたビット列検索方法も提案している（特許文献５）。
【先行技術文献】
【特許文献】
【００１８】
【特許文献１】特開２００５−１６５５９８号公報
【特許文献２】特開２００８−０１５８７２号公報
【特許文献３】特開２００８−１１２２４０号公報
【特許文献４】特開２００８−２６９５０３号公報
【特許文献５】特開２００９−０１５５３０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１９】
カップルドノードツリーを用いたビット列検索は、ツリーに必要とする記憶容量が小さく、検索速度が高速であり、データメンテナンスが容易であるという特徴があるが、可変長文字列あるいは可変長コード列の最長一致検索にカップルドノードツリーを応用した技術は存在しない。
【００２０】
そこで本発明は、可変長コード列の最長一致検索に適用可能なカップルドノードツリーを提供し、カップルドノードツリーが有する本来の特徴を生かした可変長コード列の最長一致検索を実現することを目的としている。
【課題を解決するための手段】
【００２１】
上記目的を達成するために、本発明においては、コード列からなる検索キーを符号化したビット列である符号化検索キーにより、検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定される構造を有するカップルドノードツリーを用いて検索が行われる。
【００２２】
前記カップルドノードツリーは、上述のとおり、検索対象コード列を符号化したビット列であるインデックスキーのビット値により決定される構造を有し、ルートノードと、隣接した記憶領域に配置される代表ノードと非代表ノードである２つのノードを有するツリーの構成要素としてのノード対とを有し、前記ノードは該ノードがブランチノードであるかリーフノードであるかを示すノード種別を格納する領域を有し、前記ブランチノードは、前記ノード種別に加えて、前記符号化検索キーの弁別ビット位置を格納する領域とリンク先のノード対の代表ノードの位置を示す情報を格納する領域を含み、前記リーフノードは、前記ノード種別に加えて、前記検索対象コード列あるいは検索対象コード列の記憶領域を指す参照ポインタを格納する領域を含んでいる。なお、リーフノードが検索対象コード列を含む場合及び検索対象コード列への参照ポインタを含む場合の双方について、リーフノードに係る検索対象コード列、あるいは検索対象コード列に係るリーフノードということがある。
【００２３】
前記符号化検索キーは、前記検索キーであるコード列に含まれる各コードのビット列に対して、識別ビットであって、該識別ビットに後続するコードが有ることを示す識別ビット（以下、有意コード識別ビットということがある。）を先頭に付加し、コード列の末尾に、後続するコードがないことを示す識別ビット（以下、無意コード識別ビットということがある。）を接続したビット列である。また、前記インデックスキーは、検索対象コード列に含まれる各コードのビット列に対して、有意コード識別ビットを先頭に付加し、コード列の末尾に無意コード識別ビットを接続したビット列である。
【００２４】
したがって、長さが０である無意のコードが前期検索キーであるコード列及び検索対象コード列の末尾に存在すると考えると、前記識別ビットは、該識別ビットに後続するコードが有意のコードか無意のコードかを識別するものである。また、識別ビットは、後続するコードの有無を示すものということもできる。
【００２５】
本発明によれば、まず、前記カップルドノードツリーを符号化検索キーにより検索し、検索結果コード列としての検索対象コード列を得るとともに、検索の過程においてたどったブランチノードのうち、その弁別ビット位置の値が、符号化検索キーを構成するビット列のうちいずれかの識別ビットが存在する位置と一致するブランチノード（以下、コード列区切りブランチノードということがある。）の位置を示す情報と、該コード列区切りブランチノードのリンク先のノード対のうち前記弁別ビット位置の値が前記無意コード識別ビットの値であるときにそのノード位置が演算されるノードであるコード列終端側ノードに係る検索対象コード列にアクセスするための情報をスタックに格納する初期検索が実行される。コード列区切りブランチノードのリンク先のノード対を構成するノードを該ブランチノードの子ノード、該リンク元のブランチノードを親ノードと定義すると、スタックには、コード列区切りブランチノードの位置を示す情報が親ノードの位置を示す情報として格納される。また、例えば、コード列区切りブランチノードの子ノードのうち一方のノードの位置を示す情報をコード列終端側ノードに係る検索対象コード列にアクセスするための情報とすると、それは子ノードの位置を示す情報として格納される。コード列区切りブランチノードの定義により、子ノードのうち、［０］側のノードあるいは［１］側の一方のノードはリーフノードである。
【００２６】
次に、検索結果コード列をインデックスキーに符号化し、符号化検索キーと比較することにより、検索結果コード列が最長一致コード列（以下、最長一致キーということがある。）であるか判定し、検索結果コード列が最長一致キーでなければ、スタックからコード列終端側ノードに係る検索対象コード列にアクセスするための情報を読み出して検索対象コード列を探索し、該検索対象コード列から最長一致キーを求める最長一致検索が実行される。
【発明の効果】
【００２７】
本発明によれば、カップルドノードツリーの構造を、検索対象コード列を後続するコードの有無を示す識別ビットとコードに対応するビット列の組み合わせで符号化したインデックスキーにより決定されるものとし、検索キーを検索対象コード列と同様に符号化した符号化検索キーにより検索するとともに、検索の過程でたどった経路をスタックに記憶している。そして、コード列からなる検索キーによる最長一致検索を、符号化検索キーによる検索結果のコード列とスタックに記憶した検索経路の情報によりアクセスする検索対象コード列を探索することで実現することができる。
【図面の簡単な説明】
【００２８】
【図１Ａ】可変長文字列の最長一致検索の例について説明する図である。
【図１Ｂ】カップルドノードツリーを配列に格納する例を説明する図である。
【図２】本発明の一実施形態におけるコード列の符号化方法の一例について説明する図である。
【図３】本発明の一実施形態におけるカップルドノードツリーのツリー構造を概念的に示す図である。
【図４】本発明を実施するためのハードウェア構成例を説明する図である。
【図５】本発明の一実施形態における基本検索処理の処理フロー例を説明する図である。
【図６】本発明の一実施形態におけるコード列検索の処理フロー例を説明する図である。
【図７】本発明の一実施形態における符号化処理の処理フロー例を説明する図である。
【図８Ａ】符号化検索キーによる初期検索の流れを概念的に示す図である。
【図８Ｂ】初期検索の処理フロー例を説明する図である。
【図９Ａ】最長一致検索の流れを概念的に示す図である。
【図９Ｂ】最長一致検索における初段の処理フロー例を説明する図である。
【図９Ｃ】最長一致検索における中段の処理フロー例を説明する図である。
【図９Ｄ】最長一致検索における後段の処理フロー例を説明する図である。
【図１０】探索経路スタックの格納例とインデックスキーの関係を説明する図である。
【図１１Ａ】初期検索で得られたインデックスキーが符号化検索キーに前方一致する場合の最長一致検索の例を概念的に説明する図である。
【図１１Ｂ】初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも短い場合の最長一致検索の例を概念的に説明する図である。
【図１１Ｃ】初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも長い場合の最長一致検索の例を概念的に説明する図である。
【図１２】本発明の一実施形態におけるカップルドノードツリーを生成する処理フロー例を説明する図である。
【図１３Ａ】本発明の一実施形態における挿入処理の前段の処理フロー例を説明する図である。
【図１３Ｂ】本発明の一実施形態における挿入処理の中段の処理フロー例を説明する図である。
【図１３Ｃ】本発明の一実施形態における挿入処理の後段の処理フロー例を説明する図である。
【図１４Ａ】本発明の一実施形態における削除処理の前段の処理フロー例を説明する図である。
【図１４Ｂ】本発明の一実施形態における削除処理の後段の処理フロー例を説明する図である。
【図１５】本発明の一実施形態におけるコード列検索装置の機能ブロック構成例を示す図である。
【発明を実施するための形態】
【００２９】
次に、本発明の実施の形態について詳細に説明する。以下では、コード列の符号化方法の例と、カップルドノードツリーの例を説明してから、検索、挿入、削除の各処理について説明する。なお、以下の説明においては、リーフノードは検索対象コード列が格納された記憶領域を指す参照ポインタを含むものとしているが、リーフノードが検索対象コード列を直接含むものであっても、同様な説明が成り立つことは、当業者に明らかである。
本発明においては、文字に限らず任意の記号や項目などを識別するために用いられるコードからなるコード列を対象とする。そして、本発明においては、コード列そのものを直接取り扱うのではなく、コード列に含まれる各コードを符号化した符号化コードの列を取り扱う。先に述べたように、各コードは、後続するコードが存在するか否かを示す識別ビットと各コードをビット表現した複数のビットを組み合わせることで符号化される。本発明においては、コード列の各コードを符号化した符号化コードの列である符号化コード列により検索等の処理を行う。
【００３０】
図２を参照して、本発明のコード列検索装置、検索方法及びプログラムにおけるコード列の符号化方法の一例について説明する。
図２に示す例では、「Ａ」、「Ｂ」、「Ｃ」、「Ｄ」、「Ｅ」、「Ｆ」及び「Ｇ」の各コード、並びに、コード列の終端を示すコード「＊」の８種類のコードが存在するものとしている。各コードはそれぞれ複数のビットからなるビット列で表現されており、この例では、それぞれ、コード表１３に示される３ビットの値で表現されている。
なお、コード「＊」は、後の説明から理解されるように、先に述べた長さが０である無意のコードと等価なものである。
【００３１】
ここで、コード「Ａ」、「Ｂ」、「Ｅ」、「Ａ」及び「Ｂ」を連結したコード列５０を符号化する場合について説明する。図中５２はコード位置（この例では、Ｐ１〜Ｐ６）である。図示するようにコード列５０は、コード位置Ｐ１にコード「Ａ」、コード位置Ｐ２にコード「Ｂ」、コード位置Ｐ３にコード「Ｃ」、コード位置P４にコード「Ａ」、コード位置Ｐ５にコード「Ｂ」、コード位置Ｐ６にコード列の終端を示すコード「＊」の６個のコードからなる。
前記コード列５０「ＡＢＥＡＢ＊」は、前記コード表１３に記載されたコードのビット値により、図中６０で示すビット表現されたコード列となる。この例では、ビット表現されたコード列６０は、“001 010 101 001 010 000”である。
【００３２】
先に述べたように、コード列の各コードは、後続するコードが存在するか否かを示す識別ビットと各コードをビット表現した複数のビットを組み合わせることで符号化される。図２に示すように、終端を示すコード以外のコード列５０に含まれる各コードは、１ビットの有意コード識別ビット７３ａと各コードのビット値（３ビット）７２からなる４ビットの符号化コード７４に符号化される。図２の例では、有意コード識別ビット７３ａのビット値は“１”である。また、コード列の終端を示すコード「＊」は、終端を示す無意コード識別ビット７３ｂ（値は“０”）に符号化される。
このようにして、前記コード列５０は、１ビットの有意コード識別ビット７３ａと有意の各コードのビット値（３ビット）７２からなる４ビットの符号化コード７４と終端を示す無意コード識別ビット７３ｂから構成される符号化コード列７０に符号化される。以下の説明においては、ビット表現された符号化コード列を符号化ビット列という場合もある。
なお、符号化コード列の長さを示す「符号化ビット長」には、終端を示す無意コード識別ビット７３ｂを含まないものとする。したがって、図２に示すように、コード列５０を符号化した符号化コード列７０の符号化ビット長は２０ビットである。
【００３３】
この符号化方法によれば、符号化前のコード列において後続の有意のコードがあるか否かを、符号化コード列のビット表現から簡単に判断することができる。すなわち、符号化コード列中の第（（コードに対応するビット数（この例では３）＋１）×ｎ）ビット（ｎは０以上の整数）が識別ビットの位置であり、その位置のビット値が“０”であるか“１”であるかによって、後続する有意のコードの有無を判定することができる。
なお、上記においては有意コード識別ビットの値を“１”、無意コード識別ビットの値を“０”としたが、逆にしてもよい。さらに、複数ビットからなる識別ビットを用いるようにしてもよい。
本発明においては、検索対象コード列を上記符号化方法で符号化した符号化ビット列であるインデックスキーの集合によりカップルドノードツリーを構成し、コード列からなる検索キーを上記符号化方法で符号化した符号化ビット列である符号化検索キーを用いて検索等の処理を行う。
【００３４】
次に、本発明の一実施形態におけるカップルドノードツリーの例について説明する。
図３は、カップルドノードツリーのツリー構造を概念的に示す図である。ここでは、検索対象コード列「ＢＥＡＢ＊」、「ＢＡＢ＊」、「ＡＢＥＡＢ＊」、「ＡＢ＊」、「Ａ＊」及び「＊」を符号化したインデックスキーを格納するカップルドノードツリー２００を例にとって説明する。これらのコード列は、前記図１Ａに示した例の各コード列にコード列の終端を示すものとして無意のコード「＊」を付加し、さらにコード列として、コード「＊」のみからなるコード列が加えられている。
ここで、カップルドノードツリー２００が、無意のコード「＊」のみからなるコード列も含むようにしている理由は、後に詳細に説明する最長一致検索において、検索キーに前方一致する検索対象コード列が１つも存在しないことがないようにするためである。
もちろん、検索キーに前方一致する検索対象コード列が１つも存在しないことを許容し、カップルドノードツリー２００が、無意のコード「＊」のみからなるコード列を含まないようにすることも可能である。
カップルドノードツリー２００が、無意のコード「＊」のみからなるコード列も含むようにすることにより、どのような検索キーで検索しても、必ず検索結果キーを得ることができることについては、後の最長一致検索の説明において詳細に説明する。
【００３５】
図中、符号２１０ａで示すのがルートノードである。図示の例では、ルートノード２１０ａは配列番号２２０に配置されたノード対２０１ａの代表ノードとされている。
ツリー構造としては、ルートノード２１０ａの下にノード対２０１ｂが配置され、その下層にノード対２０１ｃが配置され、さらにその下層にノード対２０１ｄとノード対２０１ｆが配置され、ノード対２０１ｄの下層にはノード対２０１ｅが配置されている。
各ノードの前に付された“０”あるいは“１”の符号は、図１Ｂに関して前述した配列要素の前に付された符号と同じである。
【００３６】
図示された例では、ルートノード２１０ａのノード種別２６０ａは“０”でブランチノードであることを示し、弁別ビット位置２３０ａは“０”を示している。代表ノード番号は２２０ａであり、それはノード対２０１ｂの代表ノード２１０ｂの格納された配列要素の配列番号である。
ノード対２０１ｂはノード２１０ｂと２１１ｂで構成されている。ノード２１０ｂのノード種別２６０ｂには“１”が格納されているので、このノードはリーフノードであり、参照ポインタ２５０ｂを含んでいる。参照ポインタ２５０ｂには、コード列の格納領域３１１における、無意のコード「＊」のみからなるコード列２９０ｂが格納されている領域を参照するポインタが格納されている。先に述べたように、参照ポインタ２５０ｂに格納されているポインタも参照ポインタといい、符号２８０ｂで表す。他のリーフノードについても同様に、参照ポインタに格納されたポインタを参照ポインタと呼ぶ。なお、参照ポインタ２５０ｂの近傍に記載された０は参照ポインタ２８０ｂで参照されるコード列を符号化した符号化コード列のビット表現であり、（＊）は、そのビット表現がコード列「＊」のビット表現であることを示している。他のリーフノードにおいても同様である。以下の説明においては、任意のコード列「ＡＢＣ」に対して、そのビット表現を（ＡＢＣ）と表記することがある。
【００３７】
また、ノード２１１ｂのノード種別２６１ｂは“０”であり、このノードがブランチノードであることを示している。ノード２１１ｂの弁別ビット位置２３１ｂには“２”が格納され、リンク先の代表ノード番号にはノード対２０１ｃの代表ノード２１０ｃの格納された配列要素の配列番号２２１ｂが格納されている。
ノード対２０１ｃはノード２１０ｃとノード２１１ｃで構成され、それらのノード種別２６０ｃ、２１６ｃはともに“０”であり、プランチノードであることを示している。ノード２１０ｃの弁別ビット位置２３０ｃは“４”であり、代表ノード番号にはノード対２０１ｄの代表ノード２１０ｄの格納された配列要素の配列番号２２０ｃが格納されている。
ノード２１０ｄのノード種別２６０ｄには“１”が格納されているので、このノードはリーフノードであり、参照ポインタ２５０ｄには、符号２９０ｄで示すコード列「Ａ＊」が格納されている領域を指す参照ポインタ２８０ｄが格納されている。
【００３８】
ノード２１０ｄと対になるノード２１１ｄのノード種別２６１ｄは“０”であり、弁別ビット位置２３１ｄには“８”が格納されている。そして、代表ノード番号には、ノード対２０１ｅの代表ノード２１０ｅの格納された配列要素の配列番号２２１ｄが格納されている。
ノード対２０１ｅはノード２１０ｅとノード２１１ｅで構成され、それらのノード種別２６０ｅ、２６１ｅはともに“１”であり、双方ともリーフノードであることを示している。ノード２１０ｅの参照ポインタ２５０ｅには、符号２９０ｅで示すコード列「ＡＢ＊」が格納されている領域を指す参照ポインタ２８０ｅが格納されており、ノード２１１ｅの参照ポインタ２５１ｅには符号２９１ｅで示すコード列「ＡＢＥＡＢ＊」が格納されている領域を指す参照ポインタ２８１ｅが格納されている。
【００３９】
前記ノード対２０１ｃのもう一方のノードであるノード２１１ｃの弁別ビット位置２３１ｃは“５”であり、代表ノード番号にはノード対２０１ｆの代表ノード２１０ｆの配列要素の配列番号２２１ｃが格納されている。
ノード対２０１ｆはノード２１０ｆとノード２１１ｆで構成され、それらのノード種別２６０ｆ、２６１ｆはともに“１”であり、双方ともリーフノードである。ノード２１０ｆの参照ポインタ２５０ｆには符号２９０ｆで示すコード列「ＢＡＢ＊」が格納されている領域を指す参照ポインタ２８０ｆが格納されており、ノード２１１ｆの参照ポインタ２５１ｆには符号２９１ｆで示すコード列「ＢＥＡＢ＊」が格納されている領域を指す参照ポインタ２８１ｆが格納されている。
【００４０】
次に、カップルドノードツリーの構成の意味について説明する。
図３に示したカップルドノードツリー２００における検索対象コード列と、各検索対象コード列を前記図２に関して説明した符号化方法により符号化した符号化ビット列（インデックスキー）は次の表１のようになる。
【表１】
0005473893.tif 000002
【００４１】
上記表１において、コード列「＊」以外の有意のコード列はその符号化ビット列の０ビット目が“１”であり、コード列「＊」の符号化ビット列は０ビット目の値が“０”となっている。そこで、符号化ビット列の０ビット目の値を判定することにより、コード列「＊」とその他のコード列を弁別することができる。図３において、ルートノード２１０ａの弁別ビット位置２３０ａが“０”であるのは、カップルドノードツリーにコード列「＊」が含まれていることによる。符号化ビット列の０ビット目の値が“０”のときのリンク先であるノード２１０ｂには、コード列「＊」が格納されている領域を指す参照ポインタ２８０ｂが格納されている。
【００４２】
次に、有意のコード列の符号化ビット列をみていくと、符号化ビット列の１ビット目は全て“０”で等しく、２ビット目はコード列「ＢＥＡＢ＊」と「ＢＡＢ＊」については“１”であり、コード列「ＡＢＥＡＢ＊」、「ＡＢ＊」及び「Ａ＊」については“０”である。
符号化ビット列のなかに、２ビット目のビット値が互いに異なるものがあることから、符号化ビット列の０ビット目の値が“１”のときのリンク先であるブランチノード２１１ｂの弁別ビット位置２３１ｂの値は“２”であり、符号化ビット列の２ビット目の値が“０”のときはノード対２０１ｃの代表ノード２１０ｃにリンクし、“１”のときはノード２１１ｃにリンクしている。
上記ブランチノード２１１ｂでの分岐をコード列の観点からみると、該分岐は、検索対象コード列中のコード列には、１番目のコード位置に位置するコードが「Ａ」であるものと「Ｂ」であるものが存在することを反映している。以下の説明において、ブランチノード２１１ｂのように、その弁別ビット位置の値が識別ビットの位置と一致しないブランチノードをコード弁別ブランチノードということがある。なお、上述の例では、コード弁別ブランチノード２１１ｂにおいて、１番目のコードが「Ａ」であるコード列と「Ｂ」であるコード列のように１番目のコードが完全に弁別されて分岐が行われるが、一般には、コード弁別ブランチノードでコードが完全に弁別されて分岐が行われるわけではない。
【００４３】
符号化ビット列の２ビット目の値が“０”のときのリンク先であるノード２１０ｃの弁別ビット位置２３０ｃには“４”が格納されている。これは、上記表１において符号化ビット列の２ビット目が“０”であるコード列「ＡＢＥＡＢ＊」、「ＡＢ＊」及び「Ａ＊」の符号化ビット列の３ビット目以降をみていくと、３ビット目の値はいずれも“１”であるが、４ビット目の値が、コード列「ＡＢＥＡＢ＊」と「ＡＢ＊」は“１”、コード列「Ａ＊」は“０”となっていることに基づいている。すなわち、有意のコードの数が１のコード列と有意のコードの数が２以上のコード列があることに基づいている。そして、符号化ビット列の４ビット目の値が“０”であるときのリンク先であるノード対２０１ｄの代表ノード２１０ｄにはコード列「Ａ＊」が格納されている領域を指す参照ポインタ２８０ｄが格納されている。
【００４４】
また、符号化ビット列の４ビット目が“１”であるときのリンク先であるノード２１１ｄには弁別ビット位置２３１ｄに“８”が格納されている。これは、符号化ビット列の２ビット目が“０”であり、４ビット目が“１”であるコード列「ＡＢＥＡＢ＊」と「ＡＢ＊」の符号化ビット列の５ビット目以降をみていくと、５ビット目から７ビット目は同じ値となっているが、８ビット目が異なっていることによる。すなわち、有意のコードの数が２のコード列と有意のコードの数が３以上のコード列があることが反映されている。
【００４５】
そして、ノード２１１ｄからのリンク先であるノード対２０１ｅの代表ノード２１０ｅ（符号化ビット列の８ビット目が“０”であるときのリンク先）には、コード列「ＡＢ＊」が格納されている領域を指す参照ポインタ２８０ｅが格納されており、８ビット目が“１”であるときのリンク先であるノード２１１ｅにはコード列「ＡＢＥＡＢ＊」が格納されている領域を指す参照ポインタ２８１ｅが格納されている。
【００４６】
前記符号化ビット列の２ビット目が“１”であるときのリンク先であるノード２１１ｃには弁別ビット位置２３１ｃとして“５”が格納されている。これは、符号化ビット列の２ビット目が“１”であるコード列「ＢＥＡＢ＊」と「ＢＡＢ＊」の符号化ビット列の３番目以降のビット列をみていくと、３ビット目と４ビット目は同じであるが、５ビット目が異なる値となっていることによる。そして、５ビット目が“０”であるときのリンク先であるノード２１０ｆにはコード列「ＢＡＢ＊」が格納されている領域を指す参照ポインタ２８０ｆが格納されており、５ビット目が“１”であるときのリンク先であるノード２１１ｆにはコード列「ＢＥＡＢ＊」が格納されている領域を指す参照ポインタ２８１ｆが格納されている。コード識別ブランチノードであるノード２１１ｃにおける分岐は、その下位の検索対象コード列中のコード列には、２番目のコード位置に位置するコードが「Ｅ」であるものと「Ａ」であるものが存在することを反映している。
【００４７】
このように、カップルドノードツリーの構造は、インデックスキー（検索対象コード列を符号化した符号化ビット列）の集合に含まれる各インデックスキーの各ビット位置のビット値により決定される。
すなわち、カップルドノードツリーにインデックスキーの差分情報が登録されているということができる。
そして、インデックスキーの先頭に近いビット位置から順に、互いに異なるビット値となるビット位置ごとに、ビット値が“１”のノードとビット値が“０”のノードに分岐している。また、符号化によりコード列の大小関係が変わることはない。このことから、ノード［１］側とツリーの深さ方向を優先させてリーフノードをたどり、そのリーフノードに格納されている参照ポインタにより参照される検索対象コード列を見ると、検索対象コード列は降順にソートされている。
【００４８】
また、本発明のカップルドノードツリーは、検索対象コード列を符号化した符号化ビット列を格納したものであることから、コード列区切りブランチノードのリンク先のノード［０］はリーフノードであるという特徴を有する。図３に示すカップルドノードツリー２００の例では、コード列区切りブランチノードはルートノード２１０ａ、ノード２１０ｃ、ノード２１１ｄであり、それぞれのリンク先のノード［０］はノード２１０ｂ、ノード２１０ｄ、ノード２１０ｅであって、すべてリーフノードである。その理由は、コード列区切りブランチノードのリンク先のノード［０］以下に配置されるリーフノードに係る符号化ビット列の、該コード列区切りブランチノードの弁別ビット位置に該当するビット位置のビット値は“０”、すなわち符号化ビット列の識別ビットの値は“０”である。したがって、ノード［０］以下に配置されるリーフノードに係る符号化ビット列はただ１つであり、ノード［０］においてそれ以上分岐することはないからである。
さらに、上記ノード［０］に係るコード列は、該ノード［０］と対をなす［１］側の子ノード以下に配置されたリーフノードに係るコード列に前方一致する。
なお、上述のコード列区切りブランチノードの子ノードのうちノード［０］はリーフノードであるという事項は、コード「＊」を“０”と符号化することと対応している。コード「＊」を“１”と符号化すると、コード列区切りブランチノードの子ノードのうちノード［１］がリーフノードとなることは明らかである。そこで、コード列区切りブランチノードの子ノードのうち、後続するコードが存在しないことを示すビット値により分岐するリーフノードをコード列終端側ノードあるいはコード列終端側子ノードといい、それと対をなすノードをコード列連結側ノードあるいはコード列連結側子ノードという。すると、コード列終端側ノードは、リーフノードである。また、コード列終端側ノードに係るコード列は、該コード列終端側ノードと対をなすコード列連結側ノード以下に配置されたリーフノードに係るコード列に前方一致する。さらに、コード列終端側ノードに係るコード列の長さは、該コード列終端側ノードと対をなすコード列連結側ノード以下に配置されたリーフノードに係るコード列の長さより短いことは明らかである。
【００４９】
なお、カップルドノードツリーはそのルートノードの配列番号により識別できることから、カップルドノードツリーの管理はルートノードの配列番号を用いて行うことができる。そこで、カップルドノードツリーの管理手段には、カップルドノードツリーのルートノードの配列番号が登録されているものとする。
【００５０】
図４は、本発明を実施するためのハードウェア構成例を説明する図である。
本発明のコード列検索装置による検索処理及びデータメンテナンスは中央処理装置３０２及びキャッシュメモリ３０３を少なくとも備えたデータ処理装置３０１によりデータ格納装置３０８を用いて実施される。カップルドノードツリーが配置される配列３０９、検索中にたどるノードが格納された配列要素の配列番号を記憶する探索経路スタック３１０及びコード列の格納領域３１１を有するデータ格納装置３０８は、主記憶装置３０５又は外部記憶装置３０６で実現することができ、あるいは通信装置３０７を介して接続された遠方に配置された装置を用いることも可能である。図１Ｂの配列１００は、配列３０９の一例である。
【００５１】
図４の例示では、主記憶装置３０５、外部記憶装置３０６及び通信装置３０７が一本のバス３０４によりデータ処理装置３０１に接続されているが、接続方法はこれに限るものではない。また、主記憶装置３０５をデータ処理装置３０１内のものとすることもできるし、探索経路スタック３１０を中央処理装置３０２内のハードウェアとして実現することも可能である。あるいは、配列３０９又はコード列の格納領域３１１は外部記憶装置３０６に、探索経路スタック３１０を主記憶装置３０５に持つなど、使用可能なハードウェア環境、インデックスキー集合の大きさ等に応じて適宜ハードウェア構成を選択できることは明らかである。
また、特に図示されてはいないが、処理の途中で得られた各種の値を後の処理で用いるためにそれぞれの処理に応じた一時記憶装置が用いられることは当然である。
【００５２】
このようなカップルドノードツリーを用いた基本的な検索処理について、図５を参照して説明する。この図５に例示する基本的な検索処理は、後に図１２、図１３Ａ〜図１３Ｃを参照して説明する挿入処理、及び図１４Ａ〜図１４Ｂを参照して説明する削除処理の中で実行されるものである。そして、図５に例示する処理フローは、先に述べた特許文献４において例示された検索処理の処理フローを変形したものである。なお、処理を実行するときに、配列番号などの各種変数を一時的に記憶する領域を設けて対応する情報を格納して処理を進めていくことが行われるが、それら変数を格納する領域をその変数名で呼ぶことがある。例えば、「配列番号に検索開始ノードの配列番号を設定する。」といったときは、配列番号を格納する領域に検索開始ノードの配列番号を設定する、あるいは、配列番号という名称の変数に検索開始ノードの配列番号を設定することを意味する。
【００５３】
本発明の好ましい一実施形態においては、カップルドノードツリーを検索中にたどる経路を記憶するための手段として、検索中に通過するノードが格納されている配列要素の配列番号を格納するための探索経路スタックが設けられている。図５に示すように、検索処理を開始するにあたって、ステップＳ５０１で、配列番号に検索開始ノードの配列番号を設定する。設定された配列番号に対応する配列要素は、カップルドノードツリーを構成する任意のノードを格納したものである。検索開始ノードの指定は、図５に例示する基本的な検索処理を利用する各種の処理に応じて行われる。
【００５４】
次に、ステップＳ５０２で、ステップＳ５０１で設定された、あるいは後記ステップＳ５０９で得た配列番号を前記探索経路スタックに格納し、ステップＳ５０３で、その配列番号に対応する配列要素を参照すべきノードとして読み出す。そして、ステップＳ５０４で、読み出したノードから、ノード種別を取り出し、ステップＳ５０５で、ノード種別がブランチノードであるか否かを判定する。
ステップＳ５０５の判定において、読み出したノードがブランチノードである場合は、ステップＳ５０６に進み、ノードから弁別ビット位置についての情報を取り出し、更に、ステップＳ５０７で、取り出した弁別ビット位置に対応するビット値を符号化検索キーから取り出す。そして、ステップＳ５０８で、ノードから代表ノード番号を取り出して、ステップＳ５０９で、符号化検索キーから取り出したビット値と代表ノード番号とを加算し、新たな配列番号として、ステップＳ５０２に戻る。
【００５５】
以降、ステップＳ５０５の判定においてリーフノードと判定されてステップＳ５１０に進むまで、ステップＳ５０２からステップＳ５０９までの処理を繰り返す。ステップＳ５１０で、リーフノードから参照ポインタを取り出して、処理を終了する。
このように、リーフノードに到達したときに検索が終了し、検索中に前記リーフノードに至るまでにたどったブランチノードが格納された配列要素の配列番号が順次、探索経路スタックに格納される。
【００５６】
次に、本発明の一実施形態におけるコード列検索処理について、図６のフローチャートを参照して説明する。図６の検索処理では、所望のコード列が検索キーとして設定され、その検索キーを符号化した符号化検索キーによりカップルドノードツリーが検索される。
【００５７】
図６の検索処理は、以下に述べる「最長一致キー」の条件を満たすインデックスキーがカップルドノードツリーに格納されていれば、その最長一致キーに対応する検索結果コード列を得る処理である。もし、最長一致キーの条件を満たすインデックスキーがカップルドノードツリーに格納されていなければ、検索失敗として処理を終了することになるが、後に説明するように、本発明の一実施形態においては、検索対象のコード列にコード「＊」を含めるので、実質的に最長一致キーの条件を満たすインデックスキーがカップルドノードツリーに格納されていなくても、コード「＊」に対応するインデックスキーが形式的な最長一致キーとして得られる。
【００５８】
本実施の形態において最長一致キーとは、検索キーを符号化した符号化検索キーに前方一致するインデックスキーの中で、最長のインデックスキーである。符号化検索キーに前方一致するインデックスキーは、そのインデックスキーの長さの範囲で符号化検索キーと完全に一致している。符号化検索キーと全く同一のインデックスキーは、符号化検索キーと前方一致するインデックスキーの中で最長のインデックスキーであるので、最長一致キーとなる。
【００５９】
図６に示すように、まずステップＳ６０１で、コード列に所望のコード列を検索キーとして設定する。次に、ステップＳ６０２に進み、コード列に設定された検索キーを、前記図２を用いて説明した符号化方法を用いて符号化して符号化コード列を作成し、その符号化コード列の符号化ビット長の情報を得る符号化処理を行う。なお、符号化処理の詳細については図７を参照して後述する。
次にステップＳ６０３において、ステップＳ６０２で作成した符号化コード列を符号化検索キーに設定し、ステップＳ６０２で得た符号化コード列の符号化ビット長を符号化検索キーの符号化ビット長に設定する。
上述のステップＳ６０１とステップＳ６０３の処理は、ステップＳ６０２の符号化処理を図７に示す各種コード列に共通な符号化処理を検索キーに適用するためのものである。図７に示す共通な符号化処理を用いることに替えて、図７に示す処理を検索キーの符号化処理用のもののように特定のコード列の符号化に変更して符号化処理を行うことも可能である。以下の符号化処理の説明においては、そのような場合についても、図７に示す処理フローにより実現されると表記する場合がある。
【００６０】
続いて、ステップＳ６０４で、検索対象のカップルドノードツリーのルートノードを検索開始ノードに設定し、次に、ステップＳ６０５で初期検索処理を実行する。この処理は、カップルドノードツリーのノードを格納する配列を、符号化検索キーにより検索開始ノードから検索し、検索結果としての参照ポインタを得るとともに、検索が終了するまでにたどったコード列区切りブランチノードの配列番号とコード列連結側ノードの配列番号を探索経路スタック３１０に格納する処理である。このステップＳ６０５の処理の詳細については、後に図８Ａ及び図８Ｂを参照して説明する。
【００６１】
次にステップＳ６０６に進み、符号化検索キーにより最長一致キーを得る最長一致検索を実行して処理を終了する。この最長一致検索処理は、前記初期検索処理により検索結果として得られた参照ポインタ及び前記探索経路スタック３１０に格納された配列番号のコード列連結側ノードと対になるコード列終端側ノードに格納されている参照ポインタにより参照されるコード列に対応するインデックスキーの中から、符号化検索キーに最も長く前方一致するインデックスキー、すなわち、最長一致キーを求める処理である。ステップＳ６０６の処理の詳細については、後に図９Ａ〜図９Ｄを参照して説明する。
【００６２】
図７は、本発明の一実施形態における符号化の処理フロー例を説明する図である。本発明の一実施形態における符号化処理では、設定されたコード列を図２に例示したように符号化して符号化コード列を生成するとともに符号化ビット長を設定する。
この符号化処理は、図６のステップＳ６０２及び後に説明する図９ＢのステップＳ９０２において実行される処理である。
【００６３】
まず、ステップＳ７０１において、コードビット長にコード列に設定された各コードのビット長（前記図２に示した例においては、“３”）を設定する。
次に、ステップＳ７０２に進み、コード列中のコードのうち次に処理すべきコードの位置を示すコード位置を初期化する。本実施の形態では第０番目のコードから順に処理するために、コード位置を“０”に初期化する。
そして、ステップＳ７０３において、この符号化処理により生成される符号化コード列の符号化コードが格納される符号化コードの格納位置を初期値にセットする。
【００６４】
続いて、ステップＳ７０４において、コード位置はコードの終端か否か、すなわち、コード位置の指すコードがコード列の終端を示すコード「＊」であるか否かを判定し、コード列の終端を示すコード「＊」でないときはステップＳ７０５へ進み、「＊」であるときはステップＳ７０９へ進む。
【００６５】
ステップＳ７０５では、コード列からコード位置の指すコードに対応するビット値を取り出す。
そして、ステップＳ７０６ａで、符号化コードに、後続するコードが存在することを示す識別ビット（この例では、“１”）を設定する。
次に、ステップＳ７０６ｂで、該符号化コードの末尾に前記ステップＳ７０５で得たコードのビット値を連結する。
続いて、ステップＳ７０７で、符号化コード列の符号化コードの格納位置の指す位置に、ステップＳ７０６ｂでビット値が連結された符号化コードを格納する。
そして、ステップＳ７０８ａでコード位置を次のコード位置に進め、ステップＳ７０８ｂで符号化コードの格納位置を次の符号化コードの格納位置に進めて、前記ステップＳ７０４に戻る。図２に示す例では、次の符号化コードの格納位置は、識別ビット分の１ビットとコードのビット長分の３ビットの和である４ビット分進められる。
【００６６】
ステップＳ７０４でコード位置がコード列の終端であると判定されたときは、ステップＳ７０９に進み、符号化コード列の符号化コードの格納位置の指す位置に、終端を示す識別ビット（この例では、“０”）を格納する。
そして、ステップＳ７１０で符号化ビット長に符号化コードの格納位置を設定して、処理を終了する。
以上の処理により、設定されたコード列から前記図２に示した符号化方法により符号化された符号化コード列と、その符号化ビット長を得ることができる。
【００６７】
なお、先に述べたように、図７に示す符号化処理は、各種コード列に共通な符号化処理であり、一時記憶領域であるコード列に設定された検索キーなどのコード列を符号化して符号化コード列に設定するものである。しかし、図７に示す処理フローの一時記憶領域であるコード列及び符号化コード列を符号化しようとする特定のコード列のものとすることにより、該特定のコード列を符号化できることは明らかである。後に説明する挿入処理における挿入コード列及び符号化挿入キー、削除処理における削除コード列及び符号化削除キーはその一例である。
また、本実施の形態では、図７に例示するようにコード列を構成する全てのコードを一括して符号化しているが、検索キーであるコード列が検索対象コード列に比べて長いものである場合には、検索処理において、探索経路上のブランチノードの弁別ビット位置の範囲までのコードを逐次符号化してもよい。
【００６８】
次に、図８Ａ及び図８Ｂを参照して、本発明の一実施形態における初期検索について説明する。
図８Ａは、符号化検索キーによる初期検索の流れを概念的に示す図である。図８Ａには、符号化検索キー２７０と図３に示すカップルドノードツリー２００の一部と探索経路スタック３１０が記載されている。
符号化検索キー２７０には、検索キー「ＡＣＥ＊」を符号化した符号化検索キー（ＡＣＥ＊）である符号化ビット列
“1001101111010”（以下、符号化検索キー７０ということもある。）が格納されている。
カップルドノードツリー２００のノード２１１ｃより下位の部分は省略され、符号化検索キー７０でルートノード２１０ａから初期検索を行ったときの探索経路が太線の枠と矢印で示されている。
【００６９】
初期検索においては、まず検索開始ノードとして配列番号２２０のルートノード２１０ａが設定される。ルートノード２１０ａの弁別ビット位置２３０ａの値は“０”、符号化検索キー７０のビット位置０のビット値は“１”であるので、ノード対２０１ｂの［１］側のノードであるノード２１１ｂにリンクする。また、ルートノード２１０ａの弁別ビット位置２３０ａの値“０”は、符号化ビット列７０の識別ビットが存在するビット位置、０、４，８、・・・  の一つに一致する、すなわちルートノードはコード列区切りブランチノードであるので、探索経路スタック３１０に、ルートノード２１０ａ（親ノード）の配列番号２２０と、ルートノード２１０ａの子ノードのうちコード列連結側ノードである［１］側のノード２１１ｂの配列番号２２０ａ＋１が探索経路スタック３１０に格納される。
【００７０】
次に、ノード２１１ｂの弁別ビット位置２３１ｂの値は“２”、符号化検索キー７０のビット位置２のビット値は“０”であるので、ノード対２０１ｃの［０］側のノードであるノード２１０ｃにリンクする。ノード２１１ｂの弁別ビット位置２３１ｂの値“２”は、符号化ビット列７０の識別ビットが存在するビット位置と一致しないので、ここではノードの配列番号の探索経路スタック３１０への格納は行われない。
【００７１】
次に、ノード２１０ｃの弁別ビット位置２３０ｃの値は“４”、符号化検索キー７０のビット位置４のビット値は“１”であるので、ノード対２０１ｄの［１］側のノードであるノード２１１ｄにリンクする。ノード２１０ｃの弁別ビット位置２３０ｃの値“４”は、符号化ビット列７０の識別ビットが存在するビット位置と一致するので、ノード２１０ｃは先に述べたコード列区切りブランチノードである。したがって、ノードノード２１０ｃ（親ノード）の配列番号２２１ｂと、ノード２１０ｃの子ノードのうち［１］側のノード２１１ｄの配列番号２２０ｃ＋１が探索経路スタック３１０に格納される。
【００７２】
次に、ノード２１１ｄの弁別ビット位置２３１ｄの値は“８”、符号化検索キー７０のビット位置８のビット値は“１”であるので、ノード対２０１ｅの［１］側のノードであるノード２１１ｅにリンクする。ノード２１１ｄは、コード列区切りブランチノードであるので、ノード２１１ｄ（親ノード）の配列番号２２０ｃ＋１と、ノード２１１ｄの子ノードのうち［１］側のノード２１１ｅの配列番号２２１ｄ＋１が探索経路スタック３１０に格納される。
【００７３】
ノード２１１ｅのノード種別２６１ｅの値は“１”であり、ノード２１１ｅがリーフノードであることを示している。そこで、参照ポインタ２５１ｅに格納されている参照ポインタ２８１ｅを取り出すことにより、初期検索が完了する。図に示すように、参照ポインタ２８１ｅの指す記憶領域には、コード列「ＡＢＥＡＢ＊」が格納されている。コード列「ＡＢＥＡＢ＊」を符号化した符号化コード列のビット表現は、“1001101011011…”となる。
【００７４】
上述の初期検索において、コード列区切りブランチノード（親ノード）の配列番号と該ブランチノードの子ノードのうちコード列連結側ノードの配列番号を探索経路スタック３１０に格納するのは、次の最長一致検索において、初期検索においてたどったコード列区切りブランチノードのコード列終端側子ノード（先に述べたようにリーフノードである。）を探索し、その参照ポインタの指すコード列を読み出すためである。
【００７５】
図８Ａに示す初期検索の例では、コード列終端側ノードは、カップルドノードツリー２００の下位の階層の側から、ノード２１０ｅ、ノード２１０ｄ、ノード２１０ｂである。［０］側のノードと［１］側のノードは隣接した記憶領域に配置されているので、探索経路スタックに格納されたコード列連結側ノードの配列番号により、コード列終端側ノードの配列番号を得ることができる。勿論、コード列連結側ノードの配列番号に替えて、コード列終端側ノードの配列番号を探索経路スタックに格納することにより、直接コード列終端側ノードの配列番号を得ることもできる。
【００７６】
また、コード列連結側ノードあるいはコード列終端側ノードの配列番号に替えて、リーフノードであるコード列終端側ノード自体を格納することも、参照ポインタあるいは該リーフノードに係るコード列を格納することも可能である。要するに、親ノードに関する情報とともに、コード列終端側子ノードに係るコード列にアクセスするための情報を格納すればよい。
【００７７】
次に初期検索の処理フローについて説明する。
図８Ｂは、前記図６のステップＳ６０５の処理の詳細を示すものであり、符号化検索キーによる初期検索の処理フロー例を説明する図である。
まず、ステップＳ８０１において、探索経路スタック３１０のスタックポインタの値を初期値に設定する。この初期値は、探索経路スタック３１０に何も格納されていないときの値である。本実施の形態の図８Ｂの処理におけるスタックポインタは、後述のステップＳ８１３において次の配列番号を格納する探索経路スタック３１０上の位置を示すものとして以下では説明する。
【００７８】
続いてステップＳ８０２で、配列番号に、検索開始ノードの配列番号を設定する。図８Ｂの処理が実行されるのは、図６のステップＳ６０４が実行された後なので、ステップＳ８０２では具体的にはルートノードの配列番号が設定される。
次に、ステップＳ８０３で、カップルドノードツリーのノードを格納する配列から、配列番号の指す配列要素をノードとして読み出す。
そして、ステップＳ８０４で、ステップＳ８０３で読み出したノードからノード種別の情報を取り出し、ステップＳ８０５で、そのノードがブランチノードであるか否かを判定する。
【００７９】
ステップＳ８０５の判定において、読み出したノードがブランチノード（ノード種別が“０”）である場合は、ステップＳ８０６に進み、そのノードから弁別ビット位置の情報を取り出す。
そして、ステップＳ８０７で、取り出した弁別ビット位置に対応するビット値を符号化検索キーから取り出し、ステップＳ８０８で、そのノードから代表ノード番号の情報を取り出す。
【００８０】
続いてステップＳ８１１で、ステップＳ８０６で取り出した弁別ビット位置が符号化ビット列の識別ビットの存在するいずれかの位置と一致するか否かを判定する。この判定は、先に述べた表記によれば、ステップＳ８０３で読み出したノードがコード列区切りブランチノードであるかを判定するものである。
なお、前述のように、識別ビットの位置は符号化方法に依存する。前記図２に示した例のように固定長コードの場合には、計算等により識別ビットの位置を求めることができるが、可変長コードの場合には、弁別ビット位置により識別ビットと可変長コードの位置をマップしたビットマップを索引する方法などを用いても良い。
【００８１】
ステップＳ８１１の判定の結果、弁別ビット位置が識別ビットの位置である場合は、符号化検索キーに後続するビット（有意のコードに対応するビット）が含まれるか否かの判定のためにステップＳ８１２に進み、ステップＳ８０７で取り出した識別ビットのビット値が“１”であるか否かを判定する。
【００８２】
識別ビットのビット値が“１”の場合、符号化検索キーには、弁別ビット位置より下位のビット位置に有意のコードに対応する値を有するビットが存在することを示している。
この場合は、ステップＳ８１３に進んで、ステップＳ８０３で読み出したノードの配列番号を親ノードの配列番号として探索経路スタック３１０に格納する。
続いてステップＳ８１４で、ステップＳ８０８で取り出した代表ノード番号に１を加えた値を新たな配列番号として設定する。
そして、ステップＳ８１５で、ステップＳ８１４で得た配列番号を子ノードの配列番号として探索経路スタック３１０に格納し、スタックポインタの値を１つ増やしてから、ステップＳ８０３に戻る。
【００８３】
なおここで「１つ増やす」という表現は、図８Ａの例示のように探索経路スタック３１０を２列に分けて図示する説明に合わせた表現であり、具体的な探索経路スタック３１０及びスタックポインタの実装方法を限定する趣旨のものではない。
すなわち、本実施の形態における探索経路スタック３１０には、スタックポインタの一つの値により指定される記憶場所に、コード列区切りブランチノードの配列番号と、そのコード列区切りブランチノードの子ノードのうちコード列連結側ノードの配列番号の２つの配列番号からなる組が格納される。
【００８４】
ステップＳ８１５の処理については、ステップＳ８１４で得た配列番号に替えて、ステップＳ８０８で取り出した代表ノード番号を子ノードの配列番号として探索経路スタック３１０に格納する、すなわち先に述べたようにコード列終端側ノードの配列番号を子ノードの配列番号として探索経路スタック３１０に格納する実施の形態も可能である。
また、コード列終端側ノード自体、あるいはコード列終端側ノードから取り出した参照ポインタあるいは参照ポインタの指すコード列を探索経路スタック３１０に格納する実施の形態も可能である。
いずれにしろ、ステップＳ８１５の処理は、コード列終端側ノードに係る検索対象コード列にアクセスするための情報を探索経路スタックに格納する処理ということができる。
【００８５】
一方、ステップＳ８１１で弁別ビット位置が識別ビットの位置でないと判定された場合、及び、ステップＳ８１１で弁別ビット位置が識別ビットの位置であると判定されたがステップＳ８１２で弁別ビット位置の識別ビットの値が“０”と判定された場合は、いずれもステップＳ８０９に進み、ステップＳ８０７で符号化検索キーから取り出したビット値を、ステップＳ８０８で取り出した代表ノード番号に加算し、その加算の結果を新たな配列番号として設定してステップＳ８０３に戻る。
以降、ステップＳ８０５の判定においてリーフノードと判定されるまで、ステップＳ８０３からステップＳ８１５までのループ処理を繰り返す。このループ処理においては、ステップＳ８０９又はステップＳ８１４で設定された配列番号がステップＳ８０３で使われる。
【００８６】
ステップＳ８０５おいて、ステップＳ８０３で読み出したノードがブランチノードでない、すなわち、リーフノード（ノード種別が“１”）であると判定された場合は、ステップＳ８１０に進み、そのリーフノードに含まれている参照ポインタを取り出して処理を終了する。
【００８７】
以上のように、本実施の形態の初期検索によれば、符号化検索キーによりカップルドノードツリーをリーフノードに到達するまで検索し、該リーフノードに格納されている参照ポインタを読み出すとともに、検索中にたどったコード区切ブランチノードの配列番号とそのコード列連結側子ノードの配列番号を順次探索経路スタック３１０に格納する。
【００８８】
次に、図９Ａ〜図９Ｄを参照して本発明の一実施形態に係る最長一致検索について説明する。
図９Ａは最長一致検索の処理の流れを概念的に示す図である。図９Ａには、図８Ａと同様にカップルドノードツリー２００、符号化検索キー２７０及び探索経路スタック３１０が記載されており、図８Ａに例示する初期検索が終了した後の最長一致検索の流れが概念的に示されている。
【００８９】
図９Ａに示すように、符号化検索キー２７０には、図８Ａに示す符号化検索キーと同一のビット列である、検索キー「ＡＣＥ＊」を符号化した符号化検索キー７０が格納されている。探索経路スタック３１０には、図８Ａと同一のコード区切ブランチノードの配列番号とコード列連結側ノードの配列番号が格納されている。しかし、太線の矢印で示すスタックポインタは、初期検索終了時の位置から１つ戻ったノード２１０ｃに係る配列番号を指している。
【００９０】
カップルドノードツリー２００については、図８Ａに示すものと同様に、ノード２１１ｃより下位の部分は省略されている。初期検索においてノード２１１ｅに到達したこと、ノード２１１ｅからの差分ビット位置探索によりコード区切ブランチノードであるブランチノード２１０ｃに至り、ブランチノード２１０ｃのコード列終端側ノードであるリーフノード２１０ｄに係るインデックスキーが最長一致キーとして決定される探索経路が太線の枠と矢印で示されている。
【００９１】
最長一致検索においては、まず初期検索で得られた検索対象コード列「ＡＢＥＡＢ＊」を符号化したインデックスキー（ＡＢＥＡＢ＊）と符号化検索キー（ＡＣＥ＊）の符号化ビット長が比較される。上記の例においてはインデックスキー（ＡＢＥＡＢ＊）の符号化ビット長は２０、符号化検索キー（ＡＣＥ＊）の符号化ビット長は１２である。したがって、インデックスキーの符号化ビット長が符号化検索キーの符号化ビット長より長いので、コード列「ＡＢＥＡＢ＊」は検索キー「ＡＣＥ＊」に前方一致しない。
【００９２】
そこで、次に探索経路スタック３１０から初期検索終了時にスタックポインタが指しているノード［１］側の子ノードの配列番号２２１ｄ＋１を取り出し、それからノード［０］側の子ノード、すなわちコード列終端側子ノード２１０ｅの配列番号２２１ｄを求めてノード２１０ｅを読み出す。そして、ノード２１０ｅから参照ポインタを介してコード列「ＡＢ＊」を読み出し、それを符号化した（ＡＢ＊）を新たなインデックスキーとしてその符号化ビット長を符号化検索キー（ＡＣＥ＊）の符号化ビット長と比較する。
【００９３】
すると、インデックスキー（ＡＢ＊）の符号化ビット長は８であって符号化検索キー（ＡＣＥ＊）の符号化ビット長１２より短いので、以後、インデックスキーと符号化検索キーの差分ビット位置と、インデックスキーに係るコード列終端側子ノードの親ノードの弁別ビット位置との相対的位置関係によりコード列終端側子ノードを特定し、その特定されたコード列終端側子ノードの参照ポインタの指すコード列を最長一致キーとする。
すなわち、探索経路スタックから順次親ノードの配列番号を読み出して該配列番号の指す配列要素に配置されたコード列区切りブランチノードから弁別ビット位置を取り出す。そして、該弁別ビット位置が上記差分ビット位置と等しいかあるいは上位の位置関係であれば、該コード列区切りブランチノードのコード列終端側子ノードの参照ポインタの指すコード列を最長一致キーとする。
図９Ａの太線の矢印で示す弁別ビット位置探索は、上述の差分ビット位置と等しいかあるいは上位の位置関係にある弁別ビット位置を探索する処理の流れを示すものである。
また、図９Ａの太線の矢印で示す最長一致キー決定は、弁別ビット位置が差分ビット位置と上述の位置関係にあるコード列区切りブランチノードのコード列終端側子ノードの参照ポインタの指すコード列を最長一致キーとする処理の流れを示すものである。
【００９４】
図９Ａに示す例では、インデックスキー（ＡＢ＊）と符号化検索キー（ＡＣＥ＊）の差  分ビット位置は７であり、探索経路スタック３１０から最初に読み出される親ノードの配列番号である配列番号２２０ｃ＋１はブランチノード２１１ｄの配列番号である。ブランチノード２１１ｄの弁別ビット位置２３１ｄの値は８であり、差分ビット位置７より下位の位置関係にあるので、探索経路スタック３１０より次の親ノードの配列番号として配列番号２２１ｂが読み出される。配列番号２２１ｂな指す配列要素に配置されたブランチノード２１０ｃの弁別ビット位置２３０ｃの値は４であり、差分ビット位置７より上位の位置関係にあるので、ブランチノード２１０ｃのコード列終端側子ノード２１０ｄの参照ポインタ２８０ｄの指すコード列「Ａ＊」が最長一致キーである。
【００９５】
次に、上述の手法により求められた最長一致キーが、検索対象コード列のうち検索キーに前方一致する最長のコード列であることを説明する。
最初に、以下の説明のため、用語の定義を行う。
初期検索において、探索経路スタックに、親ノードの配列番号として格納された配列番号のコード列区切ブランチノードのコード列終端側子ノードに係るコード列を、初期検索の探索経路のコード列という。図８Ａに示す例では、初期検索の探索経路のコード列は、「＊」、「Ａ＊」「ＡＢ＊」である。
【００９６】
すると、先に述べたように、初期検索の探索経路のコード列は、該コード列に係るコード列終端側子ノードと対をなすコード列連結側子ノード以下の階層に配置されたリーフノードに係るコード列に前方一致する。また、初期検索の探索経路のコード列の長さは、該コード列に係るコード列終端側子ノードと対をなすコード列連結側子ノード以下の階層に配置されたリーフノードに係るコード列の長さより短い。
【００９７】
もし、初期検索の検索結果キーが検索キーに前方一致すれば、初期検索の探索経路のコード列は、検索結果キーに前方一致するので、検索キーに前方一致するが、それらの長さは、検索結果キーの長さ以下である。そして、本願発明に係るカップルドノードツリーの特徴により、初期検索の探索経路のコード列以外に、検索キーに前方一致するコード列はカップルドノードツリーに格納されていない。したがって、初期検索の検索結果キーが検索キーに前方一致すれば、該検索結果キーは、最長一致キーである。
【００９８】
次に、初期検索の検索結果キーが検索キーに前方一致せず、かつ、カップルドノードツリーに検索キーに前方一致するコード列が格納されているならば、そのコード列は初期検索の探索経路のコード列に含まれる。したがって、探索経路のコード列のうち検索キーに前方一致するコード列の最長のものが最長一致キーである。
以上のとおりであるから、上述の手法により求められた最長一致キーが、検索対象コード列のうち検索キーに前方一致する最長のコード列である。
【００９９】
次に、初期検索の結果に基づいて最長一致キーを求める最長一致検索の処理フローについて、図６のステップＳ６０６の処理の詳細を示す図９Ｂ〜図９Ｄを参照して説明する。
図９Ｂは、最長一致検索の初段の処理フロー例を説明する図である。図９Ｂに示す初段の処理の内容は、インデックスキーを初期検索の検索結果コード列を符号化したものから符号化ビット長の短いものに順次更新し、該インデックスキーの符号化ビット長を符号化検索キーの符号化ビット長以下のものとすることにより、符号化検索キーに前方一致することのないインデックスキーを図９Ｃ以下の処理で扱わないようにするものである。
【０１００】
図９Ｂに示すように、まずステップＳ９０１で、コード列の格納領域から、参照ポインタの指すコード列を読み出し、コード列に設定する。参照ポインタは、ステップＳ９０１の最初の処理においては、図６に示すステップＳ６０５の初期検索で得られたものである。図８Ａ及び図９Ａの例示では、参照ポインタ２８１ｅが得られ、コード列「ＡＢＥＡＢ＊」が読み出される。
【０１０１】
次に、ステップＳ９０２に進み、ステップＳ９０１で設定されたコード列を、図２を用いて説明した符号化方法を用いて符号化して符号化コード列を作成し、その符号化コード列の符号化ビット長の情報を得る符号化処理を行う。符号化処理の詳細は図７を参照して説明したものである。
【０１０２】
次にステップＳ９０３において、ステップＳ９０２で作成した符号化コード列をインデックスキーに設定するとともに、ステップＳ９０２で得た符号化コード列の符号化ビット長をインデックスキーの符号化ビット長に設定する。図９Ａの例示では、ステップＳ９０２とステップＳ９０３の最初の処理において、インデックスキーには（ＡＢＥＡＢ＊）、すなわち“100110101101100110100”が、インデックスキーの符号化ビット長には２０が設定される。
上述のステップＳ９０１とステップＳ９０３の処理は、図６におけるステップＳ６０１とステップＳ６０３の処理と同様に、ステップＳ９０２の符号化処理を図７に示す各種コード列に共通な符号化処理を検索キーに適用するためのものである。図６の場合と同様に、図７に示す共通な符号化処理を用いることに替えて、図７に示す処理をインデックスキーの符号化処理用のもののように特定のコード列の符号化に変更して符号化処理を行うことも可能である。
なお、ステップＳ９０１の最初の処理で設定されたコード列を初期検索の検索結果コード列ということがある。また、ステップＳ９０２とステップＳ９０３の最初の処理において設定されるインデックスキーを、初期検索で得られたインデックスキーということがある。
【０１０３】
次にステップＳ９０４において、インデックスキーの符号化ビット長は符号化検索キーの符号化ビット長以下であるか判定する。ここで、符号化検索キーの符号化ビット長は、図６に示すステップＳ６０３で設定したものである。図９Ａの例示では、符号化検索キーである（ＡＣＥ＊）の符号化ビット長は１２である。
インデックスキーの符号化ビット長が符号化検索キーの符号化ビット長以下でなければ、すなわち符号化前の検索対象コード列のコード数が検索キーのコード数より大きければ、その検索対象コード列が検索キーに前方一致することはない。
そこでステップＳ９０４の判定が否定的なものであると、ステップＳ９０５〜ステップＳ９０９の処理を行ってステップＳ９０１に戻り、初期検索の探索経路のコード列に順次アクセスすることを、ステップＳ９０４での判定が肯定的になるまで繰り返す。
【０１０４】
ステップＳ９０５では、探索経路スタックからスタックポインタの指す子ノードの配列番号を読み出し、ステップＳ９０６で、探索経路スタックのスタックポインタを１つ戻す。
次に、ステップＳ９０７で、前記読み出した子ノードの配列番号と対をなす配列番号を得る。そしてステップＳ９０８に進み、カップルドノードツリーのノードを格納する配列から、ステップＳ９０７で得た配列番号の指す配列要素をノードとして読み出す。
続いて、ステップＳ９０９で、ステップＳ９０８で読み出したノードから参照ポインタを取り出して、ステップＳ９０１に戻る。ステップＳ９０１の２回目以降の処理においては、参照ポインタは、ステップＳ９０９で取り出されたものである。
【０１０５】
初期検索において、子ノードの配列番号としてコード列終端側ノードの配列番号を探索経路スタックに格納する場合には、上記ステップＳ９０７は必要なく、ステップＳ９０８では、ステップＳ９０５で得た配列番号の指す配列要素をノードとして読み出すことになる。
また、初期検索において、コード列終端側ノードを探索経路スタックに格納する場合には、ステップＳ９０５において、探索経路スタックからスタックポインタの指すコード列終端側ノードを読み出し、ステップＳ９０７〜ステップＳ９０８をスキップし、ステップＳ９０９において、ステップＳ９０５で読み出したコード列終端側ノードから参照ポインタを取り出して、ステップＳ９０１に戻ることになる。
さらに初期検索において、探索経路スタックに参照ポインタが格納される場合、あるいは検索対象コード列が格納される場合に図９Ｂの処理フローをどのように変更すればよいかは以上の説明から当業者に明らかである。
【０１０６】
上記ステップＳ９０１〜ステップＳ９０９のループ処理においてステップＳ９０４での判定が肯定的なものになると、図９Ｃに示すステップＳ９１０に移行する。
図９Ａの例示では、ステップＳ９０４の最初の判定時にはインデックスキーの符号化ビット長は２０であり、符号化検索キーの符号化ビット長は１２であるから、判定は否定的となる。したがって、ステップＳ９０５〜ステップＳ９０９及びステップＳ９０１の処理により初期検索の探索経路上のコード列「ＡＢ＊」が読み出される。そのコード列を符号化したインデックスキー（ＡＢ＊）の符号化ビット長は８であるから、２回目のステップＳ９０４における判定は肯定的なものになり、図９ＣのステップＳ９１０に進む。探索経路スタック３１０のスタックポインタは、ステップＳ９０６の処理により、配列番号２２１ｂを指している。
【０１０７】
図９Ｃは、最長一致検索における中段の処理フロー例を説明する図である。図９Ｃに示す中段の処理の内容は、図９Ｂに示す初段の処理においてその符号化ビット長が符号化検索キーの符号化ビット長以下であると判定されたインデックスキーの符号化ビット長の範囲の符号化検索キーとインデックスキーのビット列を比較し、等しければインデックスキーに符号化されたコード列を最長一致キーとし、等しくなければ上記符号化ビット長の範囲での符号化検索キーとインデックスキーの差分ビット位置を求めるものである。
【０１０８】
図９Ｃに示すように、まずステップＳ９１０において、インデックスキーの符号化ビット長を比較ビット長に設定する。図９Ａに示す例では、ステップＳ９１０の処理においては、比較イット長にインデックスキー（ＡＢ＊）の符号化ビット長である８が設定される。
そして、ステップＳ９１１で、符号化検索キーとインデックスキーのビット値が、前記比較ビット長の範囲において等しいか否かを判定する。これは、検索キーと検索結果コード列が検索結果コード列の長さの範囲で一致するか否かを判定することに相当する。この判定の結果、符号化検索キーとインデックスキーが比較ビット長の範囲、すなわちインデックスキーの符号化ビット長の範囲で一致している場合（前方一致）は、ステップＳ９１１ａに進み、そのインデックスキーに符号化されたコード列を検索結果コード列に設定して処理を終了する。この検索結果コード列が検索キーに最長一致するコード列である。
【０１０９】
一方、ステップＳ９１１の判定の結果、符号化検索キーとインデックスキーが比較ビット長の範囲で一致していないときは、ステップＳ９１２に進む。
ステップＳ９１２では、符号化検索キーとインデックスキーを比較ビット長の範囲でビット比較して、比較ビット長の差分ビット列を得る。差分ビット列は、例えば、符号化検索キーとインデックスキーで値が一致する位置のビットは値が“０”で、一致しない位置のビットは値が“１”となるビット列であり、例えば符号化検索キーとインデックスキーの排他的論理和演算によって得ることができる。
【０１１０】
続いて、ステップＳ９１２ａで、差分ビット列における最上位の位置、すなわち０ビット目からみて最初の不一致ビットのビット位置を、差分ビット位置に設定して図９Ｄに示すステップＳ９１３以降の処理に進む。ステップＳ９１２ａの処理は、例えばプライオリティエンコーダを有するＣＰＵではそこに差分ビット列を入力し、不一致のビット位置を得ること、あるいは、ソフト的にプライオリティエンコーダと同等の処理を行い最初の不一致ビットのビット位置を得ることなどにより行うことができる。
【０１１１】
図９Ａに示す例では、符号化検索キー（ＡＣＥ＊）の比較ビット長８の指すビット列のビット値は（ＡＣ）であり、インデックスキー（ＡＢ＊）の比較ビット長８の指すビット列のビット値は（ＡＢ）であるから、ステップＳ９１１の判定処理は否定的なものになる。
そして、差分ビット位置には、“７”が設定される。
【０１１２】
図９Ｄは、最長一致検索における後段の処理フロー例を説明する図である。図９Ｄに示す後段の処理の内容は、図９Ｃに示す中段の処理において求めた差分ビット位置と探索経路スタックにその配列番号が格納されたコード列区切りブランチノードの弁別ビット位置の相対的位置関係により最長一致キーを求めるものである。
図に示すように、ステップＳ９１３において、探索経路スタックから配列番号を取り出して、スタックポインタを１つ戻す。そして、ステップＳ９１４で、配列から配列番号の指す配列要素をノードとして読み出し、ステップＳ９１５において、該ノードから弁別ビット位置を取り出す。
【０１１３】
次にステップＳ９１６において、該取り出した弁別ビット位置が、ステップＳ９１２ａで設定した差分ビット位置よりも上位の位置関係にあるか否かを判定する。そして、弁別ビット位置が差分ビット位置よりも上位の場合はステップＳ９１６ａに進み、そうでない場合はステップＳ９１２に戻る。すなわち、探索経路スタック３１０から取り出した配列番号のノードに含まれる弁別ビット位置が差分ビット位置より上位の位置でないときは、弁別ビット位置が差分ビット位置よりも上位の位置であるノードが読み出されるまで探索経路スタックを遡って配列番号を取り出すループ処理が実行される。このループ処理が、図９Ａに例示する差分ビット位置探索に相当する。
【０１１４】
図９Ａの例示では、先のステップＳ９０６の処理により探索経路スタック３１０のスタックポインタは配列番号２２１ｂを指しているので、ステップＳ９１４ではブランチノード２１０ｃが読み出され、ステップＳ９１５では弁別ビット位置“４”が取り出される。取り出した弁別ビット位置“４”は、ステップＳ９１２ａで設定した差分ビット位置“７”よりも上位にあるので、ステップＳ９１６の判定結果は「はい」となり、ステップＳ９１６ａに進む。
【０１１５】
ステップＳ９１６ａでは、ステップＳ９１３で戻されていた探索経路スタックのスタックポインタを１つ進めることで１つ前の状態に戻し、ステップＳ９１７で、探索経路スタックのスタックポインタの指す子ノードの配列番号を読み出す。
次に、ステップＳ９１８で、該子ノードの配列番号と対をなすノードの配列番号を得て、ステップＳ９１９で、該対をなすノードの配列番号の指すノードを読み出す。
そして、ステップＳ９２０で、該ノードから参照ポインタを取り出し、ステップＳ９２１で、コード列の格納領域３１１から、参照ポインタの指すコード列を読み出して、検索結果コード列に設定する。
【０１１６】
図９Ａの例示では、ステップＳ９１６ａにおいて探索経路スタックのスタックポインタは再び親ノードの配列番号２２１ｂを指すものとなり、ステップＳ９１７では該スタックポインタの指す子ノードの配列番号２２０ｃ＋１が読み出される。そして、ステップＳ９１８〜Ｓ９２１の処理で、ノード２１０ｄが読み出され、参照ポインタ２８０ｄの指すコード列「Ａ＊」が検索結果コード列に設定される。ステップＳ９１６ａ〜ステップＳ９２１の処理が、図９Ａに例示する最長一致キー決定に相当する。
【０１１７】
なお、初期検索において、子ノードの配列番号としてコード列終端側ノードの配列番号を探索経路スタックに格納する場合には、上記ステップＳ９１８の処理は必要なく、ステップＳ９１９では、ステップＳ９１７で得た配列番号の指す配列要素をノードとして読み出すことになる。
また、初期検索において、コード列終端側ノードを探索経路スタックに格納する場合には、ステップＳ９１７において、探索経路スタックからスタックポインタの指すコード列終端側ノードを読み出し、ステップＳ９１８〜ステップＳ９１９をスキップし、ステップＳ９２０において、ステップＳ９１７で読み出したコード列終端側ノードから参照ポインタを取り出すことになる。
さらに初期検索において、探索経路スタックに参照ポインタが格納される場合、あるいは検索対象コード列が格納される場合に図９Ｄの処理フローをどのように変更すればよいかは以上の説明から当業者に明らかである。
【０１１８】
次に、カップルドノードツリーが、無意のコード「＊」のみからなるコード列も含むようにすることにより、どのような検索キーで検索しても、必ず検索結果キーを得ることができることについて説明する。
【０１１９】
任意の検索キーを符号化した符号化検索キーで初期検索を実施し、次に最長一致検索を行うと、図９Ｂに示す処理の後、図９Ｃに示すステップＳ９１０において、あるインデックスキーの符号化ビット長が比較ビット長に設定される。もし、符号化検索キーとインデックスキーの比較ビット長の範囲のビット列のビット値が等しければ、図９Ｃに示すように、検索結果キーが得られる。
【０１２０】
一方、符号化検索キーとインデックスキーの比較ビット長の範囲のビット列のビット値が等しくなければ、図９Ｃに示すように、差分ビット位置が得られる。そして、図９Ｄに示すステップＳ９１３〜ステップＳ９１６の処理に至り、弁別ビット位置探索が実行される。
【０１２１】
今、カップルドノードツリーが、無意のコード「＊」のみからなるコード列を含むことから、ルートノードはコード列区切りブランチノードであり、その弁別ビット位置は０である。また、検索キーが有意のコードからなる限り、上記差分ビット位置は０より下位の位置である。したがって、図９ＤのステップＳ９１６の判定がいずれ肯定的になることは保障されているので、ステップＳ９２１において、必ず検索結果コード列にコード列が設定される。
【０１２２】
もし、カップルドノードツリーが、無意のコード「＊」のみからなるコード列を含まないものとすると、その場合の最長一致検索は、図９Ｂ及び図９Ｄのループ処理に探索経路スタックのスタックポインタが初期値を指しているかの判定処理を挿入し、スタックポインタが初期値を指していれば検索失敗とすればよい。
【０１２３】
以上、本発明の最長一致検索に係る実施形態について詳細に説明した。以下においては、本発明の最長一致検索についての理解をさらに容易にするため、図１０、図１１Ａ〜図１１Ｃを参照して、最長一致検索の具体例を説明する。
以下説明する具体例のカップルドノードツリーは、図３に例示したものである。符号化検索キーは、３つのタイプのものが例示される。図１１Ａに示す例では、符号化検索キーとして、（ＡＢＥＡＢＣ＊）が用いられる。図１１Ｂ、図１１Ｃに示す例では、それぞれ符号化検索キーとして、（ＡＣＥＡＢＣ＊）、（ＡＣＥ＊）が用いられる。それぞれの符号化検索キーによる初期検索の結果は図９Ａの例示と同一である。
【０１２４】
図１０は、上記初期検索において前記探索経路スタック３１０に格納されるデータとコード列終端側子ノードに係るインデックスキーの関係を示す図である。
探索経路スタック３１０には、図１１Ａ、図１１Ｂ、図１１Ｃに示す例の符号化検索キーによる初期検索の結果、図９Ａに示すものと同一の配列番号が格納されている。
【０１２５】
図１０に示すように、親ノードの配列番号及びノード［１］側の子ノードの配列番号として、最初に配列番号２２０と配列番号２２０ａ＋１が探索経路スタック３１０に格納されている。点線の矢印で示すように、配列番号２２０ａ＋１と符号６１ｄで示すインデックスキー（＊）が対応し、図９Ｂに示すステップＳ９０５で配列番号２２０ａ＋１が読み出されると、ステップＳ９０３において、（＊）すなわち“０”がインデックスキーに設定される。
【０１２６】
次に、下向きの矢印で示すように、配列番号２２１ｂと配列番号２２０ｃ＋１が、さらに配列番号２２０ｃ＋１と配列番号２２１ｄ＋１が探索経路スタック３１０に格納される。
点線の矢印でそれぞれ示すように、配列番号２２０ｃ＋１と符号６１ｃで示すインデックスキー（Ａ＊）が対応し、図９Ｂに示すステップＳ９０５で配列番号２２０ｃ＋１が読み出されると、ステップＳ９０３において、（Ａ＊）すなわち“１００１０”がインデックスキーに設定され、配列番号２２１ｄ＋１と符号６１ｂで示すインデックスキー（ＡＢ＊）が対応し、図９Ｂに示すステップＳ９０５で配列番号２２１ｄ＋１が読み出されると、ステップＳ９０３において、（ＡＢ＊）すなわち“１００１１０１００”がインデックスキーに設定される。また、太線の矢印で示すように、スタックポインタは、親ノードの配列番号２２０ｃ＋１を指す。
【０１２７】
図１１Ａは、初期検索で得られたインデックスキーが符号化検索キーに前方一致する場合の最長一致検索の例を概念的に説明する図である。
先に述べたように、符号化検索キー５１ａは、検索キー「ＡＢＥＡＢＣ＊」を符号化した（ＡＢＥＡＢＣ＊）である。ビット表現では、“1001101011011001101010110”となり、その符号化ビット長５２ａは２４ビットとなる。
【０１２８】
この符号化検索キー５１ａで、図３に示したカップルドノードツリー２００を用いて初期検索を実行すると、符号化検索キー５１ａの０ビット目の値が“１”、２ビット目の値は“０”、４ビット目の値は“１”、８ビット目の値は“１”であるので、図８Ａの例示と同様に初期検索の結果としてノード２１１ｅから、コード列「ＡＢＥＡＢ＊」が記憶されている記憶領域を指す参照ポインタ２８１ｅが取り出され、探索経路スタック３１０には、図１０に示す内容が格納される。
【０１２９】
そして、図９Ｂに示す最長一致検索のステップＳ９０１〜ステップＳ９０３の最初の処理において、コード列「ＡＢＥＡＢ＊」が読み出され、符号６１ａで示すインデックスキー（ＡＢＥＡＢ＊）に符号化されるとともに、インデックスキーの符号化ビット長６２ａとして、図１１Ａに示すように２０ビットが設定される。
【０１３０】
続いてステップＳ９０４において、インデックスキーの符号化ビット長６２ａと符号化検索キーの符号化ビット長５２ａの大小が比較され、インデックスキーの符号化ビット長６２ａは符号化検索キーの符号化ビット長５２ａ以下であることから、インデックスキーの符号化ビット長６２ａが比較ビット長７１ａに設定される。
【０１３１】
そして、図１１Ａに示すように、比較ビット長７１ａの範囲において、符号化検索キー５１ａとインデックスキー６１ａのビット値が等しい、すなわちインデックスキー６１ａが符号化検索キーに前方一致することがステップＳ９１１で判定される。続いてステップＳ９１１ａで、インデックスキー６１ａに符号化されたコード列「ＡＢＥＡＢ＊」が最長一致キーとして検索結果コード列に設定される。先に説明したとおり、初期検索の検索結果キーが検索キーに前方一致すれば、該検索結果キーは最長一致キーである。
【０１３２】
図１１Ｂは、初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも短い場合の最長一致検索の例を概念的に説明する図である。
先に述べたように、符号化検索キー５１ｂは、検索キー「ＡＣＥＡＢＣ＊」を符号化した（ＡＣＥＡＢＣ＊）である。ビット表現では、“1001101111011001101010110”となり、その符号化ビット長５２ｂは２４ビットとなる。
【０１３３】
図１１Ｂに示すように、符号化検索キー５１ｂによる最長一致検索においては、符号９１ｂ、９２ｂ、９３ｂで示すビット列比較１、ビット列比較２、ビット列比較３を行うことにより、最長一致キーが求められる。
【０１３４】
符号化検索キー５１ｂの０ビット目、２ビット目、４ビット目及び８ビット目の値は、符号化検索キー５１ａのそれぞれのビット位置の値と等しいから、初期検索の結果は符号化検索キー５１ａによる初期検索の結果と同一である。したがって、図１１Ａに示す例と同様に、初期検索と図９Ｂに示す最長一致検索のステップＳ９０１〜ステップＳ９０３の最初の処理において、コード列「ＡＢＥＡＢ＊」が読み出され、符号６１ａで示すインデックスキー（ＡＢＥＡＢ＊）に符号化されるとともに、インデックスキーの符号化ビット長６２ａとして、図１１Ｂのビット列比較１（９１ｂ）に示すように２０ビットが設定される。また、インデックスキーの符号化ビット長６２ａが比較ビット長７１ｂに設定される。
【０１３５】
ビット列比較１（９１ｂ）においては、比較ビット長７１ｂの範囲において、符号化検索キー５１ａとインデックスキー６１ａのビット値は等しくないことがステップＳ９１１で判定され、ステップＳ９１２〜ステップＳ９１２ａの処理により、差分ビット位置７２ｂに７ビット目のビット位置が設定される。
【０１３６】
次に図９Ｄに示すステップＳ９１３〜Ｓ９１６のループ処理により、差分ビット位置より上位の位置となる弁別ビット位置を有するコード列区切りブランチノードの配列番号を求める弁別ビット位置探索が行われる。まず、スタックポインタに最後に積まれた配列番号２２０ｃ＋１のコード区切りブランチノード２１１ｄが読み出され、その弁別ビット位置２３１ｄの値“８”が取り出され、図１１Ｂに示すビット列比較２（９２ｂ）が行われる。
【０１３７】
ビット列比較２（９２ｂ）に示すのは、符号化検索キー５１ｂと、符号６１ｂで示す、上記コード区切りブランチノード２１１ｄのコード列終端側子ノードに係るインデックスキー（ＡＢ＊）である。インデックスキー６１ｂのビット表現は、”100110100” であり、符号化ビット長６２ｂは、８ビットである。
ビット列比較２（９２ｂ）には、符号化検索キー５１ｂとインデックスキー６１ｂのビット位置のうち差分ビット位置７２ｂに該当するビット位置を示す矢印と、インデックスキー６１ｂのビット位置のうちその値が“８”である弁別ビット位置８１ｂに該当するビット位置を示す矢印が記載されている。
【０１３８】
ビット列比較２（９２ｂ）においては、弁別ビット位置８１ｂが差分ビット位置７２ｂより上位の位置関係にないことが判定される。すると図に示すように、初期検索の探索経路のコード列「ＡＢ＊」のうち弁別ビット位置８１ｂより上位に位置する有意のコードを符号化した部分は、符号化検索キー５１ｂと差分ビット位置７２ｂのビット値で異なるから、符号化検索キー５１ｂに前方一致しない。
【０１３９】
そこで、図９Ｄに示すステップＳ９１３〜Ｓ９１６のループ処理が繰り返され、スタックポインタに積まれた配列番号２２１ｂのコード区切りブランチノード２１０ｃが読み出され、その弁別ビット位置２３０ｃの値“４”が取り出され、図１１Ｂに示すビット列比較３（９３ｂ）が行われる。
【０１４０】
ビット列比較３（９３ｂ）に示すのは、符号化検索キー５１ｂと、符号６１ｃで示す、上記コード区切りブランチノード２１０ｃのコード列終端側子ノードに係るインデックスキー（Ａ＊）である。インデックスキー６１ｃのビット表現は、”10010” であり、符号化ビット長６２ｃは、４ビットである。
ビット列比較３（９３ｂ）には、インデックスキー６１ｂのビット位置のうちその値が“４”である弁別ビット位置８１ｂに該当するビット位置を示す矢印と、インデックスキー６１ｃの、弁別ビット位置８１ｃより上位に位置する有意のコードを符号化した部分が、符号化検索キー５１ｂに前方一致することを示す矢印とが記載されている。
【０１４１】
ビット列比較３（９３ｂ）においては、弁別ビット位置８１ｃが差分ビット位置７２ｂより上位の位置関係にあることが判定される。すると差分ビット位置７２ｂより上位に位置する符号化検索キー５１ｂとインデックスキー６１ｃのビットの値は一致することから、初期検索の探索経路のコード列「Ａ＊」のうち弁別ビット位置８１ｃより上位に位置する有意のコードを符号化した部分は、符号化検索キー５１ｂのうち弁別ビット位置８１ｃより上位に位置する有意のコードを符号化した部分と一致し、符号化検索キー５１ｂに前方一致する。また、インデックスキー６１ｃは、符号化検索キー５１ｂに前方一致するものの中で最長のものであり、最長一致キーである。
【０１４２】
図１１Ｃは、初期検索で得られたインデックスキーの符号化ビット長が符号化検索キーの符号化ビット長よりも長い場合の最長一致検索の例を概念的に説明する図である。
先に述べたように、符号化検索キー５１ｃは、検索キー「ＡＣＥ＊」を符号化した（ＡＣＥ＊）である。ビット列表現では、“1001101111010”となり、その符号化ビット長５２ｃは１２ビットとなる。
【０１４３】
図１１Ｃに示すように、符号化検索キー５１ｃによる最長一致検索においては、符号９１ｃ、９２ｃ、９３ｃで示すビット列比較１、ビット列比較２、ビット列比較３を行うことにより、最長一致キーが求められる。
【０１４４】
符号化検索キー５１ｃの０ビット目、２ビット目、４ビット目及び８ビット目の値は、符号化検索キー５１ａ及び符号化検索キー５１ｂのそれぞれのビット位置の値と等しいから、初期検索の結果は符号化検索キー５１ａ及び符号化検索キー５１ｂによる初期検索の結果と同一である。したがって、図１１Ａ及び図１１Ｂに示す例と同様に、初期検索と図９Ｂに示す最長一致検索のステップＳ９０１〜ステップＳ９０３の最初の処理において、コード列「ＡＢＥＡＢ＊」が読み出され、符号６１ａで示すインデックスキー（ＡＢＥＡＢ＊）に符号化されるとともに、インデックスキーの符号化ビット長６２ａとして、図１１Ｃのビット列比較１（９１ｃ）に示すように２０ビットが設定される。
【０１４５】
ビット列比較１（９１ｃ）においては、インデックスキー６１ａの符号化ビット長６２ａが符号化検索キー５１ｃの符号化ビット長５２ｃより長いことがステップＳ９０４で判定される。
【０１４６】
ステップＳ９０４での判定により、ステップＳ９０５〜ステップＳ９０９の処理を介して再びステップＳ９０１〜ステップＳ９０３の処理が実行され、その結果、スタックポインタに最後に積まれた配列番号２２０ｃ＋１のコード区切りブランチノード２１１ｄのコード列終端側子ノード２１０ｅに係るインデックスキー（ＡＢ＊）とその符号化ビット長６２ｂが設定されて、図１１Ｃに示すビット列比較２（９２ｃ）が行われる。
【０１４７】
ビット列比較２（９２ｃ）に示すのは、符号化検索キー５１ｃと、符号６１ｂで示す、上記コード区切りブランチノード２１１ｄのコード列終端側子ノードに係るインデックスキー（ＡＢ＊）である。インデックスキー６１ｂのビット表現は、”100110100” であり、符号化ビット長６２ｂは、８ビットである。
ビット列比較２（９２ｃ）においては、まずステップＳ９０４で、インデックスキー６１ｂの符号化ビット長６２ｂは、符号化検索キー５１ｃの符号化ビット長６２ａより短いことが判定される。そこで、ステップＳ９１０の処理により、インデックスキー６１ｂの符号化ビット長６２ｂが比較ビット長７１ｃに設定される。
また、ビット列比較２（９２ｃ）には、符号化検索キー５１ｃとインデックスキー６１ｂのビット位置のうち差分ビット位置７２ｃに該当するビット位置を示す矢印と、インデックスキー６１ｂのビット位置のうちその値が“８”である弁別ビット位置８１ｂに該当するビット位置を示す矢印が記載されている。
【０１４８】
そしてビット列比較２（９２ｃ）においては、さらに、弁別ビット位置８１ｂが差分ビット位置７２ｃより上位の位置関係にないことが判定される。すると図に示すように、初期検索の探索経路のコード列「ＡＢ＊」のうち弁別ビット位置８１ｂより上位に位置する有意のコードを符号化した部分は、符号化検索キー５１ｃと差分ビット位置７２ｃのビット値で異なるから、符号化検索キー５１ｃに前方一致しない。
【０１４９】
そこで、図９Ｄに示すステップＳ９１３〜Ｓ９１６のループ処理が実行され、スタックポインタに積まれた配列番号２２１ｂのコード区切りブランチノード２１０ｃが読み出され、その弁別ビット位置２３０ｃの値“４”が取り出され、図１１Ｃに示すビット列比較３（９３ｃ）が行われる。
【０１５０】
図１１Ｃに示すビット列比較３（９３ｃ）と図１１Ｂに示すビット列比較３（９３ｂ）を対比すれば明らかなように、ビット列比較３（９３ｃ）における処理は、図１１Ｂに示すビット列比較３（９３ｂ）における処理と同様である。したがって、繰り返しとなるので、その説明を省略する。
【０１５１】
次に、図１２〜図１３Ｃを参照して、本発明の一実施形態に係るカップルドノードツリーに、挿入キーの指定にしたがって、リーフノードを挿入する処理について説明する。この挿入処理は、挿入キー及び検索対象コード列を符号化することを除いて、特許文献２に開示したものと類似するものである。なお、特許文献２に開示したものと同様に、ルートノードの挿入処理と、ルートノード以外のノードを既存のカップルドノードツリーに挿入する通常の挿入処理によりカップルドノードツリーが生成されることから、ノードの挿入処理の説明はカップルドノードツリーを生成する処理の説明でもある。
【０１５２】
図１２は、本発明の一実施形態におけるカップルドノードツリーを生成する処理フロー例を説明する図である。
まず、ステップＳ１２０１で、カップルドノードツリーに挿入するコード列（挿入キー）を記憶した記憶領域のポインタを取得する。
【０１５３】
続いて、ステップＳ１２０２において、カップルドノードツリーのルートノードの配列番号が登録済みであるか否かを判定する。前述のように、本発明の一実施形態においては、カップルドノードツリーの管理手段にカップルドノードツリーのルートノードの配列番号が登録されるようになされており、このステップＳ１２０２で、ルートノードの配列番号が登録されているか否かがチェックされる。その結果、登録済みであればステップＳ１２０３へ進む。
【０１５４】
ステップＳ１２０３では、挿入コード列に、ステップＳ１２０１で取得したポインタの指す記憶領域に記憶された挿入キーを設定し、次に、ステップＳ１２０３ａにおいて、挿入コード列から、符号化挿入キーを作成する。ステップＳ１２０３ａにおける符号化処理は、図７に示す処理フローにより実現可能である。
【０１５５】
次にステップＳ１２０４に進み、符号化挿入キーにより、ルートノードからカップルドノードツリーが格納された配列を検索し、挿入キーが格納されている領域を指す参照ポインタを含むリーフノードを挿入する処理を行い、この挿入処理を終了する。なお、このステップＳ１２０４の処理の詳細については、後に図１３Ａ〜図１３Ｃを参照して説明する。
【０１５６】
一方、ステップＳ１２０２での判定が登録済みでなければ、まったく新しいカップルドノードツリーの登録、生成が始まる。
すなわち、ステップＳ１２０５に進み、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
次に、ステップＳ１２０６において、ステップＳ１２０５で得た配列番号に値“０”を加えた配列番号を求める（本実施の形態では、ステップＳ１２０５で取得した配列番号に等しい配列番号がここで得られるので、ステップＳ１２０６は省略可能である）。
【０１５７】
続いて、ステップＳ１２０７において、挿入するルートノード用に、ステップＳ１２０６で得た配列番号の配列要素のノード種別にリーフノードであることを示す“１”を書き込むとともに、参照ポインタに前記ステップＳ１２０１で取得した挿入キーが記憶されている記憶領域を指すポインタを書き込む。
そして、ステップＳ１２０８で、ステップＳ１２０６で取得した配列番号をルートノードの配列番号としてカップルドノードツリーの管理手段に登録して、図１２の処理を終了する。
【０１５８】
次に、前記ステップＳ１２０４の処理、すなわち、既存のカップルドノードツリーに挿入コード列が記憶されている記憶領域を指す参照ポインタを格納するリーフノードを挿入する処理について、図１３Ａ〜図１３Ｃを参照して説明する。図１３Ａは挿入処理の前段の処理である検索処理の処理フローを示す図、図１３Ｂは挿入処理の中段の処理である挿入するノード対のための配列要素を準備する処理の処理フロー例を示す図、図１３Ｃは挿入処理の後段の処理であるノード対を挿入する位置を求め、ノード対の各ノードの内容を書き込んで挿入処理を完成させる処理の処理フロー例を示す図である。
【０１５９】
まず、図１３ＡのステップＳ１３０１において、検索開始ノードの配列番号に、ルートノードの配列番号を設定する。そして、ステップＳ１３０２で、符号化検索キーとして前記ステップＳ１２０３ａにおいて作成した符号化挿入キーを設定する。
次に、ステップＳ１３１０ａに進み、符号化検索キーにより、前記検索開始ノードからカップルドノードツリーが格納された配列を検索し、参照ポインタを得る。この処理は、前記図５示す基本検索処理により実現される。
【０１６０】
そして、ステップＳ１３１０ｂで、コード列の格納領域３１１から前記ステップＳ１３１０ａで取得した参照ポインタの指すコード列を読み出し、ステップＳ１３１０ｃで、該読み出したコード列を符号化して符号化ビット列（インデックスキー）を作成する。ステップＳ１３１０ｃにおける符号化処理は、図７に示す処理フローにより実現可能である。
【０１６１】
次に、ステップＳ１３１１において、符号化挿入キーと前記ステップＳ１３１０ｃで作成したインデックスキーとが等しいか否かを判定する。符号化挿入キーとインデックスキーとが等しい場合は、挿入キーに対応する検索対象コード列に係るリーフノードは既にカップルドノードツリー内に存在するのであるから、挿入は失敗となり、処理を終了する。
【０１６２】
符号化挿入キーとインデックスキーとが等しくないときは、図１３ＢのステップＳ１３１２に進む。
このステップＳ１３１２において、配列から空きのノード対を求め、そのノード対のうち代表ノードとなるべき配列要素の配列番号を取得する。
次に、ステップＳ１３１３に進み、符号化挿入キーとステップＳ１３１０ｃで作成したインデックスキーの大小を比較し、符号化挿入キーの方が大きいときは値“１”（真）、小さいときは値“０”（偽）のブール値を得る。
【０１６３】
そして、ステップＳ１３１４に進み、ステップＳ１３１２で得た代表ノードの配列番号にステップＳ１３１３で得たブール値を加算した配列番号を得る。後述するように、このステップＳ１３１４で得られた配列番号は、挿入キーが記憶されている記憶領域を指す参照ポインタを保持するリーフノードが格納される配列要素の配列番号となる。
続いて、ステップＳ１３１５に進み、ステップＳ１３１２で得た代表ノードの配列番号にステップＳ１３１３で得たブール値をビット反転した値（ブール値の論理否定値）を加算した配列番号を得る。この配列番号は、挿入キーが記憶されている記憶領域を指す参照ポインタを保持するリーフノードと対を成すノードが格納される配列要素の配列番号となる。
すなわち、図１３Ａに示した検索処理で得られたリーフノードに格納された参照ポインタにより参照されるコード列を符号化して得られるインデックスキーと符号化挿入キーとの大小比較の結果により、挿入されるノード対のうちどちらのノードが、挿入キーが記憶されている記憶領域を指す参照ポインタを保持するリーフノードとされるかが決定される。
次に、図１３Ｃに示すステップＳ１３１６以降の処理に進む。
【０１６４】
図１３Ｃに示すように、ステップＳ１３１６で、符号化挿入キーとステップＳ１３１０ｃで作成したインデックスキーのビット列比較を行い、差分ビット列を得る。次に、ステップＳ１３１７に進み、ステップＳ１３１６で得た差分ビット列から、上位０ビット目から見た最初の不一致ビットのビット位置を得る。
そして、ステップＳ１３１８において、探索経路スタック３１０のスタックポインタがルートノードの配列番号を指しているか否かを判定する。ルートノードの配列番号を指していればステップＳ１３２４に進み、指していなければステップＳ１３１９に進む。
【０１６５】
ステップＳ１３１９では、探索経路スタック３１０のスタックポインタを１つ戻してそこに格納されている配列番号を取り出す。続いて、ステップＳ１３２０に進み、ステップＳ１３１９で取り出した配列番号の配列要素を配列からノードとして読み出す。次に、ステップＳ１３２１に進み、ステップＳ１３２０で読み出したノードから、弁別ビット位置を取り出す。
【０１６６】
そして、ステップＳ１３２２に進み、ステップＳ１３２１で取り出した弁別ビット位置がステップＳ１３１７で得たビット位置より上位の位置関係にあるか否かを判定する。ステップＳ１３２２の判定結果が「いいえ」であれば、ステップＳ１３１８に戻り、ステップＳ１３１８での判定結果が「はい」になるかステップＳ１３２２での判定結果が「はい」になるまで、ステップＳ１３１８〜ステップＳ１３２２のループ処理を繰り返す。ステップＳ１３２２での判定結果が「はい」になると、ステップＳ１３２３で探索経路スタックのスタックポインタを１つ進め、ステップＳ１３２４以下の処理に移行する。
【０１６７】
このステップＳ１３１６〜ステップＳ１３２２のループ処理は、差分ビット列の最初の不一致ビットのビット位置と、探索経路スタック３１０に格納されている配列番号の配列要素に格納されたブランチノードの弁別ビット位置との相対的位置関係を調べ、弁別ビット位置が上位となるまで順次探索経路スタックを逆にたどることにより、挿入するノード対のカップルドノードツリー上の挿入位置を決定する処理である。
【０１６８】
ステップＳ１３２４においては、探索経路スタック３１０からスタックポインタの指す配列番号を取り出す。そして、ステップＳ１３２５において、ステップＳ１３１４で得た配列番号の指す配列要素のノード種別に“１”（リーフノード）を、参照ポインタに挿入キーが記憶されている記憶領域を指すポインタを書き込む。これにより、リーフノードに挿入コード列を指す参照ポインタが書き込まれる。
【０１６９】
次に、ステップＳ１３２６に進み、配列からステップＳ１３２４で得た配列番号の配列要素を読み出す。続いて、ステップＳ１３２７において、ステップＳ１３１５で得た配列番号の配列要素にステップＳ１３２６で読み出した内容を書き込む。
最後にステップＳ１３２８において、ステップＳ１３２４で得た配列番号の指す配列要素のノード種別に“０”（ブランチノード）を、弁別ビット位置にステップＳ１３１７で得たビット位置を、代表ノード番号にステップＳ１３１２で得た配列番号を書き込み、処理を終了する。
このように、ステップＳ１３２４以下の処理で、各ノードにデータを設定して挿入処理が完成する。
【０１７０】
次に、図１４Ａ〜図１４Ｂを参照して、本発明の一実施形態に係るカップルドノードツリーから、削除キーの指定にしたがって、リーフノードを削除する処理について説明する。この削除処理は、削除キー及び検索対象コード列を符号化することを除いて、特許文献２に開示したものと類似するものである。
【０１７１】
図１４Ａは、本発明の一実施形態における削除処理の前段の処理フロー例を説明する図である。
まず、ステップＳ１４０１で、カップルドノードツリーから削除するコード列（削除キー）を削除コード列に設定する。次に、ステップＳ１４０２で、削除コード列を符号化して符号化削除キーを作成する。ステップＳ１４０２における符号化処理は、図７に示す処理フローにより実現可能である。
【０１７２】
次にステップＳ１４０３において、検索開始ノードの配列番号にルートノードの配列番号を設定し、ステップＳ１４０４で、符号化検索キーに符号化削除キーを設定してステップＳ１４０５に進む。ステップＳ１４０５では、符号化検索キーにより、検索開始ノードから配列を検索し、参照ポインタを得る。この処理は、図５に示す基本検索処理により実現される。
【０１７３】
次に、ステップＳ１４０６に進み、コード列の格納領域３１１から前記ステップＳ１４０５において得られた参照ポインタの指すコード列を読み出す。そして、ステップＳ１４０７で、ステップＳ１４０６で読み出したコード列から符号化コード列（インデックスキー）を作成する。ステップＳ１４０７における符号化処理は、図７に示す処理フローにより実現可能である。
【０１７４】
そして、ステップＳ１４０８で、前記ステップＳ１４０４で設定した符号化削除キーと前記ステップＳ１４０７で作成したインデックスキーとを比較し、等しくなければ削除キーに対応する検索対象コード列に係るリーフノードはカップルドノードツリーに存在しないのであるから、削除は失敗として、処理を終了する。等しければ、図１４ＢのステップＳ１４１２以下の処理に進む。
【０１７５】
図１４Ｂは、本発明の一実施形態における削除処理の後段の処理フロー例を説明する図である。図に示すように、ステップＳ１４１２において、探索経路スタック３１０に２つ以上の配列番号が格納されているか否かを判定する。
【０１７６】
該判定結果が「いいえ」のときは、格納されている配列番号は１つだけで、その配列番号はルートノードの格納された配列要素のものである。その場合は、ステップＳ１４１８に進み、ステップＳ１４０３で設定したルートノードの配列番号に係るノード対を削除する。そして、ステップＳ１４１９に進み、カップルドノードツリーに管理手段に登録されていたルートノードの配列番号を削除して処理を終了する。
【０１７７】
一方、ステップＳ１４１２において探索経路スタック３１０に２つ以上の配列番号が格納されていると判定されたときはステップＳ１４１３に進み、ステップＳ１４０５でコールしている図５のステップＳ５０８で得た代表ノード番号に図５のステップＳ５０７で得たビット値を反転した値を加算した配列番号を得る。この処理は、削除キーが格納されている領域を指す参照ポインタが格納されたリーフノードと対をなすノードの配置された配列番号を求めるものである。
次にステップＳ１４１４において、ステップＳ１４１３で得た配列番号の配列要素の内容を配列から読み出し、ステップＳ１４１５において探索経路スタックのスタックポインタを１つ戻して配列番号を取り出す。
【０１７８】
次にステップＳ１４１６に進み、ステップＳ１４１４で読み出した配列要素の内容をステップＳ１４１５で得た配列番号の配列要素に上書きする。この処理は、削除キーが格納されている領域を指す参照ポインタが格納されたリーフノードへのリンク元であるブランチノードを上記リーフノードと対をなすノードに置き換えるものである。
最後にステップＳ１４１７においてステップＳ１４０５でコールしている図５のステップＳ５０８で得た代表ノード番号の指すノード対を削除して、削除処理を終了する。
【０１７９】
以上説明したとおり、本発明においては、上述した挿入処理と削除処理において影響を受ける既存のノードの範囲は最小限であり、挿入や削除による保守コストが低いというカップルドノードツリーの長所は保たれている。また、上記のような符号化方法を採用することにより、この長所を保ちつつ、高速な最長一致検索が可能となる。
【０１８０】
以上、本発明の実施の形態に係るコード列検索方法を実現する処理フローについて説明をした。これらの処理フローを図４に例示するデータ処理装置３０１のようなコンピュータに実行させるプログラムにおり、本発明に係るビット列検索装置をコンピュータ上に構築可能なことは明らかである。
そこで、本発明に係るコード列検索装置の機能構成について、以下に説明する。
【０１８１】
図１５は、本発明の一実施形態におけるコード列検索装置の機能ブロック構成例を説明する図である。
図１５に示すように、コード列検索装置５００は、図４に例示するデータ処理装置３０１により実現される初期検索部５１０と最長一致検索部５２０、及びカップルドノードツリー２００が配置される配列３０９、探索経路スタック３１０、コード列の格納領域３１１が設けられたデータ格納装置３０８を含む。
【０１８２】
初期検索部５１０は、検索結果コード列取得手段５１１と探索経路記憶手段５１２を備えている。最長一致検索部５２０は、前方一致判定手段５２１、第１の最長一致キー取得手段５２２及び第２の最長一致キー手段５２３を備えている。
【０１８３】
初期検索部５１０の機能は、図６のステップＳ６０５、すなわち図８Ｂに例示する初期検索処理と図９Ｂに示すステップＳ９０１の最初の処理により実現される。また、最長一致検索部５２０の機能は、図９Ｂ〜図９Ｄに例示する最長一致検索処理により実現される。
【０１８４】
なお、上述した実施の形態においては、図９Ａに示すように、探索経路スタック３１０を２列に分けて、スタックポインタの一つの値により指定される記憶場所に、コード列区切りブランチノードの配列番号と、コード列区切りブランチノードの子ノードのうちノード［１］の配列番号の２つの配列番号からなる組を格納するように構成していたが、これに限られることはない。
【０１８５】
コード列区切りブランチノードの配列番号と子ノードの配列番号を格納する探索経路スタック３１０を、コード列区切りブランチノードの配列番号を格納する領域と子ノードの配列番号を格納する領域に分け、格納処理ではそれぞれのスタックポインタを操作して格納し、取り出し処理ではスタックポインタを同期させて取り出すようにしてもよい。例えば、図８ＢのステップＳ８１３とＳ８１５において、コード列区切りブランチノードの配列番号と子ノードの配列番号をそれぞれのスタックポインタを操作してそれぞれの格納領域に格納し、また、図９Ｂ〜図９Ｄに示す処理において、それぞれのスタックポインタの操作を同期させるようにすればよい。
【０１８６】
また、上述の実施の形態においては、カップルドノードツリーのリーフノードは、検索対象コード列あるいは検索対象コード列が記憶された記憶領域を指す参照ポインタを含むものとし、符号化検索キーとのビット列比較においては検索結果コード列を符号化しているが、検索対象コード列を初めから符号化しておき、検索結果として符号化されたコード列であるインデックスキーを直接求めるようにしてもよい。それらのどちらを採用するかは、検索対象コード列に必要な記憶容量と検索実行時に要する符号化の処理コストを勘案して決定すべきものである。
【符号の説明】
【０１８７】
１０
検索対象文字列
１３
コード表
５０
コード列
６０
コード列（ビット表現）
７０
符号化コード列（ビット表現）
１００  配列
１０１  ルートノード
１０２、１１４、１１７、１２４、１２６  ノード種別
１０３、１１５  弁別ビット位置
１０４、１１６  代表ノード番号
１１１、１２１  ノード対
１１８  参照ポインタ
２００
カップルドノードツリー
３０１
データ処理装置
３０２
中央処理装置
３０３
キャッシュメモリ
３０４
バス
３０５
主記憶装置
３０６
外部記憶装置
３０７
通信装置
３０８
データ格納装置
３０９
配列
３１０
探索経路スタック
３１１
コード列の格納領域
５００
コード列検索装置
５１０
初期検索部
５１１  検索結果コード列取得手段
５１２  探索経路記憶手段
５２０  最長一致検索部
５２１
前方一致判定手段
５２２
第１の最長一致キー取得手段
５２３
第２の最長一致キー取得手段
【図１Ａ】
0005473893.tif 000003
【図１Ｂ】
0005473893.tif 000004
【図２】
0005473893.tif 000005
【図３】
0005473893.tif 000006
【図４】
0005473893.tif 000007
【図５】
0005473893.tif 000008
【図６】
0005473893.tif 000009
【図７】
0005473893.tif 000010
【図８Ａ】
0005473893.tif 000011
【図８Ｂ】
0005473893.tif 000012
【図９Ａ】
0005473893.tif 000013
【図９Ｂ】
0005473893.tif 000014
【図９Ｃ】
0005473893.tif 000015
【図９Ｄ】
0005473893.tif 000016
【図１０】
0005473893.tif 000017
【図１１Ａ】
0005473893.tif 000018
【図１１Ｂ】
0005473893.tif 000019
【図１１Ｃ】
0005473893.tif 000020
【図１２】
0005473893.tif 000021
【図１３Ａ】
0005473893.tif 000022
【図１３Ｂ】
0005473893.tif 000023
【図１３Ｃ】
0005473893.tif 000024
【図１４Ａ】
0005473893.tif 000025
【図１４Ｂ】
0005473893.tif 000026
【図１５】
0005473893.tif 000027