日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

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

算法與數(shù)據(jù)結構 ? 來源:碼農(nóng)的荒島求生 ? 2023-04-10 14:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

新增一個字符

刪除一個字符

替換一個字符

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

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

將word1中的第三個字符r刪掉:rorse -> rose,此時word1變?yōu)閞ose,word1與word2的前三個字符相等

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

想一想該怎樣用動態(tài)規(guī)劃解決這個問題。

選擇與子問題

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

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

如果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”,此時根據(jù)該問題的規(guī)則針對word1的第一個字符有三種操作:

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

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

2,將word1的第一個字符刪掉(Delete),此時word1變?yōu)椤皁r”,我們得到了一個新的子問題EditDistance("or","ro"),由于執(zhí)行了一次刪除操作,因此:

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

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

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

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

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

即:

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

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

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

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

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

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

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

自頂向下遞歸代碼

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

intEditDistance(inti,intj);

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

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

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聲明為全局變量,這樣你可以清楚的看到?jīng)Q定EditDistance函數(shù)值的因素只有這兩個參數(shù)i和j,i的取值為[0, word1.length()],j的取值為[0, word2.length()],也就是說子問題的個數(shù)只有(word1.length() + 1) * (word2.length() + 1) 個,上述遞歸代碼存在大量重復計算問題,因此可以通過增加cache進行優(yōu)化,這個改動就留給大家啦。

接下來我們著手將自頂向下的遞歸代碼改為自底向上的動態(tài)規(guī)劃代碼。

自底向上動態(tài)規(guī)劃代碼

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

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

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

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

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

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

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

我們可以簡單的構造出兩種情況下的所有i和j來初始化數(shù)組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循環(huán)來構造出所有的i和j,從而將遞歸函數(shù)的最后一部分:

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循環(huán)中,并將對遞歸函數(shù)的調用替換為對數(shù)組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;
}
}

最終,完整的動態(tài)規(guī)劃代碼為:

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





審核編輯:劉清

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

    關注

    2

    文章

    501

    瀏覽量

    29356

原文標題:徹底理解動態(tài)規(guī)劃:編輯距離

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    PI?36 雙 MIC 降噪拾音模塊|遠距離高清拾音?強降噪?易集成

    PI?36 雙麥降噪拾音模塊,是專為遠距離、高保真、強抗噪打造的數(shù)字 DSP 音頻處理模塊。它以雙核算力、專業(yè)陣列算法、自適應工作模式,徹底解決噪音干擾、拾音距離近、音量忽大忽小、集成調試復雜等行業(yè)
    的頭像 發(fā)表于 04-27 11:14 ?99次閱讀
    PI?36 雙 MIC 降噪拾音模塊|遠<b class='flag-5'>距離</b>高清拾音?強降噪?易集成

    LORA無線數(shù)傳電臺傳輸距離:5KM雙向透傳,RS485轉LORA

    。而LORA無線數(shù)傳電臺,尤其是支持5KM雙向透傳、RS485轉LORA功能的產(chǎn)品,正成為解決這些痛點的“剛需神器”。 一、核心價值 先澄清一個常見認知:很多人誤以為“無線傳輸距離越遠,穩(wěn)定性越差”,但LORA技術的出現(xiàn),徹底打破了這個
    的頭像 發(fā)表于 02-28 16:36 ?807次閱讀

    釘釘正式開源HarmonyOS圖片編輯組件

    近日,由釘釘團隊自主研發(fā)的“HarmonyOS圖片編輯組件”正式上線OpenHarmony三方庫中心倉并開源。作為一款填補鴻蒙社區(qū)圖像處理領域空白的重量級組件,該方案基于HarmonyOS
    的頭像 發(fā)表于 01-05 09:58 ?696次閱讀

    永磁體的磁感應強度與距離的關系

    ):常指到磁極表面的垂直距離(軸向距離),或到磁體幾何中心的距離;②對無明確磁極的永磁組件(如電機內置磁鋼):指到磁體有效磁場作用區(qū)域的最短直線距離。 在永磁體中,
    的頭像 發(fā)表于 12-25 08:39 ?811次閱讀
    永磁體的磁感應強度與<b class='flag-5'>距離</b>的關系

    圖文詳情編輯接口的設計與實現(xiàn)

    ? ?在內容管理系統(tǒng)(如電商平臺、博客或新聞應用)中,圖文詳情編輯是一個核心功能。它允許用戶動態(tài)創(chuàng)建、更新和刪除圖文內容(如產(chǎn)品描述、文章正文)。一個高效、易用的接口能顯著提升用戶體驗和開發(fā)效率
    的頭像 發(fā)表于 10-23 16:37 ?516次閱讀
    圖文詳情<b class='flag-5'>編輯</b>接口的設計與實現(xiàn)

    圖文詳情編輯接口

    逐步講解接口的設計、實現(xiàn)和使用,幫助您理解如何構建一個可靠的技術方案。 1. 接口設計原則 設計圖文詳情編輯接口時,需考慮以下關鍵點: 數(shù)據(jù)模型 :圖文內容通常包含文本字段(如標題、正文)和圖片字段(如圖片URL或二進制數(shù)據(jù))。例
    的頭像 發(fā)表于 10-23 16:24 ?455次閱讀
    圖文詳情<b class='flag-5'>編輯</b>接口

    跨越空間界限:遠距離無線充電如何重塑機器人工作半徑

    無需精準對準,無需??看驍?,磁共振技術讓機器人在運動中獲取能量,徹底解放工作半徑。 在青島魯渝能源的實驗室,一臺AGV正在演示一場靜默的變革:當電量不足時,它無需精確對準,只需經(jīng)過一個充電區(qū)域,便能
    的頭像 發(fā)表于 10-17 16:35 ?936次閱讀

    Melexis“Distance-to-Spot”視覺工作室簡化遠紅外溫度傳感器的選型流程

    Melexis(邁來芯)宣布,受性能和應用因素(包括目標物體的大小和距離)影響,選擇合適的非接觸式遠紅外(FIR)傳感器頗具挑戰(zhàn)性。人工評估不僅復雜耗時,還可能浪費開發(fā)資源。為解決這一問題,邁來芯推出了一款在線工具“Distance-to-Spot”,為其MLX90614
    的頭像 發(fā)表于 09-22 17:45 ?888次閱讀

    【Milk-V Duo S 開發(fā)板免費體驗】DuoS 超聲波測距 OLED 顯示

    GND GND SDA B11 SCL B12 軟件說明 超聲波測距 ?TRIG 脈沖觸發(fā):發(fā)送 10μs 高電平 ?ECHO 高電平持續(xù)時間 ∝ 距離 ?距離計算公式:距離 = (高電平時間 * 聲速
    發(fā)表于 08-22 03:55

    HarmonyOSAI編程編輯區(qū)代碼續(xù)寫

    利用AI大模型分析并理解開發(fā)者在代碼編輯區(qū)的上下文信息或自然語言描述信息,智能生成符合上下文的ArkTS或C++代碼片段。 使用約束 建議在編輯區(qū)內已有較豐富上下文,能夠使模型對編程場景有一定
    發(fā)表于 08-21 15:43

    HarmonyOSAI編程編輯區(qū)代碼生成

    CodeGenie提供Inline Edit能力,支持在編輯窗口中通過自然語言進行問答,基于上下文智能生成代碼片段,提升代碼可讀性。 當前有以下兩種方式喚醒Inline Edit對話框: 在代碼
    發(fā)表于 08-20 15:24

    距離傳輸新突破:山澤HDMI線確保信號穩(wěn)定無損

    、色彩失真甚至無法正常顯示的問題。然而,隨著技術的進步,山澤HDMI線帶來了全新的解決方案,即使在長距離傳輸下也能確保信號穩(wěn)定無損,徹底解決了這一難題。 一、高帶寬支持,滿足超高清需求 要實現(xiàn)長距離下的高清穩(wěn)定傳輸,首
    的頭像 發(fā)表于 08-10 15:06 ?4422次閱讀

    TurMass?技術解析:道生物聯(lián)無線語音模組:超遠距離+抗干擾,如何顛覆傳統(tǒng)對講?

    道生物聯(lián)以自主創(chuàng)新的TurMass?窄帶無線傳輸技術為核心,推出TKM-121/122系列無線語音傳輸模組及全場景解決方案,徹底打破傳統(tǒng)對講技術局限,為行業(yè)用戶提供超遠距離、高音質、低功耗、強抗干擾的無線語音通信體驗,重新定義智能對講新標準。
    的頭像 發(fā)表于 05-22 16:58 ?3797次閱讀
    TurMass?技術解析:道生物聯(lián)無線語音模組:超遠<b class='flag-5'>距離</b>+抗干擾,如何顛覆傳統(tǒng)對講?

    結構可視化:利用數(shù)據(jù)編輯器剖析數(shù)據(jù)內在架構?

    結構可視化聚焦于展示數(shù)據(jù)的內部結構和各部分之間的關系,使企業(yè)能夠深入理解數(shù)據(jù)的組織方式和層次體系,從而更好地進行數(shù)據(jù)管理和分析。通過結構可視化,企業(yè)可以清晰地看到數(shù)據(jù)的層次結構、關聯(lián)關系以及數(shù)據(jù)流
    的頭像 發(fā)表于 05-07 18:42 ?956次閱讀

    Vim編輯器的基本操作

    在代碼的世界里,效率是永恒的追求。無論是新手開發(fā)者還是資深工程師,都渴望擁有一款能讓自己如虎添翼的編輯器。而在Linux生態(tài)中,有一款被無數(shù)程序員奉為神器、被譽為“效率之王”的編輯器——Vim。它以
    的頭像 發(fā)表于 05-06 13:41 ?1474次閱讀
    Vim<b class='flag-5'>編輯</b>器的基本操作
    黄大仙区| 晋江市| 辽源市| 延寿县| 西峡县| 衡南县| 康马县| 陵川县| 许昌市| 青川县| 金山区| 阿拉尔市| 江达县| 阿城市| 当雄县| 英吉沙县| 河津市| 洛阳市| 无锡市| 东源县| 原平市| 韩城市| 永顺县| 介休市| 神农架林区| 广水市| 莎车县| 融水| 巴林左旗| 海丰县| 平陆县| 嘉禾县| 山东省| 延寿县| 乐至县| 临城县| 屯留县| 沾化县| 霍山县| 浦北县| 重庆市|