日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

diff算法_传统Diff算法为什么时间复杂度要O(n ^3)

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 diff算法_传统Diff算法为什么时间复杂度要O(n ^3) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接:https://juejin.im/post/6892671384976097287

很多文章提到的都是新舊DOM樹需要兩兩對(duì)比,但是沒有說清楚為什么。

思考

  • 大家想一下,如果讓你來設(shè)計(jì)將一棵樹轉(zhuǎn)換為另一棵樹,你會(huì)怎么設(shè)計(jì)?
    • 可能是直接暴力的根據(jù)index遍歷比較,相同保留,不同就替換?

    • 也可能是用動(dòng)態(tài)規(guī)劃計(jì)算新舊兩個(gè)節(jié)點(diǎn)變換所有情況的最小DOM操作次數(shù)?Min(新增,刪除,替換)

      等等,我相信還有很多種可能。

      第一種非常粗暴,第二種是假設(shè)所有操作的優(yōu)先級(jí)是相同的。第二種方案也就是我們傳統(tǒng)的diff算法的核心方案,下面我們就此展開討論

  • 首先思考一個(gè)問題,創(chuàng)建一顆樹的需要的復(fù)雜度是多少?

    很簡(jiǎn)單,因?yàn)闃涫且环N遞歸的數(shù)據(jù)結(jié)構(gòu),需要遞歸的創(chuàng)建,復(fù)雜度O(n)。但是DOM的操作是非常耗性能的!

  • 再思考一下,將一棵樹轉(zhuǎn)換為另一顆樹,每個(gè)節(jié)點(diǎn)如何操作可以最少次數(shù)的操作DOM?

    太抽象了想不清楚沒關(guān)系。下面我們來簡(jiǎn)化一下問題。

  • 思考一下,將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串所需的最小操作次數(shù),要如何計(jì)算?[wiki Edit distance][]

    題目還是理解的不是很清晰?看下面的示例![leetcode 72.編輯距離][leetcode 72.]

  • 編輯距離

    可能有部分同學(xué)已經(jīng)想到了,直觀的方式是用動(dòng)態(tài)規(guī)劃,通過這種記憶化搜索減少時(shí)間復(fù)雜度!

    下面就展開介紹一下如何用動(dòng)態(tài)規(guī)劃解這道題

    代碼

    /**
    ?*?@param?{string}?word1
    ?*?@param?{string}?word2
    ?*?@return?{number}
    ?*/
    var?minDistance?=?function(word1,?word2)?{
    ??//1.初始化
    ??let?n?=?word1.length,?m?=?word2.length
    ??let?dp?=?new?Array(n+1).fill(0).map(()?=>?new?Array(m+1).fill(0))
    ??for?(let?i?=?0;?i?<=?n;?i++)?{
    ??????dp[i][0]?=?i
    ??}
    ??for?(let?j?=?0;?j?<=?m;?j++)?{
    ??????dp[0][j]?=?j
    ??}
    ??//2.dp
    ??for(let?i?=?0;?i?<=?n;?i++)?{
    ??????for(let?j?=?0;?j?<=?m;?j++)?{
    ??????????if(i*j)?{
    ??????????????dp[i][j]?=?word1[i-1]?==?word2[j-1]???dp[i-1][j-1]:?(Math.min(dp[i-1][j],?dp[i][j-1],?dp[i-1][j-1])?+?1)
    ??????????}?else?{
    ??????????????dp[i][j]?=?i?+?j
    ??????????}?console.log(dp[i][j])
    ??????}
    ??}
    ??return?dp[n][m]
    };

    得到字符串的最小編輯距離需要O(n^2)復(fù)雜度 -> 樹的最小編輯距離需要O(n^3)。

    總結(jié)

    以上是生活随笔為你收集整理的diff算法_传统Diff算法为什么时间复杂度要O(n ^3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。