【文献】
KARKKAINEN,Juha et al.,Linear Work Suffx Array Construction,Journal of the ACM,米国,ACM,2006年11月,Vol.53 No.6,pp.918-936
【文献】
萩原 洋一 他,作業場所が小さいマージソートと計算量の評価,情報処理学会研究報告,日本,社団法人情報処理学会,1999年05月10日,第99巻 第33号,第33頁−第40頁
【文献】
渋谷 哲朗,アルゴリズム Algorithms,丸善出版株式会社,2016年11月20日,第103頁−第112頁
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0010】
[実施の形態1]
接尾辞配列とは、文字列の全ての接尾辞を辞書順に並べ替えることで得られる配列である。以下では、接尾辞配列の生成において実行される再帰処理を例として本実施の形態を説明する。まず、
図2及び
図3を用いて、接尾辞配列の生成において実行される再帰処理を簡単に説明する。
図2及び
図3において、矩形の図形は各ステップにおける処理対象のデータのサイズ(すなわち、問題インスタンスのサイズ。以下では問題サイズと呼ぶ。)を表す。N
iはステップiの問題サイズを表す。
【0011】
接尾辞配列の生成においては、各ステップにおいて、対象の接尾辞の半分以下の接尾辞(すなわち1/c(cは1<c≦Nを満たす整数)の接尾辞。Nは初期的な問題サイズを表す。)が再帰的に並べ替えられる。従って、ステップ(i+1)の接尾辞はステップiの接尾辞の半分以下の接尾辞に相当し、ステップ(i+2)の接尾辞はステップ(i+1)の接尾辞の半分以下の接尾辞に相当する。以下では、特にcの値を指定しない限りc=2とする。
【0012】
各ステップにおいては、次のステップにおいて並び替えられた接尾辞を利用して対象の接尾辞が並び替えられる。具体的には、ステップ(i+1)においてはステップ(i+2)において並び替えられた接尾辞を利用して対象の接尾辞が並び替えられ、ステップiにおいてはステップ(i+1)において並び替えられた接尾辞を利用して対象の接尾辞が並び替えられる。ここで、各ステップにおいては、前のステップの問題サイズ(例えば接尾辞の数)が並び替えに使用される。具体的には、ステップ(i+2)においてはステップ(i+1)の問題サイズが並び替えに使用され、ステップ(i+1)においてはステップiの問題サイズが並び替えに使用される。
【0013】
図4を用いて、問題サイズの情報を保存する方法として考えられる第1の方法を説明する。第1の方法では、作業領域とは別に外部領域(例えばスタック領域)が用意され、外部領域に問題サイズが保存される。この場合、データの取得に要する時間はO記法でO(1)(回)であり、領域はO記法でO(logN)+logN
2(ビット)である。hはステップ数を表す。以下では、対数の底が省略されている場合は底が2であるとする。
【0014】
第1の方法によれば、高速に処理することが可能であるものの、使用される領域のサイズが大きくなる。
【0015】
図5を用いて、問題サイズの情報を保存する方法として考えられる第2の方法を説明する。第2の方法では、未使用であることを表す情報を使用されない作業領域に書き込み、使用される作業領域の先頭から線形探索を行うことで、N
iが計算される。
図5にはステップiの作業領域が示されており、M
i(=floor(M
i-1/c))は、問題サイズの上限である。floorは切り捨ての関数である。ハッチングが付された部分は使用されない作業領域を表す。この場合、データの取得に要する時間はO記法でO(N)(回)であり、領域はO記法でO(logN)(ビット)である。
【0016】
第2の方法によれば、使用される領域のサイズを小さくすることができるものの、処理が低速になる。
【0017】
以上のように、上で説明した2つの方法には、処理が低速になるか又は使用される領域のサイズが大きくなるという問題がある。そこで、本実施の形態においては以下で説明するような方法によって、再帰処理の性能を維持しつつ使用される記憶領域のサイズを小さくする。
【0018】
図6に、本実施の形態の情報処理装置1の機能ブロック図を示す。情報処理装置1は、格納処理部101と、復元処理部103と、問題処理部105と、入力データ格納部110と、作業データ格納部111と、管理データ格納部113と、出力データ格納部114とを含む。
【0019】
格納処理部101、復元処理部103及び問題処理部105は、
図16に示したメモリ2501にロードされたプログラムがCPU(Central Processing Unit)2503に実行されることによって実現される。作業データ格納部111及び管理データ格納部113は、例えば、
図16に示したメモリ2501に設けられる。入力データ格納部110及び出力データ格納部114は、例えば、
図16に示したメモリ2501又はHDD(Hard Disk Drive)2505に設けられる。
【0020】
格納処理部101は、入力データ格納部110に格納されたデータに基づき、問題サイズの情報を復元するために使用する情報を生成し、管理データ格納部113に格納する。復元処理部103は、格納処理部101によって管理データ格納部113に格納された情報を用いて、問題サイズの情報を復元する。問題処理部105は、復元処理部103によって復元された問題サイズの情報を用いて、接尾辞配列の生成処理(本処理は再帰処理を含む)を実行し、実行結果を出力データ格納部114に格納する。
【0021】
次に、
図7を用いて、問題サイズの情報を復元するために使用する情報を保存する処理について説明する。本処理は各ステップについて実行されるが、説明を簡単にするためステップiについて実行される場合について説明する。
【0022】
まず、格納処理部101は、L
i=M
i mod cに従ってL
iを算出する(
図7:ステップS1)。格納処理部101は、算出したL
iを管理データ格納部113に保存する。
【0023】
なお、cは入力データ格納部110に格納されているものとする。M
iはM
i=floor(M
i-1/c)に従って算出され、M
0=N
0=Nであるとする。M
0、N
0及びNは、入力データ格納部110に格納されている。なお、M
iはステップiにおいて使用可能な連続領域の最大サイズ(すなわち、問題サイズの上限)である。
【0024】
格納処理部101は、N
i=M
iが成立するか判定する(ステップS3)。N
i=M
iが成立する場合(ステップS3:Yesルート)、格納処理部101は、P
iに1を設定する(ステップS5)。そして、格納処理部101は、P
i(すなわち1)を管理データ格納部113に保存する。
【0025】
一方、N
i=M
iが成立しない場合(ステップS3:Noルート)、格納処理部101は、P
iに0を設定する(ステップS7)。そして、格納処理部101は、P
i(すなわち0)を管理データ格納部113に保存する。さらに、格納処理部101は、ステップiの作業領域(すなわち作業データ格納部111の領域)のうちM
i番目の領域にN
iを格納する(ステップS9)。N
iは、ステップ(i−1)から呼び出されたときに判明しているものとする。そして処理は終了する。
【0026】
なお、ステップiの作業領域はM
i個の領域を含むので、ステップS9においてはM
i個の領域のうちM
i番目の領域にN
iが格納される。M
i番目の領域は、N
iとM
iとの差分に相当する領域である。これについては後で具体例を用いて説明する。
【0027】
以上のように、本実施の形態においては問題サイズの情報がそのまま保存されるわけではなく、問題サイズの情報を復元するために使用される最低限の情報(すなわち、P
i及びL
i)が保存される。なお、N
i≠M
iである場合には問題サイズの情報が保存されるものの、保存される領域は作業領域の一部であるので、問題サイズの情報を保存するために別途領域を用意しなくてもよい。
【0028】
なお、後で具体例を示すように、L
i及びP
iは各ステップについて保存されるが、M
i及びN
iは最終ステップのみについて保存されるとする。
【0029】
次に、
図8を用いて、問題サイズの情報を復元する処理について説明する。本処理は各ステップについて実行されるが、説明を簡単にするためステップiについて実行される場合について説明する。
【0030】
まず、復元処理部103は、管理データ格納部113からM
i及びL
i-1を読み出し、M
i-1=ceil(c*M
i)+L
i-1によりM
i-1を算出する(
図8:ステップS11)。ceilは切り上げの関数である。
【0031】
復元処理部103は、管理データ格納部113からP
i-1を読み出し、P
i-1=1(すなわち、M
i-1=N
i-1)であるか判定する(ステップS13)。
【0032】
P
i-1=1である場合(ステップS13:Yesルート)、復元処理部103は、N
i-1にM
i-1を設定する(ステップS17)。そして、問題処理部105は、復元処理部103により復元されたN
i-1を用いて、ステップiの問題についての処理を実行する。
【0033】
一方、P
i-1=1ではない場合(ステップS13:Noルート)、復元処理部103は、ステップ(i−1)の作業領域のM
i-1番目の領域の値を作業データ格納部111から読み出す。そして、復元処理部103は、読み出した値をN
i-1に設定する(ステップS15)。そして、問題処理部105は、復元処理部103により復元されたN
i-1を用いて、ステップiの問題についての処理を実行する。そして処理は終了する。
【0034】
なお、最終的な実行結果(すなわち、接尾辞配列)は出力データ格納部114に格納される。
【0035】
以上のように、本実施の形態においては、問題サイズの情報そのものを保存することなく、各ステップにおいて処理を実行することができる。従って、特に使用できる記憶領域が限られている場合や大規模なデータに対して再帰処理を実行する場合において、リソースを削減し、ひいてはコストを削減することができるようになる。また、処理の高速化および不要な処理の省略により、リアルタイム性の向上と省電力とを実現することができるようになる。
【0036】
本実施の形態の方法によれば、使用される情報はM
i、P
i及びL
iであるので、データの取得に要する時間はO記法でO(1)(回)である。また、P
i=1(ビット)であり、L
i=log2=1(ビット)であるので、領域はO記法でO(logN)+(1+1)*h=O(logN)+2logN(ビット)である。
図4を用いて説明した第1の方法と比較すると、同等の時間で領域を4096ビットから128ビットに小さくすることができる。また、
図5を用いて説明した第2の方法と比較すると、128ビットの領域を追加することで、処理を2
64倍速くすることができるようになる。
【0037】
図9乃至
図15を用いて、本実施の形態における作業領域及び管理領域(ここでは、管理データ格納部113の領域)の状態の遷移について具体的に説明する。
【0038】
初期状態は、
図9に示す状態であるとする。すなわち、作業領域は10の領域に分かれており、管理領域には、初期値としてM
0=10及びN
0=10が格納されている。さらに、M
0=N
0であるのでP
0=1が格納されており、L
0=M
0 mod 2=0が格納されている。なお、Nは10であり、cは2であるとする。
【0039】
図10に示すように、ステップ1においては、M
1およびL
1が算出される。M
1=floor(M
0/2)=5であり、L
1=M
1 mod 2=1である。N
1が4であることは判明している。M
1≠N
1であるので、P
1は0である。従って、ステップS1の作業領域のM
1(=5)番目の領域に、N
1=4が保存される。
【0040】
図11に示すように、ステップ2においては、M
2およびL
2が算出される。M
2=floor(M
1/2)=2であり、L
2=M
2 mod 2=0である。N
2が2であることは判明している。M
2=N
2であるので、P
2は1である。
【0041】
図12に示すように、ステップ3においては、M
3およびL
3が算出される。M
3=floor(M
2/2)=1であり、L
3=M
3 mod 2=1である。N
2が1であることは判明している。M
3=N
3であるので、P
3は1である。
【0042】
本例においては、ステップ3が最終ステップであるとする。この場合、
図13に示すように、ステップ0からステップ2までの作業領域は、ステップ1の作業領域のうちM
1番目の領域を除いて解放される(すなわち、データが陽に保存されない)。また、ステップ0からステップ2までの管理領域のうちM
i及びN
iの領域は解放される(すなわち、データが陽に保存されない)。
【0043】
そして、
図13の状態に基づいてステップ2の問題サイズが復元される。M
2=ceil(c*M
3)+L
2=ceil(2*1)+0=2である。P
2=1であるので、N
2=M
2=2である。
【0044】
次に、
図14の状態に基づいてステップ1の問題サイズが復元される。M
1=ceil(c*M
2)+L
1=ceil(2*2)+1=5である。P
1=0であるので、N
1はステップ1の作業領域のM
1番目の領域から読み出される。従って、N
1=4である。
【0045】
次に、
図15の状態に基づいてステップ0の問題サイズが復元される。M
0=ceil(c*M
1)+L
0=ceil(2*5)+0=10である。P
0=1であるので、N
0=M
0=10である。
【0046】
以上のような処理を実行すれば、前のステップの問題サイズの情報を特定することができる。なお、
図14及び
図15に示したように、対象のステップの前のステップのM
i及びN
iを復元し、復元したN
iを用いて対象のステップの処理が完了した段階で、対象のステップのM
i及びN
iの領域及び作業領域を解放してもよい。
【0047】
[実施の形態2]
第1の実施の形態の方法は、ステップ(i+1)の問題サイズがステップiの問題サイズの1/c倍であるケースを対象としている。これに対して、第2の実施の形態の方法は、ステップ(i+1)の問題サイズがステップiの問題サイズよりcだけ小さいケースを対象とする。
【0048】
この場合、以下のように第1の実施の形態の方法を変更すればよい。
【0049】
まず、定義を以下のように変更する。
(1)c≧1
(2)M
i+1=floor(M
i−c)
(3)h=o(N)
(4)L
i=M
i−ceil(c+M
i+1)
【0050】
また、ステップiにおいてM
iが判明しているときにM
i-1及びN
i-1を求める計算を、以下のように変更する。
(1)M
i-1=ceil(c+M
i)+L
i-1
(2)P
i-1=1である場合、N
i-1=M
i-1
(3)P
i-1≠1である場合、N
i-1はステップ(i−1)の作業領域のM
i-1番目の領域に格納された値
【0051】
以上のようにすれば、ステップ(i+1)の問題サイズがステップiの問題サイズよりcだけ小さいケースについても、処理を高速化し且つ記憶領域のサイズが大きくなることを抑制することができるようになる。
【0052】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置1の機能ブロック構成は実際のプログラムモジュール構成に一致しない場合もある。
【0053】
また、上で説明したデータ構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【0054】
また、接尾辞配列の生成において実行される再帰処理を例として説明したが、別の再帰処理に対しても本実施の形態を適用することができる。例えば、再帰処理後に再帰処理前の情報を使用する場合には本実施の形態の処理を適用可能であるので、問題サイズの情報以外の情報について本実施の形態の処理と同様の処理を実行してもよい。
【0055】
また、再帰処理以外の処理であって特定の処理を繰り返し実行する処理に対して本実施の形態を適用してもよい。
【0056】
なお、上で述べた情報処理装置1は、コンピュータ装置であって、
図16に示すように、メモリ2501とCPU2503とハードディスク・ドライブ(HDD)2505と表示装置2509に接続される表示制御部2507とリムーバブル・ディスク2511用のドライブ装置2513と入力装置2515とネットワークに接続するための通信制御部2517とがバス2519で接続されている。オペレーティング・システム(OS:Operating System)及び本実施例における処理を実施するためのアプリケーション・プログラムは、HDD2505に格納されており、CPU2503により実行される際にはHDD2505からメモリ2501に読み出される。CPU2503は、アプリケーション・プログラムの処理内容に応じて表示制御部2507、通信制御部2517、ドライブ装置2513を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ2501に格納されるが、HDD2505に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク2511に格納されて頒布され、ドライブ装置2513からHDD2505にインストールされる。インターネットなどのネットワーク及び通信制御部2517を経由して、HDD2505にインストールされる場合もある。このようなコンピュータ装置は、上で述べたCPU2503、メモリ2501などのハードウエアとOS及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【0057】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【0058】
本実施の形態の第1の態様に係る格納方法は、(A)各工程において特定の処理が実行される複数の工程のうち第1の工程において、第1の工程における処理対象のサイズである問題サイズが、第1の工程の前の工程の状態に基づき規定される上限サイズと一致するか判定し、(B)判定結果を記憶領域に保存し、(C)第1の工程の次の工程である第2の工程において、記憶領域に保存された判定結果を用いて問題サイズを特定し、特定した問題サイズに基づき第2の工程の特定の処理を実行する処理を含む。
【0059】
このようにすれば、前の工程の問題サイズの情報を保存する記憶領域が大きくなることを抑制できるようになる。これにより、特定の処理を繰り返し実行する場合において、実行中に使用される記憶領域のサイズが大きくなることを抑制する。
【0060】
また、本格納方法は、(D)第1の工程において、上限サイズを所定の数で割った場合の剰余の情報を記憶領域に保存する処理をさらに含んでもよい。そして、第2の工程の特定の処理を実行する処理において、(c1)判定結果が、問題サイズが上限サイズと一致することを示している場合、記憶領域に保存した剰余の情報を用いて問題サイズを特定してもよい。
【0061】
判定結果のみでは問題サイズを特定できない場合にも対処できるようになる。
【0062】
また、本格納方法は、(E)問題サイズが上限サイズと一致しない場合、第1の工程において、問題サイズと上限サイズとの差に相当する領域に、問題サイズの情報を格納する処理をさらに含んでもよい。そして、第2の工程の特定の処理を実行する処理において、(c2)判定結果が、問題サイズが上限サイズと一致しないことを示している場合、問題サイズを記憶領域から読み出してもよい。
【0063】
使用されない領域に問題サイズの情報が保存されるので、新たに使用される領域が増えてしまうことが無い。
【0064】
また、第2の工程の特定の処理を実行する処理において、(c3)第2の工程における処理対象のサイズの上限サイズに所定の数を乗じた値と剰余の情報とを用いて、問題サイズを特定してもよい。
【0065】
本実施の形態の第2の態様に係る格納装置は、(F)各工程において特定の処理が実行される複数の工程のうち第1の工程において、第1の工程における処理対象のサイズである問題サイズが、第1の工程の前の工程の状態に基づき規定される上限サイズと一致するか判定し、判定結果を記憶領域(例えば管理データ格納部113の領域)に保存する保存処理部(例えば格納処理部101)と、(G)第1の工程の次の工程である第2の工程において、記憶領域に保存された判定結果を用いて問題サイズを特定し、特定した問題サイズに基づき第2の工程の特定の処理を実行する実行部(例えば復元処理部103)とを有する。
【0066】
なお、上記方法による処理をプロセッサに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、CD−ROM、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【0067】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【0068】
(付記1)
コンピュータに、
各工程において特定の処理が実行される複数の工程のうち第1の工程において、前記第1の工程における処理対象のサイズである問題サイズが、前記第1の工程の前の工程の状態に基づき規定される上限サイズと一致するか判定し、
判定結果を記憶領域に保存し、
前記第1の工程の次の工程である第2の工程において、前記記憶領域に保存された前記判定結果を用いて前記問題サイズを特定し、特定した前記問題サイズに基づき前記第2の工程の前記特定の処理を実行する、
処理を実行させる格納プログラム。
【0069】
(付記2)
前記第1の工程において、前記上限サイズを所定の数で割った場合の剰余の情報を前記記憶領域に保存する
処理を前記コンピュータにさらに実行させ、
前記第2の工程の前記特定の処理を実行する処理において、
前記判定結果が、前記問題サイズが前記上限サイズと一致することを示している場合、前記記憶領域に保存した前記剰余の情報を用いて前記問題サイズを特定する、
付記1記載の格納プログラム。
【0070】
(付記3)
前記問題サイズが前記上限サイズと一致しない場合、前記第1の工程において、前記問題サイズと前記上限サイズとの差に相当する領域に、前記問題サイズの情報を格納する、
処理を前記コンピュータにさらに実行させ、
前記第2の工程の前記特定の処理を実行する処理において、
前記判定結果が、前記問題サイズが前記上限サイズと一致しないことを示している場合、前記問題サイズを前記記憶領域から読み出す、
付記1又は2記載の格納プログラム。
【0071】
(付記4)
前記第2の工程の前記特定の処理を実行する処理において、
前記第2の工程における処理対象のサイズの上限サイズに前記所定の数を乗じた値と前記剰余の情報とを用いて、前記問題サイズを特定する、
付記2記載の格納プログラム。
【0072】
(付記5)
コンピュータが、
各工程において特定の処理が実行される複数の工程のうち第1の工程において、前記第1の工程における処理対象のサイズである問題サイズが、前記第1の工程の前の工程の状態に基づき規定される上限サイズと一致するか判定し、
判定結果を記憶領域に保存し、
前記第1の工程の次の工程である第2の工程において、前記記憶領域に保存された前記判定結果を用いて前記問題サイズを特定し、特定した前記問題サイズに基づき前記第2の工程の前記特定の処理を実行する、
処理を実行する格納方法。
【0073】
(付記6)
各工程において特定の処理が実行される複数の工程のうち第1の工程において、前記第1の工程における処理対象のサイズである問題サイズが、前記第1の工程の前の工程の状態に基づき規定される上限サイズと一致するか判定し、判定結果を記憶領域に保存する保存処理部と、
前記第1の工程の次の工程である第2の工程において、前記記憶領域に保存された前記判定結果を用いて前記問題サイズを特定し、特定した前記問題サイズに基づき前記第2の工程の前記特定の処理を実行する実行部と、
を有する格納装置。