(57)【要約】【課題】  各配列要素と文字列の比較のための文字列の圧縮データの展開処理の展開コストに起因するCSAの探索コストを削減する。【解決手段】  本発明は、入力されたデータDに対して、接尾辞の切り分けと並び替えを行い、添え字を抽出することによりSA配列を作成し、SA配列とデータDの文字列を圧縮しCSA記憶手段に格納する。SA配列から所定の値以上の頻度で参照されるSA配列と文字列を抽出し、これを圧縮せずに非圧縮領域Ｓ記憶手段に格納する。入力されたパターンＰに対し、２分探索の位置のSAエントリが非圧縮領域Ｓ記憶手段に存在するか否かを判定し、存在する場合には、該非圧縮領域Ｓ記憶手段からエントリを取得し、存在しない場合は、CSA記憶手段からエントリを取得し、パターンＰに合致するデータDの位置情報を結果集合として出力する。【選択図】  図４
2013148974.tif 000002
【特許請求の範囲】
【請求項１】
事前に与えられた接尾辞配列を有するデータDの中から任意のパターンＰの全ての出現位置を高速に探索するために構造化された索引(SA:Suffix Array)のデータ格納方法であって、
SA初期化手段が、前記データDが入力されると、該データDに対して、接尾辞の切り分けと並び替えを行い、並び替えられた接尾辞の添え字を抽出することによりSA配列を作成するSA初期化ステップと、
SA圧縮手段が、前記SA配列と前記データDの文字列をCSA(Compressed Suffix Array)の手法を用いて圧縮し、CSA記憶手段に格納するSA圧縮ステップと、
非圧縮領域Ｓ抽出手段が、前記SA配列から所定の値以上の頻度で参照されるSA配列と文字列を抽出し、非圧縮領域Ｓ記憶手段に格納する非圧縮領域Ｓ抽出ステップと、
パターンＰ２分探索手段が、入力されたパターンＰを配列要素と文字列を展開しながら２分探索を行い、該パターンＰに合致するデータDの位置情報を結果集合として出力するパターンＰ２分探索ステップと、
を行い、
前記パターンＰ２分探索ステップにおいて、
前記２分探索の位置のSAエントリが非圧縮領域Ｓ記憶手段に存在するか否かを判定し、存在する場合には、該非圧縮領域Ｓ記憶手段からエントリを取得し、
存在しない場合は、前記CSA記憶手段からエントリを取得する、
ことを特徴とするデータ格納方法。
【請求項２】
前記非圧縮領域Ｓ抽出ステップにおいて、
非圧縮領域の最大サイズＭを設定し、前記SA配列の参照確率が高い順にエントリを取り出し、該エントリのサイズＥを計算し、Ｍ−Ｅの値が０より大きい場合は、該エントリを前記非圧縮領域Ｓ記憶手段に格納する
請求項１記載のデータ格納方法。
【請求項３】
前記パターンＰ２分探索ステップにおいて、
前記非圧縮領域Ｓ参照手段または前記SA展開手段で取得した前記エントリの文字列が探索位置周辺であり、前記パターンＰに合致するものを抽出する
請求項１記載のデータ格納方法。
【請求項４】
事前に与えられた接尾辞配列を有するデータDの中から任意のパターンＰの全ての出現位置を高速に探索するために構造化された索引のデータ格納装置であって、
前記データDが入力されると、該データDに対して、接尾辞の切り分けと並び替えを行い、並び替えられた接尾辞の添え字を抽出することによりSA配列を作成するSA初期化手段と、
前記SA配列と前記データDの文字列をCSA(Compressed Suffix Array)の手法を用いて圧縮し、CSA記憶手段に格納するSA圧縮手段と、
前記SA配列から所定の値以上の頻度で参照されるSA配列と文字列を抽出し、非圧縮領域Ｓ記憶手段に格納する非圧縮領域Ｓ抽出手段と、
入力されたパターンＰを配列要素と文字列を展開しながら２分探索を行い、該パターンＰに合致するデータDの位置情報を結果集合として出力するパターンＰ２分探索手段と
を有し、
前記パターンＰ２分探索手段は、
前記２分探索の位置のSAエントリが非圧縮領域Ｓ記憶手段に存在するか否かを判定する手段と、
前記SAエントリが前記非圧縮領域Ｓ記憶手段に存在する場合には、該非圧縮領域Ｓ記憶手段からエントリを取得する非圧縮領域Ｓ参照手段と、
前記２分探索の位置のSAエントリが前記非圧縮領域Ｓ記憶手段に存在しない場合は、前記CSA記憶手段からエントリを取得するSA展開手段と、
を含むことを特徴とするデータ格納装置。
【請求項５】
前記非圧縮領域Ｓ抽出手段は、
非圧縮領域の最大サイズＭを設定し、前記SA配列の参照確率が高い順にエントリを取り出し、該エントリのサイズＥを計算し、Ｍ−Ｅの値が０より大きい場合は、該エントリを前記非圧縮領域Ｓ記憶手段に格納する手段を含む
請求項４記載のデータ格納装置。
【請求項６】
前記パターンＰ２分探索手段は、
前記非圧縮領域Ｓ参照手段または前記SA展開手段で取得した前記エントリの文字列が探索位置周辺であり、前記パターンＰに合致するものを抽出する手段を含む
請求項４記載のデータ格納装置。
【請求項７】
コンピュータを、
請求項４乃至６のいずれか１項に記載のデータ格納装置の各手段として機能させるためのデータ格納プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ格納方法及び装置及びプログラムに係り、特に、事前に与えられたデータＤ（長さ：Ｎ）の中から任意のパターンＰ（長さ：Ｍ）全ての出現位置を高速に探索するために構造化された索引Suffix Array（SA）のデータを格納するためのデータ格納方法及び装置及びプログラムに関する。
【背景技術】
【０００２】
事前に与えられたデータＤ（長さ：Ｎ）の中から任意のパターンＰ（長さ：Ｍ）全ての出現位置を高速に探索するための索引構造を『全文索引』と呼び、任意のパターンＰの出現した回数、場所を事前に求め保存している。このデータ構造はDNAの塩基配列やWebなどのドキュメント探索に利用されることが多い。これらのデータ構造の特徴はデータDが非常に大きく（Ｎが大）、パターンＰがとても小さい（Ｍが小）ことが挙げられる。例えば、データDをD[]=feiajfieak(N=10)、探索する任意のパターンをP[]=jfi(M=3)とする。この例の場合、パターンPはデータD中の"４"の位置（先頭を０とした場合のD[3]）から存在するため"４"を返却する。
【０００３】
この全文索引を実現するデータ構造はいくつか存在するが、探索コストと構造のシンプルさから一部の領域で接尾辞配列（Suffix Array: SA）がよく用いられている（例えば、非特許文献１参照）。
【０００４】
上記の全文索引を実現する例に挙げたデータDに対するSAのデータ構造を図１に、このSAを利用したパターンＰの探索の具体例を図２に示す。探索は基本的に配列SA[]の２分探索処理に基づいて行われる。図１では、"D[]=feiajfieak"とした場合の接尾辞配列SA[]の構築方法を示している。まず、配列SA[]の中央の値"６"（SA[5]=6）を取得し、"６"の値を用いてデータから"６"の位置に存在する接尾辞（Suffix）と、パターンＰの文字列を辞書順で考えた場合の大小関係を比較する。ここでは、Suffixが"fieak$"で、パターンＰが"jfi"であるため、比較の結果"jfi"が大きいと判断され、配列SA[]の後半部分が選択され、継続して同様の２分探索が最後まで行われる。２分探索の最後に到達した位置（周辺）にある文字列がパターンＰと合致する可能性のある候補であるため、合致するパターンＰのデータD中の位置を返却する。
【０００５】
しかし、このSAのデータ構造はデータDに対して非常に空間コストが大きい問題が存在するため、SAを圧縮したCompressed SA（以下、CSA）が提案されている（例えば、非特許文献２参照）。SAの整数配列は１からNまでランダムに出現するため、整数の圧縮で従来からよく用いられているエントロピー符号化手法の適用が難しい。そこで、非特許文献２において、
φ[i]=SA-1 [SA[i]+1] (SA[φ[i]]=SA[i]+1)
と変換することで、従来のエントロピー符号化による圧縮が適用しやすい配列順序に変換し、圧縮を適用する手法が提案されている。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Udi M. and Gene M.: Suffix arrays: a new method for on-line string searches, SIAM Journal on Computing, Volume 22, Issue 5, 1991.
【非特許文献２】Roberto G. et al.: Compressed Suffix Arrays and Suffix Trees with Applications to Text Indexing and String Matching, SIAM Journal on Computing, Volume 35, Issue 2, 2005.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記従来の技術には以下のような問題がある。
【０００８】
図３は課題を説明するための図である。
【０００９】
前述のSA上の２分探索で参照したSAの配列要素と文字列はCSA上では個別に圧縮されている。そのため、SAと同じように２分探索する際に、CSAでは各配列要素と文字列の比較のための文字列の圧縮データの展開処理のペナルティ（配列要素と文字列の展開コストをそれぞれαとβと示す）が発生する。この展開コストαとβを含めたCSAの探索コストは（α＋β）*m*log2Nである。
【００１０】
従来からこのαとβのペナルティコストは非常に高いとされている。
【００１１】
本発明は、上記の点に鑑みなされたもので、各配列要素と文字列の比較のための文字列の圧縮データの展開処理の展開コストに起因するCSAの探索コストを削減することが可能なデータ格納方法及び装置及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記の課題を解決するため、本発明（請求項１）は、事前に与えられた接尾辞配列を有するデータDの中から任意のパターンＰの全ての出現位置を高速に探索するために構造化された索引のデータ格納方法であって、
SA初期化手段が、前記データDが入力されると、該データDに対して、接尾辞の切り分けと並び替えを行い、並び替えられた接尾辞の添え字を抽出することによりSA配列を作成するSA初期化ステップと、
SA圧縮手段が、前記SA配列と前記データDの文字列をCSAの手法を用いて圧縮し、CSA記憶手段に格納するSA圧縮ステップと、
非圧縮領域Ｓ抽出手段が、前記SA配列から所定の値以上の頻度で参照されるSA配列と文字列を抽出し、非圧縮領域Ｓ記憶手段に格納する非圧縮領域Ｓ抽出ステップと、
パターンＰ２分探索手段が、入力されたパターンＰを配列要素と文字列を展開しながら２分探索を行い、該パターンＰに合致するデータDの位置情報を結果集合として出力するパターンＰ２分探索ステップと、
を行い、
前記パターンＰ２分探索ステップにおいて、
前記２分探索の位置のSAエントリが非圧縮領域Ｓ記憶手段に存在するか否かを判定し、存在する場合には、該非圧縮領域Ｓ記憶手段からエントリを取得し、
存在しない場合は、前記CSA記憶手段からエントリを取得する。
【００１３】
また、本発明（請求項２）は、前記非圧縮領域Ｓ抽出ステップにおいて、
非圧縮領域の最大サイズＭを設定し、前記SA配列の参照確率が高い順にエントリを取り出し、該エントリのサイズＥを計算し、Ｍ−Ｅの値が０より大きい場合は、該エントリを前記非圧縮領域Ｓ記憶手段に格納する。
【００１４】
また、本発明（請求項３）は、前記パターンＰ２分探索ステップにおいて、
前記非圧縮領域Ｓ参照手段または前記SA展開手段で取得した前記エントリの文字列が探索位置周辺であり、前記パターンＰに合致するものを抽出する。
【発明の効果】
【００１５】
上記のように本発明は、相対的に頻繁に参照する２分探索の前半部分を圧縮せずに、非圧縮の状態で補助的なデータ構造として非圧縮領域記憶手段に保存しておき、パターンPの２分探索の前半の処理で展開コストのペナルティを避けるように構造化することにより、「相対的に頻繁に参照する２分探索の前半部分」は全体のデータサイズに対して非常に小さい領域であるため、少ない補助的なデータ構造のペナルティで、探索処理の高速化が可能である。これにより、CSA上のパターンPの探索処理コスト（α＋β）*m*log2Nに対して、探索の前半部分に比較されるK回の２分探索処理で使用されるSAの配列要素数と文字列を非圧縮領域Sに補助データとして格納して、前半の２分探索の処理で展開コストを避けることで探索コストの削減効果（m*K+(α＋β)*m*(log2N-K)）が得られる。
【図面の簡単な説明】
【００１６】
【図１】Suffix Arrayの概要（D[]=feiajfieak）を示す図である。
【図２】Suffix Arrayを利用したパターンPの探索の例である。
【図３】２分探索の比較ごとに発生する圧縮展開コストの課題を示す図である。
【図４】本発明の一実施の形態におけるデータ格納装置の構成図である。
【図５】本発明の一実施の形態における非圧縮領域Sの抽出処理を示す図である。
【図６】本発明の一実施の形態におけるSA初期化部のフローチャートである。
【図７】本発明の一実施の形態における非圧縮領域S抽出部のフローチャートである。
【図８】本発明の一実施の形態におけるパターンP２分探索部のフローチャートである。
【発明を実施するための形態】
【００１７】
以下、図面と共に本発明の実施の形態を説明する。
【００１８】
図４は、本発明の一実施の形態におけるデータ格納装置の構成を示す。
【００１９】
データ格納装置は、データD入力装置１、SA初期化部２、SA圧縮部３、非圧縮領域S抽出部４、非圧縮領域S記憶部５、パターンP入力装置６、パターンP２分探索部７、SA展開部８、非圧縮領域S参照部９、CSA記憶部１０から構成され、パターンP２分探索部７は、結果出力装置１１と接続されている。
【００２０】
上記の構成において、データD中からパターンPの高速な探索を実現するために、SA初期化部２において、入力されたデータDに対して索引の構築を行う。SA初期化部２では、データD入力装置１から入力されたデータに対して、接尾辞の切り分け、辞書順での並び替え、並び替えられた接尾辞の添え字抽出によってSAを構築する。続いて、SA圧縮部３では、SA初期化部２から入力されるSA配列と文字列情報をCSAの手法に基づいて圧縮を行い、CSA記憶部１０に記録する。ここで、図５に示すように、非圧縮領域S抽出部４を用いることで、頻繁に参照する（参照頻度の高い）SA配列と文字列情報を抽出し、非圧縮領域S記憶部５に保存する。図５の例では、『6:fieak$』と『5:ifieak$』を参照度合いが高いと判定する。パターンPの探索に関しては、パターンP２分探索部７で探索対象のパターンがパターンP入力装置６から入力されたパターンPをCSA上の２分探索処理と同じように、SA展開部８を利用することで配列要素と文字列を展開しながら探索を行う。従来手法との違いは、各配列要素と文字列の比較の際に先ほどの非圧縮領域S記憶部５に探索経路上の配列要素と文字列が含まれる場合は、当該非圧縮領域S内の非圧縮データを参照することで、展開コストをスキップして展開ペナルティを回避する点である。最終的に、パターンP２分探索部７は、パターンPに合致するデータD中の位置情報を結果集合として収集し、結果出力装置１１に出力して終了する。
【００２１】
以下に、上記の処理内容を詳細に説明する。
【００２２】
図６は、本発明の一実施の形態におけるSA初期化部、SA圧縮部のフローチャートである。
【００２３】
ステップ６００）  SA初期化部２は、データD入力装置１からデータが入力されるまで待機する。
【００２４】
ステップ６０５）  SA初期化部２は、データDが入力されると、当該データDから図１で示した接尾辞Skの定義に従い、接尾辞集合Sを作成する。
【００２５】
ステップ６１０）  SA初期化部２は、生成された接尾辞集合Sを辞書順に並び替える。
【００２６】
ステップ６１５）  SA初期化部２は、辞書順に並び替えた接尾辞集合Sから添え字を抜き出してSA[]を作成する。
【００２７】
ステップ６２０）  SA初期化部２は、非特許文献２の定義に従い、接尾辞配列SA[]を従来の圧縮手法により、以下のように圧縮しやすい配列Ψ[]に変換する。
【００２８】
Ψ[i]＝SA-1[SA[i]+1]
ステップ６２５）  SA圧縮部３は、ステップ６２０で変換された配列Ψ[]を任意の従来の圧縮符号化（エントロピー符号化）を用いて、圧縮を行う。
【００２９】
ステップ６３０）  SA圧縮部３は、圧縮された配列Ψ[]をCSA記憶部１０に格納する。
【００３０】
ステップ６３５）  SA圧縮部３は、接尾辞配列SA[]と、非圧縮領域Sの最大サイズを非圧縮領域S抽出部４に出力し、非圧縮領域S抽出部４の処理に移行する。
【００３１】
次に、非圧縮領域S抽出部４の処理を説明する。
【００３２】
図７は、本発明の一実施の形態における非圧縮領域S抽出部のフローチャートである。
【００３３】
ステップ７００）  非圧縮領域S抽出部４は、SA圧縮部３から非圧縮領域Sの最大サイズを取得すると、メモリ（図示せず）のMに設定する（M=非圧縮領域Sの最大サイズ）。
【００３４】
ステップ７０５）  iを１で初期化する（i＝１）。
【００３５】
ステップ７１０）  非圧縮領域S抽出部４は、SA圧縮部３から取得した接尾辞配列SA[]からi番目の参照確率の高いエントリを取り出す。なお、参照確率は予めエントリ毎に付与されているものとする。
【００３６】
ステップ７１５）  取り出したSAのエントリのサイズEを計算する。
【００３７】
ステップ７２０）  iをインクリメントし（i=i+1）、MからサイズEの減算をそれぞれ行う（M=M−E）。
【００３８】
ステップ７２５）  i番目の参照確率の高いSAのエントリを非圧縮領域S記憶部５に格納する。
【００３９】
次に、パターンP２分探索部７の動作について説明する。
【００４０】
図８は、本発明の一実施の形態におけるパターンP2分探索部のフローチャートである。
【００４１】
ステップ８００）  パターンP入力装置６からパターンPが入力されるまで待機する。
【００４２】
ステップ８０５）  パターンP２分探索部７は、SA配列要素数でMを、探索位置Tを0で初期化する（M=SA配列要素数、T=0）。
【００４３】
ステップ８１０）  パターンP２分探索部７は、２分探索を行うために値の更新を行う（T＝T＋M／2，M＝M／2）。
【００４４】
ステップ８１５）  パターンP２分探索部７は、非圧縮領域S内に探索位置TのSAエントリが存在するかを探索し、存在する場合はステップ８２０に移行し、存在しない場合はステップ８２５に移行する。
【００４５】
ステップ８２０）  パターンP２分探索部７は、探索位置Tのエントリを非圧縮領域S参照部９を用いて取り出す。ここで、非圧縮領域S参照部９は、非圧縮領域S記憶部５から探索位置Tのエントリを取り出す。
【００４６】
ステップ８２５）  パターンP２分探索部７は、CSA記憶部１０から探索位置Tに対応するデータを取得し、ステップ６２０、ステップ６２５で行った圧縮と値の変換に対応する逆変換をSA展開部８を用いて行い、探索位置Tに対応するSAエントリを取得する。
【００４７】
ステップ８３０）  パターンP２分探索部７は、探索位置Tに対応するSAエントリの文字列Aと、パターンPの文字列について辞書順で考えた場合の大小比較を行い、P＞Aであればステップ８３５に移行し、P≦Aであればステップ８４０に移行する。
【００４８】
ステップ８３５）  ステップ８３０においてP＞Aである場合は、２分探索を行うための値を更新し（T＝T＋M／2，M＝M／2）、M＞１であればステップ８１５に移行し、M≦１であればステップ８４５に移行する。
【００４９】
ステップ８４０）  ステップ８３０においてＰ≦Ａである場合は、２分探索を行うために値を更新し（T＝T−M／2，M＝M／2）し、M＞１であればステップ８１５に移行し、M≦１であればステップ８４５に移行する。
【００５０】
ステップ８５０）  パターンP２分探索部７は、探索位置T周辺の文字列でパターンＰに合致するものを結果として結果出力装置１１に出力する。
【００５１】
本発明では、上記のように、頻繁に参照される配列要素と文字列は圧縮せずに、非圧縮領域に格納することで探索コストを削減することができる。
【実施例】
【００５２】
Ｎ＝２24のデータDに対して、SAを作成した場合の空間コストは、SAの各エントリの期待文字列長をｓ（sByte）とした場合に、２26*（4+s)Byteとなる（SA[]の各配列要素は４Byteとする）。CSAの経験的な圧縮性能はＳＡの空間コストの２〜３％であることから、ここでは圧縮性能を２％と考えて、結果的にCSAの空間コストを0.02*226(4＋s)Byteとする。ここで入力されるパターンＰは一様と考え、２分探索が１６回行われる位置（残りの１０回の２分探索は従来どおり圧縮データを展開しながら２分探索を実施）までの各配列要素と文字列を非圧縮領域Ｓに格納する場合を考える。
【００５３】
まず、探索コストに関しては、前半の１６回の２分探索の圧縮展開コストは無くなるため、結果的に探索コストは16+10*m*(α＋β)になり、展開コストαとβが非常に大きいと考えた場合にCSAの探索コストは24*m*(α＋β)に対して、41.7%の削減効果が期待できる。
【００５４】
一方、過剰な空間コストは、１６回の２分探索が行われるまでの配列要素数が２16となるため、２16*(4＋s)Byteとなり、この余剰に消費する空間コストはCSAの空間コストに対して約５％程度となる。この結果をまとめると、Ｎ＝２24のデータDに対する本発明の効果は約５%程度の余剰な空間コスト（非圧縮領域Ｓ）を犠牲にすることで、探索コストを41.7%削減可能である、ということになる。
【００５５】
なお、上記の図４に示すデータ格納装置の各構成要素の動作をプログラムとして構築し、データ格納装置として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
【００５６】
また、本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において種々変更・応用が可能である。
【符号の説明】
【００５７】
１  データD入力装置
２  SA初期化部
３  SA圧縮部
４  非圧縮領域S抽出部
５  非圧縮領域S記憶部
６  パターンP入力装置
７  パターンP２分探索部
８  SA展開部
９  非圧縮領域S参照部
１０  CSA記憶部
１１  結果出力装置
【図１】
2013148974.tif 000003
【図２】
2013148974.tif 000004
【図３】
2013148974.tif 000005
【図４】
2013148974.tif 000006
【図５】
2013148974.tif 000007
【図６】
2013148974.tif 000008
【図７】
2013148974.tif 000009
【図８】
2013148974.tif 000010