動的なプログラミングの編集距離問題(編集距離の問題)

ウェブサイトリンク:https://algorithms.tutorialhorizo​​n.com/dynamic-programming-edit-distance-problem/

1.目的:二つの文字列S1、S2を考えると、操作ステップ数の最小値S1(編集距離)s2が必要見つけるために、変換アルゴリズムを記述します。

許可された操作:

  1. インサート(挿入) - 新しい文字を挿入

  2. 削除(削除) - 文字を削除します。

  3. (置き換え)を置き換える - 別の文字に置き換えられます

例:

S1 = "水平" 
、S2 = "horzon" 
出力:1 {削除ストリングS1から'I'} 

S1 = "水平" 
、S2 = "水平" 
出力:3 {挿入'T'、 ''、 'L'文字で文字列s1を}

2.方法:

同時に2つの文字列の比較。ここでは、右から左(フロント後方に戻ってからの)文字列を比較します。

今、各文字列のために、我々は2つの選択肢があります。

  1. 最後の文字の2つの文字列が同じであれば、その後、同時に最後から二番目の文字を比較し、この最後の文字を無視し、同じ2つの文字は、再帰と同様の第2のケースを(入力することを知って、比較的ダウンしています文字を残りの溶液)

  2. 最後の2つの文字列が同一でない場合には、(置換、挿入、削除)の3つの操作を試してみてくださいので、同じの最後の文字。そして、それぞれの可能性を再帰的に残った溶液文字列を取得し、最小値を選択します。

    与えられた文字列を想定しているS1とS2、それぞれ、長さm及びnは

CASE1:残りのM-1再帰を解決するために、同一の最後の文字、n-1個の文字。

ケース2:最後の文字が同じではありません、そして、再帰的にすべての可能なアクションを試してみてください。

  1. 長さs1は今M + 1になり、nは長さS2である:(SO文字列で同じ2つの最後の文字は、その、最後の文字S2同じに挿入文字列)S1において、文字を挿入します、およびM、N -1文字を、残りの最後の文字再帰的なソリューションを無視します。

  2. 文字列S1から最後の文字を削除します。今S1長さがm-1、長さS2 nは、再帰的な解M-1、Nとなります。

  3. S1の長さは、次に、最後の文字は無視され、長さs2はNであり、mは:最後の文字は(そうストリングに同じ2つの最後の文字こと、S2列と同じで最後の文字)S1に置き換えられています1 N-再帰溶液M-1、。

の最小値(A、B、C)を選択します。まず、我々は、ソリューションは、動的プログラミングを使用して複雑さを軽減するために改善され、再帰的な解決策が表示されます。

#再帰溶液ベースの
DEFのedit_dist(STR1、STR2、M、N-):
    IF M == 0:
        N-リターン
    IF N - == 0:
        リターンM 
    
    [1-N-] IF STR1 [-m 1] == STR2:
        戻りedit_dist(STR1、STR2、M-1、N - 1)
    
    リターン1 +分(edit_dist(STR1、STR2、M、N - 1)、
                   edit_dist(STR1、STR2、M-1、N-)、
                   edit_dist(STR1、 STR2 ,. 1-M ,. 1-N-))
S1 = "ホライゾン" 
S2 = "水平" 
プリント(edit_dist(S1、S2、LEN(S1)においてlen(S2)))
出力:
3

 

私たちはこれらのソリューションを分析してみましょう。最悪のケースでは、我々は3つの操作を持っているので、私たちは、それぞれの文字列に対して操作を実行する必要があるので、時間の複雑さは、O(3 ^ n)となります。

私たちは、サブの重なりがあるかどうかの問題を見てみましょう。例:文字列S1: "CAT"、文字列s2: "DOG"

私たちが見てきたように、多くのサブ問題を繰り返し解くことができるがあるので、サブ問題の重複がたくさんあります。我々は、動的プログラミングを使用して、それを解決するために、ボトムアップアプローチをすることができます。我々は、アレイ(メンテナンスの配列)に問題格納それらを解決するため、必要に応じて、各サブ問題を一度だけ解決されることを保証するために、溶液を使用します。

方法#プログラミング基づいて動的
DEFのdp_edit_dist(STR1、STR2):
    
    #Mを、各n STR1及びSTR2弦長
    (STR2)lenをM、N-LEN =(STR1)、 
    コンストラクト2桁のグループ格納されている部分問題を(サブ-problem)回答
    DP = [においてXは[範囲0(N + 1)]の範囲内でX(M + 1)のために。。】
      
    ダイナミックプログラミングアルゴリズムを使用して#、アレイ移入
    範囲におけるIため(M + 1)。
        Jために範囲内に(N + 1):
  
            検討位次いで(jは二回挿入されている)、jに変換し、最初の文字列が空であると仮定する
            :I == 0の場合
                DP [I] [J] = J     
              
            #同様に、仮定します2番目の文字列は、I(I挿入回)への変換のコスト空である
            J == 0のelif:
                DP [I] [J] = Iの
            
            #最後の文字は、何ら考慮等しくない場合
            [0009 ELIFを。。] == STR2 [-J 1]-I 1:
                DP [I] [J] DP = [1-I] [J-1]。
  
            #最後の文字は、さまざまな可能性を考慮すると、同じではありません、前記最小値選択した場合
            、他の:
                DP [I] [J] + 1 =分(DP [I] [J-1]、[挿入#。
                                   DP [I -1] [J]、削除#
                                   DP [1-I] [J-1])#交換
  
    リターンDP [M] [N-】

  

コメント:

コンピュータサイエンスでは、編集距離を計算することにより、操作の最小数に文字列が異なる方法の互いにA番号から二つの文字列別の文字列(例えば単語)を定量化するために必要です。編集は、辞書からの単語から当該単語のうち、小さい方を選択することにより、正しいスペルミス単語を決定するために使用することができる自動スペル訂正などの自然言語処理におけるアプリケーションの距離で見ることができます。文字A、C、GおよびTの文字列とみなすことができるDNA配列の類似性を定量化するために使用することができるバイオインフォマティクス、で。

 

おすすめ

転載: www.cnblogs.com/carlber/p/12142283.html