【每日卤一题】React 和 Vue 的 diff 时间复杂度从 O(n^3) 优化到 O(n)是怎么得来的?

41 篇文章 0 订阅
10 篇文章 1 订阅

关于O(n^3)怎么计算出来的

  • 这里的n指的是页面的VDOM节点数(虚拟节点数),这个不太严谨。如果更严谨一点,我们应该应该假设变化之前的节点数为m,变化之后的节点数为n。
  • React 和 Vue 做优化的前提是“放弃了最优解“,本质上是一种权衡,有利有弊。

React 和 Vue 做的假设是:

  1. 检测VDOM的变化只发生在同一层
  2. 检测VDOM的变化依赖于用户指定的key

注意:如果变化发生在不同层或者同样的元素用户指定了不同的key或者不同元素用户指定同样的key, React 和
Vue都不会检测到,就会发生莫名其妙的问题。

但是React 认为, 前端碰到上面的第一种情况概率很小,第二种情况又可以通过提示用户,让用户去解决,因此 这个取舍是值得的。 没有牺牲空间复杂度,却换来了在大多数情况下时间上的巨大提升。 明智的选择!

基本概念

其实这是一个典型的最小编辑距离的问题,相关算法有很多,比如Git中 ,提交之前会进行一次对象的diff操作,就是用的这个最小距离编辑算法。

leetcode 有原题目, 如果想明白这个O(n^3), 可以先看下这个。

举个栗子: 对于树,我们也是一样的,我们定义三种操作,用来将一棵树转化为另外一棵树。

  1. 删除:删除一个节点,将它的children交给它的父节点
  2. 插入:在children中 插入一个节点
  3. 修改: 修改节点的值

事实上,从一棵树转化为另外一棵树,我们有很多方式,我们要找到最少的。

直观的方式是用动态规划,通过这种记忆化搜索减少时间复杂度

算法

由于树是一种递归的数据结构,因此最简单的树的比较算法是递归处理。

确切地说,树的最小距离编辑算法的时间复杂度是O(n^2m(1+logmn)), 我们假设m 与 n 同阶, 就会变成 O(n^3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ReactVue是两个流行的前端框架,它们在组件更新时都使用了虚拟DOM来进行diff算法的优化,但是它们的diff算法实现有一些差别。 Reactdiff算法: React使用了一种称为"Reconciliation"的算法来进行diff。在组件更新时,React会生成新的虚拟DOM树,并将其与之前的虚拟DOM树进行比较。React会遍历整个树,找到需要更新的节点,并进行相应的操作。Reactdiff算法有以下特点: 1. 采用深度优先遍历:React会递归地比较子节点,然后再比较兄弟节点。 2. 使用"key"属性进行优化:通过给每个列表项添加唯一的"key"属性,React可以更准确地判断哪些节点需要更新、删除或添加。 3. 通过三种操作来更新节点:React会根据节点类型和属性的变化,进行插入、移动或删除操作。 Vuediff算法: Vue使用了一种称为"Virtual DOM with Keyed Diff"的算法来进行diffVuediff算法与React有一些相似之处,但也有一些不同之处: 1. 采用深度优先遍历:与React类似,Vue也会递归地比较子节点,然后再比较兄弟节点。 2. 使用"key"属性进行优化:与React一样,Vue也通过给每个列表项添加唯一的"key"属性来进行优化。 3. 采用双端比较:Vue会同时从新旧虚拟DOM树的头部和尾部开始比较,以尽可能地减少移动节点的操作。 总结: ReactVuediff算法都是基于虚拟DOM的,它们都通过比较新旧虚拟DOM树来确定需要更新的节点。它们的差别主要在于遍历方式和节点比较的策略上。React采用深度优先遍历,而Vue采用双端比较。此外,React还使用了"key"属性来进行优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰卤工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值