中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java動態規劃之如何編輯距離問題

發布時間:2021-07-21 09:20:03 來源:億速云 閱讀:184 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Java動態規劃之如何編輯距離問題的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

動態規劃過程是:每次決策依賴于當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。

動態規劃實際上是一類題目的總稱,并不是指某個固定的算法。動態規劃的意義就是通過采用遞推(或者分而治之)的策略,通過解決大問題的子問題從而解決整體的做法。動態規劃的核心思想是巧妙的將問題拆分成多個子問題,通過計算子問題而得到整體問題的解。而子問題又可以拆分成更多的子問題,從而用類似遞推迭代的方法解決要求的問題。問題描述:

對于序列S和T,它們之間的距離定義為:對二者其一進行幾次以下操作:1,刪除一個字符;2,插入一個字符;3,改變一個字符.每進行一次操作,計數增加1.將S和T變為相等序列的最小計數就是兩者的編輯距離(editdistance)或者叫相似度.請給出相應算法及其實現.

分析:

假設序列S和T的長度分別為m和n,兩者的編輯距離表示為edit[m][n].則對序列進行操作時存在以下幾種情況:

a,當S和T的末尾字符相等時,對末尾字符不需要進行上述定義操作中(亦即"編輯")的任何一個,也就是不需要增加計數.則滿足條件:edit[m][n]=edit[m-1][n-1].

b,當S和T的末尾字符不相等時,則需要對兩者之一的末尾進行編輯,相應的計數會增加1.

b1,對S或T的末尾進行修改,以使之與T或S相等,則此時edit[m][n]=edit[m-1][n-1]+1;

b2,刪除S末尾的元素,使S與T相等,則此時edit[m][n]=edit[m-1][n]+1;

b3,刪除T末尾的元素,使T與S相等,則此時edit[m][n]=edit[m][n-1]+1;

b4,在S的末尾添加T的尾元素,使S和T相等,則此時S的長度變為m+1,但是此時S和T的末尾元素已經相等,只需要比較S的前m個元素與T的前n-1個元素,所以滿足edit[m][n]=edit[m][n-1]+1;

b5,在T的末尾添加S的尾元素,使T和S相等,此時的情況跟b4相同,滿足edit[m][n]=edit[m-1][n]+1;

c,比較特殊的情況是,當S為空時,edit[0][n]=n;而當T為空時,edit[m][0]=m;這個很好理解,例如對于序列""和"abc",則兩者的最少操作為3,即序列""進行3次插入操作,或者序列"abc"進行3次刪除操作.

所以,以上我們不難推出編輯距離的動態規劃方程為:

Java動態規劃之如何編輯距離問題

所以, 字符串編輯距離的動態規劃算法的遞歸實現可以用如下的Java代碼表示:

public static int editDistance(String a, String b) {
    if (a == null || b == null) {
      return -1;
    }
    return editDistance(a, a.length() - 1, b, b.length() - 1);
  }

  public static int editDistance(String a, int m, String b, int n) {
    if (m < 0 || n < 0) {
      return 1;
    } else if (a.charAt(m) == b.charAt(n)) {
      return editDistance(a, m - 1, b, n - 1);
    } else {
      return Math.min(Math.min(editDistance(a, m - 1, b, n) + 1, editDistance(a, m, b, n - 1) + 1), editDistance(a, m - 1, b, n - 1) + 1);
    }
  }

UPDATE:

同時, 由編輯距離的動態規劃方程我們可以看出, edit[m][n]可以由edit[m - 1][n - 1], edit[m - 1][n], edit[m][n - 1]得出, 而如果edit是一個二維數組的話, edit[m][n]可以由它的上, 左, 左上三個位置的元素通過條件判斷得出. 亦即我們可以通過遍歷二維數組, 然后通過回溯來計算當前值.

例如對于字符串S = "sailn"和T = "failing", 對二維數組進行初始化為:

m\n failing
 01234567
s11      
a2       
i3       
l4       
n5       

因為S[0] = s, T[0] = f, 則S[0] != T[0], 則對應于上述二維矩陣, edit[1][1] = min(edit[0][0], edit[0][1], edit[1][0]) + 1即edit[1][1] = min(0, 1, 1) + 1即edit[1][1] = 0 + 1 = 1.

m\n failing
 01234567
s11234567
a221     
i3       
l4       
n5       

而對于S[1] = a, T[1] = a, S[1] = T[1], 則對應于二維矩陣, edit[2][2] = edit[1][1], 所以edit[2][2] = 1. 所以按照這種規則, 將上述二維矩陣填滿則如下:

m\n failing
 01234567
s11234567
a22123456
i33212345
l44321234
n55432223

所以, 兩者的編輯距離為edit[m][n] = edit[5][7] = 3.

所以, 按照上述思路即動態規劃的回溯解法的Java版本可以如下進行:

public static int editDistance(String a, String b) {
    if (a == null || b == null) {
      return -1;
    }
    int[][] matrix = new int[a.length() + 1][b.length() + 1];
    for (int i = 0; i < a.length() + 1; i++) {
      for (int j = 0; j < b.length() + 1; j++) {
        if (i == 0) {
          matrix[i][j] = j;
        } else if (j == 0) {
          matrix[i][j] = i;
        } else {
          if (a.charAt(i - 1) == b.charAt(j - 1)) {
            matrix[i][j] = matrix[i - 1][j - 1];
          } else {
            matrix[i][j] = 1 + Math.min(Math.min(matrix[i - 1][j], matrix[i][j - 1]), matrix[i - 1][j - 1]);
          }
        }
      }
    }
    return matrix[a.length()][b.length()];
  }

感謝各位的閱讀!關于“Java動態規劃之如何編輯距離問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

保康县| 昌黎县| 磐安县| 沙洋县| 焦作市| 泗阳县| 冀州市| 郎溪县| 藁城市| 文化| 大英县| 钟祥市| 娱乐| 大同县| 湘西| 嘉善县| 淮滨县| 石首市| 宁陕县| 洛阳市| 淳化县| 嘉祥县| 子洲县| 威信县| 博乐市| 沙雅县| 栾城县| 达日县| 玛沁县| 邵东县| 政和县| 兰溪市| 邯郸县| 新竹市| 江安县| 林州市| 历史| 通州市| 酒泉市| 永城市| 中西区|