2017-02-22 6 views
0

アルゴリズムが正しいかどうかチェックします。省略すべて空白でn文字の文字列、空白文字を省略した文字列をO(n^2)に再構成します

Ex: "itwasthebestoftimes" 

は、文字列は単語の有効なシーケンスに分割することが可能かどうかを判断し、動的プログラミングアルゴリズムを与える、として有効な文字列を再構築考える

空白は、O(n )です。

私の考え:

最初に列のすべてのサブストリングを見つける(O(N ))、及び各サブマップ間隔と空間との長さのその位置のために。

Ex: "it was the best" 
     [] [-] [-] [--] 
     [---] []  
      [] 

(見やすくするためにスペースが追加されています)。

上記の例では、「それ」が有効であると2の間隔値を取得し、文字列「TWAS」等、3を取得した「」も有効であり、そして4

の値を取得しますこれは、その後、ミニ・マックス問題に縮小され、インターバルのセットにおいて最大の非オーバーラップ長を見つける。有効な文字列にはすべての文字が含まれている必要があるため、重複しない最大の長さが答えになり、これを見つけるにはTheta(n * log(n))が必要です。

は、したがってソリューションは、Oがかかります(nは + N *ログ(N))= O(nは)

は、私の考えが正しいですか?

+0

ない場合にのみ、どのようにどの行に行くどのサブ選ぶのですか?重複するため新しい部分文字列を下の行に配置しようとすると、既存の部分文字列を列に並べ替えることで、どこかに新しい部分文字列に収まるようになるでしょうか? – avysk

+0

それを残念に編集しました。サブストリングがどの「行」に入るかは関係ありません。ミニマックスソルバの場合は任意です。重要なことは、間隔の座標によって与えられる衝突があるかどうかを調べることです。行は視覚的表現を簡単にするためにしかありません – mrybak3

+0

実際には、最大長の間隔の互いに素なサブセットを見つけるためのO(n log n)アルゴリズムへのポインタがありますか? O(n^2)で(同じダイナミックプログラミングで)行うのは簡単ですが、O(n log n)でこれを行う方法はすぐにわかりません。この問題を、最大* number *の長さではなく、不連続な区間の最大数*を見つけることと混同していないと確信していますか?最大数の欲張りアルゴリズムは、実際にはO(n log n)である。 – avysk

答えて

1

あなたは思っています(オーバーラップしない間隔を最大限見つけ出す問題をO(n log n)解決法を知っていると仮定します)、O(n^2)時間。しかし、問題はあなたが作っているよりも簡単だと思います。

W[0...n]を作成します。 i以降の文字列を単語に切り詰める方法がない場合はW[i]は0になります。それ以外の場合は、文字列の有効な切り取りを開始する単語の長さが格納されます。その後

:あなたがトライであなたの辞書を保持する場合

W[i] = min(j such that W[i:j] is a word, and i+j = n or W[i+j]>0) 
     or 0 if there's no such j. 

、あなたはすでにW[n-1]W[i+1]を計算してきたと仮定するとO(N-I)の時間にW[i]を計算することができます。つまり、O(n^2)時間でWのすべてを計算できます。または、辞書の単語の最大長がkの場合は、O(nk)時間で実行できます。

あなたがWのすべてを計算したら、全体の文字列があれば言葉に切断することができ、W[0]は0

関連する問題