精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

徹底理解編輯距離問題edit distance

算法與數據結構 ? 來源:碼農的荒島求生 ? 2023-04-10 14:04 ? 次閱讀

給定兩個字符串word1以及word2,返回將word1轉為word2需要的最少步驟,在每一步中你可以針對字符串word1進行以下操作:

新增一個字符

刪除一個字符

替換一個字符

假如word1是"horse",word2是“ros”,那么你的程序需要返回3,也就是說將word1轉為word2至少需要三個步驟:

將word1中的第一個字符h替換為字符r:horse -> rorse,此時word1變為rorse,word1與word2前兩個字符相等

將word1中的第三個字符r刪掉:rorse -> rose,此時word1變為rose,word1與word2的前三個字符相等

將word1中的最后一個字符刪掉:rose -> ros,此時word1與word2相等。

想一想該怎樣用動態規劃解決這個問題。

選擇與子問題

和之前的題目一樣,你首先應該找出子問題是什么,子問題與原始問題的依賴關系是什么。

找出子問題的關鍵在于每一步的選擇。

如果word1與word2的第一個字符相等,假設word1是hor、word2是hr,那么我們可以放心的排除掉兩個字符串的第一個字符,即EditDistance("hor", "hr")一定等于EditDistance("or", "r"):

4c0324f2-d75a-11ed-bfe3-dac502259ad0.png

此時我們得到了一個子問題EditDistance("or", "r"),原始問題EditDistance("hor", "hr")的值等于該子問題。

真正有趣的是如果word1與word2的第一個字符不相等的情況,假設word1為“hor”,而word2為“ro”,此時根據該問題的規則針對word1的第一個字符有三種操作:

1,在word1的第一個字符前新增(Insert)一個字符r,此時word1變為rhor,由于此時word1 的第一個字符等于word2的第一個字符,可以放心的忽略掉,因此我們得到了子問題EditDistance("hor","o"),由于執行了一次新增操作,因此:

EditDistance("hor","ro")=EditDistance("hor","o")+1

2,將word1的第一個字符刪掉(Delete),此時word1變為“or”,我們得到了一個新的子問題EditDistance("or","ro"),由于執行了一次刪除操作,因此:

EditDistance("hor","ro")=EditDistance("or","ro")+1

3,將word1的第一個字符替換(Replace )為r,此時word1變為了“ror”,由于word1的第一個字符等于word2的第一個字符,因此可以放心的忽略掉,我們得到了一個新的子問題EditDistance("or","o"),由于執行了一次刪除操作,因此:

EditDistance("hor","ro")=EditDistance("or","o")+1

根據題目要求,我們需要得到最小的編輯距離,因此:

EditDistance("hor","ro")=min(EditDistance("hor","o"),
EditDistance("or","ro"),
EditDistance("or","o"))+1

即:

4c20a8ce-d75a-11ed-bfe3-dac502259ad0.png

可以看到,如果word1與word2的第一個字符如果不相等的話那么我們會得到三個子問題,取這三個子問題的最小值然后加1就是原始問題的解。

現在我們找到了子問題與原始問題之間的依賴關系。

實際上,根據上述討論我們還可以進一步擴展從而得到完整的狀態空間樹。

4c3f8104-d75a-11ed-bfe3-dac502259ad0.png

從這棵樹中可以看到最小的編輯距離是2。

現在你應該清楚的知道該怎樣我們是怎樣一步步將問題不斷的分解為更小的子問題,然后利用子問題的解來得到原始問題的解了。

自頂向下遞歸代碼

上圖中每個方框都是一個子問題,決定一個子問題的因素在于word1與word2當前處理到了哪個位置,假設對word1處理到了第i個位置,對word2處理到了第j個位置,因此我們可以對問題進行定義:

intEditDistance(inti,intj);

該函數表示從i到word1的末尾形成的字符串與從j從word2的末尾形成的字符串的編輯距離。

因此如果調用該函數時我們應該這樣使用:

EditDistance(0,0);

有了該定義與上述分析,你可以輕而易舉的寫出這樣的遞歸代碼:

stringword1;
stringword2;

intEditDistance(inti,intj){
if(i==word1.length()&&j==word2.length())return0;
if(i==word1.length())returnword2.length()-j;
if(j==word2.length())returnword1.length()-i;

if(word1[i]==word2[j])returnEditDistance(i+1,j+1);
else{
returnmin(EditDistance(i+1,j+1),min(
EditDistance(i,j+1),
EditDistance(i+1,j)))+1;
}
}

我們將word1與word2聲明為全局變量,這樣你可以清楚的看到決定EditDistance函數值的因素只有這兩個參數i和j,i的取值為[0, word1.length()],j的取值為[0, word2.length()],也就是說子問題的個數只有(word1.length() + 1) * (word2.length() + 1) 個,上述遞歸代碼存在大量重復計算問題,因此可以通過增加cache進行優化,這個改動就留給大家啦。

接下來我們著手將自頂向下的遞歸代碼改為自底向上的動態規劃代碼。

自底向上動態規劃代碼

由于子問題的個數只有(word1.length() + 1) * (word2.length() + 1) 個,因此可以定義一個相同大小的二維數組dp:

vector>dp(word1.length()+1,vector(word2.length()+1,0));

接下來我們要求解最小子問題,最小子問題就是上述遞歸代碼的遞歸出口:

if(i==word1.length()&&j==word2.length())return0;

該最小子問題的解包含在了dp數組的初始化中。

接下來的子問題是另外兩個遞歸出口:

if(i==word1.length())returnword2.length()-j;
if(j==word2.length())returnword1.length()-i;

我們可以簡單的構造出兩種情況下的所有i和j來初始化數組dp,即:

for(intj=word2.length()-1;j>=0;j--)
dp[word1.length()][j]=word2.length()-j;
for(inti=word1.length()-1;i>=0;i--)
dp[i][word2.length()]=word1.length()-i;

最后我們利用兩個for循環來構造出所有的i和j,從而將遞歸函數的最后一部分:

if(word1[i]==word2[j])returnEditDistance(i+1,j+1);
else{
returnmin(EditDistance(i+1,j+1),min(
EditDistance(i,j+1),
EditDistance(i+1,j)))+1;
}

放置在for循環中,并將對遞歸函數的調用替換為對數組dp的讀寫:

for(inti=word1.length()-1;i>=0;i--){
for(intj=word2.length()-1;j>=0;j--){
if(word1[i]==word2[j])
dp[i][j]=dp[i+1][j+1];
else
dp[i][j]=min(dp[i+1][j+1],min(dp[i][j+1],dp[i+1][j]))+1;
}
}

最終,完整的動態規劃代碼為:

intminDistance(stringword1,stringword2){
vector>dp(word1.length()+1,vector(word2.length()+1,0));
for(intj=word2.length()-1;j>=0;j--)
dp[word1.length()][j]=word2.length()-j;
for(inti=word1.length()-1;i>=0;i--)
dp[i][word2.length()]=word1.length()-i;
for(inti=word1.length()-1;i>=0;i--){
for(intj=word2.length()-1;j>=0;j--){
if(word1[i]==word2[j])
dp[i][j]=dp[i+1][j+1];
else
dp[i][j]=min(dp[i+1][j+1],min(dp[i][j+1],dp[i+1][j]))+1;
}
}

returndp[0][0];
}





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27481

原文標題:徹底理解動態規劃:編輯距離

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    OrCAD Capture 17.2 點擊edit simulation profile沒有反應

    請問OrCAD capture 17.2點擊edit simulation profile后沒有反應應該怎么解決呢,可以正常繪制原理圖,也可以跑仿真,但是沒有simulation setting窗口彈出,無法修改仿真設置,求助各位!
    發表于 09-19 22:28

    vim編輯器如何使用

    Vim編輯器是一個功能強大的文本編輯器,它基于Vi進行改進,并增加了許多新特性。Vim編輯器的使用主要涉及其不同的工作模式及相應操作。以下是Vim編輯器的基本使用方法: 一、Vim
    的頭像 發表于 08-30 14:58 ?373次閱讀

    如何理解PCB設計的爬電距離?

    一站式PCBA智造廠家今天為大家講講PCB設計爬電距離要求與走線規則有哪些?PCB設計爬電距離要求與走線規則。在PCB設計中,爬電距離和走線規則是關鍵的考慮因素,尤其是在高壓電路和高頻電路的設計中
    的頭像 發表于 08-15 09:23 ?876次閱讀

    爬電距離是根據什么確定的

    爬電距離(Creepage Distance)是指在電氣設備中,兩個導體之間沿絕緣材料表面的距離。它是一個重要的電氣參數,用于評估電氣設備在正常工作和故障條件下的絕緣性能。爬電距離的確
    的頭像 發表于 07-12 15:39 ?759次閱讀

    爬電距離與電壓的對應關系

    爬電距離(Creepage Distance)是電氣設備中的一個重要概念,它指的是在絕緣材料表面,沿著絕緣體表面或邊緣,從帶電部分到接地部分或不同電位部分之間的最短距離。爬電距離的大小
    的頭像 發表于 07-12 15:35 ?2500次閱讀

    微軟AI新成果:將不可編輯PDF轉化為可編輯文檔

    市面現有相關軟件雖能將PDF轉為可編輯版,但易喪失原始布局。微軟研究論文名為《從不可編輯文檔生成可編輯文檔的方法和系統》,其獨特之處在于運用AI技術保持了字體、色彩、布局及圖像格式等視覺元素的完整性。
    的頭像 發表于 05-30 10:11 ?620次閱讀

    UCGUI edit輸入框內字符串如何單獨用光標選中某字符進行修改?

    如題: UCGUI edit輸入框內字符串如何單獨用光標選中某字符進行修改? 使用場景: 對RTC芯片進行校時。GUI繪畫虛擬鍵盤:edit輸入框、虛擬按鍵;用于實現年月子時分秒時間的輸入。 現在
    發表于 04-23 06:14

    tftlcd畫線程序里面xerr>distance和yerr>distance兩個條件能成立嗎?

    實驗中這個程序是沒問題的,就是在個人讀程序中,無法理解if(xerr>distance) 和if(yerr>distance) 兩個條件,個人認為distance選取
    發表于 04-22 07:35

    使用EDIT_SetDecMode()函數設置十進制編輯后變成了一個黑塊的原因?

    使用了EDIT_SetDecMode()函數設置十進制編輯后,就變成這樣;但是在電腦上仿真界面的時候,數字和背景是會自動反色的,但下載到單片機上就是一個黑色塊。請問會是什么原因?
    發表于 04-12 06:12

    arcgis圖層字段怎么批量輸入屬性

    對于ArcGIS圖層字段的批量輸入屬性,可以通過以下步驟完成: 打開ArcMap軟件,并加載需要編輯屬性的圖層。 在ArcMap的主菜單中,選擇“編輯Edit)”選項,然后選擇“開始編輯
    的頭像 發表于 02-25 14:15 ?4670次閱讀

    CCS edit Flags有bug

    今天發現編輯完Build->Edit Flags里面的內容后會被自動更新出錯,請問這個問題如何解決呢? 我編輯如此: -v28 -ml -mt --cla_support=cla1
    發表于 02-24 17:50

    變頻器在長距離供電時末端電壓會升高還是降低?

    理解,但是有一點,如果在電能傳輸距離很長時,會導致末端電壓的變化,我搜了百度上面的一些回答,有的說過長的傳輸距離會導致末端電壓升高,但是這與我平常的認知理解不一樣,
    發表于 01-11 18:50

    解讀光模塊波長與傳輸距離的關系 波長是影響光模塊傳輸距離的因素嗎

    領域,理解和優化光模塊的波長選擇對于實現高速、長距離光纖通信至關重要。 首先,我們需要了解光模塊和波長的基本概念。光模塊是將電信號轉換為光信號,并在光纖中傳輸的設備。波長指的是光信號的頻率或色彩。對于常用的通
    的頭像 發表于 12-27 11:28 ?1250次閱讀

    距離保護有哪些優點?距離保護是如何工作的?

    距離保護有哪些優點?距離保護是如何工作的? 距離保護(Distance Protection)是一種電力系統的保護機制,用于檢測和隔離故障,并確保電力系統的可靠運行。
    的頭像 發表于 12-18 15:44 ?2460次閱讀

    PLC程序的編輯與注釋

    在對程序進行編輯時,需要選擇編輯的對象,再進行復制、粘貼、刪除和插入等操作。STEP 7-Micro/WIN SMART軟件的一些常用選擇操作見表3-2。
    發表于 12-12 10:32 ?607次閱讀
    PLC程序的<b class='flag-5'>編輯</b>與注釋