コンピュータサイエンスにおいて、辞書式最小文字列回転(LMSR)または辞書式最小循環部分文字列とは、そのような回転の中で辞書式順序が最も低い文字列の回転を見つける問題である。例えば、「bbaaccaadd」の辞書式最小回転は「aaccaaddbb」となる。LMSRは、グラフ、多角形、オートマトン、化学構造の等価性チェックに広く用いられている。[ 1 ]
文字列には複数の LMSR が存在する可能性がありますが、ほとんどのアプリケーションでは回転が等価である必要があるため、これは問題になりません。辞書式最小回転を見つけることは、文字列を正規化する方法として有用です。文字列がグラフなどの同型構造を表す場合、このように正規化することで、単純な等価性チェックが可能になります。[ 2 ]循環文字列を扱う際の一般的な実装トリックは、文字列インデックスに対してモジュラ演算を 実行する代わりに、文字列をそれ自身に連結することです。
文字列の辞書式最小回転を見つけるための単純なアルゴリズムは、連続する回転を繰り返し実行しながら、遭遇した最も辞書式最小の回転を記録していくというものです。文字列の長さがnの場合、このアルゴリズムは最悪の場合O ( n² )の時間で実行されます。
Booth (1980) は効率的なアルゴリズムを提案した。[ 3 ] このアルゴリズムは、Knuth–Morris–Pratt 文字列検索アルゴリズムの修正された前処理関数を使用する。文字列の失敗関数は通常どおり計算されるが、計算中に文字列が回転するため、一部のインデックスは折り返して複数回計算する必要がある。文字列が再び回転することなく失敗関数のすべてのインデックスが正常に計算されると、最小の辞書式回転が見つかり、その開始インデックスが返される。このアルゴリズムの正当性はやや理解しにくいが、実装は容易である。
def least_rotation ( s : str ) -> int : """Boothの辞書式最小文字列回転アルゴリズム。""" n = len ( s ) f = [ - 1 ] * ( 2 * n ) k = 0 for j in range ( 1 , 2 * n ): i = f [ j - k - 1 ] while i != - 1 and s [ j % n ] != s [( k + i + 1 ) % n ]: if s [ j % n ] < s [( k + i + 1 ) % n ]: k = j - i - 1 i = f [ i ] if i == - 1 and s [ j % n ] != s [( k + i + 1 ) % n ]: if s [ j % n ] < s [( k + i + 1 ) % n ] ]: k = j f [ j - k ] = - 1 else : f [ j - k ] = i + 1 return k興味深いのは、 kの値を変更するコード行をすべて削除すると、元の Knuth-Morris-Pratt 前処理関数になるということです。これは、k (回転を表す) がゼロのままになるためです。 Booth のアルゴリズムはで実行されます。回数、ここでnは文字列の長さです。アルゴリズムは最大でを実行します。最悪の場合の比較が必要であり、故障関数テーブルを保持するために長さ n の補助メモリが必要です。
Shiloach (1981) [ 4 ] は、パフォーマンスの点で Booth の結果を改善するアルゴリズムを提案した。長さnの文字列にq個の同等の辞書式最小回転がある場合、その文字列はq個の等しい長さの部分文字列から構成されている必要があることが観察された。アルゴリズムに必要なのはだけです最悪の場合、比較と一定のスペースが必要になります。
このアルゴリズムは2つのフェーズに分かれています。最初のフェーズは、辞書式最小回転の開始位置として明らかに不適切であるインデックスを除外するクイックシーブです。2番目のフェーズでは、残ったインデックスの中から辞書式最小回転の開始インデックスを見つけます。
デュバル(1983)[ 5 ]は、文字列を構成要素であるリンドン語 に因数分解する効率的なアルゴリズムを提案した。このアルゴリズムは線形時間で実行され、メモリ要件は一定である。
Shiloach (1979) [ 6 ] は、正規化の要件なしに、2 つの環状文字列の等価性を効率的に比較するアルゴリズムを提案した。このアルゴリズムから派生した追加の応用例として、繰り返しのない特定の化学構造の高速生成がある。
量子コンピューティングの変種は、Wang & Ying (2024) によって提案されました。[ 1 ]彼らは、量子アルゴリズムが最悪の場合と平均的な場合の両方で、あらゆる(古典的な)ランダム化アルゴリズムを上回ることを示しました。
{{cite journal}}: CS1 maint: 複数の名前: 著者リスト (リンク)