「接尾辞配列」の研究ノート

接尾辞配列の構築

注:最初から表1の文字列。

$サ$の接尾辞配列は、定義されました

$ Sa_iは$開始位置$ I $接尾語として辞書編集ランクを表現します。

考え

迅速で$ n $サフィックスのソートをソートするために暴力を使用して比較の数は、$ n個の\ログのn $ですが、時間の複雑さの比較は$ O(n)の$です。総複雑になることは$ O(N ^ 2 \ログn)が$です。

基数ソートに基づいて$ Manber $&$メイヤー$乗算方法は、各要素の$ 2 ^ k個の$サフィックスの前に毎回行われ、$ Oの複雑さは、$(N Nログ\します)。中心的な考えは、内部にリンクされているので、接尾辞と接尾数字の間、通常とは異なり、我々はオブジェクト自体をソートしたいということです。各接尾辞の後$ 2 ^ {K + 1} $いずれかを排出するために^ k個の$要素$ 2の前に排出するが、両者は$ 2 ^ k個の$が一緒に置かれています。そして、すべてがされているので、$ 2 ^ k個の$は、それがタプルに問題をソートすることになるので、私たちは、$ 2 ^ k個の$相対的な関係を知っているだろう、ソートされました。これは、基数ソート$ O(n)の完成$を利用することができます。

基数ソートアイデアが発注されていた第2の鍵、最初のソート・キーを使用することです。これは、最初のキーごとに、2番目のキーを注文されることを保証します。だから、全体がソートされました。

/ * DennyQi 2019 * / 
書式#include <cstdioを> 
する#include <アルゴリズム> 
書式#include <CStringの> 
の#include <キュー>
 使用して 名前空間はstd;
const  int型 N = 1000010 ; 
インラインint型リード(){
     int型のx(0)、W(1)。チャー C = GETCHAR()。
    一方、(C ^ ' - ' &&(C < ' 0 ' || C> ' 9 '))C = GETCHAR()。
    もし(C == ' - ')W = - 1、C = GETCHAR()。
    一方、(C> = ' 0 ' && C <= ' 9 ')x =(x << 3)+(X << 1)+ C- ' 0 '、C = GETCHAR()。 
    リターンのx *のワット。
} 
チャーS [N]。
int型N、X [N]、Y [N]、C [N]、SA [N]。
インラインボイド BuildSA(int型M){
     int型のP。
    以下のためのint型 I = 1; I <= N。++ I)、C ++ [X [I] =のS [I]]。
    以下のためにint型私= 1 ; I <= M; ++ I)C [I] + = C [I- 1 ]。
    以下のためにint型 I = N; I> = 1 ; --I)SA [Cの[X [I]] - ] = I。
    int型のk = 1 ; K <= N; K + = K){ 
        P = 0 以下のためにint型 iがN-K + = 1 ; iは= N <; ++ I)Y [++のP] = I。
        以下のためにint型 i = 1 ; iが<= N; ++ I)であれば(SA [I]> k)をY [++のP] = SA [I] -K;
        以下のためにint型 I = 1 ; I <= M; ++ I)のC [I] = 0 ;
        以下のためにint型 I = 1 ; I <= N; ++ I)++ C [X [I]]。
        以下のためにint型私= 1 ; I <= M; ++ I)C [I] + = C [I- 1 ]。
        int型 ; I> = I = N 1 = Y [i]は、Y [I] = - SA [C [X [Y [I]]]]; --I)0 
        スワップ(X、Y)
        X [SA [ 1 ] = 1、P = 1 以下のためのint型私は=2 ; I <= N。++ I)X [SA [I] =(Y [SA [I]] == Y [SA [I- 1 ]] && Y [SA [I] + K] == Y [SA [I- 1 ] + K])?P:++ のp;
        もし(P> = N)、ブレーク
        M = P。
    } 
} 
int型のmain(){
     // freopenは( "R"、STDIN "です。"); 
    scanf関数(" %sの"、S + 1 )。
    N = STRLEN(S + 1 )、
    BuildSA(' Z ' + 1 )。
    以下のためにint型 i = 1 ; iは= N <; ++ I)のprintf(" %のD " 、SA [I])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/qixingzhi/p/11015673.html