最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java動(dòng)態(tài)規(guī)劃之編輯距離問題示例代碼

 更新時(shí)間:2017年11月29日 09:25:21   作者:SilentKnight  
這篇文章主要介紹了Java動(dòng)態(tài)規(guī)劃之編輯距離問題示例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。

動(dòng)態(tài)規(guī)劃過程是:每次決策依賴于當(dāng)前狀態(tài),又隨即引起狀態(tài)的轉(zhuǎn)移。一個(gè)決策序列就是在變化的狀態(tài)中產(chǎn)生出來的,所以,這種多階段最優(yōu)化決策解決問題的過程就稱為動(dòng)態(tài)規(guī)劃。

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

對(duì)于序列S和T,它們之間的距離定義為:對(duì)二者其一進(jìn)行幾次以下操作:1,刪除一個(gè)字符;2,插入一個(gè)字符;3,改變一個(gè)字符.每進(jìn)行一次操作,計(jì)數(shù)增加1.將S和T變?yōu)橄嗟刃蛄械淖钚∮?jì)數(shù)就是兩者的編輯距離(editdistance)或者叫相似度.請(qǐng)給出相應(yīng)算法及其實(shí)現(xiàn).

分析:

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

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

b,當(dāng)S和T的末尾字符不相等時(shí),則需要對(duì)兩者之一的末尾進(jìn)行編輯,相應(yīng)的計(jì)數(shù)會(huì)增加1.

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

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

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

b4,在S的末尾添加T的尾元素,使S和T相等,則此時(shí)S的長度變?yōu)閙+1,但是此時(shí)S和T的末尾元素已經(jīng)相等,只需要比較S的前m個(gè)元素與T的前n-1個(gè)元素,所以滿足edit[m][n]=edit[m][n-1]+1;

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

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

所以,以上我們不難推出編輯距離的動(dòng)態(tài)規(guī)劃方程為:

所以, 字符串編輯距離的動(dòng)態(tài)規(guī)劃算法的遞歸實(shí)現(xiàn)可以用如下的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:

同時(shí), 由編輯距離的動(dòng)態(tài)規(guī)劃方程我們可以看出, edit[m][n]可以由edit[m - 1][n - 1], edit[m - 1][n], edit[m][n - 1]得出, 而如果edit是一個(gè)二維數(shù)組的話, edit[m][n]可以由它的上, 左, 左上三個(gè)位置的元素通過條件判斷得出. 亦即我們可以通過遍歷二維數(shù)組, 然后通過回溯來計(jì)算當(dāng)前值.

例如對(duì)于字符串S = "sailn"和T = "failing", 對(duì)二維數(shù)組進(jìn)行初始化為:

m\n   f a i l i n g
  0 1 2 3 4 5 6 7
s 1 1            
a 2              
i 3              
l 4              
n 5              

因?yàn)镾[0] = s, T[0] = f, 則S[0] != T[0], 則對(duì)應(yīng)于上述二維矩陣, 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   f a i l i n g
  0 1 2 3 4 5 6 7
s 1 1 2 3 4 5 6 7
a 2 2 1          
i 3              
l 4              
n 5              

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

m\n   f a i l i n g
  0 1 2 3 4 5 6 7
s 1 1 2 3 4 5 6 7
a 2 2 1 2 3 4 5 6
i 3 3 2 1 2 3 4 5
l 4 4 3 2 1 2 3 4
n 5 5 4 3 2 2 2 3

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

所以, 按照上述思路即動(dòng)態(tài)規(guī)劃的回溯解法的Java版本可以如下進(jìn)行:

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()];
  }

總結(jié)

以上就是本文關(guān)于Java動(dòng)態(tài)規(guī)劃之編輯距離問題示例代碼的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。

相關(guān)文章

  • Java?20在Windows11系統(tǒng)下的簡易安裝教程

    Java?20在Windows11系統(tǒng)下的簡易安裝教程

    這篇文章主要給大家介紹了關(guān)于Java?20在Windows11系統(tǒng)下的簡易安裝教程,學(xué)習(xí)Java的同學(xué),第一步就是安裝好Java環(huán)境,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • java.lang.NumberFormatException異常解決方案詳解

    java.lang.NumberFormatException異常解決方案詳解

    這篇文章主要介紹了java.lang.NumberFormatException異常解決方案詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java異常處理操作 Throwable、Exception、Error

    Java異常處理操作 Throwable、Exception、Error

    這篇文章主要介紹了Java異常處理操作 Throwable、Exception、Error,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java WindowBuilder 安裝及基本使用的教程

    Java WindowBuilder 安裝及基本使用的教程

    這篇文章主要介紹了Java WindowBuilder 安裝及基本使用的教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 解讀.idea文件的使用及說明

    解讀.idea文件的使用及說明

    文章介紹了IntelliJ IDEA項(xiàng)目中的.idea文件夾及其作用,包括編譯配置、工作空間配置、項(xiàng)目標(biāo)識(shí)文件、編碼配置、jar包信息以及插件配置等,同時(shí),文章提醒在版本控制時(shí)應(yīng)排除.idea文件夾,以避免版本沖突
    2025-01-01
  • Java四種線程池的使用詳解

    Java四種線程池的使用詳解

    本篇文章主要介紹了Java四種線程池的使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java實(shí)現(xiàn)經(jīng)典游戲泡泡堂的示例代碼

    Java實(shí)現(xiàn)經(jīng)典游戲泡泡堂的示例代碼

    這篇文章將利用Java制作經(jīng)典游戲——泡泡堂,游戲設(shè)計(jì)為雙人pk積分賽模式,在這個(gè)模式里面,玩家只要率先達(dá)到一定分?jǐn)?shù)既可以贏得比賽。感興趣的可以了解一下
    2022-04-04
  • elasticsearch索引index之put?mapping的設(shè)置分析

    elasticsearch索引index之put?mapping的設(shè)置分析

    這篇文章主要為大家介紹了elasticsearch索引index之put?mapping的設(shè)置分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Java利用IO流實(shí)現(xiàn)簡易的記事本功能

    Java利用IO流實(shí)現(xiàn)簡易的記事本功能

    本文將利用Java中IO流編寫一個(gè)模擬日記本的程序,通過在控制臺(tái)輸入指令,實(shí)現(xiàn)在本地新建文件,打開日記本和修改日記本等功能,感興趣的可以了解一下
    2022-05-05
  • Spring Cloud Config對(duì)特殊字符加密處理的方法詳解

    Spring Cloud Config對(duì)特殊字符加密處理的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對(duì)特殊字符加密處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2018-05-05

最新評(píng)論

湘乡市| 洱源县| 视频| 平果县| 新泰市| 满洲里市| 辉南县| 馆陶县| 雷州市| 成安县| 交口县| 黔江区| 阜平县| 上栗县| 会宁县| 青川县| 循化| 安国市| 南乐县| 陆良县| 全南县| 安多县| 和顺县| 黄浦区| 太康县| 息烽县| 改则县| 曲阜市| 莱西市| 博白县| 鄂托克旗| 新和县| 金平| 宁晋县| 邵阳县| 鄄城县| 遂川县| 宁津县| 克山县| 皮山县| 娄底市|