(57)【特許請求の範囲】
【請求項１】
バイナリ文字列データを記憶する記憶装置と、
バイナリ検索文字列を入力する入力装置と、
前記文字列データ中における前記検索文字列の出現位置を計算する演算装置と、
前記演算装置による演算結果を出力する出力装置を備え、
前記演算装置は、
前記文字列データをバローズ・ホィーラー変換するバローズ・ホィーラー変換処理部と、
前記バローズ・ホィーラー変換に対する補助情報を構築する補助情報構築処理部と、
前記補助情報を記憶する領域と、
前記文字列データからサフィックス・アレイを計算するサフィックス・アレイ構築処理部と、
前記サフィックス・アレイ構築処理部によって計算されたサフィックス・アレイの要素を一定間隔に間引く処理を行うサフィックス・アレイ部分配列抽出処理部と、
前記サフィックス・アレイ部分配列抽出処理部によって得られたサフィックス・アレイ部分配列を記憶する領域と、
前記補助情報を用いて、前記文字列データのバローズ・ホィーラー変換後の文字列において、その文字列先頭から指定文字位置までに出現する１の数を当該文字位置におけるランク値として計算するランク関数計算処理部と、
指定した自然数ｋに対して、前記文字列データのバローズ・ホィーラー変換後の文字列において、ｋ番目に１が現れる文字列先頭からの文字位置を探索文字位置とよぶとき、前記補助情報を用いて前記文字列データのバローズ・ホィーラー変換後の文字列における探索文字位置（セレクト値）を計算するセレクト関数計算処理部と、
ランク関数とセレクト関数を繰り返し用いて前記バローズ・ホィーラー変換された結果と前記サフィックス・アレイの情報から前記文字列データ内での前記検索文字列の出現位置を検索する文字列検索処理部とを有し、
前記補助情報構築処理部は、
前記文字列データのバローズ・ホィーラー変換後の文字列に対して、ランク値及び文字列先頭から数えた文字位置を表す整数値を、それらの２進表記を指定したビット幅（ｗ）に区切ることにより、２のｗ乗進法の桁に分割し、
補助情報全体を、桁ごとの情報に分割した桁データの集まりとして記憶し、
各々の桁データは、文字位置の該当桁の２のｗ乗個の値に対する補助情報を要素データとして、それらの繰り返しとして記憶し、
各々の要素データは、文字位置の該当桁の２のｗ乗個の値に対して、
その最後の値（２のｗ乗マイナス１）に対しては、累積値データとして、対応する文字位置でのランク値の該当桁を記憶し、
それ以外の値（０から２のｗ乗マイナス２まで）では、差分データとして、対応する文字位置と該当桁の値が１だけ小さい文字位置での、ランク値の該当桁での変化分を記憶することにより、
上位の桁に上がる毎に、桁データのデータ量を繰り返し２のｗ乗分の１に減少させて記憶し、
前記ランク関数計算処理部は、
前記文字列データのバローズ・ホィーラー変換後の文字列の対象文字位置におけるランク値を計算するにあたり、
最下位桁から最上位桁までの各桁において、前記補助情報の桁データを参照して、
対象文字位置の直前の要素データ内の累積値データと、
対象文字位置を含む要素データ内での、対象文字位置までの差分データの総和と、
の和を求め、さらに、それと下位の桁からの繰上り（最下位桁では０）の和を求め、その値をｗビット幅の下位桁と上位桁に分割し、その下位桁の値をランク値の該当桁の値とし、その上位桁の値を該当桁から上位の桁への繰り上がりとして計算し、
これを、最下位桁から最上位桁までの各桁に対して順次繰り返すことにより、前記対象文字位置におけるランク値を計算し、
前記セレクト関数計算処理部は、
最上位桁から最下位桁までの各桁において、前記補助情報の桁データを参照して、
探索文字位置の直前の要素データ内の累積値データと、
対象文字位置を含む要素データ内での、対象文字位置までの差分データの総和と、
の和として、探索文字位置のランク値の該当桁の値を求め、その値がｋの該当桁の値（繰上りが必要な場合は、２のｗ乗を加えた値）以上となり、かつ、
ランク値の該当桁以下の未定の桁の値を、探索文字位置における該当桁より下位の桁の要素データの累積値データとしたときの仮の値がｋ以上となる、
ような最小の値として、探索文字位置の該当桁の値を決め、そのときランク値の該当桁がｋの該当桁の値を越えるときは、一つ下位の桁においては繰上りが必要として、
これを、最上位桁から最下位桁まで順次繰り返すことにより、与えられた自然数ｋに対する探索文字位置を計算し、
前記文字列検索処理部は、
前記ランク関数計算処理部に指示してランク関数の計算を繰り返すことにより、前記検索文字列が現れる前記サフィックス・アレイ内の順位の範囲を計算し、前記セレクト関数計算処理部に指示してセレクト関数の計算を繰り返すことにより、前記文字列データにおける前記検索文字列の出現位置を計算することを特徴とするバイナリ文字列検索システム。
【請求項２】
Ａ，Ｇ，Ｃ，ＴとＮからなる塩基文字列データを記憶する記憶装置と、
塩基検索文字列を入力する入力装置と、
前記文字列データ中における前記検索文字列の出現位置を計算する演算装置と、
前記演算装置による演算結果を出力する出力装置を備え、
前記演算装置は、
前記文字列データをバローズ・ホィーラー変換するバローズ・ホィーラー変換処理部と、
前記バローズ・ホィーラー変換に対する補助情報を構築する補助情報構築処理部と、
前記補助情報を記憶する領域と、
前記文字列データからサフィックス・アレイを計算するサフィックス・アレイ構築処理部と、
前記サフィックス・アレイ構築処理部によって計算されたサフィックス・アレイの要素を一定間隔に間引く処理を行うサフィックス・アレイ部分配列抽出処理部と、
前記サフィックス・アレイ部分配列抽出処理部によって得られたサフィックス・アレイ部分配列を記憶する領域と、
前記補助情報を用いて、各塩基を表す文字種（Ａ，Ｇ，Ｃ，Ｔ，Ｎ）に対して、前記文字列データのバローズ・ホィーラー変換後の文字列において、その文字列先頭から指定文字位置までに出現するその塩基の数を当該文字位置におけるランク値として計算するランク関数計算処理部と、
各塩基を表す文字種と指定した自然数ｋに対して、前記文字列データのバローズ・ホィーラー変換後の文字列において、ｋ番目にその塩基が現れる文字列先頭からの文字位置を探索文字位置とよぶとき、前記補助情報を用いて前記文字列データのバローズ・ホィーラー変換後の文字列における探索文字位置を計算するセレクト関数計算処理部と、
ランク関数とセレクト関数を繰り返し用いて前記バローズ・ホィーラー変換された結果と前記サフィックス・アレイの情報から前記文字列データ内での前記検索文字列の出現位置を検索する文字列検索処理部とを有し、
前記補助情報構築処理部は、
塩基文字列データに対して、各塩基を表す文字種ごとに、その文字を１、他の文字を０に置き換えたバイナリ文字列を作成する手段を有し、
最下位を除く上位の桁については、各塩基を表す文字種ごとに作成された前記バイナリ文字列のバローズ・ホィーラー変換後の文字列に対し、前記請求項１記載の補助情報構築処理部により文字種ごとに独立に桁データを作成することにより、上位の桁データを構築しこれを記憶する手段を有し、
また、最下位の桁については、文字列先頭より２のｗ乗個ごとの文字位置では、文字種ごとのランク値の最下位桁を記憶し、それ以外の文字位置では、現れる文字種を２進符号化して記憶することにより、最下位の桁データを構築しこれを記憶する手段を有し、
前記ランク関数計算処理部は、
各塩基を表す文字種に対して、前記文字列データのバローズ・ホィーラー変換後の文字列の対象文字位置におけるランク値の計算を、その文字種に対して作成されたバイナリ配列に対する同一文字位置におけるランク関数の計算に帰着させ、その計算を前記請求項1記載のランク関数計算処理部を用いて計算し、
前記セレクト関数計算処理部は、
各塩基を表す文字種と指定した自然数ｋに対する探索文字位置の計算を、その文字種に対して作成されたバイナリ配列と自然数ｋに対するセレクト関数の計算に帰着させ、その計算を前記請求項1記載のセレクト関数計算処理部を用いて計算し、
前記文字列検索処理部は、
前記ランク関数計算処理部に指示してランク関数の計算を繰り返すことにより、前記検索文字列が現れる前記サフィックス・アレイ内の順位の範囲を計算し、前記セレクト関数計算処理部に指示してセレクト関数の計算を繰り返すことにより、前記文字列データにおける前記検索文字列の出現位置を計算することを特徴とする塩基文字列検索システム。
【請求項３】
多数の文字種からなる多文字種文字列データを記憶する記憶装置と、
多文字種検索文字列を入力する入力装置と、
前記文字列データ中における前記検索文字列の出現位置を計算する演算装置と、
前記演算装置による演算結果を出力する出力装置を備え、
前記演算装置は、
前記文字列データをバローズ・ホィーラー変換するバローズ・ホィーラー変換処理部と、
前記バローズ・ホィーラー変換に対する補助情報を構築する補助情報構築処理部と、
前記補助情報を記憶する領域と、
前記文字列データからサフィックス・アレイを計算するサフィックス・アレイ構築処理部と、
前記サフィックス・アレイ構築処理部によって計算されたサフィックス・アレイの要素を一定間隔に間引く処理を行うサフィックス・アレイ部分配列抽出処理部と、
前記サフィックス・アレイ部分配列抽出処理部によって得られたサフィックス・アレイ部分配列を記憶する領域と、
前記補助情報を用いて、各文字種に対して、前記文字列データのバローズ・ホィーラー変換後の文字列において、その文字列先頭から指定文字位置までに出現するその文字種の数を当該文字位置におけるランク値として計算するランク関数計算処理部と、
各文字種と指定した自然数ｋに対して、前記文字列データのバローズ・ホィーラー変換後の文字列において、ｋ番目にその文字種が現れる文字列先頭からの文字位置を探索文字位置とよぶとき、前記補助情報を用いて前記文字列データのバローズ・ホィーラー変換後の文字列における探索文字位置を計算するセレクト関数計算処理部と、
ランク関数とセレクト関数を繰り返し用いて前記バローズ・ホィーラー変換された結果と前記サフィックス・アレイの情報から前記文字列データ内での前記検索文字列の出現位置を検索する文字列検索処理部とを有し、
前記補助情報構築処理部は、
多文字種文字列データに対して、全文字種を２種類に分類して、文字列の各文字がどちらの種類に属するかを０又は１で指定することにより、０と１からなるバイナリ文字列を作成し、前記２種類の分類のそれぞれに対して、一方の分類のみの文字からなる部分列を抜き出すことにより文字種が半減した文字列を２つ作り、後者の２つの文字列に対して、同様の処理を、文字種が２種に減少するまで再帰的に繰り返す手段を有し、
前記の再帰的な繰り返しの過程で得られる全てのバイナリ文字列に対して、前記請求項１記載の補助情報構築処理部を用いて、バイナリ文字列に対する前記請求項１記載の補助情報を構築し、それらの補助情報を全て記憶し、
前記ランク関数計算処理部は、
各文字種に対して、前記文字列データのバローズ・ホィーラー変換後の文字列の対象文字位置におけるランク関数の計算を、前記の再帰的な文字種の分類の過程におけるバイナリ文字列に対するランク関数の計算に帰着させ、その計算を前記請求項１記載のランク関数計算処理部を用いて計算し、
前記セレクト関数計算処理部は、
各文字種と指定した自然数ｋに対する探索文字位置の計算を、前記の再帰的な文字種の分類の過程におけるバイナリ文字列に対するセレクト関数の計算に帰着させ、その計算を前記請求項1記載のセレクト関数計算処理部を用いて計算し、
前記文字列検索処理部は、
前記ランク関数計算処理部に指示してランク関数の計算を繰り返すことにより、前記検索文字列が現れる前記サフィックス・アレイ内の順位の範囲を計算し、前記セレクト関数計算処理部に指示してセレクト関数の計算を繰り返すことにより、前記文字列データにおける前記検索文字列の出現位置を計算することを特徴とする多文字種文字列検索システム。
【請求項４】
演算装置を用いて、バイナリ文字列データにおけるバイナリ検索文字列の出現位置を計算する文字列検索方法において、
前記演算装置は、
入力された文字列データのバローズ・ホィーラー変換を計算し、
前記バローズ・ホィーラー変換に対する補助情報を計算し、
前記文字列データからサフィックス・アレイを計算し、
前記サフィックス・アレイの要素を一定間隔に間引くことによりサフィックス・アレイ部分配列を計算し、
前記文字列データのバローズ・ホィーラー変換後の文字列において、
その文字列先頭から指定文字位置までに１が出現する数を当該文字位置におけるランク値として計算する関数をランク関数とよび、また、
指定した自然数ｋに対して、１がｋ番目に現れる文字列先頭からの文字位置を探索文字位置（セレクト値）として計算する関数をセレクト関数とよぶとき、
前記文字列データのバローズ・ホィーラー変換後の文字列に対して、ランク関数の計算を繰り返すことにより、前記検索文字列が現れる前記サフィックス・アレイ内の順位の範囲を計算し、セレクト関数の計算を繰り返すことにより、前記文字列データにおける前記検索文字列の出現位置を計算し、
前記補助情報の計算に当たっては、
前記文字列データのバローズ・ホィーラー変換後の文字列に対して、ランク値及び文字列先頭から数えた文字位置を表す整数値を、それらの２進表記を指定したビット幅（ｗ）に区切ることにより、２のｗ乗進法の桁に分割し、
補助情報全体を、桁ごとの情報に分割した桁データの集まりとして記憶し、
各々の桁データは、文字位置の該当桁の２のｗ乗個の値に対する補助情報を要素データとして、それらの繰り返しとして記憶し、
各々の要素データは、文字位置の該当桁の２のｗ乗個の値に対して、
その最後の値（２のｗ乗マイナス１）に対しては、累積値データとして、対応する文字位置でのランク値の該当桁を記憶し、
それ以外の値（０から２のｗ乗マイナス２まで）では、差分データとして、対応する文字位置と該当桁の値が１だけ小さい文字位置での、ランク値の該当桁での変化分を記憶することにより、
上位の桁に上がる毎に、桁データのデータ量を繰り返し２のｗ乗分の１に減少させて記憶し、
前記ランク関数の計算に当たっては、対象文字位置におけるランク値を計算するにあたり、
最下位桁から最上位桁までの各桁において、前記補助情報の桁データを参照して、
対象文字位置の直前の要素データ内の累積値データと、
対象文字位置を含む要素データ内での、対象文字位置までの差分データの総和と、
の和を求め、さらに、それと下位の桁からの繰上り（最下位桁では０）の和を求め、その値をｗビット幅の下位桁と上位桁に分割し、その下位桁の値をランク値の該当桁の値とし、その上位桁の値を該当桁から上位の桁への繰り上がりとして計算し、
これを、最下位桁から最上位桁までの各桁に対して順次繰り返すことにより、前記対象文字位置におけるランク値を計算し、
前記セレクト関数の計算に当たっては、
最上位桁から最下位桁までの各桁において、前記補助情報の桁データを参照して、
探索文字位置の直前の要素データ内の累積値データと、
対象文字位置を含む要素データ内での、対象文字位置までの差分データの総和と、
の和として、探索文字位置のランク値の該当桁の値を求め、その値がｋの該当桁の値（繰上りが必要な場合は、２のｗ乗を加えた値）以上となり、かつ、
ランク値の該当桁以下の未定の桁の値を、探索文字位置における該当桁より下位の桁の要素データの累積値データとしたときの仮の値がｋ以上となる、
ような最小の値として、探索文字位置の該当桁の値を決め、そのときランク値の該当桁がｋの該当桁の値を越えるときは、一つ下位の桁においては繰上りが必要として、
これを、最上位桁から最下位桁まで順次繰り返すことにより、与えられた自然数ｋに対する探索文字位置を計算することを特徴とするバイナリ文字列検索方法。
【請求項５】
演算装置を用いて、Ａ，Ｇ，Ｃ，ＴとＮからなる塩基文字列データにおける塩基検索文字列の出現位置を計算する文字列検索方法において、
前記演算装置は、
入力された文字列データのバローズ・ホィーラー変換を計算し、
前記バローズ・ホィーラー変換に対する補助情報を計算し、
前記文字列データからサフィックス・アレイを計算し、
前記サフィックス・アレイの要素を一定間隔に間引くことによりサフィックス・アレイ部分配列を計算し、
前記文字列データのバローズ・ホィーラー変換後の文字列において、
各塩基に対して、その文字列先頭から指定文字位置までに出現するその塩基の数を当該文字位置におけるランク値として計算する関数をランク関数とよび、また、
各塩基と指定した自然数ｋに対して、ｋ番目にその塩基が現れる文字列先頭からの文字位置を探索文字位置（セレクト値）として計算する関数をセレクト関数とよぶとき、
前記文字列データのバローズ・ホィーラー変換後の文字列において、ランク関数の計算を繰り返すことにより、前記検索文字列が現れる前記サフィックス・アレイ内の順位の範囲を計算し、セレクト関数の計算を繰り返すことにより、前記文字列データにおける前記検索文字列の出現位置を計算し、
前記補助情報の計算に当たっては、
塩基文字列データに対して、各塩基を表す文字種ごとに、その文字を１、他の文字を０に置き換えたバイナリ文字列を作成して、
最下位を除く上位の桁については、各塩基を表す文字種ごとに作成された前記バイナリ文字列のバローズ・ホィーラー変換後の文字列に対し、前記請求項４記載の補助情報の計算法に従い、文字種ごとに独立に桁データを計算し、それらを上位の桁データとして記憶し、
また、最下位の桁については、文字列先頭より２のｗ乗個ごとの文字位置では、文字種ごとのランク値の最下位桁を記憶し、それ以外の文字位置では、現れる文字種を２進符号化して記憶することにより、これらを最下位の桁データとして記憶し、
前記ランク関数の計算に当たっては、
各塩基を表す文字種に対して、前記文字列データのバローズ・ホィーラー変換後の文字列の対象文字位置におけるランク値の計算を、その文字種に対して作成されたバイナリ配列に対する同一文字位置におけるランク関数の計算に帰着させ、その計算を前記請求項４記載のランク関数計算方法に従って計算し、
前記セレクト関数の計算に当たっては、
各塩基を表す文字種と指定した自然数ｋに対する探索文字位置の計算を、その文字種に対して作成されたバイナリ配列と自然数ｋに対するセレクト関数の計算に帰着させ、その計算を前記請求項４記載のセレクト関数計算方法に従って計算することを特徴とする塩基文字列検索方法。
【請求項６】
演算装置を用いて、多文字種（多数の文字種からなる）文字列データにおける多文字種検索文字列の出現位置を計算する文字列検索方法において、
前記演算装置は、
入力された文字列データのバローズ・ホィーラー変換を計算し、
前記バローズ・ホィーラー変換に対する補助情報を計算し、
前記文字列データからサフィックス・アレイを計算し、
前記サフィックス・アレイの要素を一定間隔に間引くことによりサフィックス・アレイ部分配列を計算し、
前記文字列データのバローズ・ホィーラー変換後の文字列において、
各文字種に対して、その文字列先頭から指定文字位置までに出現するその文字種の数を当該文字位置におけるランク値として計算する関数をランク関数とよび、また、
各文字種と指定した自然数ｋに対して、ｋ番目にその文字種が現れる文字列先頭からの文字位置を探索文字位置（セレクト値）として計算する関数をセレクト関数とよぶとき、
前記文字列データのバローズ・ホィーラー変換後の文字列において、ランク関数の計算を繰り返すことにより、前記検索文字列が現れる前記サフィックス・アレイ内の順位の範囲を計算し、セレクト関数の計算を繰り返すことにより、前記文字列データにおける前記検索文字列の出現位置を計算し、
前記補助情報の計算に当たっては、
多文字種文字列データに対して、全文字種を２種類に分類して、文字列の各文字がどちらの種類に属するかを０又は１で指定することにより、０と１からなるバイナリ文字列を作成し、前記２種類の分類のそれぞれに対して、一方の分類のみの文字からなる部分列を抜き出すことにより文字種が半減した文字列を２つ作り、後者の２つの文字列に対して、同様の処理を、文字種が２種に減少するまで再帰的に繰り返し、
前記の再帰的な繰り返しの過程で得られる全てのバイナリ文字列に対して、前記請求項４記載の補助情報構築処理部を用いて、バイナリ文字列に対する前記請求項４記載の補助情報を構築し、それらの補助情報を全て記憶し、
前記ランク関数の計算に当たっては、
各文字種に対して、前記文字列データのバローズ・ホィーラー変換後の文字列の対象文字位置におけるランク関数の計算を、前記の再帰的な文字種の分類の過程におけるバイナリ文字列に対するランク関数の計算に帰着させ、その計算を前記請求項４記載のランク関数計算方法に従って計算し、
前記セレクト関数の計算に当たっては、
各文字種と指定した自然数ｋに対する探索文字位置の計算を、前記の再帰的な文字種の分類の過程におけるバイナリ文字列に対するセレクト関数の計算に帰着させ、その計算を前記請求項1記載のセレクト関数計算方法に従って計算することを特徴とする多文字種文字列検索方法。
【請求項７】
請求項１記載の文字列検索システムにおいて、
ビット幅ｗを１とすることにより、前記補助情報を１ビットの累積値データを保持するメモリセルのみから構成される桁データから構成し、
前記ランク関数計算処理部及びセレクト関数計算処理部を、ビット演算に還元して論理ゲート回路により構成し、
前記メモリセルと前記論理ゲート回路とを近接して配置した専用ハードウェアを備えることを特徴とする文字列検索システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機を利用して、大量の遺伝子配列データやゲノム配列データ、又は大量の一般の文書データに対して、高速に文字列検索を行うための方法に関する。
【背景技術】
【０００２】
近年、従来型のキャピラリー型ＤＮＡシーケンサとは全く異なる、新しい原理に基づいた超並列ＤＮＡシーケンサが出現した（非特許文献１）。超並列ＤＮＡシーケンサの一回のランでは、一度に数千万本にも及ぶ大量の配列を読み取ることができる。但し、読取り配列長は数十塩基長程度と短い。このような大量の配列データを解析するためには、シーケンスされた各々の配列に対して、既知の遺伝子配列又はゲノム配列の中に一致又は類似した部分配列としてどこに現れるか否かを調べることが重要である。
【０００３】
そのような配列検索のための手法として、サフィックス・アレイ（非特許文献２）やバローズ・ホィーラー変換（非特許文献３）を利用する方法がある。これらの方法は、大規模な既知配列データに対して、大量の短い配列の検索を高速・高精度に行えるという特徴がある。
【０００４】
バローズ・ホィーラー変換を利用して配列検索を行うためには、ランク関数とセレクト関数の計算が必要となる（非特許文献４）。与えられた文字列データに対して、ランク関数は、文字列先頭より指定した文字位置までの範囲に、指定した種類の文字の出現回数を答える関数である。また、セレクト関数は、与えられた文字列データに対して、指定した自然数ｋに対して、指定した種類の文字がｋ回目に現れる文字位置を答える関数である。
【０００５】
原理的には、これらの関数は、全て事前に計算して表に纏めて主記憶装置などに記憶しておけば、その表を引くことにより、極めて高速に計算できる。しかし、実際には、そのために必要な記憶容量が文字列の長さと文字列長のワード長の積に比例し、特に、元の文字列データの記憶容量よりも大きくなることから、そのような方法は記憶容量の観点からは極めて非効率的である。例えば、０と１からなる１Ｇビット（約１０億ビット）のバイナリ文字列に対して、その全ての文字位置でのランク値を記憶しようとすると、ランク値のワード長は４バイト（３２ビット）必要なため、総計で４Ｇバイト（約３２０億ビット）の記憶容量が必要となる。
【０００６】
そこで、記憶容量の観点から効率的で、高速に計算を行えるような補助情報のデータ構造が知られている（非特許文献５）。文字列データ内の文字の種類数は、一般的には任意でよいが、特に２種類の場合に対する方法が基礎となる。具体的には、２種類の文字０と１とからなるバイナリ文字列に対して、文字１に対するランク関数とセレクト関数の計算法が基礎となる。この場合、ランク関数は、文字列先頭から指定した文字位置までの０と１の並びの和（文字列中の部分和）の値となる。ランク関数を高速に計算するための補助情報としては、文字列データ全体を、スーパー・ブロック、ブロックの２階層に分割し、スーパー・ブロック境界での部分和の値と、ブロック境界でのスーパー・ブロック内に限定した部分和の値と、ブロック内の全てのビットパターンに対する部分和の情報である。ランク関数は、これら３種類の部分和の和として高速に計算できる。文字列の長さに応じてスーパー・ブロックとブロックの長さを調整することにより、これら３種類の部分和の記憶容量の総和を抑制することができる。例えば、１Ｇビット（約１０億ビット）のバイナリ文字列データの場合は、このような調整により、そのような補助情報に必要な記憶容量は、文字列データに必要な記憶容量よりも小さく、その６６．８５％程度に抑えることができる（非特許文献５）。
【０００７】
【非特許文献１】Service RF. ”Gene sequencing. The race for the $1000 genome.” Science. 2006 Mar 17;311(5767):1544-6.
【非特許文献２】Manber, U. and Myers, G.: Suffix arrays: A new method for on-line string searches, in 1st ACM-SIAM, Symposium on Discrete Algorithms, pp. 319-327 (1990).
【非特許文献３】Burrows M and Wheeler D, A block sorting lossless data compression algorithm, Technical Report 124, Digital Equipment Corporation, 1994.
【非特許文献４】Ross Lippert, Space-efficient whole genome comparisons with Burrows-Wheeler transforms, Journal of Computational Biology, 12(4), pp. 407-415, 2005.
【非特許文献５】R. Gonzalez, S. Grabowski, V. Makinen, and G. Navarro. Practical Implementation of Rank and Select Queries. In Proc. WEA'05, pages 27-38, 2005.
【非特許文献６】N. J. Larsson and K. Sadakane. Faster Suffix Sorting, Technical report LU-CS-TR:99-214, 1999.
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかし、このような調整を行ったとしても、これらの大量の部分和の値の中には、上位の桁の値が互いに共通なものが多数含まれており、記憶容量の観点からは非効率な冗長性が残されている。
【０００９】
そこで、本発明の目的は、部分和の上位桁の情報が冗長に記憶されることを防ぎ、記憶容量の観点から効率的な補助情報の記憶方法（データ構造）を提供することと、そのようなデータ構造を用いて高速にランク関数とセレクト関数を計算する方法を提供することにある。また、これらを応用して、文字列データの高速検索方法を提供することにある。
【課題を解決するための手段】
【００１０】
本発明では、大量の部分和の情報を記憶する際、上位桁の情報が冗長に記憶されることを防ぐために、部分和の値の２進表記を、指定したビット幅ｗの桁に分割し、２のｗ乗進法による桁ごとの情報に分けた桁データの集まりとして記憶する。同様に、文字位置も、文字列先頭からの文字数で指定して、２のｗ乗進法による桁に分割する。各桁データは、上位桁を共有して、該当桁を０から２のｗ乗マイナス１まで変化させた文字位置に対する、部分和の該当桁の値を要約した要素データの繰り返し構造とする。各要素データは、文字位置の該当桁の値が２のｗ乗マイナス１のときの累積値データとして、その位置における部分和の該当桁の値と、文字位置の該当桁の値がそれ以外のときに対する差分データとして、その位置と該当桁の値が１少ない位置とにおける部分和の該当桁での変化分の値からなる。
【００１１】
本発明によると、以下のような、ランク値を高速に求めるための補助情報の記憶方法、ランク値の計算方法、セレクト値の計算方法、０と１からなる文字列に対する配列検索方法、塩基配列データに対する配列検索方法、多種の文字を含むデータに対する配列検索方法、ランク関数とセレクト関数の計算を高速化する方法が実現される。
【００１２】
（１）０と１からなる文字列に対して、文字列先頭から任意の文字位置までの１の数（以後、これをその文字位置におけるランク値とよぶ）を高速に求めるための補助情報を、記憶容量の観点から効率良く記憶することを目的として、
ランク値及び文字位置（文字列先頭から数えた文字数）を表す整数値を、それらの２進表記を指定したビット幅（ｗ）に区切ることにより、２のｗ乗進法の桁に分割し、
補助情報全体を、桁ごとの情報に分割した桁データの集まりとして記憶し、
各々の桁データは、文字位置の該当桁の２のｗ乗個の値に対する補助情報を要素データとして、それらの繰り返しとして記憶し、
各々の要素データは、文字位置の該当桁の２のｗ乗個の値に対して、
その最後の値（２のｗ乗マイナス１）に対しては、累積値データとして、対応する文字位置でのランク値の該当桁を記憶し、
それ以外の値（０から２のｗ乗マイナス２まで）では、差分データとして、対応する文字位置と該当桁の値が１だけ小さい文字位置での、ランク値の該当桁での変化分を記憶することにより、
上位の桁に上がる毎に、桁データのデータ量を繰り返し２のｗ乗分の１に減少させて、
前記目的を達する補助情報の記憶方法。
【００１３】
（２）０と１からなる文字列に対して、任意の文字位置（これを対象文字位置とよぶ）におけるランク値を高速に求めることを目的として、最下位桁から最上位桁までの各桁において、前記（１）の補助情報の桁データを参照して、
対象文字位置の直前の要素データ内の累積値データと、
対象文字位置を含む要素データ内での、対象文字位置までの差分データの総和と、
の和を求め、さらに、それと下位の桁からの繰上り（最下位桁では０）の和を求め、その値をｗビット幅の下位桁と上位桁に分割し、その下位桁の値をランク値の該当桁の値とし、その上位桁の値を該当桁から上位の桁への繰り上がりとして計算し、
これを、最下位桁から最上位桁までの各桁に対して順次繰り返すことにより、前記目的を達するランク値の計算方法。
【００１４】
（３）０と１からなる文字列に対して、任意に指定した番号ｋに対して、ｋ番目に１が現れる文字位置（これを探索文字位置とよび、また、文字列先頭から探索文字位置までの文字数をｋに対するセレクト値とよぶ）を高速に求めることを目的として、最上位桁から最下位桁までの各桁において、前記（１）の補助情報の桁データを参照して、
探索文字位置の直前の要素データ内の累積値データと、
対象文字位置を含む要素データ内での、対象文字位置までの差分データの総和と、
の和として、探索文字位置のランク値の該当桁の値を求め、その値がｋの該当桁の値（繰上りが必要な場合は、２のｗ乗を加えた値）以上となり、かつ、
ランク値の該当桁以下の未定の桁の値を、探索文字位置における該当桁より下位の桁の要素データの累積値データとしたときの仮の値がｋ以上となる、
ような最小の値として、探索文字位置の該当桁の値を決め、そのときランク値の該当桁がｋの該当桁の値を越えるときは、一つ下位の桁においては繰上りが必要として、
これを、最上位桁から最下位桁まで順次繰り返すことにより、前記目的を達するセレクト値の計算方法。
【００１５】
（４）０と１からなる文字列に対して、そのバローズ・ホィーラー変換に対する前記（１）の補助情報を計算機主記憶上に構築し、前記（２）の計算方法によるランク関数の計算を繰り返すことにより、検索文字列が現れるサフィックス・アレイ内の順位の範囲を計算し、前記（３）の計算方法によるセレクト関数の計算を繰り返すことにより、検索文字列の出現位置を計算する、０と１からなる文字列に対する配列検索方法。
【００１６】
（５）塩基配列データに対して、各塩基を表す文字種ごとに、その文字を１、他の文字を０に置き換えた０と１からなる文字列を作成し、
それらに対する検索を高速化するための桁データを、最下位を除く上位の桁では、前記（１）の方法を用いて独立に作成し、
また、最下位の桁については、文字列先頭より２のｗ乗個ごとの文字位置では、文字種ごとのランク値の最下位桁を記憶し、それ以外の文字位置では、現れる文字種を２進符号化して記憶することにより、最下位の桁データを作成し、
塩基配列に対する各文字に関するランク関数とセレクト関数の計算を、それらの桁データからなる補助情報を備えた０と１からなるそれらの文字列に対するランク関数とセレクト関数の計算に帰着させることにより、塩基配列データに対して前記（４）と同様の計算を行う、塩基配列データに対する配列検索方法。
【００１７】
（６）アミノ酸配列データ、又は、全てのアルファベットを含む一般の文書データなどのような、多種の文字を含む文字列に対して、
全文字種を２種類に分類して、文字列の各文字がどちらの種類に属するかを０又は１で指定することにより、０と１からなるバイナリ文字列を作成し、また、
２種類の分類のそれぞれに対して、一方の分類のみの文字からなる部分列を抜き出すことにより、文字種が減少した文字列を２つ作り、
後者の２つの文字列に対して、同様の処理を、文字種が２種に減少するまで再帰的に繰り返し、
元の多種の文字を含む文字列に対するランク関数とセレクト関数の計算を、再帰的に得られたバイナリ文字列に対するランク関数とセレクト関数の計算に帰着させる、多種の文字を含むデータに対する配列検索方法。
【００１８】
（７）前記（１）において、ビット幅ｗを１とすることにより、補助情報を１ビットの累積値データを保持するメモリセルのみから構成される桁データから構成し、また、
前記補助情報を利用するランク関数の前記（２）の計算方法と前記（３）のセレクト関数の計算方法を、ビット演算に還元して論理ゲート回路により構成し、
それらのメモリセルと論理ゲート回路とを近接して配置した専用ハードウェアを利用することにより、ランク関数とセレクト関数の計算を高速化する方法。
【００１９】
（８）０と１からなる文字列に対して、そのバローズ・ホィーラー変換に対する前記（１）の補助情報を専用ハードウェア上に構築して、前記（７）のランク関数とセレクト関数の高速化された計算方法を用いることにより高速な検索を行う、０と１からなる文字列に対する配列検索方法。
【発明の効果】
【００２０】
本発明による補助情報のデータ構造により、桁データのデータ量は、上位桁に上がるたびに繰り返し２のｗ乗分の１に減少し、上位桁の情報が冗長に記憶されることが回避される。また、併せて、要素データを累積値データと差分データに分けることにより、要素データのデータ量の圧縮が行われ、記憶容量の効率化が達成される。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の実施例を、図面を用いて詳細に説明する。
【００２２】
本実施例では、２種類の文字０と１とからなるバイナリ文字列に対して、文字１に対するランク関数とセレクト関数の高速な計算を可能にするための補助情報のデータ構造とその構築方法を説明する。また、本発明の効果を示すために、この補助情報のデータ構造が、記憶容量の観点から効率が良いことを示す。また、その補助情報を用いて、ランク関数とセレクト関数を高速に計算する方法を説明する。さらに、これらのデータ構造と計算方法を用いた、バイナリ文字列データ内の文字列の高速検索を行うシステムの例を示す。
【００２３】
（構成の説明）
図１は、本発明の特徴を最も良く現している、ランク関数とセレクト関数の高速計算のための補助情報のデータ構造を表した説明図である。このデータ構造は、計算機主記憶上に構築される。
【００２４】
与えたれたバイナリ文字列をs = s[0] s[1]…s[n-1]とし、その長さをｎとする。s[i]は、文字列ｓのｉ番目の文字を表し、その値は０又は１である。文字列の長さｎの２進表記に必要なビット数をｂとする。整数値データは、その２進表記を指定したビット幅（ｗ）に区切ることにより、２のｗ乗進法の“桁”に分割する。文字位置は、文字列先頭を０として、文字列先頭より数えた文字数で表現する。文字位置ｋにおけるランク関数の、下からｄ番目の桁をB[i, d]と表す。
【００２５】
図１において、１は補助情報の全体を現す。この中には、最下位から最上位までの各桁に対する桁データ２が並んでいる。桁データ２の数はｂをｗで割った値（切り上げ）より１だけ大きい値である。最下位よりｄ番目の桁データは、全てのｉに対するB[i, d]の情報を要約したものである。桁データ２は、要素データ３の繰り返しである。
【００２６】
要素データ３は、上位の桁を共有してｄ番目の桁を０から２のｗ乗マイナス１まで変化させたときの文字位置ｉに対するB[i, d]の情報を要約したものである。最下位の桁では、桁データ２はｎを２のｗ乗で割った値（切り上げ）の数だけの要素データ３からなる。上位の桁に一つ上がるごとに、桁データ２に含まれる要素データ３の個数は２のｗ乗分の１（切り上げ）に繰り返し減少し、最上位の桁では桁データに含まれる要素データの数は１となる。このようにして、上位桁を冗長に記憶することが回避される。
【００２７】
要素データ３は、ｄ番目の桁が２のｗ乗マイナス１のときのｉに対するB[i, d]の値である累積値データ５と、それ以外のｉに対するB[i, d] - B[j - 1, d]の値である差分データ４からなる。ここで、ｊは、ｉ＋１以下の２のｗ乗の倍数の最大値である。累積値データ５はｗビット必要だが、差分データは１ビットで十分なため、これにより記憶容量の圧縮を図ることができる。
【００２８】
（動作の説明）
図２に、このような補助情報を構築するための処理手順を示す。また、図３に、桁のビット幅がｗ＝２のときの構築過程の例を示す。図３において、３１は与えられたバイナリ文字列を上から下に向かって縦方向に表記したものである。文字列３１を入力し（Ｓ２０）、その各文字位置で、文字列先頭からの０又は１の並びの累積値を計算することにより（Ｓ２１）、各文字位置で図３の３２のような値を得る。これらの値は２進表記している。次に、これらの２進表記をｗビット幅の桁に分割し（Ｓ２２）、分割後得られたものをセルと呼ぶ。これにより図３の３３のような結果を得る。次に、最下位の桁から１桁上がるごとに繰り返し、上位桁のセルを２のｗ乗分の１に間引く（Ｓ２３）。即ち、上から数えて２のｗ乗の倍数番目の位置にあるセルを残して、他のセルを削除する。これにより、図３の３４に示すような結果を得る。次に、各列で上から数えて２のｗ乗の倍数番目以外の位置にあるセルの値を、直前のセルの値との差に変更する（Ｓ２４）。これにより、図３の３５に示すような結果を得る。ここで、その各列を桁データ２とし、その内部の２のｗ乗個ごとのセルを纏めて要素データ３とする。要素データ３の最後のセルを累積値データ５とし、それ以外のセルを差分データ４とする（Ｓ２５）。
【００２９】
（効果の説明）
図３の３１と３５を比較することにより、入力文字列を記憶するために必要な記憶容量と、補助情報を記憶するために必要となる記憶容量とを比較することができる。補助情報では、バイナリ入力文字列内の２のｗ乗個の文字（２のｗ乗ビット）ごとに、累積値データとして、部分和の該当桁（ｗビット）の情報を余分に記憶する必要がある。さらに、補助情報では、バイナリ入力文字列内の２のｗ乗個の文字（２のｗ乗ビット）ごとに、上位１セル（１ビット）を記憶する必要がある。上位の桁においても同様に、２のｗ乗個のセル（２のｗ乗ビット）ごとに、累積値データとして、部分和の該当桁（ｗビット）をさらに記憶する必要がある。また、上位セルが複数あれば、さらに上位方向に同様のセルのための記憶容量が繰り返し必要となる。従って、入力文字列を記憶するために必要な記憶容量を基準として、補助情報を記憶するために必要となる記憶容量の割合は、累積値データのために、１＋ｗ／（２のｗ乗）であり、また、上位桁方向のために、公比ｒ＝１／（２のｗ乗）の無限級数和として１／（１−ｒ）以下となり、最終的には、これらを合成して、（１＋ｗｒ）／（１−ｒ）以下となる。この値は、例えば、桁のビット幅がｗ＝８のとき、約１．０３５となる。すなわち、補助情報のために余分に必要となる記憶容量の増加は、僅か約３．５％に抑えられる。
【００３０】
（全体の説明）
次に、図１に示した補助情報を用いて、バイナリ文字列データ内の文字列検索を行う方法を示す。図４は、そのシステム全体の構成図であり、図５は全体の動作のフローチャートである。
【００３１】
図４において、計算機４３は、外部記憶装置４１内に保持された文字列データ４２を読み込んで（Ｓ５１）、そのバローズ・ホィーラー変換を計算してから（Ｓ５２）、主記憶４４内に図１に示した補助情報のデータ構造を構築する。また、計算機４３は、入力装置４６を介して検索配列データ４５を読み込み、各検索配列が文字列データ内に出現する位置を図５に示す手続きにより求めて、その検索結果４８を出力装置４７に出力する。
【００３２】
主記憶４４上には、公知のバローズ・ホィーラー変換の計算を行うバローズ・ホィーラー変換処理部４０１、図２を用いて説明した補助情報の構築処理を行う補助情報構築処理部４０２、公知のサフィックス・アレイを計算するサフィックス・アレイ構築処理部４０４、サフィックス・アレイの要素を一定間隔に間引く処理をする部分配列抽出処理部４０５、ランク関数を計算するランク関数計算処理部４０８、セレクト関数を計算するセレクト関数計算処理部４０９、公知の方法でランク関数とセレクト関数を繰り返し用いて、バローズ・ホィーラー変換とサフィックス・アレイの情報から、検索文字列の出現位置を特定する文字列検索処理部４０７が構築される。これらの処理部は、プログラムによって実装される。ランク関数計算処理部４０８は、図６に示した擬似コードを実装したプログラムによって実現される。セレクト関数計算処理部４０９は、図７に示した擬似コードを実装したプログラムによって実現される。また、主記憶４４上には、データとして、補助情報構築処理部４０２によって構築された補助情報４０３、及び部分配列抽出処理部４０５によって得られたサフィックス・アレイ部分配列４０６が保持される。
【００３３】
図５において、ステップ５１で文字列データ４２を入力し、ステップ５２でそのバローズ・ホィーラー変換を、バローズ・ホィーラー変換処理部４０１によって公知の方法を用いて計算する（非特許文献６）。次に、ステップ５３では、補助情報構築処理部４０２において、図２，３で説明した前記の方法を用いて、図１に示したような補助情報４０３を計算し、計算機主記憶４４上に記憶する。また、ステップ５７では、与えられた文字列データのサフィックス・アレイを、サフィックス・アレイ構築処理部４０４において公知の方法で計算する（非特許文献６）。サフィックス・アレイは文字列データ以上に多くの記憶容量を要するため、部分配列抽出処理部４０５において一定間隔に間引いて、例えば、１００要素ごとに１要素を抽出して、主記憶内にサフィックス・アレイ部分配列４０６として記憶する（Ｓ５８）。ステップ５４では、検索配列４５を一配列ずつ入力する。ステップ５５では、その入力の終了判定を行い、全ての入力を読み切って新たな入力が得られなかったときは、処理全体を終了する。新たな入力として検索配列が得られたときは、その検索配列に対する、サフィックス・アレイ内での辞書式順位の範囲を計算する。この計算は、公知の方法を用いて、ランク関数を繰り返し計算することにより達成できる（非特許文献４）（Ｓ５６）。補助情報を用いたランク関数の計算方法は、後述する。ステップ５９では、検索配列に対するサフィックス・アレイ内での辞書式順位を、文字列データ内での文字位置に変換することにより、検索配列の出現位置を計算する。この変換は、公知の方法を用いて、セレクト関数を繰り返し計算することにより達成できる（非特許文献４）。補助情報を用いたセレクト関数の計算方法は、後述する。ステップ６０では、計算された検索配列の出現位置を出力して、ステップ５４の検索配列の入力処理に戻る。ステップ５６，５９，６０の処理は、ランク関数計算処理部４０８とセレクト関数計算処理部４０９を用いて、文字列検索処理部４０７で行われる。
【００３４】
図６に、桁のビット幅がｗ＝８のときに、補助情報を用いてランク関数を計算する関数の擬似コードを示す。ビット幅がｗ＝８の場合は、２のｗ乗進法の１桁が計算機の１バイトに相当するため、特に高速に計算することが可能であるが、他のビット幅のときにもこの計算方法は有効である。この関数は、文字位置ｎを変数として、ｎにおけるランク関数の値ｒを返す。ここで、heightは補助情報のデータ構造の高さ（桁の数）であり、partial_sum_byte(h, n0)は、最下位の桁を０番目として、最下位より数えてｈ番目の桁にあるn0番目の部分和の値である。この値は、補助情報のデータ構造の中に累積値データとして記憶されている。何故ならば、n0は、定義式より２５６の倍数の値をとるからである。また、bit_sum(h, n0, n)は、補助情報のデータ構造において、最下位よりｈ番目の桁にある、n0＋１番目からｎ番目までの差分データ（ビット値）の総和である。これらは、高々２５５個以下のビットの総和なので、文字列データの大きさに無関係に、一定の時間で計算できる。また、>>は右ビットシフト、<<は左ビットシフト、＆はビットANDを表す。従って、n0はｎの直前の２５６の倍数を表し、s＆255はｓの最下位バイトを表す。
【００３５】
図７に、桁のビット幅がｗ＝８のときに、補助情報を用いてセレクト関数を計算する関数の擬似コードと、そのサブルーチンとして用いられる関数の擬似コードを示す。ビット幅がｗ＝８の場合は、２のｗ乗進法の１桁が計算機の１バイトに相当するため、特に高速に計算することが可能であるが、他のビット幅のときにもこの計算は有効である。このセレクト関数は、与えられたｎに対して、ｎ番目の１の位置positionを返す。number_of_1sは文字列データ４２全体の中に含まれる１の数であり、これを超えるｎが与えられた場合は、この関数は−１を返す。外側のwhileループにより、positionの値は、最上位桁から最下位桁まで桁ごとに順次決定される。最上位桁の値は一意で０であり、これをrootで表す。bit_set(position)は、現在のpositionの該当桁の差分データ４の値が１か０かを表す。overshootは、上位の桁が繰上りを要求しているか否かを表すブール値である。position＝first_child_of(position)は、該当桁を一つ下に下げ、その桁の値を０とすることを表す。byte_at(n, height_of(position))は、ｎの該当桁の値を表す。partial_sum_byte(position−1)は、positionの直前の位置に対応する要素データ３の累積値５を表す。shortageは、現在のpositionにおけるランク値とｎの値との該当桁における差を表す。内側のwhileループでは、shortageの値が正である限り、positionの値を１ずつ増やして、差分データ４の値を参照して、shortageの値を更新する。こうしてshortageの値が０に等しくなったときは、最下位桁でない場合、即ち、height_of(position)が正の場合、該当桁より下位の桁でpositionのランク値がｎの値を越えるか、又は、該当桁の差分データ４にビットが立つまで、positionの値を１ずつ増やしてゆく。ここで、該当桁より下位の桁でのpositionのランク値をｎの値の比較のためには、以下に説明する関数compare_lower_bytes(position, n)を用いる。こうして得られたshortageの値が負になるか否かをブール値overshootとする。以上の処理を最下位の桁まで繰り返し、最終的に得られたpositionをセレクト関数の値として返す。
【００３６】
関数compare_lower_bytes(node, n)は、該当桁より下位の桁でのnodeにおけるランク値とｎの値を比較し、前者が後者よりも小さければ負の値を返し、前者が後者よりも大きければ正の値を返し、両者が一致すれば０を返す。この関数は、与えられた文字位置の該当桁から最下位の桁に向かって順に、変数descendentでのランク値とｎの値との該当桁における差を計算しながら、そのような比較判定を行う。descendant＝last_child_of(descendant)は、該当桁を１つ下に下げ、その桁の値を最大化する。そこでの累積値データ５の値とｎの該当桁の値との差ｓを計算して、０との比較判定を行うことにより、結果を返す。
【００３７】
（その他の実施例１）
前記実施例では、２種類の文字０と１とからなるバイナリ文字列データ内の文字列の高速検索を行うシステムの例を示した。本実施例では、文字の種類数を２に限定せずに、一般の複数の文字種に対しても同様に、本発明を用いて文字列の高速検索を行うシステムを実現できることを示す。説明を具体的にするために、超並列ＤＮＡシーケンサの配列データ解析で必要となる、Ａ，Ｇ，Ｃ，Ｔ，Ｎの５種類の文字からなる塩基配列データに対して、高速に配列検索を行うシステムを取り上げる。２０種類の文字を必要とするアミノ酸配列、又は、全てのアルファベットを用いる一般文書に対しても、同様な検索システムを実現することが出来る。
【００３８】
前記実施例と同様に、指定したパラメータｗにより、整数値の２進表記をｗビットごとに分解して、２のｗ乗進法による“桁”を考える。特に、ｗ＝８のときは、この１桁が計算機上の１バイトに相当することから、計算が高速になる。
【００３９】
基本的な考え方は、５種類の文字Ａ，Ｇ，Ｃ，Ｔ，Ｎからなる文字列ｓが与えられたとき、これら５種類の各文字に対応するバイナリ文字列s(A), s(C), s(G), s(T), s(N)を作り、例えば、文字Ａに対する元の文字列ｓのランク関数やセレクト関数の計算を、文字１に対するバイナリ文字列s(A)のランク関数やセレクト関数の計算に帰着させることである。バイナリ文字列s(A)は、与えられた文字列にｓおいて、文字Ａを１に、それ以外の文字を０に置き換えることにより得られる。その他の文字Ｃ，Ｇ，Ｔ，Ｎについても同様である。
【００４０】
バイナリ文字列s(A), s(C), s(G), s(T), s(N)のランク関数やセレクト関数を高速に計算するために、それらの補助情報を前記実施例と同様に構築する。但し、最下位の桁データでは、文字種類数（この場合は５）に比例してデータ量が増加することを避けるため、最下位の桁データだけは、全文字種を一括したデータ構造とする。一方、上位の桁データのデータ量は大きくない（１桁上がるごとに２５６分の１に減少）ので、上位の桁データは文字種ごとに独立に構築する。
【００４１】
図８は、５種類の文字Ａ，Ｇ，Ｃ，Ｔ，Ｎからなる文字列データに対して、各々の文字Ａ，Ｇ，Ｃ，Ｔ，Ｎに対するランク関数とセレクト関数を高速に計算するために用いる補助情報のデータ構造の説明図である。８１は補助情報の全体であり、各文字Ａ，Ｇ，Ｃ，Ｔ，Ｎに対する桁データ８２（但し、最下位の桁を除く）と、それら５種類の文字の間で共有される最下位桁データ８３とから構成される。各文字Ａ，Ｇ，Ｃ，Ｔ，Ｎに対する上位の桁データ８２の内部の構成は、バイナリ文字列の１に対する桁データ（図１の桁データ２）と全く同じである。これらの上位の桁データ８２は、前記の各バイナリ文字列s(A), s(C), s(G), s(T), s(N)に対して、前記実施例と同一の方法で構築できる。一方、最下位桁データ８３の内部は、図９に示す構成をもつ。
【００４２】
図９において、最下位桁データ８３は、要素データ９１の繰り返しからなる。各要素データ９１は、文字列先頭から２のｗ乗個ごとに区切った文字位置の各グループに対して、Ａ，Ｇ，Ｃ，Ｔ，Ｎ各文字に関するランク関数の最下位桁の値を纏めて要約した情報である。その内部は、２のｗ乗マイナス１個の差分データ９２と、１個の累積値データ９４とからなる。差分データ９２は、対応する文字位置にＡ，Ｇ，Ｃ，Ｔ，Ｎのどの文字があるかにより、表９３の変換テーブルに従って２進符号化した値をもつ。一方、累積値データ９４は、２のｗ乗個に区切った文字位置のグループの最後の文字位置において、Ａ，Ｇ，Ｃ，Ｔ，Ｎの各文字に関するランク関数の最下位桁の値を並べたものである。最下位桁データは、上記の定義に基づいて、与えられた文字列データから直接計算できる。
【００４３】
Ａ，Ｇ，Ｃ，Ｔ，Ｎの５種類の文字からなる塩基配列データに対して、高速に配列検索を行うシステムの構成は、図４において、文字列データ及び検索配列データがバイナリ文字列からＡ，Ｇ，Ｃ，Ｔ，Ｎの５種類の文字からなる文字列に置き換えられるだけで、全く同様である。また、その動作のフローチャートも図５と全く同様である。その際、各文字Ａ，Ｇ，Ｃ，Ｔ，Ｎに対して、塩基文字列ｓに対するランク関数とセレクト関数の計算が必要になる。ところが、それらの値は、バイナリ文字列s(A), s(C), s(G), s(T), s(N)に対するランク関数とセレクト関数の値に等しい。一方、後者の値は、前記実施例で説明した方法に従って高速に計算できる。従って、前者の値も高速に計算されることになる。
【００４４】
（その他の実施例２）
前記実施例では、文字の種類数を２に限定せずに、一般の複数の文字種に対して、文字列の高速検索を行うための補助情報を、最下位の桁については、全文字種に関する情報を纏めて有する最下位桁データと、それ以外の上位の桁については、文字種ごとに独立に構成した桁データとからなるデータ構造とすることにより、メモリ効率が良い高速な文字列検索が行えることを示した。
【００４５】
本実施例では、さらに、上位の桁データについても、文字種ごとに独立に構成することを避け、文字種が多いときにメモリ効率が改善される、もう一つの実施例を述べる。本実施例は、塩基配列データの場合よりも文字種が多く、２０種の文字種をもつアミノ酸配列データや、それ以上の文字種をもつ全アルファベットからなる一般の文書データに対して応用するのに適している。
【００４６】
文字列検索のための全体システムや全体の処理手順は、前記実施例と全く同じである。上位桁のための補助情報のデータ構造と、それを利用するランク関数とセレクト関数の計算方法が異なるだけである。
【００４７】
基本的な考え方は、文字種全体を２つに分類して、多種の文字を含む文字列の各文字がそのどちらの種類に分類されるかに従って０又は１に置き換えたバイナリ文字列を作り、さらに、その２種類の内の一方のみからなる部分文字列を２つ作って、その各々に対して同様な処理を、文字種が２種類に減少するまで再帰的に繰り返す。元の文字列に対するランク関数とセレクト関数の計算は、このようにして得られるバイナリ文字列に対するランク関数とセレクト関数の計算に帰着させる。
【００４８】
図１０に、そのようなバイナリ文字列の構成例を示す。１０１は多種の文字を含む文字列で、１０２で示すＭはその各文字を２進符号化した３ビットの配列である。各文字は、その２進符号化の先頭ビットにより２種類に分類される。１０３で示すＬは、その各々の先頭ビットを並べて得られるバイナリ配列である。１０４で示すＭ０とＭ１は、先頭ビットがそれぞれ０，１である文字と抜き出して、それらの下位の２ビットを並べた配列である。これらは、一方の種類のみの文字からなる１０１の部分配列に対応する。これらのＭ０とＭ１に対して、同様の処理を再帰的に繰り返す。即ち、それらの先頭ビットを並べて得られるバイナリ配列が１０５で示すＬ０とＬ１である。また、その先頭ビットに従って分類して、さらに下位のビットを並べて得られる配列が、Ｍ００と１０６で示すＭ０１、及び、Ｍ１０とＭ１１である。この例では、ここで文字の種類が２種類まで減少したので、これらは、それらの先頭ビット並べて得られる配列Ｌ００とＬ０１、及び、Ｌ１０とＬ１１と一致する。
【００４９】
図１１に、多種の文字を含む文字列を、このようなバイナリ文字列に再帰的に分解するための処理手順を示す。ステップ１１０は文字列データの入力処理である。文字列データに含まれる文字の種類数は、高々２のｂ乗以下とする。ステップ１１１では、文字列データ内の各文字をｂビットで２進符号化して、ｂビットの列を作る。ステップ１１２でｋをｂにセットして、ステップ１１３でｋが１より大きいと判定される間、以下の処理を繰り返す。
【００５０】
ステップ１１５では、全てのｋビットの列に対して、以下の処理を繰り返す。
【００５１】
ステップ１１６では、ｋビットの列の最上位ビットを用いて、バイナリ文字列を作る。
【００５２】
ステップ１１７では、ｋビットの列の最上位ビットにより分類した２つの部分列それぞれに対して、下位のｋ−１ビットを用いて、ｋ−１ビットの列を作る。
【００５３】
全てのｋビット列に対する処理が完了したら、ステップ１１８でｋを１減らして、ステップ１１３に戻る。ステップ１１３でｋが１に等しいと判断されたら、ステップ１１４で処理を終了する。
【００５４】
次に、多種の文字を含む文字列に対するランク関数の計算が、こうして得られたバイナリ文字列のランク関数の計算に帰着できることを示す。図１２は、多種の文字を含む文字列のｎ番目の文字位置における文字ｃに関するランク関数を計算する処理手順を示す。ステップ１２０で、文字位置ｎと文字種ｃを入力する。ステップ１２１で、文字ｃのｂビットの２進符号化を行い、それをp1 p2 … pbとする。ステップ１２２でｋ＝１として、ステップ１２３でｋがｂ以下であると判断される限り、以下の処理を繰り返す。ステップ１２６でｐｋの値が１に等しいかどうか判断し、それに従ってステップ１２７又はステップ１２８で示す式により、ｎの値を更新する。ここで、rank(Lp0 p1…p(k-1), n)は、先頭からｋビットまでを用いて再帰的に分類して得られた部分文字列の先頭ビットを並べて得られるバイナリ文字列Lp0 p1…p(k-1)に対する文字位置ｎにおける１に関するランク関数の値である。これにより、pkの値が０か１かに拘わらず、ｎの値は、バイナリ文字列rank(Lp0 p1…p(k-1), n)のｎにおけるpkに関するランク関数の値に更新される。この値は、次の再帰処理において、先頭からｋ＋１ビットまでを用いて再帰的に分類して得られる部分文字列の先頭ビットを並べて得られるバイナリ文字列Lp0 p1…pk内の文字位置を指定することになる。ステップ１２９でｋの値を１増やして、ステップ１２３に戻り再帰的な処理を続け、ステップ１２３でｋがｂを越えた場合は、ステップ１２４でｎをランク値として回答し、ステップ１２５で処理を終える。
【００５５】
次に、多種の文字を含む文字列に対するセレクト関数の計算が、前記のようにして得られたバイナリ文字列のセレクト関数の計算に帰着できることを示す。図１３は、多種の文字を含む文字列において文字ｃがｎ番目に現れる文字位置を求めるセレクト関数を計算する処理手順を示す。ステップ１３１で、文字種ｃと順位ｎを入力する。ステップ１３２で、文字ｃのｂビットの２進符号化を行い、それを p1 p2 … pbとする。ステップ１３３でｋ＝ｂとして、ステップ１３４でｋが正であると判断される限り、以下の処理を繰り返す。ステップ１３５では式に従って、ｎの値を更新する。ここで、select(Lp0 p1…p(k-1), n, pk)は、先頭からｋビットまでを用いて再帰的に分類して得られた部分文字列の先頭ビットを並べて得られるバイナリ文字列 Lp0 p1…p(k-1)において文字１がｎ番目に現れる文字位置を求めるセレクト関数の値である。pkの値が１に等しいときは、図７を用いて説明したバイナリ文字列の１に関するセレクト関数の計算方法を用いる。pkの値が０に等しいときにも、バイナリ文字列の０に関するセレクト関数を同様な方法で計算できる。この値は、次の再帰処理において、先頭からｋ−１ビットまでを用いて再帰的に分類して得られる部分文字列の先頭ビットを並べて得られるバイナリ文字列 Lp0 p1…p(k-2)内のp(k-1)の出現順位を指定することになる。ステップ１３６でｋの値を１減らして、１３４に戻り再帰的な処理を続け、ステップ１３４でｋが０になった場合は、ステップ１３７でｎをセレクト値として回答し、ステップ１３８で処理を終える。
【００５６】
（その他の実施例３）
前記実施例では、汎用計算機の利用を想定して、ビット幅ｗを８にして、２のｗ乗進法の１桁を汎用計算機の１バイトに一致させて、汎用計算機上で効率的に計算できるような方法を説明した。しかし、これまでに説明した方法は、ビット幅ｗが８以外である場合でも有効である。
【００５７】
配列検索の処理を直接論理ゲートで構成し、ハードウェア化した専用の計算機として実現する場合には、ビット幅ｗを１にすると、ハードウェアが単純化されて有利となる。この場合、２進法の“桁”とはビットに他ならない。
【００５８】
ビット幅ｗを１にすることにより、図１に示した、ランク関数とセレクト関数の高速計算のための補助情報のデータ構造は、図１４のように単純化される。１４１は補助情報の全体を現す。この中には、最下位から最上位までの各桁に対する桁データ１４２が並んでいる。桁データ１４２の数は、与えられた文字列ｓの長さｎの２進表記に必要なビット数ｂより１だけ大きい値である。桁データ１４２は、要素データ１４３の繰り返しである。
【００５９】
要素データ１４３は、２つの累積値データ１４４と１４５とからなる。これらは、上位の桁（ビット）を共有して、下からｄ番目の桁（ビット）をそれぞれ０と１にしたときの文字位置におけるランク関数の下からｄ番目のビットの値である。
【００６０】
従って、最下位の桁データは、全ての文字位置におけるランク関数の値の最下位ビットを並べたものであり、下からｄ番目の桁データは、全ての文字位置におけるランク関数の値の下からｄ番目のビットを、１桁上がるごとに繰り返し半分になるように間引いてから、並べたものとなる。図１の４のような差分データは累積値データ１４４に置き換えられ、不要となる。
【００６１】
ビット幅ｗを１にすることにより、図６と図７に示したようなランク関数やセレクト関数の計算は全てビット演算に還元され、また、累積値データに差分データを加算するような計算は不要となり、また、ループ処理は展開することにより、繰り返し構造をもつ論理ゲート回路に還元される。このような論理ゲートを図１４のデータ構造をもつメモリセルの近くに配置する回路設計を行うことにより、専用ハードウェアにより高速化されたランク関数とセレクト関数の計算が可能になる。
【００６２】
図１５に、このような専用ハードウェアを用いた配列検索システムの全体の構成図を示す。計算機１５３は、外部記憶装置１５１内に保持された文字列データ１５２を読み込んで、そのバローズ・ホィーラー変換を計算してから、専用ハードウェア１５４内に図１４に示した補助情報のデータ構造を構築する。また、計算機１５３は、入力装置１５６を介して検索配列データ１５５を読み込み、各検索配列が文字列データ内に出現する位置を図５に示す手続きにより求めて、その検索結果１５８を出力装置１５７に出力する。図５に示す手続きは、ビット幅ｗを１にすることによる変更は受けず、全く同様に行うことができる。
【図面の簡単な説明】
【００６３】
【図１】バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報のデータ構造を表示した説明図である。
【図２】バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報を構築する処理手順を示した説明図である。
【図３】バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報を構築する過程を示した説明図である。
【図４】バイナリ文字列データ内の文字列検索を行うシステムを示した説明図である。
【図５】バイナリ文字列データ内の文字列検索を行う動作のフローチャートである。
【図６】バイナリ文字列に対するランク関数の計算方法の擬似コードを示した説明図である。
【図７】バイナリ文字列に対するセレクト関数の計算方法の擬似コードを示した説明図である。
【図８】バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報のデータ構造の全体を表示した説明図である。
【図９】バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報のデータ内部の最下位の桁データの構成を表示した説明図である。
【図１０】多種の文字からなる文字列を、バイナリ文字列データに再帰的に分解する例を示した説明図である。
【図１１】多種の文字からなる文字列を、バイナリ文字列データに再帰的に分解する処理のフローチャートである。
【図１２】多種の文字からなる文字列に対するランク関数の計算を、バイナリ文字列データに対するランク関数の計算に帰着させるための処理のフローチャートである。
【図１３】多種の文字からなる文字列に対するセレクト関数の計算を、バイナリ文字列データに対するセレクト関数の計算に帰着させるための処理のフローチャートである。
【図１４】ビット幅ｗが１のときの、バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報の単純化されたデータ構造を表示した説明図である。
【図１５】ビット幅ｗを１として、バイナリ文字列に対するランク関数とセレクト関数の計算をハードウェアにより高速化した文字列検索システムを示した説明図である。
【符号の説明】
【００６４】
１  バイナリ文字列に対するランク関数とセレクト関数を高速に計算するための補助情報
２  桁データ
３  要素データ
４  差分データ
５  累積値データ
【図１】
0005171346.tif 000002
【図２】
0005171346.tif 000003
【図３】
0005171346.tif 000004
【図４】
0005171346.tif 000005
【図５】
0005171346.tif 000006
【図６】
0005171346.tif 000007
【図７】
0005171346.tif 000008
【図８】
0005171346.tif 000009
【図９】
0005171346.tif 000010
【図１０】
0005171346.tif 000011
【図１１】
0005171346.tif 000012
【図１２】
0005171346.tif 000013
【図１３】
0005171346.tif 000014
【図１４】
0005171346.tif 000015
【図１５】
0005171346.tif 000016