国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【動(dòng)態(tài)規(guī)劃】最長公共子序列Python實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【動(dòng)態(tài)規(guī)劃】最長公共子序列Python實(shí)現(xiàn)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

個(gè)人主頁:丷從心

系列專欄:動(dòng)態(tài)規(guī)劃算法


問題描述

  • 給定兩個(gè)序列 X = { ? x 1 , x 2 , ? ? , x m ? } X = \set{x_{1} , x_{2} , \cdots , x_{m}} X={x1?,x2?,?,xm?} Y = { ? y 1 , y 2 , ? ? , y n ? } Y = \set{y_{1} , y_{2} , \cdots , y_{n}} Y={y1?,y2?,?,yn?},找出 X X X Y Y Y的最長公共子序列

最長公共子序列的結(jié)構(gòu)

  • 設(shè)序列 X = { ? x 1 , x 2 , ? ? , x m ? } X = \set{x_{1} , x_{2} , \cdots , x_{m}} X={x1?,x2?,?,xm?} Y = { ? y 1 , y 2 , ? ? , y n ? } Y = \set{y_{1} , y_{2} , \cdots , y_{n}} Y={y1?,y2?,?,yn?}的最長公共子序列為 Z = { ? z 1 , z 2 , ? ? , z k ? } Z = \set{z_{1} , z_{2} , \cdots , z_{k}} Z={z1?,z2?,?,zk?}
    • x m = y n x_{m} = y_{n} xm?=yn?,則 z k = x m = y n z_{k} = x_{m} = y_{n} zk?=xm?=yn?,且 Z k ? 1 Z_{k - 1} Zk?1? X m ? 1 X_{m - 1} Xm?1? Y n ? 1 Y_{n - 1} Yn?1?的最長公共子序列
    • x m ≠ y n x_{m} \neq y_{n} xm?=yn? z k ≠ x m z_{k} \neq x_{m} zk?=xm?,則 Z Z Z X m ? 1 X_{m - 1} Xm?1? Y Y Y的最長公共子序列
    • x m ≠ y n x_{m} \neq y_{n} xm?=yn? z k ≠ y n z_{k} \neq y_{n} zk?=yn?,則 Z Z Z X X X Y n ? 1 Y_{n - 1} Yn?1?的最長公共子序列

子問題的遞歸結(jié)構(gòu)

  • 當(dāng) x m = y n x_{m} = y_{n} xm?=yn?時(shí),找出 X m ? 1 X_{m - 1} Xm?1? Y n ? 1 Y_{n - 1} Yn?1?的最長公共子序列,然后在其尾部加上 x m x_{m} xm?
  • 當(dāng) x m ≠ y n x_{m} \neq y_{n} xm?=yn?時(shí),找出 X m ? 1 X_{m - 1} Xm?1? Y Y Y的一個(gè)最長公共子序列及 X X X Y n ? 1 Y_{n - 1} Yn?1?的一個(gè)最長公共子序列,這兩個(gè)公共子序列中較長者即為 X X X Y Y Y的最長公共子序列
c [ i ] [ j ] c[i][j] c[i][j]遞歸方程

c [ i ] [ j ] = { 0 , i = 0 或 j = 0 c [ i ? 1 ] [ j ? 1 ] + 1 , i , j > 0 ; x i = y j max ? { ? c [ i ] [ j ? 1 ] , c [ i ? 1 ] [ j ] ? } , i , j > 0 ; x i ≠ y j c[i][j] = \begin{cases} 0 , & i = 0 或 j = 0 \\ c[i - 1][j - 1] + 1 , & i , j > 0 ; x_{i} = y_{j} \\ \max\set{c[i][j - 1] , c[i - 1][j]} , & i , j > 0 ; x_{i} \neq y_{j} \end{cases} c[i][j]=? ? ??0,c[i?1][j?1]+1,max{c[i][j?1],c[i?1][j]},?i=0j=0i,j>0;xi?=yj?i,j>0;xi?=yj??文章來源地址http://www.zghlxwxcb.cn/news/detail-829929.html


時(shí)間復(fù)雜性

  • 由于每個(gè)數(shù)組單元的計(jì)算耗費(fèi) O ( 1 ) O(1) O(1)時(shí)間,因此算法耗時(shí) O ( m n ) O(mn) O(mn)

構(gòu)造最長公共子序列

  • 在算法 L C S LCS LCS中,每次遞歸調(diào)用使 i i i j j j 1 1 1,因此算法的計(jì)算時(shí)間為 O ( m + n ) O(m + n) O(m+n)

Python實(shí)現(xiàn)

def longest_common_subsequence(str_1, str_2):
    m = len(str_1)
    n = len(str_2)

    # 創(chuàng)建一個(gè)二維數(shù)組來存儲(chǔ)子問題的解
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    # 填充二維數(shù)組
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str_1[i - 1] == str_2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

    # 構(gòu)造最長公共子序列
    lcs = ''

    i, j = m, n
    while i > 0 and j > 0:
        if str_1[i - 1] == str_2[j - 1]:
            lcs = str_1[i - 1] + lcs

            i -= 1
            j -= 1
        elif dp[i - 1][j] > dp[i][j - 1]:
            i -= 1
        else:
            j -= 1

    return lcs


str_1 = 'ABCDGH'
str_2 = 'AEDFHR'

lcs = longest_common_subsequence(str_1, str_2)

print(f'最長公共子序列: {lcs}')
最長公共子序列: ADH

算法的改進(jìn)

  • 如果只需要計(jì)算最長公共子序列的長度,則只用到數(shù)組 c c c的第 i i i行和第 i ? 1 i - 1 i?1
  • 因此,用兩行的數(shù)組空間就可以計(jì)算出最長公共子序列的長度,可將空間需求減至 O ( min ? { ? m , n ? } ) O(\min\set{m , n}) O(min{m,n})

到了這里,關(guān)于【動(dòng)態(tài)規(guī)劃】最長公共子序列Python實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法:動(dòng)態(tài)規(guī)劃——最長公共子序列

    算法:動(dòng)態(tài)規(guī)劃——最長公共子序列

    動(dòng)態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個(gè)子問題,先求解子問題,然后從這些子問題的解得到原問題的解。 與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃法求解的問題,經(jīng)分解得到的子問題往往不是互相獨(dú)立的。若用分治法解這類問題,則分解得到的

    2023年04月27日
    瀏覽(22)
  • 【算法-動(dòng)態(tài)規(guī)劃】最長公共子序列

    【算法-動(dòng)態(tài)規(guī)劃】最長公共子序列

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年01月23日
    瀏覽(27)
  • 【動(dòng)態(tài)規(guī)劃】最長公共子序列(Java)

    給定兩個(gè)字符串 text1 和 text2,返回這兩個(gè)字符串的最長 公共子序列 的長度。如果不存在 公共子序列 ,返回 0 。 一個(gè)字符串的 子序列 是指這樣一個(gè)新的字符串:它是由原字符串在不改變字符的相對順序的情況下刪除某些字符(也可以不刪除任何字符)后組成的新字符串。

    2024年01月18日
    瀏覽(21)
  • 動(dòng)態(tài)規(guī)劃之最長公共子序列模板

    夏令營:動(dòng)態(tài)規(guī)劃特訓(xùn) - 【算法模板題】最長公共子序列 - 藍(lán)橋云課 (lanqiao.cn) 我們來解釋一下狀態(tài)轉(zhuǎn)移方程吧。 dp[i][j]的含義是第i個(gè)和第j個(gè)字符,i與j的下標(biāo)從1開始,代表著原子符串的第一個(gè)字符。那么理所當(dāng)然字符串a(chǎn)的第0個(gè)字符和字符串b的0個(gè)字符的公共長度為0.如果字

    2024年02月12日
    瀏覽(18)
  • 動(dòng)態(tài)規(guī)劃-----最長公共子序列(及其衍生問題)

    動(dòng)態(tài)規(guī)劃-----最長公共子序列(及其衍生問題)

    目錄 一.最長公共子序列的基本概念: 解決動(dòng)態(tài)規(guī)劃問題的一般思路(三大步驟): 二.最長公共子序列題目: 三.字符串的刪除操作: 四.最小 ASCII 刪除和: 首先需要科普一下,最長公共子序列(longest common sequence)和最長公共子串(longest common substring)不是一回事兒。什么

    2024年03月26日
    瀏覽(19)
  • 動(dòng)態(tài)規(guī)劃-最長公共子序列(c語言)

    動(dòng)態(tài)規(guī)劃-最長公共子序列(c語言)

    實(shí)驗(yàn) 3: 最長公共子序列 內(nèi)容: 給定兩個(gè)字符串str1和str2,輸出兩個(gè)字符串的最長公共子序列,如果最長公共子序列為空,則返回“-1”。目前給出的數(shù)據(jù),僅僅會(huì)存在一個(gè)最長的公共子序列。 數(shù)據(jù)范圍: 0 ≤|str1|,|str2|≤2000 要求: 空間復(fù)雜度O(n 2 ) 具體思路: step1:

    2024年02月04日
    瀏覽(32)
  • 【動(dòng)態(tài)規(guī)劃】最長公共子序列——算法設(shè)計(jì)與分析

    【動(dòng)態(tài)規(guī)劃】最長公共子序列——算法設(shè)計(jì)與分析

    子序列是給定序列中在任意位置去掉任意多個(gè)字符后得到的結(jié)果。例如: 給定序列 X X X : X : A B C B D A B X:ABCBDAB X : A BCB D A B X X X 的子序列: X 1 : A B C B D A B X_1:ABCBDAB X 1 ? : A BCB D A B X 2 : A B C B X_2:ABCB X 2 ? : A BCB X 3 : A C B B X_3:ACBB X 3 ? : A CBB 給定兩個(gè)序列

    2024年02月05日
    瀏覽(27)
  • 動(dòng)態(tài)規(guī)劃應(yīng)用篇:詳解最長公共子序列問題

    動(dòng)態(tài)規(guī)劃應(yīng)用篇:詳解最長公共子序列問題

    動(dòng)態(tài)規(guī)劃 是一個(gè)強(qiáng)大的工具,將復(fù)雜問題 分解 為多個(gè)容易解決的子問題,并且會(huì)對中間結(jié)果進(jìn)行存儲(chǔ)從而避免重復(fù)計(jì)算,然后將它們的解組合起來,形成大問題的解,高效地得出 全局最優(yōu)解 。前面我們已經(jīng)了解了動(dòng)態(tài)規(guī)劃的基礎(chǔ)知識(shí)及一維動(dòng)態(tài)規(guī)劃問題的求解,今天,我

    2024年04月15日
    瀏覽(21)
  • 兩個(gè)數(shù)組的動(dòng)態(tài)規(guī)劃——最長公共子序列模型

    兩個(gè)數(shù)組的動(dòng)態(tài)規(guī)劃——最長公共子序列模型

    1.考慮空串,即dp表多出一行一列, 代表某個(gè)字符串為空。 2.考慮最后一個(gè)位置;是否相等; 3.可在字符串最前面加虛擬位置以對應(yīng)映射關(guān)系; 4.一般橫行是j,列是i。此時(shí)第一行代表第二個(gè)字符串不為空,即第一個(gè)字符串是空的 給你兩個(gè)字符串? s ? 和? t ?,統(tǒng)計(jì)并返回在

    2024年03月10日
    瀏覽(19)
  • (Java) 算法——?jiǎng)討B(tài)規(guī)劃 最長公共子序列 圖解

    (Java) 算法——?jiǎng)討B(tài)規(guī)劃 最長公共子序列 圖解

    遇到了用動(dòng)態(tài)規(guī)劃來求解最長公共子序列問題,算法這塊兒比較薄弱,便想著在網(wǎng)上找現(xiàn)成的思路和代碼,也算拾人牙慧,但有一點(diǎn)沒想到,都已經(jīng)22年了,關(guān)于LCS問題網(wǎng)上給出的答案如此一言難盡……,只有零散幾篇對于 新手 來說比較友好,但也僅僅這樣,好在自己花了點(diǎn)

    2023年04月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包