タグ付けされた質問 「suffix-array」

3
サフィックス配列を使用して2つの文字列の最長共通部分文字列を計算する
複雑さで接尾辞配列を作成する方法を学んだ後、接尾辞配列の用途を発見することに興味があります。これらの1つは、時間で2つの文字列間の最長共通部分文字列を見つけることです。インターネットで次のアルゴリズムを見つけました。O(N)O(N)O(N)O(N)O(N)O(N) 2つの文字列とBを1つの文字列ABにマージしますAAABBBABABAB ABの接尾辞配列を計算しますABABAB LCPLCPLCP(最長共通プレフィックス)配列を計算します 答えは最大値LCP[i]LCP[i]LCP[i] 私はそれを実装しようとしましたが、多くの実装の詳細は言われていなかったので(つまり、文字列を連結するとき、それらの間に特殊文字を入れる必要があります()?)、私のコードは多くのテストケースで失敗しました。誰かがこのアルゴリズムについて詳しく説明できますか?AcBAcBAcB 前もって感謝します。 注:このアルゴリズムの正確性は保証しません。私はブログでそれを見つけました、そして、それが機能していると確信がありません。間違っていると思われる場合は、別のアルゴリズムを提案してください。

1
配列の連続した部分配列から合計数を数える
すべてa [ i ] > 0の配列が与えられます。a[1…n]a[1…n]a[1 \ldots n]a[i]>0a[i]>0a[i]>0 今、私たちは部分配列は、配列、すなわち、連続した範囲のです(そのサブアレイから形成することができますどのように多くの異なる合計見つける必要がある[ J ... K ]いくつかのために、合計は全ての和でありますサブアレイの要素)。例えば、場合、その後、答えは4:我々が形成することができる。a[j…k]a[j…k]a[j\ldots k]j,kj,kj,ka=[1,2,1]a=[1,2,1]a=[1,2,1]1,2,3,41,2,3,4 1,2,3,4 時間で個別の合計数をカウントする方法を知っています。O(n2)O(n2)O(n^2) さらに、私はこれが文字列の異なる部分文字列の数を見つける必要がある古典的な問題に似ていることに気付きました。私は、サフィックス配列を構築し、同様の方法で解決する可能性を考えていました(時間)。しかし、私はここで動作するようにそれを変更する方法を理解することができませんでした。たとえば、接尾辞配列を使用すると、4つの許容可能なケースの代わりに5つのケースが取得されます。これは、接尾辞配列を使用してこれを行うことは可能ですか、それとも間違った方向に考えていますか?O(n)O(n)O(n)a=[1,2,1]a=[1,2,1]a=[1,2,1] また、私が考えてきたもう1つの方向があります。分割して征服します。配列を1つの要素に縮小されるまで毎回2つの部分に分割する場合のように。1つの要素に1つの合計を含めることができます。2つの単一要素を組み合わせる場合、2つの方法で実行できます。両方の単一範囲に同じ要素がある場合、2つの異なる合計を取得するか、両方に異なる要素がある場合、3つの異なる合計を取得します。しかし、長さが1より大きい配列をマージするためにこれを一般化することはできません。2つのmサイズの配列をマージして答えを取得することは可能ですか?O(m)O(m)O(m)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.