トライの接尾辞配列の構築

例:

あまりにも多くの思い出が、時々忘れて忘れてしまいました。
非心が存在しない場合には、それはそれは追加ポイントによってのみです!
私たちは、木が過去n個の点で定義するのn-1有向非巡回グラフ、ポイントのエッジは1からnまでの番号が付けられ、ここで、1ポイントルートノードを除いて、ルートノードと呼ばれ
、各点は正確に一つの側(出発点として、すなわちその側)です。
文字(ここでは、実際に使用される異なる文字300を表す非負の整数より大きくない)、の各エッジ
任意の点Uのために、Uすべてのエッジ(即ち、その側面で終わる)に互いに異なる文字。
我々はポイントを過ぎてUはUのルートパスに対応する、過去の定義次のエッジステッチ順次に形成された後の文字列の文字のシーケンシャル順序に従ってルートにUからすべての側面を略す(明らかに一つだけが存在します)これは、R(U)です。
過去の接触は、それがすべての最も近い類似のペアが含まれていることを、過去のツリーに依存します。具体的には、uおよびvは、過去の類似度F(U、V)を次のように対応する2つの点を定義します。
\(F(U、V)、
LCP(R(U)、R(V))+ LCS(R(U)、R(V))を= \) LCPは、(a、b)はaとbの列を示しています最長の共通のプレフィックスの長さは、LCS(a、b)は最長共通文字列のサフィックスa、bの長さを示します。
ツリー過去のコンタクトは、<= U、V <= N Fの最大値(U、V)を満たす全て1 <ように定義されます。
さて、これまでツリー与えられた、木、過去ツリーの連絡先を記入してください。

ソリューション:

まず、全てのR(U)ソートので、LCPのLCPはRMQの隣接するR(U)です。(同じ原理接尾辞配列)
だから、近い、長いLCPを注文した後。
明らかに、LCSは、LCAの深さです。
したがって、列挙LCA、すなわち木DFS、それぞれがすべてのサブツリーをマージし、最近RMQのすべての最大間隔を求めることができます。
左の子ノードの最大値と最小値の右の子を検討する際、最も低いノード、腕立て伏せをランク付け、最大のノードをランク付け、各区間のツリーライン、メンテナンスLCPの最大値と合併。
このステップはnlognの時間複雑です。

並べ替えを検討する方法:

直接のqsort、半分のサイズLOGN +ハッシュ比較、nlog ^ 2n個の合計時間複雑あたりCMP。

別のアプローチを考えてみます。

我々は関係の大きさ(ランキング)は、Xの文字列の長さを知っているなら、私たちは、長さの文字列になります一緒にスプライスX、あなたは文字列の長さを2倍得ることができます。
最初のキーの上半分の長さ2Xのストリングは、ランク付けの後半のような第2のキーは、ソート列2X大小関係の長さとして得られ、次いで、ストリング2倍の長さを引き出すことができますランキング。
その後、我々はするすべてのR(u)のため、このプロセスを、継続することができます。
ランキングは0〜Nであるので、基数ソートに使用することができ、各ラウンドの時間複雑度は線形、CO LOGN輪であるので、合計時間の複雑性はnlognあります。
実際には、それは仕方の接尾辞配列です。

今(そのメソッドは配列をサフィックスしていないようです)の高さを求めて検討してください。

方法A:半分+ハッシュ。

方法2:各々は、最大2つのy ^ I文字列の長さと2 ^ i個の文字列の長さを考慮してアップxは乗算等しいです。
順位が等しい場合、2つの文字列が等しい、ソート倍増考慮した場合、これらの文字列を見つけることができます。ライン上でレコードをランク付けのすべての並べ替えを倍増。

合計時間の複雑さ:\(O(nlogn)\)

コードがなくなっています。

おすすめ

転載: www.cnblogs.com/lnzwz/p/11371720.html
おすすめ