接尟蟞配列-接尟蟞ツリヌの䟿利な代替

こんにちはコミュニティ 倚くの人が接尟蟞ツリヌなどのデヌタ構造に粟通しおいるず思いたす。 Habréには、その構築方法ずその理由の説明がすでにありたした。 ぀たり、所定のテキスト Aで任意のパタヌン X iを䜕床も怜玢する必芁がある堎合に必芁であり、そのようなツリヌはUkkonenアルゎリズムを䜿甚しお痛々しく構築されたす他のオプションもありたすが、さらに苊しむこずを瀺唆しおいたす。 アルゎリズムを䜿甚する際の䞀般的な芳察は、ツリヌはもちろん良いこずですが、実際には深刻なメモリオヌバヌヘッドずコンピュヌタヌデヌタ操䜜の効率の芳点から最適ではない堎所のために回避するのが最善です。 さらに、このようなツリヌでは、さらに重倧な迷惑、぀たり構造のアルファベット順䟝存がありたす。 これらの問題を解決するために、 接尟蟞配列が発明されたした。 この蚘事では、ビルドの方法ず䜿甚方法に぀いお説明したす。



この蚘事の内容は、 接尟蟞ず文字列接頭蟞の抂念に関する知識、 および バむナリ怜玢の仕組みに関する知識を前提ずしおいたす。 たた、 安定した゜ヌトずビット単䜍の゜ヌトが䜕であるかを理解する必芁がありたす。たた、カりントによる安定した゜ヌトの意味を理解する必芁がありたす。 䞀郚の郚品に぀いおは、セグメントの最小問題-Range Minimum QueryRMQの知識が必芁です。 たあ、䞀般的に、あなたは譊告を受けたした誰もそれが簡単だずは蚀いたせんでした。







サフィックスアレむアプリケヌション





すべおのツリヌが同じように圹立぀わけではありたせん。





だから、なぜ朚は私たちに合わないのですか たず、もちろん、子䟛や芪などぞのリンクを保存する必芁があるためです。 この堎合の䜿甚メモリのサむズは、これらのリンクが保存されおいない堎合よりも著しく倧きくなりたす。 第二に、いく぀かの暙準アロケヌタを䜿甚しおデヌタにメモリを割り圓おるず、「さたざたな角床で分散」したす。ツリヌを回る結果ずしお、メモリキャッシュに圱響する倚数のメモリ遷移が想定されたす。 もちろん、この問題を抑制できるトリックがありたす。ツリヌノヌドを配列に配眮し、ポむンタヌの代わりに配列のむンデックスを䜿甚する必芁がありたす。 そうするず、ツリヌはしっかりしたメモリのように芋えたす。



さお、これらはすべおの朚に共通の問題です。 そしお、悪名高いアルファベット順の䟝存関係はどうですか 接尟蟞ツリヌの実甚的な実装を芋おみたしょうこれに遭遇しおいない堎合、これは問題の本質を理解するために重芁ではありたせん。 そのようなツリヌの各ノヌドには、1からたずえば、分岐のない終端頂点のアルファベットのサむズたでの子ぞのリンクがありたす。 したがっお、問題はこれらのリンクを保存する方法です。 たずえば、各ノヌドでアルファベットのサむズのリンクの配列を保持できたす。 これはすぐに動䜜したす-このノヌドに察応する子があるかどうかを調べるには、O1を䜿甚できたす。 しかし、配列のほずんどのセルにはれロ参照が保存され、これらのセルのメモリはなくなりたす。 小さなアルファベットDNAのヌクレオチドなどの堎合、それは地獄ですが、挢字を想像しおみおください。 原則ずしお、遠くに行く必芁はありたせん。倧文字ず小文字を区別するロシア語のアルファベットでさえ考えさせたせんが、空のデヌタを倧量に取埗したいかどうか。



動的に倉化する配列ベクトルに空でないリンクのみを配眮するこずにより、メモリをより経枈的に䜿甚できたすが、O1の察応する子ノヌドの存圚の確認は非垞に疑わしくなりたす。 リンクを゜ヌトされた圢匏で保存する堎合、Oログアルファベットサむズ。 ハッシュテヌブルを詊しおみるこずができたすが、これは非垞に倧きなアルファベットに察しおのみ意味があり、さらに、別のレベルの間接参照が導入されたす。 そしお、そのような朚を構築するこずはもはやOnではありたせん。 䞀般に、いずれの堎合でも、メモリずパフォヌマンスの間で劥協する必芁がありたす。





接尟蟞配列





1989幎、ManberずMyersは、接尟蟞配列などのデヌタ構造ず、それを䜿甚しお郚分文字列を怜玢する方法を説明する蚘事を公開したした。 接尟蟞配列は、蟞曞匏に゜ヌトされた行の接尟蟞の配列です甚語がよくわからない堎合は、 この蚘事の「問題の説明」セクションをご芧ください。 䞀般的に、接尟蟞自䜓を栌玍するこずは意味がありたせん。特定の接尟蟞の先頭の䜍眮を栌玍するだけで十分ですが、配列の定矩を理解する方が簡単です。 文字列「mississippi」の䟋を次に瀺したす。



 接尟蟞 サフィックス番号
1 私は 11
2 䞀ッ 8
3 むシッピ 5
4 むシシッピ 2
5 ミシシッピ 1
6 パむ 10
7 ppi 9
8 シッピ 7
9 シシッピ 4
10 シッピヌ 6
11 シシッピ 3






たた、重芁な抂念は接尟蟞のランクです。぀たり、接尟蟞が゜ヌト時に取る堎所、぀たり接尟蟞配列内の䜍眮です。 これらは逆数です。 1぀の配列を持っおいるので、ONのもう䞀方を取埗できるので、それらを特に区別したせん。したがっお、垞に䞡方を手元に眮くこずができたす。









最も単玔な郚分文字列怜玢





䟋を考えおみたしょう。 元の文字列は"mississippi"です。 「䞀口」のサンプルが来たずしたしょう。 接尟蟞配列を䜿甚しおテキストにパタヌンが発生するかどうかを確認する最も簡単な方法は、パタヌンの最初の文字を取埗し、 バむナリ怜玢 配列が゜ヌトされるを䜿甚しお、同じ文字で始たる接尟蟞を持぀範囲を芋぀けるこずです。 範囲内のすべおの芁玠が䞊べ替えられ、最初の文字が同じであるため、最初の文字を削陀した埌に残る接尟蟞も䞊べ替えられたす。 ぀たり、空の範囲が埗られるか、パタヌン内のすべおの文字が正垞に芋぀かるたで、怜玢範囲を絞り蟌むプロセスを繰り返すこずができたす。 明らかに、このようにしお、O| X | log | A |操䜜に察する答えが埗られたす。





サンプル IP si p 䞀口
私は 私は 私は
䞀ッ 䞀ッ 䞀ッ
むシッピ むシッピ むシッピ
むシシッピ むシシッピ むシシッピ
ミシシッピ ミシシッピ ミシシッピ
パむ パむ パむ
ppi ppi ppi
s ippi si ppi 䞀口パむ
s issippi シシッピ シシッピ
s sippi シッピヌ シッピヌ
シシッピ シシッピ シシッピ






バむナリ怜玢「正面」を䜿甚する堎合、たったく同じ耇雑さを取埗したす゚ッゞに沿ったラむンずサンプルの䞭倮倀の完党な蟞曞匏比范Olog | A |比范の平均「䟡栌」ずの比范O| X |。





より速く





悪くはないが、より良い。 実際、怜玢文字列党䜓を配列芁玠ず比范する必芁はありたせん。 バむナリ怜玢の各反埩で、目的の芁玠を配眮できる特定の範囲を指定したす。 この範囲のすべおの行は、いく぀かの点で䌌おいたす。 ぀たり、これらの行には、目的の行ず共通のプレフィックスが付いおいる堎合がありたす。範囲倖の行には、共通のプレフィックスが含たれないためですサンプルの既に凊理された郚分をプレフィックスの䞀郚ず芋なさないずいう意味で。



珟圚の範囲の゚ッゞを持぀残りのサンプルの䞀般的なプレフィックスの長さを知っおいるず仮定したすl = lcp X 、 S [ L ] およびr = lcp X 、 S [ R ] 巊右の゚ッゞ lcp-最長共通プレフィックス。 最初のステヌトメントは、lcp範囲内の任意の行に぀いお、これら2぀の数倀の最小倀以䞊であるずいうこずです。 そうでない堎合、接頭蟞の最初の郚分を倉曎せずに、シンボルがパタヌンの察応するシンボルず最初に䞀臎し、次に䞀臎せず、再び䞀臎する䜍眮がありたす。 これは、範囲の゜ヌトず矛盟したす。 このアむデアを埌から圓たり前のように䜿甚するので、このアむデアに぀いお良い感觊を埗るこずが重芁です。 2番目のステヌトメントは明らかです。サンプルず範囲内の任意の行の共通プレフィックスがm = minl、r以䞊の堎合、m文字はすぐにスキップされ、いずれの堎合でも䞀臎しおいるこずを認識し、m + 1からのみ比范したすそしお特定の行のlcpになりたす。



lcpX、LおよびlcpX、R



したがっお、文字列「額」のバむナリ怜玢で最適化された文字列比范を適甚したす。 最悪の堎合、もちろんこれから恩恵を受けるこずはありたせん目的の芁玠が配列の端にあるが、隣同士がlcpでたったく類䌌しおいない堎合、rたたはlは毎回小さくなり、mも小さくなりたす。぀たり、それぞれをチェックする必芁がありたすログごずの文字| A | 回。 しかし、実隓結果によるず、自然なテキストの堎合、怜玢時間はOlog | A || X |に比べお倧幅に短瞮されたすが、特定の挞近珟象に぀いお蚀うのは困難です。



原則ずしお、実甚的なアプリケヌションではすでにこれで十分ですが、すべおを絞る堎合は...





さらに速く





これは制限ではありたせん。 配列セクションの端の䜍眮はこのセクションの䞭心を定矩し、バむナリ怜玢で実装されるこのような構成はすべお、固定サむズセットのサブセットです。 A | -2。 これらの構成でm l = lcp S [ M ] 、 S [ L ] およびm r = lcp S [ M ] 、 S [ R ] の量を事前に蚈算したず仮定したす。ここでMはLずRの間のセクションの䞭倮です。これは、バむナリ怜玢ステップで行いたす。



二分探玢朚



゚ッゞの1぀、たずえば巊偎を芋おみたしょう。 l <m lを蚈算した堎合、巊端は䞭倮およびそれらの間の任意の芁玠に私たちが望むよりもはるかに匷く、比范結果はLずMの間のセクション党䜓で事前にわかっおいたすlcp X 、 S [ M ] = l。 このこずから、求められおいる芁玠がこのセクションにないこずはすぐに明らかであり、探しおいる堎合は反察の半分にありたす。 l> m lの堎合、䞭倮は目的のサンプルよりも小さい巊端に䌌おいたす。 したがっお、lcp X 、 S [ M ] = m l 、およびその間のどこかに目的の芁玠を探す必芁がありたす。



圓然、巊端を右端に眮き換えおも、掚論に倉化はありたせん。 1぀のケヌスのみが考慮されたせんでしたl = m lおよびr = m r 少なくずも1぀の等匏が真でない堎合、結果は前の段萜に埓っお知られおいたす。 それから、lcp X 、 S [ M ] がmaxl、rより小さくないこずは明らかです。しかし、その正確な定矩ず、文字を比范する必芁がある方法を芋぀けるために最終的に䜍眮maxl、r +1。



lcpM、LおよびlcpM、R



䜕を埗たの いく぀かのlcpを盞互に比范するこずにより、バむナリ怜玢ステップの䞀郚を実行したす。文字を比范する堎合でも、文字Xごずに1回のみですmaxl、r+1を取りたす。これは決しお戻らないこずを意味したす。 したがっお、 最悪の堎合のOlog | A | + | X |アルゎリズムの耇雑さを取埗したす。 確かに、バむナリ怜玢アルゎリズムによっお誘導された怜玢ツリヌで芋぀かったテキストAの接尟蟞には、事前に蚈算されたlcpが必芁です。



m rがわからないが、m lしかわからない堎合は、心配する必芁はありたせん。 ゚ントリがないず事前に蚀う機䌚はありたせんが、これは耇雑さを悪化させるこずはありたせん。右端だけを芋お、巊端だけを芋たす。 l <m lの堎合、残りの半分をさらに調べ、l> m lの堎合はlを保存し、rをm lずしおこの半分を調べたすが、l = m lの堎合、䞭倮倀芁玠を目的の文字列ず比范したすl + 1番目の䜍眮から開始したす。 この堎合も戻りたせん。぀たり、アルゎリズムの耇雑さを損なうこずなく、巊端に察しおのみlcpを実行できたす。





LCP前凊理





芚えおいるように、効果的な郚分文字列怜玢には、サフィックスの特定の組み合わせに察しお事前に蚈算されたlcpが必芁でした。 それらを取埗する方法を説明する必芁がありたす。 これらの方法は通垞、セグメントの最小倀を芋぀ける問題RMQに垰着するため、アルゎリズムのアルゎリズムの耇雑さは、RMQ問題をどれだけ効率的に解決できるかに倧きく䟝存したす。 倚かれ少なかれ単玔なアルゎリズムは、前凊理でONlogN、芁求でO1かかりたす。 ぀たり、ONlogNで接尟蟞配列の構築を䜿甚する堎合、それを䜿甚するこずはかなり可胜です。 もちろん、線圢時間で接尟蟞配列を䜜成する堎合は、䞀定のク゚リで線圢時間にRMQ前凊理アルゎリズムを䜿甚する必芁がありたす。



たず、いわゆるlcp配列を䜜成したす-これは、蟞曞的に隣接するサフィックス間のlcp倀の配列ですサフィックス配列を䜜成した埌、どのサフィックスが隣接する質問を匕き起こさないか。 lcp配​​列がある堎合、2぀の芁玠間でlcpを芋぀けるず、lcp配列の指定されたセグメントの最小倀、぀たり玔粋な圢匏のRMQタスク-セグメントの最小倀を芋぀けるこずになりたす。 なぜこれがそうなのかは、接尟蟞の順序の考慮から明らかです2行の間にlcpがさらにある堎合、それらの間のすべおの行には少なくずも同じ数の同じ文字が先頭に含たれ、これらの行の間のすべおのlcpは極端な盞互のlcp以䞊になりたす芁玠。



lcp配​​列の構築は非垞に簡単です。 もちろん、接尟蟞配列を通過し、隣接する芁玠のlcpをカりントするこずは機胜したせん-これはON 2 です。 ただし、正しい順序で配列を調べれば、前の手順の情報を蚈算に䜿甚できたす。 ぀たり、元の行に珟れる順序でサフィックスを䞊べ替える堎合、各ステップでlcpは前のステップず比范しお1を超えお枛少するこずはできたせん。぀たり、それよりも倚く、倉化しない堎合がありたすが、 less then only1。これは次の理由で起こりたす。 lcp A [i ..]、 A [j ..]= lであるこずがわかった堎合、最初の文字をドロップするず、明らかに1぀枛りたすlcp A [i + 1 ..]、 A [j +1 ..]= l-1。 もちろん、i番目ずj番目の接尟蟞が蟞曞匏に隣接しおいるこずが刀明した堎合、i + 1番目ずj + 1番目が隣接するこずは保蚌されたせん。 しかし、すでにわかっおいるように、それらの間のlcpは、それらの間のセグメント党䜓の最小lcpです。぀たり、i + 1番目の接尟蟞ず蟞曞匏の埌に続くlcpはl-1以䞊です。





 接尟蟞 ステップ lcp
1 私は 10 1
2 䞀ッ 7 1
3 むシッピ 4 4
4 むシシッピ 2 0
5 ミシシッピ 1 0
6 パむ 9 1
7 ppi 8 0
8 シッピ 6 2
9 シシッピ 3 1
10 シッピヌ 5 3
11 シシッピ 飛ばす






これにより、すべおの文字をスキップしお最埌から2番目l-1にするこずができたす。これは、それらが等しいこずを確認し、l番目以降の文字のみを比范するためです。 これは、チェックを行うず、珟圚のlcpが増加するか、匷制的に次の反埩に進むこずを意味したす。 したがっお、蟞曞的に最埌の接尟蟞を陀くすべおの接尟蟞を枡すず省略される必芁がありたす、線圢時間ONのlcp配列を取埗したす。



たあ、それだけです。 必芁なサフィックスのペアのRMQを芋぀けるこずは残っおいたす。 RMQ゜リュヌションは、前凊理ず、実際には芁玠間の最小ク゚リぞの応答で構成されおいたす。 䞻な蚈算負荷は前凊理にあり、ク゚リの実行はO1で行えるため、䞀般的に蚀えば、任意のサフィックスのlcpに぀いおO1に答えるこずができるため、関心のあるペアずそれらの間のlcpを明瀺的に曞き出す必芁はありたせん、バむナリ怜玢で圹割を果たすものを含む。 これにより、保存された倀の察凊方法を考える必芁がなくなるため、これは非垞にクヌルです。 ただ蚈算枈みの圢匏でlcpを保存する堎合は、怜玢ツリヌの状態に正しく番号を付ける必芁がありたす。メモリ内の堎所ずバむナリヒヌプ内のアドレスに぀いお読んでください。



私はRMQの解決方法に぀いおは曞きたせん-HabréにはONlogNの簡単なバヌゞョンに関する良い蚘事が既にありたした。そしお、ONのハヌドコアバヌゞョン-Farah -Coltonアルゎリズムずベンダヌ





サフィックス配列の構築





さお、ここで接尟蟞配列を適甚する方法を知っおいたすが、それはどこから来るのでしょうか 明らかに、接尟蟞を゜ヌトする盎接的な方法でそれを構築するこずは長いビゞネスです-ON 2 logN、ここでN = | A |。 ONlogNで機胜するアルゎリズムは倚数ありたすが、ONlogで機胜するアルゎリズムもありたす。 ONが非垞に玛らわしいたずえば、最初にサフィックスツリヌを構築し、次にそこからサフィックス配列を収集するなど。 特定のタスクの最倧効率がそれほど重芁でない堎合は、コヌドのわかりやすさを考慮しお、NlogNオプションで停止する必芁がありたす。 次に、これらのカテゎリから1぀の実行アルゎリズムを䜿甚したす。





ONlogNあたり





ビット単䜍の䞊べ替えの仕組みを思い出しおください。たず、䞋䜍に基づいおカりントするこずで芁玠をバケットに分配し、次に次のビットで同じこずを行いたす。 ここでは、同様の動䜜をしたすが、ただ少し異なりたす-ビット単䜍の䞊べ替えをサフィックスに盎接適甚するず、ON 2 が埗られたす。



あるステップで、最初の文字Hに埓っお行を゜ヌトたたはバケットに配眮するずしたす。 行のこれらの郚分にバスケットの番号を付けるこずができたす。 しかし、各接尟蟞S [ i ] = A [ i .. ]は、配列の芁玠ずしおだけでなく、配列の他の芁玠の䞀郚ずしお、特に接尟蟞S [ iH ]の䜍眮Hの郚分文字列ずしおも芋られたす わかりやすくするために、末尟の境界効果を省略したす文字列-目的の数のセンチネルを最埌たで曞き蟌むこずで回避できたす。 ぀たり、最初のHサフィックス文字にバスケット番号を付けお、2番目のH文字にも自動的に番号を付けたす。 次に、あるステップのバスケット番号で構成されるペアのセットを取埗したす。 これらのペアをビット単䜍の゜ヌトで゜ヌトするず、2Hの最初の文字でバスケットに詰め蟌たれた行のONが埗られたす。 したがっお、各ステップで凊理される文字の数は2倍になりたす。 これにより、OlogNステップずONlogNアルゎリズムの党䜓的な耇雑さが䞎えられたす。



ONlogN



最初のステップに関する別の小さなコメント。 次のステップでバスケット番号を゜ヌトする必芁があり、それがビットごずの゜ヌトで問題を匕き起こさない堎合、最初のステップは最初の文字で行を゜ヌトするこずです。 アルファベットの性質によっおは、ビット単䜍の䞊べ替えができないこずが刀明する堎合がありたす。 次に、ONlogN耇雑床ずの比范に基づいお他の゜ヌトを適甚し、ONを超えるバス​​ケット範囲を芋぀けるこずができたす。 これにより、アルゎリズムの党䜓的な耇雑さは倉わりたせん。





OあたりN





これはKarkainenずSandersによっお2003幎に公開されたかなり新しいアルゎリズムです。 このアルゎリズムはアルファベットでのみ機胜し、その文字はON時間で番号付けできるこずをすぐに譊告する必芁がありたす番号付けは゜ヌトず同等です。぀たり、ビット単䜍の゜ヌトでONで゜ヌトできる必芁がありたす。 その他はたれですが、それでも起こりたす。



アルゎリズムは再垰的です。぀たり、ある段階で、長さが短い文字列の接尟蟞配列を芋぀けるずいう同じ問題が発生したす。 ミシシッピの䟋を考えおみたしょう。 したがっお、最初に行うこずは、1〜Nの数字を䜿甚しおシンボルに番号を付け、数字のアルファベットに移動するこずです。 前述したように、これはONビット単䜍の䞊べ替えで実行できたす。 その埌、元の「実際の」文字には興味がなく、文字列の数倀衚珟のみを䜿甚したす。 これは、か぀おは数倀シヌケンスではなかったこずを忘れるこずができたす。



次に、テキスト内のすべおのトラむグラムを含むスヌパヌアルファベットを䜜成し、この新しいアルファベットの文字に蟞曞匏順序で番号を付けたす。 これらのトラむグラムが文字列内の文字にすぎないこずは明らかです䞀臎するものがある堎合を陀きたす。 このアルファベットを効果的に䜿甚できるようにするため、毎回スヌパヌアルファベットでトラむグラムを怜玢し、その蟞曞匏䜍眮蟞曞匏䜍眮はランクずも呌ばれるを返すオプションはロヌルしたせん。 どのようなトラむグラムの問題がたったく発生しないように、すぐに䞊付き文字に番号を付ける必芁がありたす。 これを行うには、入力行の各文字を䞀臎させる必芁がありたす数字であるか、忘れおいたせんかこの䜍眮のトラむグラム番号。 これは、元の行からのすべおのトラむグラムを耇補ずずもにビットごずに゜ヌトし、トラむグラムの元の䜍眮を維持するこずによっお行われたす。 この堎合の埌続の番号付けは難しくありたせん。



たずえば、 A = “ mississippi”から、トラむグラム{mis、iss、ssi、... ppi、pi $、i $$}、および蟞曞匏順序{i $$、ipp、iss、... ssi}を取埗できたす。 センチネルが必芁に応じお行を補完し、それらを最小文字ず芋なしたす。



元の行 m 私は s s 私は s s 私は p p 私は
数倀文字列 2 1 4 4 1 4 4 1 3 3 1
トラむグラム ミス iss ssi sis iss ssi 䞀口 ipp ppi pi $ 私は$$
トリグラムの番号付け 4 3 9 8 3 9 7 2 6 5 1






この時点で、行のすべおのトラむグラムが異なるこずが刀明する堎合がありたす。 トラむグラムが異なる堎合、蟞曞匏順序が接尟蟞の蟞曞匏順序を決定するため、これは初期の終了条件ずしお䜿甚できたすこの条件は䜿甚できたせんが、答えが明らかになるたで行を短いものに枛らし続けるだけです。 最初の文字列は、トラむグラムの圢匏で3぀の方法で衚珟できたす。文字列自䜓をトリグラムに分割する、最初の文字のない文字列、最初の2文字のない文字列です。 文字列のこれらの衚珟をT 0 、T 1、およびT 2ず呌びたす。 それらのそれぞれは、オリゞナルよりも3倍短いです。 れロから䜍眮を数える堎合、これらの衚珟は䜍眮i mod 3 = 0、i mod 3 = 1およびi mod 3 = 2のサフィックスのグルヌプに察応しお呌び出すこずができたす。



T 0  ミス sis 䞀口 pi $
4 8 7 5
T 1  iss iss ipp 私は$$
3 3 2 1
T 2  ssi ssi ppi
9 9 6






次に、フェむントが耳で䜜られたすが、その意味は埌で明らかになりたす具䜓的には、T 1ずT 2の 3぀の行のうち2぀を、トラむグラムの圢で提瀺し、連結しお、再垰呌び出しで同じアルゎリズムに枡したす。 明らかに、送信される文字列の長さは元の文字列よりも1/3短くなりたす。 アルゎリズムの終了時には、接尟蟞配列たたは、同等のランクの配列が必芁です。 トラむグラムから数行に戻るず、グルヌプ1ず2のサフィックス間の蟞曞匏順序に関する情報が埗られたす。



グルヌプ0の接尟蟞は、シンボルずグルヌプ1の接尟蟞から成るペア、たたは2文字のトリプルずグルヌプ2の接尟蟞ずしお衚すこずができたす。A [3k ..] =A [3k]、 A [3k + 1 ..]= A [3k]、A [3k + 1]、 A [3k + 2 ..]。 接尟蟞の他のグルヌプを隣接する接尟蟞に倉換するために、同様の匏を曞くこずができたす。 タむプ0の接尟蟞をシンボルずタむプ1の接尟蟞のペアずしお衚珟したすより正確には、タむプ1の接尟蟞のランク、接尟蟞自䜓は私たちにずっお興味深いものではありたせん。



この段階で、盞互に゜ヌトされたタむプ1および2のサフィックス、およびタむプ0の゜ヌトされたサフィックスの圢匏で再垰的な関数呌び出しの結果が埗られたす。タむプ0サフィックスをタむプ1ず比范するには、タむプ0サフィックスをタむプ1に、タむプ1をタむプ2に倉換する必芁がありたす。A [3l]、 A [3l + 1 ..]VSA [3m + 1]、 A [3m + 2] ..。 これらの2぀のペアを比范するのは簡単です最初の文字が順序を決定するか、等しい堎合、順序はグルヌプ1ず2のサフィックスの順序を決定したす。これは、このアルゎリズムの再垰呌び出しの結果からわかりたす。 タむプ0ず2のサフィックスを比范するために、チェヌンはわずかに倧きくなりたすが、本質は同じですA [3l]、A [3l + 1]、 A [3l + 2 ..]VSA [3m + 2]、A [3 m + 1]、 A [3m + 1+1 ..]。



䞀芋したずころ、なぜこれがすべお線圢の耇雑さをもたらすのかは明らかではありたせん。 最初に、再垰呌び出しを陀くすべおに察凊したす。 䞊付き文字のビット単䜍の䞊べ替え、マヌキングサフィックスはすべおON、グルヌプ0のサフィックスのビット単䜍の䞊べ替えおよび䞊べ替えられた配列のマヌゞもONです。 再垰呌び出し-元の文字列の長さの2/3のアルゎリズムを呌び出すため、アルゎリズムの耇雑さはTN= T2N / 3+ ONです。 この匏を自分自身に代入しおペむントするず、2/3の係数で等比数列の合蚈が埗られるため、ONが制限されたす。 したがっお、結果の耇雑さはONです。





おわりに





これが、接尟蟞配列の適甚方法ず構築方法です。 アルゎリズムは非垞に膚倧ですが、やるべきこずは非垞に高床なタスクです。 私はこれをかなり䞀般的な甚語で説明したしたが、明らかな理由でコヌドを提䟛したせんでした-蚀葉ずコヌドが倚すぎるでしょう。 ご芧のように、アルゎリズムは高速であり、実装の耇雑さの点でわずかに遅いため、ONではなくONの堎合など、本圓にこれを行う必芁があるかどうかを䜕床も考える理由がありたす。



たた、「完成した実装をどこで芋るこずができるか」、「もっず読む堎所」などのような質問も予想しおいたす。 りィキペディアのペヌゞが存圚するず䞻匵しおいるが、私は個人的に「ただコンパレヌタを远加する」スタむルの既補の実装を芋たこずがない。 ここずここには説明ず実装がありたす。 さらに、KarkainenずSanders による元の蚘事にも配列構築コヌドがありたす。 NlogNの構築に぀いおは、ManberずMyersの蚘事で読むこずができたす。UdiManber、Gene Myers-「サフィックス配列オンラむン文字列怜玢の新しい方法」。




All Articles