【文献】
岡野原 大輔,大規模データを高速・コンパクトに処理するデータ構造 Web2.0後のシステム開発を支える基礎知識,WEB+DB PRESS,日本,(株)技術評論社,2008年 2月 1日,第42巻,pp.33−41
(58)【調査した分野】(Int.Cl.,DB名)
前記作成手段は、前記ダブル配列のトライ構造を構成するノードから遷移可能なノードに対するデータを、前記簡潔木構造のノードに登録することを特徴とする請求項1に記載の情報処理装置。
前記作成手段は、所定ノードから遷移可能なノードは、前記遷移可能なノードに対する前記ダブル配列を構成するCHECK配列の値から求まる遷移元のノードが前記所定ノードとなることを特徴とする請求項2に記載の情報処理装置。
前記作成手段は、前記複数の第1のキーワード間で共通ではない接尾辞部を併合して前記TAIL配列として、作成することを特徴とする請求項1乃至3の何れか1項に記載の情報処理装置。
【背景技術】
【0002】
従来から、複数の文字列の集合に指定された文字列が存在するか否かを高速に判定するためのデータ構造として、トライ(trie)構造を用いた手法が提案されている。
【0003】
トライ構造は、複数の文字列集合における共通接頭辞を状態遷移構造として表現することで、重複した記憶領域を削減し、且つ検索処理における無駄な処理も削減する。
【0004】
このトライ構造を効率的に実装し且つ高速に検索する方法として、ダブル配列法が開示されている(非特許文献1)。ダブル配列法は2つの整数型配列(以下、BASE配列及びCHECK配列)にトライ構造を効率的に格納し、トライ構造上における状態遷移を、BASE配列上の加算演算とCHECK配列上の比較演算で実現する非常に高速な検索手法を開示している。さらに接尾辞部分について、状態遷移の分岐が発生しない状態遷移を1つの文字列型配列(以下、TAIL配列)に集約して格納することで、状態遷移を表すBASE配列とCHECK配列の記憶領域を削減し且つ検索速度の向上を図っている。
【0005】
また、非特許文献2では前記ダブル配列法を改良し、よりコンパクトなダブル配列構造を実装する方法が開示されている。具体的には、前述したTAIL配列について、後方一致する共通接尾辞を併合することで、TAIL配列のさらなる圧縮を行っている。
【0006】
このようにダブル配列法は、トライ構造上の状態遷移において、分岐の発生しない部分をTAIL配列として実装することで、空間領域の削減と検索速度の向上を図っている。
【0007】
一方、トライ構造の空間効率を重視した実装方法として、簡潔木法が開示されている(非特許文献3)。簡潔木法はトライ構造上で幅優先探索を行い、トライ構造をビット列に変換する。このビット列構造とトライ構造上の状態遷移を表す文字集合を合わせて格納することで、非常にコンパクトなトライ構造の実装が実現できる。
【0008】
しかしながら、簡潔木法は、常にビット列構造を先頭からカウントする関数を用いて状態遷移を行う。具体的には、先頭からのビット1の数を返すrank
1関数、及び先頭からn番目の0ビットの位置を返すselect
0関数を利用する。これらの状態遷移関数は算出コストが高く、特にselect
0関数は非常に算出コストが高い。従って、前述したビット列構造に対して、任意の大きさの区画ごとに当該ビット数を予め算出した索引を併用する実装が一般的である。
【発明を実施するための形態】
【0017】
以下、図面を参照して本発明の実施の形態の一例について説明する。
【0018】
図1は、本発明の実施形態における文字列登録検索装置の構成を示す図である。
【0019】
文字列登録検索装置100は、ダブル配列構築部102と、簡潔木構築部103と、簡潔木データ104と、検索結果表示部105と、簡潔木検索部106とを備える。尚、簡潔木データ104は後述する外部メモリ211等の記憶装置に記憶されている。
【0020】
ダブル配列構築部102は、キーワード集合101を入力としてダブル配列を構築する。構築されたダブル配列は簡潔木構築部103に送られて、簡潔木データ104を生成する。簡潔木検索部106は、検索キーワード107を入力として簡潔木データ104を検索し、検索結果を検索結果表示部105に表示する。これら一連のデータ登録処理及びデータ検索処理については、詳しく後述する。
【0021】
次に、
図1の文字列登録検索装置100のハードウェア構成について、
図2を用いて説明する。
【0022】
図中、CPU201は、システムバス204に接続される後述の各デバイスやコントローラを統括的に制御する。また、ROM203あるいは外部メモリ211には、CPU201の制御プログラムであるBIOS(Basic Input / Output System)やオペレーティングシステムプログラム(以下、OS)や、文字列登録検索装置100に後述する各種の処理を実行させるために必要な各種プログラムやデータ等が記憶されている。RAM202は、CPU201の主メモリ、ワークエリア等として機能する。
【0023】
CPU201は、処理の実行に際して必要なプログラム等をRAM202にロードして、プログラムを実行することで後述する各種処理を実現するものである。また、入力コントローラ(入力C)205は、キーボードやポインティングデバイス等で構成される入力装置209からの入力を制御する。ビデオコントローラ(VC)206は、ディスプレイ装置210等の表示装置への表示を制御する。ディスプレイ装置210は、例えばCRTディスプレイや液晶ディスプレイ等で構成される。
【0024】
メモリコントローラ(MC)207は、ブートプログラム、ブラウザソフトウエア、各種のアプリケーション、フォントデータ、ユーザファイル、編集ファイル、各種データ等を記憶するハードディスク(HD)やフロッピーディスク(登録商標 FD)或いはPCMCIAカードスロットにアダプタを介して接続されるコンパクトフラッシュメモリ等の外部メモリ211へのアクセスを制御する。
【0025】
通信I/Fコントローラ(通信I/FC)208は、ネットワークを介して、外部機器と接続・通信するものであり、ネットワークでの通信制御処理を実行する。例えば、TCP/IPを用いたインターネット通信等が可能である。
【0026】
なお、CPU201は、例えばRAM202内の表示情報用領域へアウトラインフォントの展開(ラスタライズ)処理を実行することにより、ディスプレイ装置210上での表示を可能としている。また、CPU201は、ディスプレイ装置210上の不図示のマウスカーソル等でのユーザ指示を可能とする。以上が、文字列登録検索装置100のハードウェア構成の説明であるが、後述する各種の処理を実行可能であれば、必ずしも
図2に記載のハードウェア構成を有していなくとも構わないことは言うまでもない。
【0027】
次に、文字列登録検索装置100における文字列登録処理について、
図3から
図9を用いて、詳しく説明する。
【0028】
図3は、文字列登録処理の全体フローチャートを示す図である。文字列登録処理では、CPU201は、キーワード集合101を読み込み、ダブル配列構造を構築してから簡潔木データ構造を作成する処理を行う。この文字列登録処理は、CPU201をダブル配列構築部102、簡潔木構築部103として機能させるためのプログラムによる制御に従って行われる処理である。文字列登録処理の説明の前に、この処理で扱うキーワード集合の一例を、
図7を参照して説明する。
【0029】
図7は、キーワード集合101の一例である。キーワード701は、文字列「山形県」に対して数値「10」が定義されている。同様に、キーワード702は文字列「山梨県」に対して数値「20」が定義され、キーワード703は文字列「大阪府大阪市」に数値「30」が定義されている。キーワード704から706についても同様である。前記数値は、例えばID番号を示すものである、等であり、キーワード集合を利用するソフトウェア上において意味を持つ数値である(以下、OUTPUT値とする)。
【0030】
図3に戻って、ステップS301において、CPU201は、
図7に示すキーワード集合を1行ずつ読み込む。このとき、行情報は所定の書式に従って文字列とOUTPUT値に分解され、ステップS302において、ダブル配列に追加される。本実施形態におけるダブル配列は、文字列による検索処理が成功すると、OUTPUT値が返される。
【0031】
続いて、ステップS303において、CPU201は、すべてのキーワード集合について登録処理が完了したかどうかを判定し、未処理情報があると判定した場合には処理をステップS301に進める。すべてのキーワードをダブル配列へ登録完了したと判定した場合(ステップS303で「YES」の場合)は、ステップS304に進み、TAIL併合処理を実施する。
【0032】
TAIL併合処理は、非特許文献2で開示されている共通接尾辞を併合したTAIL配列のデータ構造について、ダブル配列への追加処理(ステップS302)の際に発生するTAIL配列内の未使用領域を削減しつつ当該データ構造を作成する処理を示す。この処理の詳細は
図4を参照して説明する。
【0033】
ここで、
図4を参照して、
図3のステップS304のTAIL併合処理の詳細について説明する。
図4はTAIL併合処理の詳細を示すフローチャートである。TAIL併合処理では、TAIL配列内の未使用領域を回収するために、BASE配列からTAIL配列へのリンクが定義されているものを探索する。
【0034】
CPU201は、ステップS401で、当該リンクを登録するためのリストを初期化し、続くステップS402からBASE配列の探索を開始する。具体的には、BASE配列の値が負数になっているものがTAIL配列へのリンクを表現しており、その絶対値がTAIL配列の添字である。従って、有効なBASE配列の中から負値を持つものについて、そのリンク先となるTAIL配列に登録されたTAIL文字列を取得し(ステップS403)、取得したTAIL文字列を反転させた反転TAIL文字列とリンク元となるBASE配列の添字をセットにして前記リストに追加する(ステップS404)。
【0035】
すべてのTAIL文字列を追加した後、続くステップS405において、反転TAIL文字列をキーとして、前記リストを逆順ソートする。即ち、前記リストを順に辿ることで、反転TAIL文字列を逆辞書順に取得することができる。
【0036】
続くステップS406で、CPU201は新しくTAIL配列を格納する領域(以下、併合TAIL配列)を確保し、ステップS407で前記リストから先頭要素を取得する。続くステップS408で、ステップS406で確保した併合TAIL配列に、反転していない元の正TAIL文字列を登録する。元の正TAIL文字列は、反転TAIL文字列を反転させて得ることもできるし、ステップS404において、別要素にセットして前記リストに追加してもよい。続くステップS409で、BASE配列の更新を行う。前記反転TAIL文字列とセットで追加したBASE配列の添字を参照することで、当該BASE配列の値を併合TAIL配列への添字の負数に更新し、BASE配列から併合TAIL配列へのリンクを更新する。
【0037】
具体例をあげて説明する。BASE[26]=−12であるとき、TAIL[12]から正TAIL文字列「ABC」が取得できたとする。このとき、ステップS404で前記リストに登録するセットは、(26、「CBA」)である。また、併合TAIL配列に登録した先がTAIL[1]の場合、ステップS409で、BASE[26]=−1に更新する。
【0038】
その後、CPU201はステップS410で、BASE配列をすべて探索したかを判定し、すべての探索が終了したと判定した場合すれば(ステップS410で「YES」の場合)、TAIL併合処理を終了する。探索が終了していないと判定した場合には(ステップS410で「NO」の場合)、ステップS411に進める。
【0039】
CPU201は、ステップS411において、前記リストから次の要素セットを取得し、続くステップS412で、取得したセットの反転TAIL文字列と、前記ステップS407で取得したセットの反転TAIL文字列を比較する。このとき、ステップS411で取得した反転TAIL文字列がステップS407で取得した反転TAIL文字列に含まれていると判定した場合(共通接頭辞になっている場合、即ち、ステップS412で「YES」の場合)、ステップS409に戻り、BASE配列の更新のみを実施する。ステップS412で「NO」の場合、ステップS408に戻り、併合TAIL配列に正TAIL文字列に登録して、続くステップS409でBASE配列の更新を実施する。
【0040】
前述の具体例で説明する。先頭要素の反転TAIL文字列「CBA」である場合に、次要素のセットが(7、「CB」)である場合、ステップS412において、共通接頭辞であると判断し(「YES」の場合)、BASE[7]=−2とする。即ち、TAIL[1]で正TAIL文字列「ABC」を得ることができ、TAIL[2]で正TAIL文字列「BC」を得ることができる。また、次要素のセットが(7、「DA」)である場合は、ステップS412において「NO」となり、TAIL[5]=ADを登録し(ステップS408)、BASE[7]=−5となる(ステップS409)。
【0041】
このように、前記リストに追加したすべての要素セットについて、BASE配列の更新処理と併合TAIL配列への登録処理を実施することで、非特許文献2で開示されているデータ構造を得ることができる。以上が、TAIL併合処理の詳細な説明である。
【0042】
図8に、
図7で示したキーワード集合700を入力にした、併合TAIL配列を用いたダブル配列構造の一例を示す。ダブル配列構造は、BASE配列部801、CHECK配列部802、併合TAIL配列部803、OUTPUT部(索引部804及び値部805)で構成される。変換表806は、ダブル配列構造に登録される文字列に対して、文字を数値に置き換えたものである。通常は文字コードを使用するが、本発明では以降の説明の簡略化のために、便宜的に定義した。
【0043】
OUTPUT索引部804は、BASE配列部801において併合TAIL配列部803へのリンクが定義されているものについて1を定義し、その他は0となるビット列で表現される。即ち、当該OUTPUT値を得るためには、OUTPUT索引部804においてrank
1関数を用いればよい。例えば、BASE[4]=−1であることから、BASE[4]はTAIL[1]へのリンクを意味している。このとき、OUTPUT索引部804において、BASE配列の添字4を引数にしてrank
1(4)を求めると2であることから、OUTPUT[2]を参照し、OUTPUT値「20」を得る(
図7におけるキーワード702の検索結果を意味する)。
【0044】
図3の説明に戻る。CPU201は、TAIL併合処理(ステップS304)が終了すると、処理をステップS305に進め、前記併合TAIL配列を用いたダブル配列構造を入力として、簡潔木生成処理を実施する。この処理の詳細は
図5を参照して説明する。
【0045】
ここで、
図5を参照して、
図3のステップS305の簡潔木生成処理の詳細について説明する。
図5は、簡潔木生成処理の詳細を示すフローチャートである。簡潔木生成処理では、ダブル配列構造を幅優先探索方式で辿ることにより簡潔木を生成する。
【0046】
まずCPU201は、ステップS501で簡潔木構造における先頭ビット列「10」を追加する。そして、続くステップS502において、状態キューを初期化する。前記状態キューはダブル配列構造において幅優先探索を実現するために使用される。
【0047】
ステップS503では、状態sを1に初期化し、ステップS504で遷移可能集合追加処理を実施する。遷移可能集合追加処理では、状態sから遷移可能な文字を探索し、前記状態キューに追加する処理を実施する。この遷移可能集合追加処理の詳細については、
図6を参照して説明することにする。
【0048】
ここで、
図6を参照して、
図5のステップS504(及びステップS511)の遷移可能集合追加処理の詳細について説明する。
図6は遷移可能集合追加処理の詳細を示すフローチャートである。
【0049】
まずCPU201はステップS601で、遷移可能な文字を保持するためのリストを初期化する。続くステップS602からステップS603において、状態sから遷移可能なすべての文字を探索する。前述したように、ダブル配列構造はCHECK配列の値が遷移元の状態番号を示すことが開示されているため、有効な文字集合の範囲内で、CHECK配列の値がBASE配列添字になるものを探索すればよい。
【0050】
具体的には、例えば、有効な文字集合をアルファベット26文字とし且つAを1、Bを2・・・Zを26、と定義した場合において、BASE[1]=2のとき、BASE[1]+1からBASE[1]+26の範囲、即ち、CHECK[3]からCHECK[28]の範囲において、CHECK[s]=1であるsを満たす文字を探索する。
【0051】
その後、CPU201はステップS604において、前記条件を満たす文字Ciを前記リストに追加する。
【0052】
続くステップS605以降の処理において、前記リストに追加されたすべての文字Ciについて、
図5のステップS502で初期化した前記状態キューに追加する。
【0053】
ここで、BASE[s]が正値の場合(ステップS606で「YES」の場合)、ダブル配列構造において分岐を持った遷移状態を意味しているので、ステップS607に進み、遷移先の状態番号を示すBASE[s]+Ciとペアにして、状態(BASE[s]+Ci、Ci)を前記状態キューに追加する。BASE[s]が正値でない場合(ステップS606で「NO」の場合)、BASE[s]はTAIL配列へのリンク、或いは後述する終端状態を示しているので、ステップS608に進み、状態(BASE[s]、Ci)を前記状態キューに追加する。
【0054】
以上の遷移可能集合追加処理によって、状態sから遷移可能なすべての文字が遷移先の状態番号と共に、前記状態キューに追加されたことになる。続くステップS609において、状態sからの遷移探索が完了したことを意味する終端状態(0、0)を前記状態キューに追加する。以上が、遷移可能集合追加処理の詳細な説明である。
【0055】
図5の説明に戻る。ステップS504の遷移可能集合追加処理終了後、CPU201は、ステップS505において、前記状態キューが空かどうかを判定する。空でないと判定した場合(ステップS505で「NO」の場合)、処理をステップS506に進め、前記状態キューから状態(s、c)をひとつ取得する。
【0056】
続くステップS507の判定処理において、CPU201が状態sを正値であると判定した場合(ステップS507で「YES」の場合)、ステップS508に進む。ここでBASE[s]が正数の場合(ステップS508で「NO」の場合)、ステップS506で取得した状態sは分岐を持った遷移状態であるので、ステップS511に進み、前述した遷移可能集合追加処理を再帰的に実施して、ステップS512に進む。このように前記状態キューを使用することで、ダブル配列構造において幅優先探索を実現している。
【0057】
また、ステップS508で「YES」とCPU201が判定した場合、即ち、BASE[s]が負数の場合は前記併合TAIL配列へのリンクを示す状態であるため、ステップS509に進み、新たに併合TAIL配列へのリンクを作成する。簡潔木構造では、状態sに対応するビット番号に対して併合TAIL配列へのリンクを設定する必要がある。従って、前述した
図8におけるOUTPUT索引部804とOUTPUT値部805のように、rank
1関数を用いた索引部とリンク部の構造を持つように併合TAIL配列へのリンクを設定する。当該リンク構造の詳細については、後述する。
【0058】
ステップS509の処理終了後、処理をステップS510に進め、状態sから分岐できる遷移は存在しないため(併合TAIL配列への分岐なし状態遷移のみ存在する)、前記状態キューに終端状態(0、0)を追加し、ステップS512に進む。
【0059】
ステップS507の判定処理で戻って「NO」と判定した場合、即ち、状態sが正値でない場合には、処理をステップS512に進める。
【0060】
ステップS512では、ステップS506で取得した文字cをエッジ文字として簡潔木に登録する。文字cが0でない場合は、簡潔木のビット列に1を追加して、文字cをエッジ文字列に追加する。文字cが0の場合は(終端状態)、簡潔木のビット列に0を追加する。
【0061】
ステップS512での文字cの登録処理が終了すると、処理をステップS505に進め、前記状態キューが空になるまで、前述した処理を繰り返す。
【0062】
前記状態キューが空になった場合(ステップS505で「YES」の場合)、ステップS513に進み、索引生成処理を実施する。索引生成処理は、ビット列におけるrank
1関数やselect
0関数の算出コストを削減するために、任意の大きさの区画ごとに当該ビット数を予め算出した索引を生成する処理である。
【0063】
以上の処理により、ダブル配列構造において幅優先探索を実施し、簡潔木構造への変換が実現される。
【0064】
図9に、
図8に示したダブル配列構造から生成した簡潔木構造を一例として示す。簡潔木構造は、トライ構造を表すビット配列901とエッジ文字列902、併合TAIL配列へのリンクを示すTAILビット配列903とTAILリンク配列904、OUTPUT値を保持するOUTPUT配列905、及び併合TAIL配列906から構成される。併合TAIL配列906は、
図8における前記併合TAIL配列803と同等のものである。また、エッジ文字列902及び併合TAIL配列906内に保持されている文字は、
図8の前記変換表806を用いて数値に置き換えている。
【0065】
ビット配列901及びTAILビット配列903はビット列で表現される。従って、前述したように、これらのデータにはrank
1関数やselect
0関数の算出コストを削減するための索引情報が付与されることになる。
【0066】
図10に、前期簡潔木構造の検索方法のフローチャートを示す。なお、
図9を合わせて用いることで、具体的に検索方法を説明する。
【0067】
まず、CPU201は、ステップS1001で検索キーワードから文字cを取得する。文字cが取得できた場合(ステップS1002で「YES」の場合)、ステップS1003に進み、簡潔木構造における最初の子ノードを探索する。最初の子ノードの探索は、次の関数として非特許文献3に開示されている。
【0068】
first-child (n) = select
0(rank
1(n))+1
【0069】
図9を用いて具体的に説明する。検索開始位置はビット配列901の1番目であり、rank
1(1)=1である。従って、select
0(1)=2となり、first-child (1)=3であるから、最初の子ノード番号が3とわかる。ここでビット配列901の3番目を見ると1であるため、子ノードが存在することがわかる。0や領域外の場合は、子ノードは存在しない。
【0070】
続くステップS1004で、子ノードが存在するかどうかを確認する。子ノードが存在する場合(ステップS1004で「YES」の場合)、ステップS1005に進む。ステップS1005で当該子ノードに対応したエッジ文字を取得する。エッジ文字は
図9におけるエッジ文字列902に登録されており、その算出式は以下のようになる。
【0071】
e = edge[rank
1(n)−1]
【0072】
図9の例で説明する。ビット配列901の3番目のエッジ文字は、rank
1(3)=2であるため、edge[1]=1が選択される。文字コード「1」は、
図8における変換表806において、文字「山」であることがわかる。従って、ビット配列901の3番目のエッジ文字は「山」となる。
【0073】
図10のステップS1005ではさらに、取得したエッジ文字eとステップS1001で取得した検索キーワードの文字cが一致するかを判定する。CPU201が一致したと判定した場合(ステップS1005で「YES」の場合)、状態遷移が成立したため、ステップS1001に戻り、検索キーワードにおける次の文字を取得し、その文字について、簡潔木構造上での状態遷移を確認する。
【0074】
ステップS1005の判定処理で、取得したエッジ文字eとステップS1001で取得した検索キーワードの文字cが一致しないとCPU201が判定した場合(ステップS1005で「NO」の場合)、ステップS1006に進み、兄弟ノードの探索を実施する。簡潔木構造は幅優先探索を用いて作成されているため、兄弟ノードの探索は、当該ビット列において、隣接するビットが1であれば探索に成功する。
図9のビット配列901の例では、子ノード番号3に隣接する子ノード番号4のビットが1であることから、子ノード番号4は子ノード番号3の兄弟ノードであるとわかる。
【0075】
ステップS1007で兄弟ノードが存在しないと判定した場合(ステップS1007で「NO」の場合)、当該検索キーワードを用いた簡潔木構造において、もはや状態遷移が成立し得ないため、検索失敗として簡潔木検索処理を終了する。
【0076】
一方、ステップS1007で、兄弟ノードが存在するとCPU201が判定した場合(ステップS1007で「YES」の場合)には、ステップS1005に戻り、当該ビット番号のエッジ文字と当該検索キーワードから取得した文字cとの比較を実施する。
【0077】
このように、当該検索キーワードを1文字ずつ簡潔木構造上で探索していくが、子ノードが存在しない場合(ステップS1004で「NO」の場合)、或いは、当該検索キーワードすべての文字を探索した場合(ステップS1002で「NO」の場合)、ステップS1008へ進む。
【0078】
ステップS1008以降では、ビット配列901上における状態遷移が終了し、遷移分岐のない併合TAIL配列906を用いた探索を実施する。ステップS1008において、併合TAIL配列906へのリンクを取得する。例えば、検索キーワードが「山形県」の場合、ビット配列901上を、1⇒3⇒6⇒13と遷移し bit[13]=0であることから、ビット番号6までの状態遷移が成立する。ここで、TAILビット配列903に対してrank
1(6)を算出すると1であるので、TAILリンク配列904を参照して
併合TAIL配列906へのリンク値 tail_link [1] =1を得る。
【0079】
続くステップS1009で、前記リンク値が取得できたかどうかを判定する。取得できなかったと判定した場合(ステップS1009で「NO」の場合)、併合TAIL配列へのリンクが存在しないため、検索失敗として簡潔木検索処理を終了する。取得できたと判定した場合(ステップS1009で「YES」の場合)は、ステップS1010に進む。
【0080】
ステップS1010では、前記検索キーワードの未探索部分である接尾辞部と、併合TAIL配列906に格納された文字列が一致するかどうかを調べる。一致しなかった場合(ステップS1010で「NO」の場合)、前記検索キーワードが存在しないことから、検索失敗として簡潔木検索処理を終了する。
【0081】
前述の例では、検索キーワード「山形県」において、「山形」までがビット配列901上で確認されており、残りの接尾辞「県」が併合TAIL配列906との比較対象となる。前記TAILリンク配列904から得たリンク値が1であるため、併合TAIL配列906の1番目を先頭に文字列比較を実施する。Tail[1]=10であることから、変換表806を参照すると「県」であり、続くTail[2]=0で終端となる。従って、前記検索キーワードの接尾辞「県」と併合TAIL配列906に登録された文字列「県」が一致することがわかる。
【0082】
ステップS1010で「YES」と判定した場合、即ち、文字列比較が一致した場合はステップS1011に進む。ステップS1011では、OUTPUT値をOUTPUT配列905から取得する。取得する方法は、TAILリンク配列904と同様であり、TAILビット配列903を用いて取得する。
【0083】
以上の処理をもって、検索キーワードの検索が成功し、簡潔木検索処理はOUTPUT値を返すことができる。
【0084】
以上説明したように、本実施形態によれば、ダブル配列構造を経由させて簡潔木構造を構築することによって、トライ構造をコンパクトに実装できる。また、簡潔木構造の検索において、その計算コストが大きいビット配列を使った状態遷移を最小限に留め、検索速度の向上に寄与している。
【0085】
以上、実施形態例を詳述したが、本発明は、例えば、システム、装置、方法、プログラムもしくは記憶媒体等としての実施態様をとることが可能であり、具体的には、複数の機器から構成されるシステムに適用しても良いし、また、一つの機器からなる装置に適用しても良い。
【0086】
なお、上述した各種データの構成及びその内容はこれに限定されるものではなく、用途や目的に応じて、様々な内容で構成されることは言うまでもない。
【0087】
また、本発明は、システム或いは装置にプログラムを供給することにとって達成される場合にも適用できることは言うまでもない。この場合、本発明を達成するためのソフトウェアによって表されるプログラムを格納した記録媒体を該システム或いは装置に読み出すことによって、そのシステム或いは装置が、本発明の効果を享受することが可能となる。
【0088】
さらに、本発明を達成するためのソフトウェアによって表されるプログラムをネットワーク上のサーバー、データーベース等から通信プログラムによりダウンロードして読み出すことによって、そのシステム或いは装置が、本発明の効果を享受することが可能となる。
【0089】
なお、上述した各実施形態及びその変形例を組み合わせた構成もすべて本発明に含まれるものである。