简述React 和 Vue 的 diff 时间复杂度从 O(n^3) 优化 到 O(n) ,那么 O(n^3) 和 O(n) 是如何计算出来的 ?

news/2024/10/20 18:54:27/

React 和 Vue 的 diffing 算法(即虚拟DOM比较算法)的优化过程是一个复杂的过程,涉及到多个层面的设计和优化。从 O(n^3) 优化到 O(n) 的时间复杂度并不是简单地通过一个步骤完成的,而是经过了一系列的改进和优化。

O(n^3) 的可能来源

变成O(n^3)其实是牺牲了最优解,来换取时间

在最初的虚拟DOM diffing算法中,如果采用简单的方法去比较两个树形结构的差异,可能会遇到需要递归比较所有节点的情况。在最坏的情况下,每个节点都需要与其对应的节点以及所有子节点进行比较,这可能导致一个三重循环(对于每个节点,检查其子节点,然后对于每个子节点再检查其子节点),从而可能产生 O(n^3) 的时间复杂度。

优化到 O(n) 的过程

React 和 Vue 都采用了不同的策略来优化 diffing 算法,使其时间复杂度降低到接近 O(n)。以下是一些常见的优化策略:

  1. 基于组件类型的比较

    • 如果两个节点是不同类型的,React 会立即销毁旧的树并构建新的树。
    • Vue 也类似,它会基于虚拟节点的类型来判断是否可以复用节点。
  2. 列表和键(Keys)

    • 对于列表渲染,React 引入了 key 属性来帮助识别哪些项目发生了改变、被添加或被移除。
    • Vue 同样支持使用 :key 绑定来优化列表的渲染。
  3. 使用虚拟DOM的“快照”

    • React 和 Vue 的虚拟DOM不仅仅是一个简单的JS对象树,它们还包含了一些额外的信息来帮助diffing过程。
    • 这些信息可能包括节点的类型、属性、子节点等,并且可以在比较时避免不必要的比较。
  4. 只比较变更的部分

    • React 和 Vue 都采用了某种形式的“变化追踪”或“脏检查”机制,以确定哪些部分需要重新渲染。
    • 这意味着它们不会每次都比较整个树,而只会比较那些已知已经改变或可能改变的部分。
  5. 使用启发式方法

    • React 和 Vue 的diffing算法可能包含一些启发式方法,例如假设列表中的元素很少会改变顺序或位置,从而优化比较过程。

如何计算时间复杂度

时间复杂度的计算通常基于算法的基本操作(如比较、赋值等)的数量,以及这些操作如何随输入数据的大小(n)而变化。

  • O(n^3):如果算法中存在三层嵌套循环,且每一层循环都遍历整个输入数据(或与其大小成比例的某个集合),则时间复杂度可能是 O(n^3)。
  • O(n):如果算法中的基本操作数量与输入数据的大小(n)成线性关系,即无论输入数据多大,基本操作的数量都只是输入数据大小的一个常数倍,则时间复杂度是 O(n)。

需要注意的是,这里的 O(n) 和 O(n^3) 是对算法性能的一种粗略估计,实际表现可能会受到多种因素的影响,包括硬件性能、输入数据的特性、算法的具体实现等。因此,在评估算法性能时,通常需要结合实际情况进行基准测试和性能分析。


http://www.ppmy.cn/news/1466894.html

相关文章

查找list集合中,持续时间>=ContinueTime的数据集合,保存在新的list中

在给定的包含时间戳的list中,查找连续continueNum次的且时间间隔为needDiff的集合。 eg:相邻两个数据的时间戳间隔为1分钟,且超过30分钟有数据 /**** param list 包含时间戳(10位)的list* param continueNum 至少持续…

docker运行centos提示Operation not permitted

1、在docker中运行了centos7镜像 2、进入到centos容器中使用systemctl命令时提示 systemctl Failed to get D-Bus connection: Operation not permitted 3、解决办法 在运行centos镜像的时候加上--privileged参数 4、附上docker官网命令说明截图

【全开源】Java养老护理助浴陪诊小程序医院陪护陪诊小程序APP源码

打造智慧养老服务新篇章 一、引言:养老护理的数字化转型 随着老龄化社会的到来,养老护理需求日益凸显。为了更好地满足老年人及其家庭的需求,我们推出了养老护理助浴陪诊小程序系统源码。该系统源码旨在通过数字化技术,优化养老…

java通过反射Reflect操作注解Annotation

通过反射获取加在类上的注解 java中可以通过反射来操作注解,可以获得加在类上面的注解,进而获得加在类上面的注解 的配置参数的值。 加在类上面的注解 Table_Annotation 的定义: Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTI…

在点云地图中进行点云计数

文章目录 概要头文件主要代码概要 在激光SLAM(Simultaneous Localization and Mapping)中,局部点云地图是通过激光雷达扫描捕捉到的周围环境的局部三维点集合。统计局部点云地图中的所有点数目是一个常见的需求,这可以帮助我们了解数据的密集程度、有效性等。 为了统计局…

Python sorted 用法:深入解析排序函数的奥秘

Python sorted 用法:深入解析排序函数的奥秘 在Python编程中,sorted函数是一个强大的工具,用于对可迭代对象进行排序。然而,它的用法和功能远不止表面看起来那么简单。本文将深入剖析sorted函数的四个方面、五个方面、六个方面和…

全自动打包封箱机:解析其在产品质量与安全保障方面的作用

在当今快节奏的生产环境中,全自动打包封箱机以其高效、精准的特点,正逐渐成为生产线上的得力助手。它不仅提升了生产效率,更在产品质量与安全保障方面发挥着举足轻重的作用。星派将详细解析全自动打包封箱机在产品质量与安全保障方面的作用。…

kotlin基础之协程

Kotlin协程(Coroutines)是Kotlin提供的一种轻量级的线程模型,它允许我们以非阻塞的方式编写异步代码,而无需使用回调、线程或复杂的并发API。协程是一种用户态的轻量级线程,它可以在需要时挂起和恢复,从而有…