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

vue diff 前后綴+最長(zhǎng)遞增子序列算法

這篇具有很好參考價(jià)值的文章主要介紹了vue diff 前后綴+最長(zhǎng)遞增子序列算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

查找相同前后綴

vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端

  • 如上圖所示,新舊 children 擁有相同的前綴節(jié)點(diǎn)和后綴節(jié)點(diǎn)
  • 對(duì)于前綴節(jié)點(diǎn),我們可以建立一個(gè)索引,指向新舊 children 中的第一個(gè)節(jié)點(diǎn),并逐步向后遍歷,直到遇到兩個(gè)擁有不同 key 值的節(jié)點(diǎn)為止
// 更新相同的前綴節(jié)點(diǎn)
// j 為指向新舊 children 中第一個(gè)節(jié)點(diǎn)的索引
let j = 0
let prevVNode = prevChildren[j]
let nextVNode = nextChildren[j]
// while 循環(huán)向后遍歷,直到遇到擁有不同 key 值的節(jié)點(diǎn)為止
while (prevVNode.key === nextVNode.key) {
  // 調(diào)用 patch 函數(shù)更新
  patch(prevVNode, nextVNode, container)
  j++
  prevVNode = prevChildren[j]
  nextVNode = nextChildren[j]
}

  • 對(duì)于相同的后綴節(jié)點(diǎn),由于新舊 children 中節(jié)點(diǎn)的數(shù)量可能不同,所以我們需要兩個(gè)索引分別指向新舊 children 的最后一個(gè)節(jié)點(diǎn),并逐步向前遍歷,直到遇到兩個(gè)擁有不同 key 值的節(jié)點(diǎn)為止
// 更新相同的后綴節(jié)點(diǎn)

// 指向舊 children 最后一個(gè)節(jié)點(diǎn)的索引
let prevEnd = prevChildren.length - 1
// 指向新 children 最后一個(gè)節(jié)點(diǎn)的索引
let nextEnd = nextChildren.length - 1

prevVNode = prevChildren[prevEnd]
nextVNode = nextChildren[nextEnd]

// while 循環(huán)向前遍歷,直到遇到擁有不同 key 值的節(jié)點(diǎn)為止
while (prevVNode.key === nextVNode.key) {
  // 調(diào)用 patch 函數(shù)更新
  patch(prevVNode, nextVNode, container)
  prevEnd--
  nextEnd--
  prevVNode = prevChildren[prevEnd]
  nextVNode = nextChildren[nextEnd]
}

通過(guò)前后綴位置信息新增節(jié)點(diǎn)

// 前綴節(jié)點(diǎn)終止位置
j: 1
// 后綴節(jié)點(diǎn)終止位置
prevEnd: 0
nextEnd: 1

  • 發(fā)現(xiàn) j > prevEnd 并且 j <= nextEnd,這說(shuō)明當(dāng)新舊 children 中相同的前綴和后綴被更新之后,舊 children 中的節(jié)點(diǎn)已經(jīng)被更新完畢了,而新 children 中仍然有剩余節(jié)點(diǎn),通過(guò)上圖可以發(fā)現(xiàn),新 children 中的 li-d 節(jié)點(diǎn),就是這個(gè)剩余的節(jié)點(diǎn)。實(shí)際上新 children 中位于 j 到 nextEnd 之間的所有節(jié)點(diǎn)都應(yīng)該是新插入的節(jié)點(diǎn):
    vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端
// 滿足條件,則說(shuō)明從 j -> nextEnd 之間的節(jié)點(diǎn)應(yīng)作為新節(jié)點(diǎn)插入
if (j > prevEnd && j <= nextEnd) {
  // 所有新節(jié)點(diǎn)應(yīng)該插入到位于 nextPos 位置的節(jié)點(diǎn)的前面
  const nextPos = nextEnd + 1
  const refNode =
    nextPos < nextChildren.length ? nextChildren[nextPos].el : null
  // 采用 while 循環(huán),調(diào)用 mount 函數(shù)掛載節(jié)點(diǎn)
  while (j <= nextEnd) {
    mount(nextChildren[j++], container, false, refNode)
  }
}

通過(guò)前后綴位置信息刪除節(jié)點(diǎn)

vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端

  • 在這個(gè)案例中,當(dāng)“去掉”相同的前綴和后綴之后,三個(gè)索引的值為:
j: 1
prevEnd: 1
nextEnd: 0
  • 這時(shí)條件 j > nextEnd 并且 j <= prevEnd 成立,通過(guò)上圖可以很容的發(fā)現(xiàn),舊 children 中的 li-b 節(jié)點(diǎn)應(yīng)該被移除,實(shí)際上更加通用的規(guī)則應(yīng)該是:在舊 children 中有位于索引 j 到 prevEnd 之間的節(jié)點(diǎn),都應(yīng)該被移除
if (j > prevEnd && j <= nextEnd) {
  // j -> nextEnd 之間的節(jié)點(diǎn)應(yīng)該被添加
  const nextPos = nextEnd + 1
  const refNode =
    nextPos < nextChildren.length ? nextChildren[nextPos].el : null
  while (j <= nextEnd) {
    mount(nextChildren[j++], container, false, refNode)
  }
} else if (j > nextEnd) {
  // j -> prevEnd 之間的節(jié)點(diǎn)應(yīng)該被移除
  while (j <= prevEnd) {
    container.removeChild(prevChildren[j++].el)
  }
}

  • 假設(shè)在第一個(gè) while 循環(huán)結(jié)束之后,索引 j 的值已經(jīng)大于 prevEnd 或 nextEnd,那么還有必須執(zhí)行第二個(gè) while 循環(huán)嗎?答案是沒(méi)有必要,這是因?yàn)橐坏┧饕?j 大于 prevEnd 則說(shuō)明舊 children 中的所有節(jié)點(diǎn)都已經(jīng)參與了 patch,類(lèi)似的,如果索引 j 大于 nextEnd 則說(shuō)明新 children 中的所有節(jié)點(diǎn)都已經(jīng)參與了 patch,這時(shí)當(dāng)然沒(méi)有必要再執(zhí)行后續(xù)的操作了。
while (prevVNode.key === nextVNode.key) {
  patch(prevVNode, nextVNode, container)
  j++
  if (j > prevEnd || j > nextEnd) {
    break;
  }
  prevVNode = prevChildren[j]
  nextVNode = nextChildren[j]
}
// 更新相同的后綴節(jié)點(diǎn)
prevVNode = prevChildren[prevEnd]
nextVNode = nextChildren[nextEnd]
while (prevVNode.key === nextVNode.key) {
  patch(prevVNode, nextVNode, container)
  prevEnd--
  nextEnd--
  if (j > prevEnd || j > nextEnd) {
    break outer
  }
  prevVNode = prevChildren[prevEnd]
  nextVNode = nextChildren[nextEnd]
}

if(!(j > prevEnd && j>prevEnd)){
	// 滿足條件,則說(shuō)明從 j -> nextEnd 之間的節(jié)點(diǎn)應(yīng)作為新節(jié)點(diǎn)插入
	if (j > prevEnd && j <= nextEnd) {
	  // j -> nextEnd 之間的節(jié)點(diǎn)應(yīng)該被添加
	  // 省略...
	} else if (j > nextEnd) {
	  // j -> prevEnd 之間的節(jié)點(diǎn)應(yīng)該被移除
	  // 省略...
	}
}
 

中間部份 diff

vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端

  • 首先,我們需要構(gòu)造一個(gè)數(shù)組 source,該數(shù)組的長(zhǎng)度等于新 children 在經(jīng)過(guò)預(yù)處理之后剩余未處理節(jié)點(diǎn)的數(shù)量,初始化該數(shù)組中每個(gè)元素的初始值為 -1
  • 實(shí)際上 source 數(shù)組將用來(lái)存儲(chǔ)新 children 中的節(jié)點(diǎn)在舊 children 中的位置,后面將會(huì)使用它計(jì)算出一個(gè)最長(zhǎng)遞增子序列,并用于 DOM 移動(dòng)
    vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端
  • 再建立一個(gè) Index Map 中的鍵是節(jié)點(diǎn)的 key,值是節(jié)點(diǎn)在新 children 中的位置索引,用空間來(lái)?yè)Q取時(shí)間上的優(yōu)化
    vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端
if (j > prevEnd && j <= nextEnd) {
  // 省略...
} else if (j > nextEnd) {
  // 省略...
} else {
	// 構(gòu)造 source 數(shù)組
	const nextLeft = nextEnd - j + 1  // 新 children 中剩余未處理節(jié)點(diǎn)的數(shù)量
	const source = []
	for (let i = 0; i < nextLeft; i++) {
	  source.push(-1)
	}
	
	const prevStart = j
	const nextStart = j
	let moved = false
	let pos = 0
	// 構(gòu)建索引表
	const keyIndex = {}
	for(let i = nextStart; i <= nextEnd; i++) {
	  keyIndex[nextChildren[i].key] = i
	}
	// 遍歷舊 children 的剩余未處理節(jié)點(diǎn)
	for(let i = prevStart; i <= prevEnd; i++) {
	  prevVNode = prevChildren[i]
	  // 通過(guò)索引表快速找到新 children 中具有相同 key 的節(jié)點(diǎn)的位置
	  const k = keyIndex[prevVNode.key]
	
	  if (typeof k !== 'undefined') {
	    nextVNode = nextChildren[k]
	    // patch 更新
	    patch(prevVNode, nextVNode, container)
	    // 更新 source 數(shù)組
	    source[k - nextStart] = i
	    // 判斷是否需要移動(dòng)
	    if (k < pos) {
	      moved = true
	    } else {
	      pos = k
	    }
	  } else {
	    // 沒(méi)找到
	  }
	}

}


判斷節(jié)點(diǎn)是否需要移動(dòng)

  • 在上一步代碼中,遍歷舊 children 的剩余未處理節(jié)點(diǎn),通過(guò)索引表快速找到新 children 中具有相同 key 的節(jié)點(diǎn)的位置
  • 如果新舊節(jié)點(diǎn)位置沒(méi)有變化,那么位置信息應(yīng)該是相同的,否則,新節(jié)點(diǎn)索引表信息為[1,2,3,4],如果映射成舊節(jié)點(diǎn)為[1,2,4,3],說(shuō)明舊節(jié)點(diǎn)的最后一個(gè)位置和前面的位置互換了,說(shuō)明節(jié)點(diǎn)移動(dòng)了
const prevStart = j
const nextStart = j
let moved = false
let pos = 0
// 構(gòu)建索引表
const keyIndex = {}
for(let i = nextStart; i <= nextEnd; i++) {
  keyIndex[nextChildren[i].key] = i
}
// 遍歷舊 children 的剩余未處理節(jié)點(diǎn)
for(let i = prevStart; i <= prevEnd; i++) {
  prevVNode = prevChildren[i]
  // 通過(guò)索引表快速找到新 children 中具有相同 key 的節(jié)點(diǎn)的位置
  const k = keyIndex[prevVNode.key]

  if (typeof k !== 'undefined') {
    nextVNode = nextChildren[k]
    // patch 更新
    patch(prevVNode, nextVNode, container)
    // 更新 source 數(shù)組
    source[k - nextStart] = i
    // 判斷是否需要移動(dòng)
    if (k < pos) {
      moved = true
    } else {
      pos = k
    }
  } else {
    // 沒(méi)找到
  }
}

刪除節(jié)點(diǎn)

刪除未查找到的節(jié)點(diǎn)

  • 拿舊 children 中的節(jié)點(diǎn)嘗試去新 children 中尋找具有相同 key 值的節(jié)點(diǎn),但并非總是能夠找得到,當(dāng) k === ‘undefined’ 時(shí),說(shuō)明該節(jié)點(diǎn)在新 children 中已經(jīng)不存在了,這時(shí)我們應(yīng)該將其移除
// 遍歷舊 children 的剩余未處理節(jié)點(diǎn)
for(let i = prevStart; i <= prevEnd; i++) {
  prevVNode = prevChildren[i]
  // 通過(guò)索引表快速找到新 children 中具有相同 key 的節(jié)點(diǎn)的位置
  const k = keyIndex[prevVNode.key]

  if (typeof k !== 'undefined') {
    // 省略...
  } else {
    // 沒(méi)找到,說(shuō)明舊節(jié)點(diǎn)在新 children 中已經(jīng)不存在了,應(yīng)該移除
    container.removeChild(prevVNode.el)
  }
}

刪除多余節(jié)點(diǎn)

  • 舊 children 中已經(jīng)更新過(guò)的節(jié)點(diǎn)數(shù)量應(yīng)該小于新 children 中需要更新的節(jié)點(diǎn)數(shù)量,一旦更新過(guò)的節(jié)點(diǎn)數(shù)量超過(guò)了新 children 中需要更新的節(jié)點(diǎn)數(shù)量,則說(shuō)明該節(jié)點(diǎn)是多余的節(jié)點(diǎn),我們也應(yīng)該將其移除
const nextLeft = nextEnd - j + 1  // 新 children 中剩余未處理節(jié)點(diǎn)的數(shù)量
let patched = 0
// 遍歷舊 children 的剩余未處理節(jié)點(diǎn)
for (let i = prevStart; i <= prevEnd; i++) {
  prevVNode = prevChildren[i]

  if (patched < nextLeft) {
    // 通過(guò)索引表快速找到新 children 中具有相同 key 的節(jié)點(diǎn)的位置
    const k = keyIndex[prevVNode.key]
    if (typeof k !== 'undefined') {
      nextVNode = nextChildren[k]
      // patch 更新
      patch(prevVNode, nextVNode, container)
      patched++
      // 更新 source 數(shù)組
      source[k - nextStart] = i
      // 判斷是否需要移動(dòng)
      if (k < pos) {
        moved = true
      } else {
        pos = k
      }
    } else {
      // 沒(méi)找到,說(shuō)明舊節(jié)點(diǎn)在新 children 中已經(jīng)不存在了,應(yīng)該移除
      container.removeChild(prevVNode.el)
    }
  } else {
    // 多余的節(jié)點(diǎn),應(yīng)該移除
    container.removeChild(prevVNode.el)
  }
}

移動(dòng)和新增節(jié)點(diǎn)

vue diff 前后綴+最長(zhǎng)遞增子序列算法,Vue源碼,vue.js,算法,javascript,前端文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-639871.html

最長(zhǎng)遞增子序列

  • source 數(shù)組的值為 [2, 3, 1, -1],很顯然最長(zhǎng)遞增子序列應(yīng)該是 [ 2, 3 ],換算成位置信息是 [ 0, 1 ]
  • 而最長(zhǎng)遞增子序列是 [ 0, 1 ] 這告訴我們:新 children 的剩余未處理節(jié)點(diǎn)中,位于位置 0 和位置 1 的節(jié)點(diǎn)的先后關(guān)系與他們?cè)谂f children 中的先后關(guān)系相同?;蛘呶覀兛梢岳斫鉃槲挥谖恢?0 和位置 1 的節(jié)點(diǎn)是不需要被移動(dòng)的節(jié)點(diǎn)
  • 只有 li-b 節(jié)點(diǎn)和 li-g 節(jié)點(diǎn)是可能被移動(dòng)的節(jié)點(diǎn),但是我們發(fā)現(xiàn)與 li-g 節(jié)點(diǎn)位置對(duì)應(yīng)的 source 數(shù)組元素的值為 -1,這說(shuō)明 li-g 節(jié)點(diǎn)應(yīng)該作為全新的節(jié)點(diǎn)被掛載,所以只有 li-b 節(jié)點(diǎn)需要被移動(dòng)
  • 使用 for 循環(huán)從后向前遍歷新 children 中剩余未處理的子節(jié)點(diǎn)
  • 這里的技巧在于 i 的值的范圍是 0 到 nextLeft - 1,這實(shí)際上就等價(jià)于我們對(duì)剩余節(jié)點(diǎn)進(jìn)行了重新編號(hào)。接著判斷當(dāng)前節(jié)點(diǎn)的位置索引值 i 是否與子序列中位于 j 位置的值相等,如果不相等,則說(shuō)明該節(jié)點(diǎn)需要被移動(dòng);如果相等則說(shuō)明該節(jié)點(diǎn)不需要被移動(dòng),并且會(huì)讓 j 指向下一個(gè)位置
  • 節(jié)點(diǎn)需要被怎么移動(dòng)呢?找到 li-b 節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)(li-g),將其插入到 li-g 節(jié)點(diǎn)的前面即可
if (moved || source.indexOf(-1)!==-1) {
  // 根據(jù) source 數(shù)組計(jì)算一個(gè)最長(zhǎng)遞增子序列:
  const seq = lis(sources) // [ 0, 1 ],代表的是最長(zhǎng)遞增子序列中的各個(gè)元素在 source 數(shù)組中的位置索引
  let j = seq.length - 1
  // 從后向前遍歷新 children 中的剩余未處理節(jié)點(diǎn)
  for (let i = nextLeft - 1; i >= 0; i--) {
    if (source[i] === -1) {
      // 作為全新的節(jié)點(diǎn)掛載

      // 該節(jié)點(diǎn)在新 children 中的真實(shí)位置索引
      const pos = i + nextStart
      const nextVNode = nextChildren[pos]
      // 該節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)的位置索引
      const nextPos = pos + 1
      // 掛載
      mount(
        nextVNode,
        container,
        false,
        nextPos < nextChildren.length
          ? nextChildren[nextPos].el
          : null
      )
    } else if (i !== seq[j]) {
      // 說(shuō)明該節(jié)點(diǎn)需要移動(dòng)
      // 該節(jié)點(diǎn)在新 children 中的真實(shí)位置索引
      const pos = i + nextStart
      const nextVNode = nextChildren[pos]
      // 該節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)的位置索引
      const nextPos = pos + 1
      // 移動(dòng)
      container.insertBefore(
        nextVNode.el,
        nextPos < nextChildren.length
          ? nextChildren[nextPos].el
          : null
      )
    } else {
      // 當(dāng) i === seq[j] 時(shí),說(shuō)明該位置的節(jié)點(diǎn)不需要移動(dòng)
      // 并讓 j 指向下一個(gè)位置
      j--
    }
  }
}

}

求解最長(zhǎng)遞增子序列位置信息

[ 0, 8, 4, 12, 2, 10]
// 最長(zhǎng)遞增子序列長(zhǎng)度
[ 3, 2, 2, 1, 2, 1]
  • 如上可知最長(zhǎng)子序列長(zhǎng)度為 3,從右往左遍歷查找子序列長(zhǎng)度為2位置,接著查找為1的位置,這樣就能找到所有的位置信息
// 所有的最長(zhǎng)遞增子序列
[ 0, 8, 12 ]
[ 0, 8, 10 ]
[ 0, 4, 12 ]
[ 0, 4, 10 ]
[ 0, 2, 10 ]

到了這里,關(guān)于vue diff 前后綴+最長(zhǎng)遞增子序列算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C++二分查找算法的應(yīng)用:最長(zhǎng)遞增子序列

    C++二分查找算法的應(yīng)用:最長(zhǎng)遞增子序列

    C++二分算法應(yīng)用:最長(zhǎng)遞增子序列 二分查找算法合集 單調(diào)映射 點(diǎn)擊下載源碼 給你一個(gè)整數(shù)數(shù)組 nums ,找到其中最長(zhǎng)嚴(yán)格遞增子序列的長(zhǎng)度。 子序列 是由數(shù)組派生而來(lái)的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子

    2024年02月06日
    瀏覽(23)
  • [100天算法】-最長(zhǎng)遞增子序列的個(gè)數(shù)(day 47)

    思路 代碼 JavaScript Code C++ Code 復(fù)雜度分析 時(shí)間復(fù)雜度:$O(N^2)$。N 是數(shù)組? nums ?的長(zhǎng)度。 空間復(fù)雜度:$O(N)$。N 是輔助數(shù)組? length ?和? count ?的長(zhǎng)度。

    2024年02月07日
    瀏覽(25)
  • 【算法|動(dòng)態(tài)規(guī)劃No.7】leetcode300. 最長(zhǎng)遞增子序列

    【算法|動(dòng)態(tài)規(guī)劃No.7】leetcode300. 最長(zhǎng)遞增子序列

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專(zhuān)欄【手撕算法系列專(zhuān)欄】【LeetCode】 ??本專(zhuān)欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過(guò)程,希望對(duì)大家有所幫助 ??希望我們一起努力、成長(zhǎng),共同進(jìn)步。

    2024年02月07日
    瀏覽(30)
  • 算法與數(shù)據(jù)結(jié)構(gòu)(二十三)動(dòng)態(tài)規(guī)劃設(shè)計(jì):最長(zhǎng)遞增子序列

    算法與數(shù)據(jù)結(jié)構(gòu)(二十三)動(dòng)態(tài)規(guī)劃設(shè)計(jì):最長(zhǎng)遞增子序列

    注:此文只在個(gè)人總結(jié) labuladong 動(dòng)態(tài)規(guī)劃框架,僅限于學(xué)習(xí)交流,版權(quán)歸原作者所有; 也許有讀者看了前文 動(dòng)態(tài)規(guī)劃詳解,學(xué)會(huì)了動(dòng)態(tài)規(guī)劃的套路:找到了問(wèn)題的「狀態(tài)」,明確了 dp 數(shù)組/函數(shù)的含義,定義了 base case;但是不知道如何確定「選擇」,也就是找不到狀態(tài)轉(zhuǎn)移

    2024年02月13日
    瀏覽(34)
  • 【源碼系列#06】Vue3 Diff算法

    【源碼系列#06】Vue3 Diff算法

    專(zhuān)欄分享:vue2源碼專(zhuān)欄,vue3源碼專(zhuān)欄,vue router源碼專(zhuān)欄,玩具項(xiàng)目專(zhuān)欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏 ?????? Vue2 Diff算法可以參考此篇文章 【Vue2.x源碼系列08】Diff算法原理 兩個(gè)不同虛擬節(jié)點(diǎn)不需要進(jìn)行比較,直接移除老節(jié)點(diǎn),將新的虛擬節(jié)點(diǎn)渲染成真實(shí)D

    2024年01月17日
    瀏覽(23)
  • vue和react的diff算法源碼

    Vue.js 的 Diff 算法主要基于 Snabbdom,以下是 Vue.js 中虛擬 DOM Diff 算法的簡(jiǎn)化版?zhèn)未a,以便說(shuō)明其基本思想: 這里主要關(guān)注 patchVnode 函數(shù),它是 Diff 算法的核心。Vue.js 的 Diff 算法采用了一種雙端比較的策略,具體步驟如下: 1.同層級(jí)比較: 首先比較新舊節(jié)點(diǎn)的同層級(jí),通過(guò)

    2024年03月15日
    瀏覽(24)
  • 【Vue2.x源碼系列08】Diff算法原理

    【Vue2.x源碼系列08】Diff算法原理

    DOM是很慢的,其元素非常龐大,當(dāng)我們頻繁的去做 DOM更新,會(huì)產(chǎn)生一定的性能問(wèn)題,我們可以直觀感受一下 div元素包含的海量屬性 在Javascript對(duì)象中, 虛擬DOM 表現(xiàn)為一個(gè) Object對(duì)象(以VNode 節(jié)點(diǎn)作為基礎(chǔ)的樹(shù))。并且最少包含標(biāo)簽名 tag 、屬性 attrs 和子元素對(duì)象 children 三個(gè)

    2024年02月05日
    瀏覽(19)
  • day55 最長(zhǎng)遞增子序列 最長(zhǎng)連續(xù)遞增子序列 最長(zhǎng)重復(fù)子數(shù)組

    day55 最長(zhǎng)遞增子序列 最長(zhǎng)連續(xù)遞增子序列 最長(zhǎng)重復(fù)子數(shù)組

    題目鏈接?300 最長(zhǎng)遞增子序列 題意 找到整數(shù)數(shù)組nums的最長(zhǎng)嚴(yán)格遞增子序列的長(zhǎng)度(子序列并不改變?cè)嫉捻樞?,但是可以刪除元素) 動(dòng)態(tài)規(guī)劃 動(dòng)規(guī)五部曲 1)dp數(shù)組及下標(biāo)i的含義 dp[i] 表示以nums[i]為結(jié)尾的最長(zhǎng)遞增子序列的長(zhǎng)度 2)dp數(shù)組初始化 根據(jù)定義 長(zhǎng)度至少是1? dp

    2024年04月11日
    瀏覽(26)
  • 【LeetCode動(dòng)態(tài)規(guī)劃#14】子序列系列題(最長(zhǎng)遞增子序列、最長(zhǎng)連續(xù)遞增序列、最長(zhǎng)重復(fù)子數(shù)組、最長(zhǎng)公共子序列)

    【LeetCode動(dòng)態(tài)規(guī)劃#14】子序列系列題(最長(zhǎng)遞增子序列、最長(zhǎng)連續(xù)遞增序列、最長(zhǎng)重復(fù)子數(shù)組、最長(zhǎng)公共子序列)

    力扣題目鏈接(opens new window) 給你一個(gè)整數(shù)數(shù)組 nums ,找到其中最長(zhǎng)嚴(yán)格遞增子序列的長(zhǎng)度。 子序列是由數(shù)組派生而來(lái)的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 輸入:nums = [10,9,2,5,3,7,101,18] 輸出

    2024年02月01日
    瀏覽(30)
  • Leetcode:300. 最長(zhǎng)遞增子序列、674. 最長(zhǎng)連續(xù)遞增序列(C++)

    目錄 300.?最長(zhǎng)遞增子序列 題目描述: 實(shí)現(xiàn)代碼: 原理思路: 674.?最長(zhǎng)連續(xù)遞增序列 題目描述: 實(shí)現(xiàn)代碼: 原理思路: 題目描述: ????????給你一個(gè)整數(shù)數(shù)組? nums ?,找到其中最長(zhǎng)嚴(yán)格遞增子序列的長(zhǎng)度。 子序列? 是由數(shù)組派生而來(lái)的序列,刪除(或不刪除)數(shù)組中

    2024年02月11日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包