最長繰り返し部分文字列を見つけるためのアルゴリズムは、次のように書かれています 1)build the suffix tree 2)find the deepest internal node with at least k leaf children
しかし、なぜこのアルゴリズムが正しいのか理解できません。アルゴリズムでは、O(n)に繰り返し部分文字列があると言いますが、nは部分文字列の長さですが、これも私には分かりません!次のツリーを考えてみましょう。ここでは最長繰り返し部分文字列は "ru" DFSでは5ステップでは見つかるが2では見つからない このことを私に説明できますか? おかげ少なくともk個のオカレンスを持つ最長繰り返し部分文字列
0
A
答えて
0
私はあなたが完全にO(n)(ランダウの記号を)知っていると仮定はn個の機能、およびないようにと量の等価性をいくつかの量の成長の順序を指し、 n。
私は(私は...と仮定)はコメントを少し長すぎるので、私はaswerではなく、コメントとしてこれを書いている
...これは私が疑問にあった質問を読んbecase書く
0
文字列SがN文字の場合、対応する接尾辞ツリーの作成は、Ukkonen'sなどのアルゴリズムを使用して、O(N)です。
このような接尾辞ツリーは、at most 2N - 1 nodes(ルートと葉を含む)を持つことができます。
ツリーをたどって、特定のノードから到達可能なリーフの数とその深さを計算すると、望ましい結果が得られます。これを行うには、ルートから始めて、それぞれの子を探索します。
いくつかの擬似コード:
traverse(node, depth):
nb_leaves <-- 0
if empty(children(node)):
nb_leaves <-- 1
else:
for child in children(node):
nb_leaves <-- nb_leaves + traverse(child, depth+1)
node.setdepth(depth)
node.setoccurrences(nb_leaves)
return nb_leaves
最初の呼び出しはtraverse(root, 0)
です。構造体はツリーなので、ノードごとにtraverse
を1回呼び出すだけです。これは、traverse
への最大呼び出し回数が2N - 1であることを意味します。したがって、全体のトラバーサルはO(N)です。今度は、最大深度を持つノードを追跡するだけでよい:depth > 0 && nb_leaves >= k
関連する簿記メカニズムを追加することによって、確認する。これは、全体の複雑さを妨げるものではありません。最後に
、そのようなサブストリングを検索するためのアルゴリズムの複雑さは、O(N)Nは、入力された文字列の長さである(としないサブストリングマッチングの長さ!)。
注:上記トラバーサルは、基本的に接尾辞ツリー上のDFSです。
関連する問題
- 1. Pythonで文字を繰り返さない最長の部分文字列
- 2. JS - 文字列から最も長い繰り返しのない部分文字列を取得する
- 3. 最小値と最大値を持つk個の部分の分割
- 4. 文字列の最長部分文字列を持つ行を選択
- 5. 最大最大繰返し部分文字列
- 6. 繰り返し文字列を持つ文字列python
- 7. 最も長い繰り返し文字の位置を見つける
- 8. 最も長い繰り返し文字列を検索しますか?
- 9. 文字列内の最も長い繰り返し1の長さを見つける
- 10. 文字列から部分文字列を削除し、繰り返し
- 11. 文字列から繰り返し部分文字列を削除します。
- 12. 繰り返し文字列部分の間の値
- 13. 文字列から部分文字列を繰り返し削除する
- 14. 文字列から繰り返し部分文字列を取得する
- 15. 奇妙な長い文字列から部分文字列を抽出する(繰り返し文字)私は形式のアドレスラインのシリーズを持っている
- 16. 文字を繰り返さないで最長のサブストリング - Java
- 17. C++の文字列配列で文字の最長シーケンスを見つける方法(繰り返し)
- 18. パスワードの正規表現(少なくとも2桁と特殊文字1個、最小長8)
- 19. 最も長い共通部分文字列問題
- 20. アルファベット順に最長の部分文字列を見つける
- 21. LCS(最長共通部分列) - 最良のK解を得る
- 22. 3つの文字列の中で最も長い共通部分シーケンス
- 23. 文字列またはテーブルcoulmnで未知の繰り返し部分文字列を見つける方法
- 24. 文字列中で最も長い連続した部分文字列を見つける方法は?
- 25. 文字列内の文字繰り返しの長さと位置の決定
- 26. LeetCode Problem3:最長サブストリング文字の繰り返し
- 27. 最初の非繰り返し文字列を返します
- 28. 文字列pythonで最も長い一意の部分文字列を見つけよう
- 29. で文字列の繰り返し文字を見つける
- 30. 接尾辞ツリー(バイナリ文字列):最も長い部分文字列を見つけよう
サフィックスツリー構造は文字列自体の長さが線形であるため、部分文字列の長さは線形にできません – Rerito