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

很多文章提到的都是新旧DOM树需要两两对比,但是没有说清楚为什么。

思考

  1. 大家想一下,如果让你来设计将一棵树转换为另一棵树,你会怎么设计?
  • 可能是直接暴力的根据index遍历比较,相同保留,不同就替换?

  • 也可能是用动态规划计算新旧两个节点变换所有情况的最小DOM操作次数?Min(新增,删除,替换)

    等等,我相信还有很多种可能。

    第一种非常粗暴,第二种是假设所有操作的优先级是相同的。第二种方案也就是我们传统的diff算法的核心方案,下面我们就此展开讨论

  1. 首先思考一个问题,创建一颗树的需要的复杂度是多少?

    很简单,因为树是一种递归的数据结构,需要递归的创建,复杂度O(n)。但是DOM的操作是非常耗性能的!

  2. 再思考一下,将一棵树转换为另一颗树,每个节点如何操作可以最少次数的操作DOM?

    太抽象了想不清楚没关系。下面我们来简化一下问题。

  3. 思考一下,将一个字符串转换为另一个字符串所需的最小操作次数,要如何计算?[wiki Edit distance][]

    题目还是理解的不是很清晰?看下面的示例![leetcode 72.编辑距离][leetcode 72.]

编辑距离


可能有部分同学已经想到了,直观的方式是用动态规划,通过这种记忆化搜索减少时间复杂度!

下面就展开介绍一下如何用动态规划解这道题



代码

/** * @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)复杂度 -> 树的最小编辑距离需要O(n^3)

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

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. prim算法_数据结构与算法

    根据MOOC上课程总结,文章目录为: 一.引论 数据结构的基本概念 数据的逻辑结构和存储结构 算法及其时间复杂度 时间复杂度及应用 二.线性表 线性表的概念及顺序存储 单链表的概念及其基本操作 建立单 ...

  5. python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...

  6. python 查找算法_七大查找算法(Python)

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Ke ...

  7. fifo算法_前端进阶算法6:一看就懂的队列及配套算法题

    引言 队列这种数据结构,据瓶子君了解,前端需要了解的队列结构主要有:双端队列.滑动窗口,它们都是算法中是比较常用的数据结构. 因此,本节主要内容为: 数据结构:队列(Queue) 双端队列(Deque ...

  8. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  9. python数据结构算法_数据结构与算法(Python)

    数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...

最新文章

  1. VNX证书过期解决方案(2018-11-02)
  2. 5G加速下的云办公时代来临?阿里云新品服务器 - 无影云桌面的服务开通与体验,本地客户端连接阿里云无影云桌面演示
  3. 北美暴风雨,Linux5.12被延迟6天发布
  4. Java虚拟机JVM的内存管理
  5. dict实现原理 python_5分钟看懂系列:Python 线程池原理及实现
  6. 团队阅读之——Google’s Hybrid Approach to Research
  7. Linux安装python3.8时,编译过程中报错Could not build the ssl module!
  8. ROS的学习(十)rqt_console和roslaunch
  9. (转)AppDomain 和动态加载
  10. 34. Differentiate between inheritance of interface and inheritance ofimplementations
  11. [Linux]不可重入函数
  12. MIT 线性代数习题
  13. 运筹学及其matlab应用,运筹学基础及其MATLAB应用
  14. 计算机中的查找快捷键,Excel搜索快捷键如何在excel中快速找到所需信息
  15. 深圳学位锁定怎么计算机,【实用】如何查询深圳房子学位是否锁定?(附操作步骤)...
  16. 刘强东的高调,给京东带来了流量,也给京东带来了灾难
  17. 虚无缥缈的自信,一落千丈的打击
  18. 苹果手机使用技巧篇:教你完美使用好苹果手机的4个方法
  19. 每日一佳——Trading Convexity for Scalability(Ronan Collobert et al. ,ICML,2006)
  20. 模拟二进制交叉(SBX)

热门文章

  1. javaone_JavaOne 2015 –又一年,又向前迈进了一步
  2. 投行数据_投行对Java的二十大核心访谈问答
  3. gradle入门_Gradle入门:集成测试
  4. sap界面功能_功能介面
  5. 自定义ui_如何允许用户自定义UI
  6. 您需要了解的有关UI测试的所有信息
  7. java lambda循环_在Java 8 Lambda中创建自己的循环结构
  8. Apache Ant 1.10.6发布–用于junitlauncher的fork模式以及新的jmod和链接任务
  9. spring jaxb_自定义Spring命名空间使JAXB变得更容易
  10. 向Java最佳专家的全球专家学习Java