(57)【特許請求の範囲】
【請求項１】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納する記憶装置と、を備え、入力された数列データを保持し、検索クエリを受け付けて、前記受け付けた前記検索クエリから前記数列データを検索する数列データ検索装置であって、
前記数列データの分岐数Ｋを受け付けて、前記数列データからＫ分木を構築するＫ分木構築部と、
前記分岐数Ｋから前記数列データをＫ進数列に変換し、前記構築したＫ分木のうち葉ノード以外のノードにおいて、分岐数Ｋの２を底とする対数と等しいかより大きい整数の中で最小の値ｚを算出し、前記Ｋ進数列の０からＫ−１の各数字を前記最小の値ｚ桁で２進数列化し、前記最小の値ｚ本のビット列に各桁を格納する多段ビット列を含む多分岐ウェーブレット木データ構築部と、
前記検索クエリに含まれる検索対象の数字の位置のビットが所定値であるビット列を前記多段ビット列から求める検索部を備えたことを特徴とする数列データ検索装置。
【請求項２】
請求項１に記載の数列データ検索装置であって、
前記数列データの０からＫ−１の各数字に対して、前記数列データ上の位置ｐまでに出現する回数を返すＲａｎｋを計算した結果を辞書として保持する辞書作成部をさらに備え、
前記検索部は、
前記辞書の範囲外における前記数列データ上の位置について、前記多段ビット列から検索クエリに含まれる数字のビットが所定の値であるビット列を求めるビット列検索部と、
前記辞書と前記ビット列検索部を用いて、検索クエリに含まれる数字について前記多段ビット列における前記Ｒａｎｋを計算するＲａｎｋ計算部と、を備えたことを特徴とする数列データ検索装置。
【請求項３】
請求項１に記載の数列データ検索装置であって、
前記数列データの０からＫ−１の各数字に対して、前記数列データ上の出現回数がｎ回となる位置を返すＳｅｌｅｃｔを計算した結果を辞書として保持する辞書作成部をさらに備え、
前記検索部は、
前記辞書の範囲外における前記数列データ上の出現回数について、前記多段ビット列から検索クエリに含まれる数字のビットが所定の値であるビット列を求めるビット列検索部と、
前記辞書と前記ビット列検索部を用いて、検索クエリに含まれる数字について前記多段ビット列における前記Ｓｅｌｅｃｔを計算するＳｅｌｅｃｔ計算部と、を備えたことを特徴とする数列データ検索装置。
【請求項４】
請求項１に記載の数列データ検索装置であって、
前記検索部は、
前記数列データの０からＫ−１の各数字に対して、前記多段ビット列から所定のビットが所定値のビット列を求めることにより前記多段ビット列からＬｏｏｋｕｐの計算を実行するＬｏｏｋｕｐ計算部と、をさらに備えたことを特徴とする数列データ検索装置。
【請求項５】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリと、を備えた計算機で、入力された数列データを保持し、検索クエリを受け付けて、前記受け付けた前記検索クエリから前記数列データを検索する数列データ検索方法であって、
前記プロセッサが、前記数列データの分岐数Ｋを受け付けて、前記数列データからＫ分木を構築する第１のステップと、
前記プロセッサが、前記分岐数Ｋから前記数列データをＫ進数列に変換し、前記構築したＫ分木のうち葉ノード以外のノードにおいて、分岐数Ｋの２を底とする対数と等しいかより大きい整数の中で最小の値ｚを算出し、前記Ｋ進数列の０からＫ−１の各数字を前記最小の値ｚ桁で２進数列化し、前記最小の値ｚ本のビット列に各桁を格納する多段ビット列を含む多分岐ウェーブレット木データを構築する第２のステップと、
前記プロセッサが、前記検索クエリに含まれる検索対象の数字の位置のビットが１であるビット列を前記多段ビット列から求める第３のステップと、
を含むことを特徴とする数列データ検索方法。
【請求項６】
請求項５に記載の数列データ検索方法であって、
前記プロセッサが、前記数列データの０からＫ−１の各数字に対して、前記数列データ上の位置ｐまでに出現する回数を返すＲａｎｋを計算した結果を辞書として保持する第４のステップと、
前記プロセッサが、前記辞書の範囲外における前記数列データ上の位置について、前記多段ビット列から検索クエリに含まれる数字のビットが所定の値であるビット列を求める第５のステップと、
前記プロセッサが、前記辞書と前記ビット列を用いて、検索クエリに含まれる数字について前記多段ビット列における前記Ｒａｎｋを計算する第６のステップと、をさらに含むことを特徴とする数列データ検索方法。
【請求項７】
請求項５に記載の数列データ検索方法であって、
前記プロセッサが、前記数列データの０からＫ−１の各数字に対して、前記数列データ上の出現回数がｎ回となる位置を返すＳｅｌｅｃｔを計算した結果を辞書として保持する第７のステップと、
前記プロセッサが、前記辞書の範囲外における前記数列データ上の出現回数について、前記多段ビット列から検索クエリに含まれる数字のビットが所定の値であるビット列を求める第８のステップと、
前記プロセッサが、前記辞書と前記ビット列を用いて、検索クエリに含まれる数字について前記多段ビット列における前記Ｓｅｌｅｃｔを計算する第９のステップと、をさらに含むことを特徴とする数列データ検索方法。
【請求項８】
請求項５に記載の数列データ検索方法であって、
前記数列データの０からＫ−１の各数字に対して、前記多段ビット列から所定のビットが所定値のビット列を求めることにより前記多段ビット列からＬｏｏｋｕｐの計算を実行する第１０のステップ、をさらに含むことを特徴とする数列データ検索方法。
【請求項９】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリと、を備えた計算機で、入力された数列データを保持し、検索クエリを受け付けて、前記受け付けた前記検索クエリから前記数列データを検索するプログラムであって、
前記数列データの分岐数Ｋを受け付けて、前記数列データからＫ分木を構築する第１のステップと、
前記分岐数Ｋから前記数列データをＫ進数列に変換し、前記構築したＫ分木のうち葉ノード以外のノードにおいて、分岐数Ｋの２を底とする対数と等しいかより大きい整数の中で最小の値ｚを算出し、前記Ｋ進数列の０からＫ−１の各数字を前記最小の値ｚ桁で２進数列化し、前記最小の値ｚ本のビット列に各桁を格納する多段ビット列を含む多分岐ウェーブレット木データを構築する第２のステップと、
前記検索クエリに含まれる検索対象の数字の位置のビットが１であるビット列を前記多段ビット列から求める第３のステップと、
を前記計算機に実行させることを特徴とするプログラム。
【請求項１０】
請求項９に記載のプログラムであって、
前記数列データの０からＫ−１の各数字に対して、前記数列データ上の位置ｐまでに出現する回数を返すＲａｎｋを計算した結果を辞書として保持する第４のステップと、
前記辞書の範囲外における前記数列データ上の位置について、前記多段ビット列から検索クエリに含まれる数字のビットが所定の値であるビット列を求める第５のステップと、
前記辞書と前記ビット列を用いて、検索クエリに含まれる数字について前記多段ビット列における前記Ｒａｎｋを計算する第６のステップと、をさらに含むことを特徴とするプログラム。
【請求項１１】
請求項９に記載のプログラムであって、
前記数列データの０からＫ−１の各数字に対して、前記数列データ上の出現回数がｎ回となる位置を返すＳｅｌｅｃｔを計算した結果を辞書として保持する第７のステップと、
前記辞書の範囲外における前記数列データ上の出現回数について、前記多段ビット列から検索クエリに含まれる数字のビットが所定の値であるビット列を求める第８のステップと、
前記辞書と前記ビット列を用いて、検索クエリに含まれる数字について前記多段ビット列における前記Ｓｅｌｅｃｔを計算する第９のステップと、をさらに含むことを特徴とするプログラム。
【請求項１２】
請求項９に記載のプログラムであって、
前記数列データの０からＫ−１の各数字に対して、前記多段ビット列から所定のビットが所定値のビット列を求めることにより前記多段ビット列からＬｏｏｋｕｐの計算を実行する第１０のステップ、をさらに含むことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、数列データまたは文字列データの検索に関し、特に、文字列または文書の検索を行う検索装置の改良に関する。
【背景技術】
【０００２】
オフィスにおける文書情報の電子化、インターネットの普及・拡大により、膨大な量の電子文書が作成され、蓄積されている。こうして作成及び蓄積された電子文書から、所望の情報を抽出するため、高速に検索を行う技術が重要となっている。ウェーブレット木は数列データを検索するために設計されたデータ構造であり、圧縮接尾辞配列等の文書検索技術に用いられている。また、近年では、ウェーブレット木をＸＭＬ文書の検索に利用することが考えられている。
【０００３】
ウェーブレット木では、数列データが圧縮された状態で保持されており、Rank、Select、Lookupの３種のデータ検索が可能である。この３種のデータ検索方法は以下のような関数として表現される。Ｒａｎｋ（ｃ，ｐ）は保持された数列上のｐの位置までに、数字ｃが含まれる数を返す関数であり、Ｓｅｌｅｃｔ（ｃ，ｎ）はｎ番目の数字ｃが出現する数列上の位置を返す関数であり、Ｌｏｏｋｕｐ（ｐ）は数列上のｐの位置にある数字を返す関数である。図１８は、数列データ「３１４１０４２１０３」におけるデータ検索の一例を示している。
【０００４】
図１８において、Ｒａｎｋ（１，５）は数字「１」が５番目の位置までに２回出現していることから、「２」となる。Ｓｅｌｅｃｔ（４，１）は数字「４」が１番目に出現する場所が３番目の位置であることから、「３」となる。Ｌｏｏｋｕｐ（５）は５番目の位置にある数字が「０」であることから値も「０」となる。
【０００５】
ウェーブレット木は、図１９に示すように、通常は２分木を元にしたデータ構造である。数列データ１０１内にある各数字は、どの符号語も他の符号語の接頭語にならないという条件（接頭語条件）を満たす形で２進数表現により符号化されており、構造の主となる２分木は、この２進数表現に合わせた形で構成されている。そして、２分木の葉ノードは各数字に対応した形となっている。また、前記２分木では、各分岐点において０、１が割り振られ、数字の２進数表現を辿れば、数字に対応した葉へ到達できる。葉ノード以外のノードにおいては、そのノードの子孫にある葉に対応した数字からなる、数列データ１０１の部分列の情報を保持する。この部分列の情報は、各数字が対応した子孫にある葉ノードへ辿るために向かう子ノードの方向、０、１を元に部分列の各数字を０、１に置き換え得られたビット列となっている。
【０００６】
図１９では、数列データ「３１４１０４２１０３」にある数字０、１、２、３、４への２進数表現の一例と、その２進数表現によって生成されたウェーブレット木を構成する２分木と２分木内に登録されたデータを示している。
【０００７】
図１９において、数字「１」は「０１」と２進数で表現されるが、図中根ノード２０１から分岐を２進数表現に合わせて０、１と辿ることで、数字１に対応した葉ノード２０３へ到達できることが分かる。すなわち、各数字の２進数表現は、数字に対応した子ノードへ到達するための分岐に対応している。根ノード２０１でのビット列の登録について、１０進数の数字「１」、「２」、「３」では２進数表現の先頭の数字２０４が「０」であるが、「０」、「４」では「１」であるため、数列データ「３１４１０４２１０３」において、「１」、「２」、「３」を、「０」に、「４」を「１」に置き換えることで得られる、「００１０１１００１０」というビット列が根ノード２０１に登録される。
【０００８】
根ノード２０１から「０」の方向にある子ノード２０２で、子孫にある葉ノードは、数字「１」、「２」、「３」に対応していることから、数列データ「３１４１０４２１０３」のうち数字「１」、「２」、「３」からなる部分数列「３１１２１３」として生成されたビット列が登録される。「２」、「３」の２進数表現の２番目の数字２０５が「０」であるが、「１」は「１」であるため、「０１１０１０」が登録される。他の葉ノード以外のノードでも同様な形で部分数列が生成され、上述のビット列の形で各ノードに登録される。
【０００９】
ウェーブレット木へのＲａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐは、各ノードに保持されたビット列へのＲａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐから得られた結果から計算される。ビット列へのＲａｎｋ、Ｓｅｌｅｃｔ、ＬｏｏｋｕｐはSuccinct Bit Vectorと呼ばれる構造で、高速に計算可能である（例えば、非特許文献１）。このSuccinct Bit Vectorでは、ビット列が多くの場合、例えば、３２ビット整数の配列として格納される。ビット列へのＬｏｏｋｕｐ（ｐ）の計算は、ｐ／３２が商＝ｑ、余り＝ｒのとき、配列のｑ＋１番目の要素のｒ番目のビットの値が０か１をビット演算で計算することで求められる。
【００１０】
Ｒａｎｋ、Ｓｅｌｅｃｔの計算では、ビット列を大まかなブロックに分け、ブロックの終わり部分にあるビットに相当する値等を事前に計算して、これを辞書と呼ばれるデータ構造に保持することで、高速な計算が可能である（例えば、非特許文献１）。
【００１１】
例えば、Ｒａｎｋの場合では、ビット列をブロックに分け、ブロックの終わりの部分にビットのＲａｎｋの値が計算され、辞書として保持されている。このため、辞書を利用することで、辞書にある位置までのＲａｎｋの値と、辞書でカバーされていない部分のＲａｎｋを計算し、足し合わせることで、任意の位置に対するＲａｎｋの答えが得られる。このようにすれば、ビット列全体を走査することなく、Ｒａｎｋの値を定数オーダーで計算できる。Ｓｅｌｅｃｔの場合も、少し複雑ではあるが、同様の計算が行われる。
【先行技術文献】
【非特許文献】
【００１２】
【非特許文献１】Navarro, G. and Makinen, V., Compressed full-text indexes, ACM Computing Surveys 39(1), 2007
【非特許文献２】Ferragina, P., Manzini, G., Makinen, V., and Navarro, G., Compressed representations of sequences and full-text indexes, ACM Transactions on Algorithms 3(2): Article 1, 2007.
【発明の概要】
【発明が解決しようとする課題】
【００１３】
ウェーブレット木は２分木からなるデータ構造であるが、これを多分木、例えば、Ｋ分木１４０１へ拡張することで、木の高さが低くなることから、Ｒａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐ計算時に辿る段数が削減されるため、高速化が期待される。
【００１４】
しかしながら、葉ノードに辿るまでの各ノードにおけるＲａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐの計算は、上記のようなビット列である２進数ではなく、Ｋ進数となるため、Succinct Bit VectorをＫ進数が扱えるように拡張する必要がある。そこで、非特許文献２では、Succinct Bit Vectorを一般化し、整数０からＫ−１を並べたＫ進数列に対して、Ｋが比較的小さい場合、０からＫ−１の各数字を符号化し、Ｒａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐの計算を可能とする方法が提案されている。この場合も、辞書情報と辞書の範囲外である短いK進数列の符号語に対して表が用意される。
【００１５】
ここで、Ｋ進数列データの長さをｎとしたとき、辞書サイズは少なくとも
２＊Ｋ＊ｎ＊ｌｇ（ｌｇ（ｎ））／ｌｏｇ（Ｋ，ｎ）ビット
となる。ここで、ｌｇ（ｎ）は２を底とする対数より大きい最小の整数を示し、ｌｏｇ（Ｋ，ｎ）はＫを底とする対数より大きい最小の整数を返す関数を表す。
【００１６】
Ｋ進数列の長さがｎの時、非圧縮状態におけるデータサイズはｎ＊ｌｇ（Ｋ）ビットとなるため、ｎが巨大になるほど、データサイズに対して、辞書サイズは相対的に小さくなる。しかしながら、実際には、Ｋ＝４のとき、長さ４０億の４進数列に対して、数列自体のデータサイズは１０ＧＢとなるが、辞書のサイズは１１．７ＧＢとなり、数列自体のデータサイズより大きくなる。また、ウェーブレット木内では、数列データは、葉ノード以外のノードにおいて、元の数列データ長よりも短いＫ進数列として保持されることから、既存手法の問題点はより顕著になる。
【００１７】
そこで本発明は、上記問題点に鑑みてなされたもので、検索速度を損なうことなく、より小さなデータ領域で計算する手法を提供することを目的とする。
【課題を解決するための手段】
【００１８】
本発明は、プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納する記憶装置と、を備え、入力された数列データを保持し、検索クエリを受け付けて、前記受け付けた前記検索クエリから前記数列データを検索する数列データ検索装置であって、前記数列データの分岐数Ｋを受け付けて、前記数列データからＫ分木を構築するＫ分木構築部と、前記分岐数Ｋから前記数列データをＫ進数列に変換し、前記構築したＫ分木のうち葉ノード以外のノードにおいて、分岐数Ｋの２を底とする対数と等しいかより大きい整数の中で最小の値ｚを算出し、前記Ｋ進数列の０からＫ−１の各数字を前記最小の値ｚ桁で２進数列化し、前記最小の値ｚ本のビット列に各桁を格納する多段ビット列を含む多分岐ウェーブレット木データ構築部と、前記検索クエリに含まれる検索対象の数字の位置のビットが所定値であるビット列を前記多段ビット列から求める検索部を備える。
【発明の効果】
【００１９】
したがって、本発明によれば、分岐数を４とした場合、葉以外ノードにおいて保持されるビット列は漸近的に２倍となり、また、Ｒａｎｋ、Ｓｅｌｅｃｔのために保持される辞書サイズも漸近的に２倍となるが、木の高さは半減するため、保持されるビット列、辞書サイズの合計は従来のウェーブレット木と変わらない。一方、計算速度においては、木の高さは半減するが、各ノードでの演算速度は、ビット演算が非常に高速であることから、ほとんど変わらないため、全体でのＲａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐの演算速度が２倍になる。
【図面の簡単な説明】
【００２０】
【図１Ａ】本発明の実施形態の、数列データ検索装置１の構成例を示すブロック図である。
【図１Ｂ】本発明の実施形態の、数列データ検索装置１のソフトウェアの構成例を示すブロック図である。
【図２】本発明の実施形態の、多分岐ウェーブレット木データ部１０７の概要を示す図である。
【図３】本発明の実施形態の、多分岐ウェーブレット木データ部の構築処理４０７の概要の説明図である。
【図４】本発明の実施形態のＫ分木構築部４０８によって実行される処理のフローチャートである。
【図５】本発明の実施形態のＫ進数列記録構造１０４の構築処理の概要の説明図である。
【図６】本発明の実施形態の多分岐ウェーブレット木データ部の構築部４０７の処理のデータの流れの説明図である。
【図７】本発明の実施形態の検索部４１３による検索処理のデータの流れを説明する図である。
【図８】本発明の実施形態の検索部４１３によって実行される処理の概要の説明図である。
【図９】本発明の実施形態のRank計算によって実行される処理のフローチャートである。
【図１０】本発明の実施形態のSelect計算によって実行される処理のフローチャートである。
【図１１】本発明の実施形態のLookup計算によって実行される処理のフローチャートである。
【図１２】本発明の実施形態の辞書を用いたＫ進数列のRank計算の流れを説明する図である。
【図１３】本発明の実施形態のビットベクトル抽出部によって実行される処理のフローチャートである。
【図１４】本発明の実施形態の４分岐ウェーブレット木の構造を示す図である。
【図１５】本発明の実施形態の４分岐ウェーブレット木におけるRank計算の流れを説明する図である。
【図１６】本発明の実施形態の４分岐ウェーブレット木の非葉ノードに記録された多段ビットベクトルと辞書によるRank計算の流れを説明する図である。
【図１７】本発明の実施形態の４分岐ウェーブレット木の非葉ノードに記録された多段ビットベクトルの要素から所望の数字のビットのみ立ったビットベクトルを取り出す方法を説明する図である。
【図１８】従来例を示し、数列データ１０１に対するRank、Select、Lookupをクエリとする検索の一例を示す図である。
【図１９】従来のウェーブレット木の構造を示す図である。
【発明を実施するための形態】
【００２１】
以下、本発明の実施形態を添付図面に基づいて説明する。
【００２２】
図１Ａ、図１Ｂは、本発明の実施形態の数列データ検索装置１の構成例を示す図である。数列データ検索装置１は、ＣＰＵ（Central Processing Unit）４０１、主記憶装置（メモリ）４０２、補助記憶装置４０３、ユーザインタフェース部４０６を備えた計算機で構成される。この数列データ検索装置１は、ＬＡＮ（Local Area Network）等のネットワーク４０５を介して外部のネットワークに接続されている。
【００２３】
ＣＰＵ４０１は、主記憶装置４０２に格納されたプログラム（多分岐ウェーブレット木データ構築部４０７、Ｋ分木構築部４０８、数列登録部４０９、Ｋ進数列記録構造構築部４１０、Ｋ進数列登録部４１１、辞書作成部４１２、検索部４１３、Ｋ進数列検索部４１７、ビット列検索部４２１）を実行する中央演算装置である。
【００２４】
主記憶装置４０２は、上記プログラム及び上記プログラムの実行に用いるＫ分木１０５、Ｋ進数配列データ等を記憶するＲＡＭ（Random Access Memory）等の記憶装置である。主記憶装置４０２は、数列データ１０１も、必要があれば一時的に記憶する。補助記憶装置４０３は、数列データ１０１や上記プログラム等を格納するＨＤＤ等の記憶装置または記憶媒体である。
【００２５】
リムーバブルメディア４０４は、ウェーブレット木の構造、数列データ１０１等を記録したＣＤ−ＲＯＭや、ＤＶＤ等の記録媒体である。補助記憶装置４０３およびリムーバブルメディア４０４に記録された各データは、必要に応じて数列データ検索装置１の起動時に主記憶装置４０２に読み出される。
【００２６】
ユーザインタフェース部４０６は、ユーザインタフェースを提供する入出力装置（例えば、キーボード、マウス、ディスプレイ）である。
【００２７】
以上に示す装置構成において、ＣＰＵ４０１は、主記憶装置４０２、補助記憶装置４０３、リムーバブルメディア４０４、又は、ネットワーク４０５を介した外部から、必要に応じて数列データ１０１を取得する。その後、ＣＰＵ４０１は、取得した数列データ１０１に基づいて、多分岐ウェーブレット木データ部１０７を構築する。
【００２８】
図１Ａにおいて、数列データ１０１、多分岐ウェーブレット木データ部１０７は、主記憶装置４０２、補助記憶装置４０３、リムーバブルメディア４０４、ネットワーク４０５上の装置に格納される例を示したが、ＣＰＵ４０１が読み書き可能な装置上であればよい。例えば、数列データ１０１を補助記憶装置４０３に格納し、多分岐ウェーブレット木データ部１０７を主記憶装置４０２に生成して格納するようにしても良い。
【００２９】
ＣＰＵ４０１は、各機能部のプログラムに従って動作することによって、所定の機能を実現する機能部として動作する。例えば、ＣＰＵ４０１は、多分岐ウェーブレット木データ構築プログラムに従って動作することで多分岐ウェーブレット木データ構築部４０７として機能する。他のプログラムについても同様であり。ＣＰＵ４０１はＫ進数列記録構造構築プログラムに従って動作することで、Ｋ進数列記録構造構築部４１０として機能し、また、検索プログラムに従って動作することでＣＰＵ４０１は検索部４１３として機能する。さらに、ＣＰＵ４０１は、各プログラムが実行する複数の処理のそれぞれを実現する機能部としても動作する。
【００３０】
多分岐ウェーブレット木データ構築部４０７、Ｋ進数列記録構造構築部４１０及び検索部４１３の各機能を実現するプログラム、テーブル等の情報は、補助記憶装置４０３やリムーバブルメディア４０４や不揮発性半導体メモリ、ハードディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。
【００３１】
図２は、多分岐ウェーブレット木データ部１０７の概要を示す図である。多分岐ウェーブレット木データ部１０７は、後述のＫ分木構築部４０８により構築されたＫ分木１０５と後述の数列登録部４０９により、Ｋ分木１０５の葉ノード以外のノードに、後述のＫ進数列記録構造１０４を設けた構造である。Ｋ進数列記録構造１０４は、後述の多段ビット列１０４１と後述の辞書１０４２からなるデータ構造である。
【００３２】
図３は、本発明の実施形態の多分岐ウェーブレット木データ構築部４０７の処理の概要を示す図である。個々の処理の概略を述べる。
【００３３】
＜Ｋ分木の構築４０８＞
多分岐ウェーブレットの分岐数をＫとし、０からＭの数字から構成される数列データ１０１を入力データとする。０からＭの各数字には、Ｋ進数列からなる符号語が、前記背景技術で述べた接頭語条件を満たす形で割り振られる。
【００３４】
Ｋ分木処理部４０８は予め設定されたＫ進数に基づいてＫ分木１０５を生成し、数列登録部４０９はＫ分木１０５の葉ノード以外のノードに、後述のＫ進数列記録構造１０４を付加して分岐ウェーブレット木データ部１０７を構築する。なお、Ｋ進数の設定は数列データ検索装置１のユーザインターフェース部４０６で行うことができる。
【００３５】
図４は、本発明の実施形態において、予め設定されたＫ進数表現を用いてＫ分木構築部４０８で行われる処理の一例を示すフローチャートである。以下、Ｋ分木構築部４０８の各処理について説明する。なお、この処理は、数列データ検索装置１の利用者または管理者などによって開始される。
【００３６】
まず、ステップＳ１０１では、Ｋ分木構築部４０８を実行するＣＰＵ４０１は、０からＭの数字を表す変数ｉを０にセットする。次に、ステップＳ１０２では、変数ｉに割り当てられたＫ進数表現をｆとする。ここで、Ｋ進数表現とは前記従来例の１９で示したように、入力された数列データ１０１をＫ分木のノードに設定し、各ノードにビット列を設定するための変換情報である。このＫ進数表現については後述する。
【００３７】
ステップＳ１０３では、ＣＰＵ４０１が、現在処理の対象としているノードの位置を表す変数をｖとし、変数ｖに根のノードをセットする。次に、ステップＳ１０４ではＫ進数表現ｆの先頭の数字を変数ｋに設定する。そして、ステップＳ１０５では、Ｋ進数表現ｆの先頭の数字を削除する。
【００３８】
ステップＳ１０６では、ＣＰＵ４０１が、変数ｖが示すノードが子ノードを持つか否かを判定し、変数ｖが示すノードが子ノードを持つ場合にはステップＳ１０８へ進み、そうでない場合にはステップＳ１０７へ進む。
【００３９】
ステップＳ１０７では、変数ｖが示すノードにｋ個の子ノードを作成して、０からｋ−１の番号を設定する。そして、ステップＳ１０８では、変数ｖを変数ｖが現在示しているノードのｋ番目の子ノードにセットし直す。
【００４０】
ステップＳ１０９では、Ｋ進数表現ｆの要素がなくなるまで、ステップＳ１０３〜Ｓ１０８までの処理を繰り返す。そして、Ｋ進数表現ｆの要素がなくなると、ステップＳ１１０に進んで、変数ｖを数字ｉに該当する葉ノードとする。そして、ＣＰＵ４０１は、変数ｉに１を加算する。
【００４１】
ステップＳ１１１では、変数ｉが所定値Ｍより大きくなるまで、ステップＳ１０２〜Ｓ１１０までの処理を繰り返す。
【００４２】
上記の処理によって、図２で示したようなＫ分木１０５が生成されて主記憶装置４０２等に保持される。
【００４３】
＜数列登録部４０９＞
数列データ登録部４０９は、数列データ１０１からＫ分木１０５の葉ノード以外のノードについて、Ｋ進数列記録構造（Ｋ進数列データ）１０４の登録を行う。図５は、本発明の実施形態のＫ分木１０５の葉ノード以外のノードへデータを登録する数列データ登録部４０９の処理の一例を示すフローチャートである。このフローチャートは、図４のＫ分木構築部４０８の処理の後に実行される。図５に示す数列データ登録部４０９の処理により、多分岐ウェーブレット木データ部１０７が構築される。以下、Ｋ分木１０５の葉ノード以外のノードへのデータ登録の処理について説明する。
【００４４】
まず、ステップＳ２０１で数列データ登録部４０９を実行するＣＰＵ４０１は、Ｋ分木１０５の葉ノード以外の各ノードに後述のＫ進数列記録構造１０４を作成する。次に、ステップＳ２０２では、数列データ１０１の先頭の数字を取り出し、これを変数ｄとする。ステップＳ２０３でＣＰＵ４０１は、変数ｄに設定した数列データ１０１の先頭の数字を削除する。
【００４５】
ステップＳ２０４では、ＣＰＵ４０１は、変数ｄに割り当てるＫ進数表現をｆとする。ステップＳ２０５では、現在処理対象となっているノードをあらわす変数をｖとし、根のノードを変数ｖにセットする。Ｓ２０６では、Ｋ進数表現ｆの先頭の数字を取り出して、変数ｋにセットする。そして、ステップＳ２０７では、変数ｋにセットしたＫ進数表現ｆの先頭の数字を削除する。
【００４６】
次に、ＣＰＵ４０１はステップＳ２０８で、現在処理対象となっている変数ｖが示すノードに設定されるＫ進数列記録構造１０４に変数ｋを追加登録する。そして、ＣＰＵ４０１はステップＳ２０９で変数ｖを、変数ｖが現在示しているノードのｋ番目の子ノードにセットする。
【００４７】
ステップＳ２１０ではＣＰＵ４０１が、Ｋ進数表現ｆの要素がなくなるまで、ステップＳ２０６〜Ｓ２０９までの処理を繰り返す。
【００４８】
Ｋ進数表現ｆの要素がなくなったステップＳ２１１では、ＣＰＵ４０１が、数列データｄの要素がなくなるまで、Ｓ２０２〜Ｓ２１０までの処理を繰り返す。
【００４９】
数列データｄの要素がなくなったステップＳ２１２では、ＣＰＵ４０１が、後述の辞書作成部４１２により、各ノードに設定されるＫ進数列記録構造１０４に辞書１０４２を作成する。
【００５０】
以上の処理によって、Ｋ分木１０５の葉ノード以外のノードには、図２のようにＫ進数列記録構造１０４が付加されて分岐ウェーブレット木データ部１０７が構築される。
【００５１】
Ｋ進数列記録構造１０４は、多段ビット列１０４１によるＫ進数列のデータを記録・保持し、検索のための辞書１０４２を保持する。以下、Ｋ進数列記録構造構築部４１０の各処理について説明する。
【００５２】
＜Ｋ進数列登録部４１１＞
Ｋ進数列登録部４１１は、Ｋの２を底とする対数より大きい整数の中で、最小の値を変数ｚに設定する。Ｋ進数列記録構造１０４は、１からｚまでの番号が振られたｚ本の整数配列（以下、多段ビット列）を用いて、Ｋ進数列を記録する。
【００５３】
Ｋ進数列毎の各整数配列について、登録されている最後尾のビットを保持している配列要素と、この配列要素において、最後尾のビットの保持されているビットでの位置は全て等しい。これらの位置を保持する変数をそれぞれａ、ｂとする。
【００５４】
初期状態では、変数ａ、ｂは、Ｋ進数列登録部４１１によって共に１にセットされている。０からＫ−１を含む変数ｋは、Ｋ進数列登録部４１１によって次の形で記録される。Ｋ進数列登録部４１１は、変数ｋの２進数列表現をｍとし、ｍのｉ番目の数字が１のとき、ＣＰＵ４０１は、ｉ番目の配列のａ番目の配列要素で整数を表すビット列のｂ番目のビットを立てる（１にセットする）。ＣＰＵ４０１は、ｍを構成する数字で１となっている２進数列表現の全てについて、上記の内容で登録を行う。登録終了後、ＣＰＵ４０１は、変数ｂに１を足す。ＣＰＵ４０１は、変数ｂが配列要素を構成する整数のビット幅より大きくなる場合には、変数ｂを１にセットし、変数ａに１を足す。
【００５５】
＜辞書作成部４１２＞
辞書作成部４１２は、Ｋ進数列のＲａｎｋ、Ｓｅｌｅｃｔの計算に用いられる辞書１０４２を構築する。辞書作成部４１２は、０からＫ−１の値を含む変数ｋについて、ｚ本の各配列から、変数ｋの値に該当する部分のビットのみが立っている整数列を作成する。
【００５６】
整数列を生成した以降は、公知または周知の手法を用いて、Ｒａｎｋ、Ｓｅｌｅｃｔそれぞれについて辞書１０４２の作成が可能である。例えば、非特許文献１に基づいて辞書１０４２を作成することができる。
【００５７】
Ｒａｎｋに関する辞書１０４２としては、数字ｃが数列データ１０１上のある位置ｐまでに出現する回数を返す計算をＲａｎｋ（ｃ，ｐ）とする時、数列データ１０１上の０からＫ−１の各数字に対し、多段ビット列１０４１のＲａｎｋを計算した結果を辞書作成部４１２がデータ構造（１０４１）に保持する。
【００５８】
また、Ｓｅｌｅｃｔに関する辞書１０４２としては、数字ｃがある回数ｎ出現するときの数列データ１０１上の位置を返す計算をＳｅｌｅｃｔ（ｃ，ｎ）とする時、数列データ１０１上０からＫ−１の各数字に対し、多段ビット列１０４１のＳｅｌｅｃｔを計算した結果を辞書作成部４１２がデータ構造（１０４１）に保持する。
【００５９】
＜多分岐ウェーブレット木データ構築部４０７＞
図６は、本発明の実施形態の多分岐ウェーブレット木データ部１０７の構築部４０７の処理におけるデータの流れを説明するタイムチャートである。
【００６０】
まず、ユーザインタフェース部４０６を介して機能するプログラム（Ｋ分木構築部４０８）を数列データ検索装置１で実行し、主記憶装置４０２上にＫ分木１０５を構築する。
【００６１】
次に、ＣＰＵ４０１は、多分岐ウェーブレット木データ構築部４０７として機能するプログラムを実行し、主記憶装置４０２上にある、Ｋ分木１０５と数列データ１０１を参照し、主記憶装置４０２上に多分岐ウェーブレット木データ部１０７を構築する。
【００６２】
ＣＰＵ４０１は、以上の処理の実行が終了すると、構築処理終了通知をユーザインタフェース部４０６に出力する。
【００６３】
多分岐ウェーブレット木データ構築部４０７は、まず、Ｋ分木構築部４０８で数列データ１０１を読み込んでＫ分木１０５を生成する。次に、数列データ登録部４０９が数列データ１０１からＫ分木１０５の葉ノード以外のノードについて、Ｋ進数列記録構造（Ｋ進数列データ）１０４の登録を行う。Ｋ進数列記録構造１０４の登録は、数列データ登録部４０９とＫ進数列登録部４１１によって行われる。
【００６４】
図７は、本発明の実施形態の検索部４１３による検索処理のデータの流れを説明するタイムチャートである。
【００６５】
まず、ＣＰＵ４０１は、図６で示したように多分岐ウェーブレット木データ構築部４０７が構築した、多分岐ウェーブレット木データ部１０７を補助記憶装置４０３、リムーバブルメディア４０４又はネットワーク４０５を介して接続される図示しない装置の記憶領域から主記憶装置４０２上にロードする。
【００６６】
次に、ユーザインタフェース部４０６を介して、ユーザからＲａｎｋ、Ｓｅｌｅｃｔ又はＬｏｏｋｕｐのうちいずれかの検索クエリが数列データ検索装置１に入力され、検索部４１３が受け付ける。検索部４１３は、Ｋ進数列検索部４１７とビット列検索部４２１を用いて検索を実行する。なお、検索クエリには、Ｒａｎｋ、Ｓｅｌｅｃｔ又はＬｏｏｋｕｐの何れかの検索コマンドと、検索対象の数字や位置などが含まれる。
【００６７】
図８は、本発明の第１の実施形態のＫ進数列検索部４１７を構成する検索部４１３で行われる処理の概要を示す図である。
【００６８】
検索部４１３では、ＣＰＵ４０１は、多分岐ウェーブレット木データ部１０７に対して、後述のＫ進数列検索部４１７を用いて検索クエリであるＲａｎｋ、Ｓｅｌｅｃｔ又はＬｏｏｋｕｐのいずれかの計算を行う。以下、検索部４１３の各処理について説明する。なお、Ｋ進数列検索部４１７は、検索コマンドがＲａｎｋであればＲａｎｋ計算部４１４を起動し、検索コマンドがＳｅｌｅｃｔであればＳｅｌｅｃｔ計算部４１５を起動し、検索コマンドがＬｏｏｋｕｐであればＬｏｏｋｕｐ計算部４１６を起動する。
【００６９】
＜Ｒａｎｋ計算部４１４の処理＞
Ｒａｎｋ（ｃ，ｐ）計算部４１４は、多分岐ウェーブレット木データ部１０７に登録された数列データ１０１について検索対象の数字ｃが位置ｐまでに出現する回数を結果として返す。
【００７０】
図９は、本実施形態のＲａｎｋ（ｃ，ｐ）計算部４１４の処理の一例を示すフローチャートである。以下、Ｒａｎｋ（ｃ，ｐ）計算部４１３の各処理について説明する。
【００７１】
まず、Ｒａｎｋ計算部４１３を実行するＣＰＵ４０１は、ステップＳ３０１で、検索対象の数字ｃに割り当てられたＫ進数表現を変数ｆとする。次に、ステップＳ３０２では、現在いるノードを表す変数をｖとし、変数ｖに根ノードをセットする。
【００７２】
ステップＳ３０３でＣＰＵ４０１は、Ｋ進数表現上の位置を表す変数をｑとし、変数ｑをｐにセットする。
【００７３】
ステップＳ３０４でＣＰＵ４０１は、Ｋ進数表現ｆの先頭の数字を取り出し、これを数字ｋとする。ステップＳ３０５でＣＰＵ４０１は、数字ｋにセットされたＫ進数表現ｆの先頭の数字を削除する。ステップＳ３０６でＣＰＵ４０１は、変数ｖが示すノードにあるＫ進数列記録構造１０４からＫ進数列検索部４１６のビット列検索部４２１により、Ｒａｎｋ（ｋ，ｑ）を計算し、この結果を変数ｑにセットする。
【００７４】
ステップＳ３０７でＣＰＵ４０１は、変数ｖをｖが現在示しているのｋ番目の子ノードにセットする。ＣＰＵ４０１は、ステップＳ３０８で、Ｋ進数表現ｆの要素がなくなるまで、上記ステップＳ３０４〜Ｓ３０７までの処理を繰り返す。そして、ＣＰＵ４０１は全てのＫ進数表現ｆの要素について上記処理を実行すると、ステップＳ３０９で変数ｑが、演算の結果として出力される。
【００７５】
＜Ｓｅｌｅｃｔ計算部４１５の処理＞
Ｓｅｌｅｃｔ（ｃ，ｎ）計算部４１５は、Ｋ分木１０５に登録された数列データ１０１について検索対象の数字ｃがｎ回目に出現する位置を結果として返す。図１０は、本実施形態のＳｅｌｅｃｔ（ｃ，ｎ）計算部４１４の処理の一例を示すフローチャートである。以下、Ｓｅｌｅｃｔ（ｃ，ｎ）計算部４１５の各処理について説明する。
【００７６】
Ｓｅｌｅｃｔ計算部４１５を実行するＣＰＵ４０１は、ステップＳ４０１で検索対象の数字ｃに割り当てられたＫ進数表現を変数ｆとする。
【００７７】
ステップＳ４０２でＣＰＵ４０１は、数字の出現回数を表す変数をｍとし、変数ｍに所定の回数ｎをセットする。ステップＳ４０３でＣＰＵ４０１は、現在いるノード（処理対象のノード）を表す変数をｖとし、この変数ｖを数字ｃに該当する葉ノードにセットする。そして、ステップＳ４０４でＣＰＵ４０１は、変数ｖを親ノードにセットする。
【００７８】
次に、ステップＳ４０５でＣＰＵ４０１は、Ｋ進数表現ｆの末尾の数字を取り出し、これを変数ｋとする。ステップＳ４０６でＣＰＵ４０１は、が数字ｋにセットしたＫ新数列ｆの末尾の数字を削除する。ステップＳ４０７でＣＰＵ４０１は、変数ｖが示すノードにあるＫ進数列記録構造１０４からＫ進数列検索部４１６のビット列検索部４２１により、Ｓｅｌｅｃｔ（ｋ，ｍ）を計算し、この結果を変数ｍにセットする。ステップＳ４０８でＣＰＵ４０１は、Ｋ進数表現ｆの要素がなくなるまで、上記ステップＳ４０４〜Ｓ４０７までの処理を繰り返す。
【００７９】
そして、Ｋ進数表現ｆの全ての要素について上記処理が完了するとステップＳ４０９でＣＰＵ４０１は変数ｍを、演算結果として出力する。
【００８０】
＜Ｌｏｏｋｕｐ計算部４１６の処理＞
Ｌｏｏｋｕｐ（ｐ）計算部４１５は、Ｋ分木１０５に登録された数列データ１０１の位置ｐに出現する数字を結果として返す。図１１は、本実施形態のＬｏｏｋｕｐ（ｐ）計算部４１６の処理の一例を示すフローチャートである。以下、Ｌｏｏｋｕｐ（ｐ）計算部４１６の各処理について説明する。
【００８１】
Ｌｏｏｋｕｐ計算部４１６を実行するＣＰＵ４０１は、ステップＳ５０１で現在いるノードを表す変数をｖとし、この変数ｖに根ノードにセットする。次に、ＣＰＵ４０１はステップＳ５０２で０からＫ−１の数字を表す変数をｋとする。
【００８２】
ステップＳ５０３でＣＰＵ４０１は、数列の位置を表す変数をｑとし、変数ｑに所定値ｐをセットする。ステップＳ５０４でＣＰＵ４０１は、変数ｖが示すノードにあるＫ進数列記録構造１０４からＫ進数列検索部４１７のビット列検索部４２１により、Ｌｏｏｋｕｐ（ｑ）を計算し、この結果を変数ｋにセットする。次にステップＳ５０５でＣＰＵ４０１は、変数ｖが示すノードにあるＫ進数列記録構造１０４からＫ進数列検索部４１７のビット列検索部４２１により、Ｒａｎｋ（ｋ，ｑ）を計算し、この結果を変数ｑにセットする。
【００８３】
ステップＳ５０６でＣＰＵ４０１は、変数ｖをｖが現在示しているノードのｋ番目の子ノードにセットする。そして、ステップＳ５０７では変数ｖが示すノードが葉ノードとなるまで、ＣＰＵ４０１は上記ステップＳ５０４〜Ｓ５０６までの処理を繰り返す。
【００８４】
変数ｖが示すノードが葉ノードに到達するとＣＰＵ４０１はステップＳ５０８で、変数vが示す葉ノードに対応する数字を、演算結果として出力する。
【００８５】
以上の処理によって、Ｋ分木１０５に登録された数列データ１０１の位置ｐに出現する数字がＬｏｏｋｕｐ（ｐ）計算部４１５によって計算される。
【００８６】
＜ビット列検索部４２１＞
Ｋ進数列検索部４１７において、ＣＰＵ４０１は、Ｋ進数列記録構造１０４に設定された検索用の辞書１０４２と多段ビット列１０４１への後述のビット列検索部４２１によりＫ進数列のＲａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐの計算を行う。これらの計算は、上記図９のステップＳ３０６、上記図１０のステップＳ４０７、上記図１１のステップＳ５０４、Ｓ５０５で行われる。
【００８７】
以下、Ｋ進数列検索部４１７における、Ｒａｎｋ、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐの各場合の処理について説明する。
【００８８】
＜Ｋ進数列Ｒａｎｋ計算部４１８の処理＞
Ｋ進数列Ｒａｎｋ（ｋ，ｑ）計算部４１８は、Ｋ進数列記録構造１０４に保持されたデータから、０からＫ−１の範囲に存在する数字ｋが位置ｑまでに出現する回数を結果として返す。
【００８９】
Ｋ進数列記録構造１０４では、Ｒａｎｋ計算のための検索用の辞書１０４２が保持されているため、公知または周知の技術を用いることで、検索用の辞書１０４２の範囲内にある値と、辞書１０４２の範囲外にあり、Ｋ進数列から直接Ｒａｎｋを計算する必要がある配列の要素番号の範囲が得られる（例えば、前記非特許文献１）。
【００９０】
図１２は、検索用の辞書１０４２と辞書１０４２の範囲外のＫ進数列から、Ｒａｎｋ（ｋ，ｑ）を計算する手順を示している。辞書１０４２では、ｚ本の整数配列からなる多段ビット列１０４１の要素ｉ−１番目までに数字ｋが出現した回数ｈは保持されている。しかし、ｉ番目の要素から、Ｋ進数列においてｑ番目の数字を保持しているｊ番目の配列要素については、辞書１０４２の範囲外であるとする。
【００９１】
このとき、ｚ本の整数配列からなる多段ビット列１０４１のｉ番目の要素からｊ番目の要素までの各要素に保持されている整数から、Ｒａｎｋを計算する必要がある。ビット列検索部４２１により、ｚ本の配列の各要素にあるｚ個の整数から数字ｋに該当した部分だけにビットが立った（例えば、所定値である１）整数が得られる。これにより、ｉからｊ番目の要素について得られた整数のＲａｎｋを計算し、出現回数ｈに加算することで、目的の値である数字ｋが位置ｑまでに出現する回数を得る。尚、この際に使用する整数型としては、３２ビット型、６４ビット型、１２８ビット型等、任意のビット幅のものが使用できる。
【００９２】
＜Ｋ進数列Ｓｅｌｅｃｔ計算部４１９の処理＞
次に、Ｋ進数列Ｓｅｌｅｃｔ（ｋ，ｍ）計算部４１９は、Ｋ進数列記録構造に保持されたデータから、０からＫ−１の数字ｋがｍ回目に出現する位置を結果として返す。Ｋ進数列Ｓｅｌｅｃｔ計算部４１９は、まずＫ進数列記録構造１０４に保持されているＳｅｌｅｃｔ計算のための検索用の辞書１０４２を参照し、数字ｋがｍより小さく最もｍに近い回数であるｎ回目に出現する位置の情報を探す。
【００９３】
Ｋ進数列Ｓｅｌｅｃｔ計算部４１９は、探索した位置をｈとすると、Ｋ進数列のあるｈ番目以降において、数字ｋがあるｍ−ｎ回目に出現する位置を求めることで、目的の数字ｋを得ることができる。ここで、Ｋ進数列が３２ビット整数型の配列で格納されているとし、出現回数ｈを３２で割った商をｉとすると、ビット列検索部４２１より、ｚ本の配列のｉ番目の要素から、ｋに該当した部分だけにビットが立った３２ビット整数を取得し、順にＳｅｌｅｃｔを計算しｍ−ｎ回目にビットが出現した位置を求めることができる。
【００９４】
このように、辞書１０４２を用いることにより、Ｓｅｌｅｃｔを計算する範囲が絞られることから、高速な計算が可能となる。
【００９５】
＜Ｋ進数列Ｌｏｏｋｕｐ計算部４２０の処理＞
Ｋ進数列Ｌｏｏｋｕｐ（ｑ）計算部４２０は、Ｋ進数列記録構造１０４に保持されたＫ進数列データのｑの位置にある数字を結果として返す。位置ｑを所定のビット幅で割ったときの商をｘ、余りをｙとする。Ｋ進数列記録構造１０４に保持された各ｚ本の整数配列に対し、ｘ＋１番目の配列にある整数を表現したビット列のｙ番目のビットが０か１になっているかを調べることで、Ｋ進数列データの位置ｑにある数字の２進数表現を取得できる。そして、この２進数表現を１０進数表現などへ変換することで、目的の数字を得る。
【００９６】
ビット列検索部４２１では、ＣＰＵ４０１は、０からＫ−１の範囲にある数字ｋと配列番号ｉについて、Ｋ進数列記録構造１０４に保持されているｚ本の整数配列データから、各配列にあるｉ番目の整数から、数字ｋに関連する部分だけビットが立ったビット列で表現される整数を計算する。尚、整数型としては、３２ビット型整数、６４ビット型整数等が考えられる。
【００９７】
図１３は、本実施形態のビット列検索部４２１で行われる処理の一例を示すフローチャートである。以下、ビット列検索部４２１の各処理について説明する。
【００９８】
ビット列検索部４２１を実行するＣＰＵ４０１は、ステップＳ６０１で数字ｋのｚ桁を２進数で表したときの２進数列をｇとする。また、ステップＳ６０２でＣＰＵ４０１は、整数を表す変数をｗとする。そして、ステップＳ６０３でＣＰＵ４０１は変数ｗに１本目の配列のｉ番目の要素を代入する。
【００９９】
ステップＳ６０４，Ｓ６０５では、２進数列ｇの先頭の数字が０の時、変数ｗをビット反転させる。そして、ステップ６０６では２進数列ｇの先頭の数字を削除する。
【０１００】
ステップＳ６０７でＣＰＵ４０１は、配列の番号を表す変数をｊとし、この変数ｊに２をセットする。
【０１０１】
次に、ステップＳ６０８，Ｓ６０９，Ｓ６１０でＣＰＵ４０１は、２進数列ｇの先頭の数字が１のとき、変数ｗとｊ本目の配列のｉ番目の要素で論理積を演算して、変数ｗに代入する。一方、２進数列ｇの先頭の数字が０のとき、ステップ６１０で変数ｗと、ｊ本目の配列のｉ番目の要素をビット反転した値の論理積を演算して変数ｗに代入する。
【０１０２】
ステップＳ６１１でＣＰＵ４０１は、２進数列ｇの先頭の数字を削除する。そして、ステップＳ６１２でＣＰＵ４０１は、変数ｊに１を加算する。ステップＳ６１３では２進数列ｇの要素がなくなるまで、ＣＰＵ４０１は上記ステップＳ６０８〜Ｓ６１２までの処理を繰り返す。ＣＰＵ４０１は、全ての２進数列ｇの要素について上記処理が完了すると、ステップＳ６１４で変数ｗを、結果として出力する。
【０１０３】
以下、上記各処理の具体例について図１４〜図１７を用いて説明する。
【０１０４】
図１４は、本発明の実施形態において、Ｋ進数列のＫが「４」の場合について、数列データ検索装置１へ入力された数列データ１０１＝「３１４１０４２１０３」からＫ分木を構築する一例である。
【０１０５】
図１４において、数字０、１、２、３、４は、４進数により接頭語条件を満たす形で、それぞれ、００、１、０１、２、３と割り振られる。Ｋ分木構築部４０８によるＫ分木の構築では、Ｋ分木１０５が各数字に予め割り当てられたＫ進数表現に即して枝を伸ばしていく形で構築されており、各数字に割り当てられたＫ進数表現に即した形で子ノードを辿ることで、検索対象の葉ノードに到達できる。図１４において、Ｋ分木構築部４０８によって構築された４分木（１４０１）でも、数字０が根ノードから図４のステップＳ１０２〜Ｓ１０５に示した形で４分木を構成する。そして、根ノードから図中、「０」、「０」と辿ることで、数字０に対応した葉ノードに達していることが分かる。他の数字についても、同様に割り当てられた４進数表現に即して子ノードを辿ることで、数字に対応した葉ノードに到達していることが分かる。
【０１０６】
４分木１４０１への数列データ１０１の登録について、数列データ１０１＝「３１４１０４２１０３」を用いて図１４の一例を説明する。
【０１０７】
上記図５のステップＳ２０２〜Ｓ２０３で、先頭の数字「３」を数列データ１０１から取り出し、数列データ１０１の先頭からは削除する。数字「３」に対応する４進数表現は「２」である。上記図５のステップＳ２０５〜Ｓ２１０では、４進数表現から４分木を辿りながら、各ノードに対応した４進数を登録している。
【０１０８】
数字「３」に対応する４進数表現の長さは「１」で値は「２」であるため、根ノードに「２」を登録して終了となる。数字「３」に続いてデータに存在する「１」、「４」、「１」もそれぞれ、４進数表現は長さ１の「１」，「３」，「１」であるため、順に根ノードに数字「３」のときに続き、「２１３１」が登録される。数字「０」に対応する４進数表現は「００」であるため、根ノードに４進数表現の先頭の数字０を登録した後、図５のステップＳ２０９にあるように「０」に対応する子ノード１４０２へ移動し、４進数表現の次の数字「０」を、現在いるノード１４０２へ登録し、終了する。残りの数字についても同様な形で登録を行うことで、図１４にある形で葉ノード以外のノードにおいても４進数列が登録される。
【０１０９】
＜Ｋ進数表現について＞
Ｋ進数表現については、前記背景技術の図１９と同様であり、本実施形態では前記背景技術の２進数表現に代わって４進数表現を用いた例を示している。本実施形態では、数列データ１０１＝「３１４１０４２１０３」にある数字０、１、２、３、４への４進数表現の一例と、その４進数表現によって生成されたウェーブレット木を構成する４分木と４分木内に登録されたデータを示している。
【０１１０】
図１４において、上述のように数字「０」は「００」と４進数で表現され、数字「１」は「１」と４進数で表現され、数字「２」は「０１」と４進数で表現され、数字「３」は「２」と４進数で表現され、数字「４」は「３」と４進数で表現される。
【０１１１】
図中根ノードからの分岐を４進数表現に合わせて０、１と辿ることで、数字「２」に対応した葉ノードへ到達できる。各数字の４進数表現は、数字に対応した子ノードへ到達するための分岐に対応している。
【０１１２】
根ノードでのビット列の登録について、図１４では１０進数の数字「０」、「２」は４進数表現の先頭の数字１４０３が「０」で長さが２であるので、先頭の数字１４０３＝「０」のみを登録する。一方、「１」、「３」、「４」は、数字１４０３から「１」、「２」、「３」に変換される。このため、数列データ１０１＝「３１４１０４２１０３」において、「０」、「２」を「０」に変換し、「３」を「２」に変換し、「４」を「３」に変換することで得られる、「２１３１０３０１０２」という４進数列が根ノードに登録される。
【０１１３】
そして、根ノードから「０」の方向にある子ノード１４０２で、１０進数の数字「０」、「２」は、４進数表現の次の桁にある数字１４０４から４進数の数字「０」、「１」に対応していることから、数列データ「３１４１０４２１０３」のうち１０進数の数字「０」、「２」からなる部分数列を数字１４０４にある４進数から「０１０」として生成された４進数列がノード１４０２に登録される。他の葉ノード以外のノードでも同様な形で部分数列が生成され、上述の４進数列で各ノードに登録される。
【０１１４】
＜Ｒａｎｋ計算の一例＞
図１５〜図１７は、図１４において構築された４分木におけるＲａｎｋ計算の一例を示している。
【０１１５】
図１５では、次の手順でＲａｎｋ（２，７）の計算をしている。「２」の４進数表現は図１４より「０１」である。上記図９のステップＳ３０４で示したように、上記４進数表現により数列データ１０１を４進数列へ変換した値「２１３１０３０１０２」が根ノードに保持される。そして、根ノードに保持された４進数列「２１３１０３０１０２」からなる数列データ１５０１についてＲａｎｋ（０，７）を計算し、結果である「２」を次のＲａｎｋにおける数列の位置に設定する。
【０１１６】
図９に示したステップＳ３０５で、根ノードから「０」に対応した子ノード１５０２に移動し、現在いるノード１５０２において保持された数列「０１０」について、Ｒａｎｋ（１，２）を計算する。そして、最終結果である「１」を得ることができる。４進数におけるＲａｎｋ計算はＫ進数列Ｒａｎｋ計算部４１８で行われるが、この処理は次の図１６で説明する。
【０１１７】
図１６では、４進数列におけるＲａｎｋ（ｃ，ｐ）の計算について説明する。４進数を保持する多段ビット列１０４１を構成する整数配列の整数型を３２ビットとし、位置ｐを３２で割った商をｑ、余りをｒとする。また、商ｑ番目より前においては、ｑ−１番目の配列までにおける数ｃのＲａｎｋが検索用の辞書１０４２に計算されており、この例では「２０」であったとする。この時、Ｒａｎｋ（ｃ，ｐ）はｑ番目までの配列おける検索対象の数字ｃの数、ｑ＋１番目の配列におけるＲａｎｋ（ｃ，ｒ）と上記「２０」を足した数となる。
【０１１８】
各配列における４進数列は、実際は多段ビット列１０４１として記録されているため、多段ビット列１０４１から数ｃに対応したビットのみ立っている３２ビットを抽出し、Ｒａｎｋ（１，ｒ）を計算すればよい。
【０１１９】
図１７では、４進数列を格納している多段ビット列１０４１から、「２」に対応したビットのみが立っているビット列を取り出している。「２」の２進数表現は「１０」であるため、上記図１３に示したステップＳ６０３〜Ｓ６１１であるように、図中ビット列１はそのままにするが、図中ビット列２はビット反転を行い、論理積を計算する。この処理により、「２」に対応したビットのみが立つ（１となる）ビット列を取り出すことができる。数「０」、「１」、「３」についても同様の操作で所望のビット列を取り出すことができる。ビット反転と論理積の計算は非常に高速に計算することができるため、他の処理のオーバーヘッドに比べ、非常に軽い計算となる。
【０１２０】
図１５〜図１７を用いて、Ｒａｎｋ計算についての例を示したが、Ｓｅｌｅｃｔ、Ｌｏｏｋｕｐ計算でも上記Ｒａｎｋと同様の方法で計算が可能である。このように、４分木化することで木の探索段数は半減する一方、各ノードでの計算はビット演算分増加した程度であり、計算の負荷はほとんど変わらないため、２分木の場合の約２倍高速に計算することができる。葉ノード以外のノードで登録される辞書１０４２は非特許文献１の構成法によるSuccinct Bit Vectorと同様であり、「０」から「３」に対応するものをそれぞれ構成した場合、数列データの長さｎに対し、辞書１０４２のサイズは、少なくとも、
４＊２＊ｎ＊ｌｇ（ｌｇ（ｎ））／ｌｇ（ｎ）ビット
となる。
【０１２１】
本発明によれば、データサイズが１０ＧＢとなるような長さ４０億の４進数に対して、辞書１０４２のデータ量は５．８ＧＢとなり、前記従来例のSuccinct Bit VectorをＫ進数へ拡張したものの半分のサイズとなっている。
【０１２２】
以上、本発明の各実施形態について説明したが、上記実施形態は本発明の適用例を示したものであり、本発明の技術的範囲を上記各実施形態の具体的構成に限定する趣旨ではない。本発明の要旨を逸脱しない範囲において種々変更可能である。
【産業上の利用可能性】
【０１２３】
以上のように、本発明は、数列データを圧縮した状態で保持しながら、高速なデータアクセスを実現するための技術であり、数列データを文字列データに置き換えることで文字列や文書検索の要素技術として利用可能である。高速に文字列や文書検索を行う場合、できる限り多くの情報を効率よくメモリ上に展開することが有効であるため、メモリ使用量を抑えながら高速なデータアクセスを実現する本発明は、高速な情報検索装置に利用することができる。
【符号の説明】
【０１２４】
１  数列データ検索装置
１０４  Ｋ進数列記録構造
１０５  Ｋ分木
１０７  多分岐ウェーブレット木データ部
４０１  ＣＰＵ（中央演算装置）
４０２  主記憶装置
４０３  補助記憶装置
４０４  リムーバブルメディア
４０５  ネットワーク
４０６  インターフェース部
４０７  多分岐ウェーブレット木データ構築部
４０８  Ｋ分木構築部
４０９  数列登録部
４１０  Ｋ進数列記録構造構築部
４１１  Ｋ進数列登録部
４１２  辞書作成部
４１３  検索部
４１４  Ｒａｎｋ計算部
４１５  Ｓｅｌｅｃｔ計算部
４１６  Ｌｏｏｋｕｐ計算部
４１７  Ｋ進数列検索部
４１８  Ｋ進数列Ｒａｎｋ計算部
４１９  Ｋ進数列Ｓｅｌｅｃｔ計算部
４２０  Ｋ進数列Ｌｏｏｋｕｐ計算部
４２１  ビット列検索部
【図１Ａ】
0005736589.tif 000002
【図１Ｂ】
0005736589.tif 000003
【図２】
0005736589.tif 000004
【図３】
0005736589.tif 000005
【図４】
0005736589.tif 000006
【図５】
0005736589.tif 000007
【図６】
0005736589.tif 000008
【図７】
0005736589.tif 000009
【図８】
0005736589.tif 000010
【図９】
0005736589.tif 000011
【図１０】
0005736589.tif 000012
【図１１】
0005736589.tif 000013
【図１２】
0005736589.tif 000014
【図１３】
0005736589.tif 000015
【図１４】
0005736589.tif 000016
【図１５】
0005736589.tif 000017
【図１６】
0005736589.tif 000018
【図１７】
0005736589.tif 000019
【図１８】
0005736589.tif 000020
【図１９】
0005736589.tif 000021