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

81e708de94b97640cda0d660689ca3d3.png

原文链接: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.]

编辑距离

7e14c45f8804f2068e3ba248e5ca70c5.png

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

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

0588e0b68caddc5324a01b2703b555d0.png
bf7a004f8e93666ba802f20bbc6c64a1.png

代码

/**
 * @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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解

文章目录一、systemd 的由来&#xff08;一&#xff09;常用的 init 系统&#xff08;二&#xff09;init 程序的缺点&#xff08;三&#xff09;systemd 简介&#xff08;四&#xff09;systemd 架构图二、服务管理三、unit 配置文件&#xff08;一&#xff09;概述&#xff0…

python 指针指向的内容,python-文件的读取及指针位置

文件的读取及指针位置打开文件的三步&#xff1a;打开->操作->关闭文件的读取&#xff1a;f open(/tmp/passwd)打开f.close()操作完&#xff0c;关闭文件判断文件对象拥有的权限print(f.readable())是否拥有可读权限True or Falshprint(f.writable())是否拥有可写权限文…

matplotlib 柱状图_Matplotlib数据可视化:柱状图与直方图

↑↑点击上方蓝字&#xff0c;回复资料&#xff0c;嘿嘿&#xff0c;10个G的惊喜柱状图和直方图是两种非常类似的统计图&#xff0c;区别在于&#xff1a;直方图展示数据的分布&#xff0c;柱状图比较数据的大小。直方图X轴为定量数据&#xff0c;柱状图X轴为分类数据。因此&am…

groovy.run 脚本_Picocli 2.0:类固醇上的Groovy脚本

groovy.run 脚本Picocli 2.0增加了对其他JVM语言&#xff08;尤其是Groovy&#xff09;的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时&#xff0c;为什么还要使用picocli&#xff1f; 您可能喜欢picocli的使用帮助&#xff0c;默认情况下会显示ANSI 颜色和样式 。 您…

Linux 系统服务管理和控制程序(初始化系统/Init System) -- systemd 介绍

文章目录systemd 简介systemd 启动过程概述Systemd的争议systemd 简介 开发systemd的主要目的就是减少系统引导时间和计算开销。systemd&#xff08;系统管理守护进程&#xff09;&#xff0c;最开始以GNU GPL协议授权开发&#xff0c;现在已转为使用GNU LGPL协议&#xff0c;…

mongodb msi安装包_跟我快速学数据存储:MongoDB非关系型数据库

想要学习更多编程&#xff0c;就点上方蓝字关注我们MongoDB概述01与Redis半持久化&#xff0c;存储于内存和硬盘不同&#xff0c;MongoDB是直接持久化&#xff0c;存储于硬盘的缓存系统。MongoDB非常流行&#xff0c;其中阿里云提供了云数据库MongoDB版。https://blog.csdn.net…

php页面 info,通过PATH_INFO方法实现页面伪静态_php

/*函数url_parse用于解析url&#xff0c;使用时需要在前面定义define(PATH_INFO,true);需要解析时调用该函数&#xff0c;取值方法用回$_GET[xxx]即可*/function url_parse(){if(!(isset($_SERVER[PATH_INFO])&&defined(PATH_INFO))){return;}$url substr($_SERVER[PA…

fanuc roboguide_FANUC机器人虚拟仿真教程:Roboguide弧焊仿真工作站工装添加

Roboguide软件左侧浏览树中的“Fixture”节点专门用于添加工装资源&#xff0c;软件支持添加自带的库文件数模以及外部导入的CAD数模。软件支持CSB、DXF、STL、IGES、3DS等格式数模文件&#xff0c;一般情况下将将外部数模转换为IGES或CSB格式后进行导入效果会更好一些。本期&a…

如何在 Ubuntu 14.04 和 12.04 上测试 systemd

本来&#xff0c;Ubuntu决定从Ubuntu 16.04 LTS开始使用systemd来替换当前的引导过程。Ubuntu 16.04预计在2016年4月发布&#xff0c;但是考虑到systemd的流行和需求&#xff0c;刚刚发布的Ubuntu 15.04采用它作为默认引导程序。另外&#xff0c;Ubuntu 14.04 Trusty Tahr和Ubu…

python-opencv 最快的遍历颜色空间_居住空间设计的七种设计风格

生活中每家每户的家居样式都是不一样的&#xff0c;它们都是各有各的风格。在居住空间设计中&#xff0c;设计师会根据居住者的风格喜好来定制相应的设计方案&#xff0c;以及融入设计师的风格特点来创造出独特的设计风格&#xff0c;那么让我看看都有哪些设计风格吧。传统风格…

java更好的语言_五个使Java变得更好的功能

java更好的语言我偶然发现了Brian Goetz 提出的有关Java数据类的建议 &#xff0c;立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多&#xff0c;但这只是五个最重要的简短列表。 专制&#xff08;2006&#xff09;&#xff0c;迈克贾奇&#xff08;…

Linux 初始化系统(系统服务管理和控制程序/Init System) -- System V init(SysV init) 的简单理解

文章目录SysV init 简介SysV init 的缺点运行级别主要文件和目录的截图SysV init 简介 System V init&#xff08;缩写 SysV init&#xff09;是类 Unix 操作系统中传统的也是首款初始化系统。 服务配置文件&#xff08;bash 脚本文件&#xff09;存放在目录 /etc/init.d 下 …

java使用缓冲区读取文件_在Java中使用Google的协议缓冲区

java使用缓冲区读取文件最近发布了 有效的Java第三版 &#xff0c;我一直对确定此类Java开发书籍的更新感兴趣&#xff0c;该书籍的最新版本仅通过Java 6进行了介绍 。 在此版本中&#xff0c;显然存在与Java 7 &#xff0c; Java 8和Java 9密切相关的全新项目&#xff0c;例如…

linux多用户运行同一程序_linux系统中CentOS有哪些优势,让它长盛不衰?

CentOS是目前评价和口碑都不错的linux系统&#xff0c;甚至很多公司安装的都是CentOS系统&#xff0c;对于初入门的小白可能不了解这个系统&#xff0c;今天我们就整理一下CentOS系统的七大优势。1. 开源、免费众所周知&#xff0c;不管是微软的 Windows 还是苹果的 macOS&…

浅析 Linux 初始化系统(系统服务管理和控制程序/init system) -- UpStart

文章目录一、Upstart 简介&#xff08;一&#xff09;开发 Upstart 的缘由&#xff08;二&#xff09;Upstart 的特点二、Upstart 概念和术语&#xff08;一&#xff09;Job&#xff08;二&#xff09;Job 生命周期&#xff08;三&#xff09;事件 Event1.Signals2.Methods3.Ho…

telnet到设备里 php_金融行业思科设备典型网络故障案例:76系列典型案例(一)...

一、Cisco 7606主备引擎自动切换01故障现象某行上联路由器cisco7606 x月x日引擎自行切换&#xff0c;这种情况是第一次发生&#xff0c;至今仍是备引擎是active&#xff0c;主引擎是standby。02分析过程思科TAC提取了log日志和crashinfo信息&#xff1a;Previous engine detect…

白盒测试方法静态分析_静态分析的教育方面

白盒测试方法静态分析加入我们项目的新程序员经常问我们是否有自动格式化工具&#xff0c;以使Java代码看起来完全像Qulice期望的那样。 &#xff08;Quili是我们使用的静态分析器。&#xff09;我总是回答说&#xff0c;拥有这样一个自动代码抛光器只会有害&#xff0c;并且不…

java javadoc_使用Java 9向Javadoc搜索添加术语

java javadoc有一个相对较旧的网页&#xff0c;称为“ Proposed Javadoc Tags ”&#xff0c;最初似乎是与Javadoc 1.2一起编写的&#xff0c;其中列出了“ Sun有朝一日可能会在Javadoc中实现的标签”。 在此列表中的标签是category &#xff0c; example &#xff0c; tutoria…

浅析 Linux 初始化系统(系统服务管理和控制程序/Init System) -- systemd

文章目录一、Systemd 的简介和特点&#xff08;一&#xff09;同 SysVinit 和 LSB init scripts 兼容&#xff08;二&#xff09;更快的启动速度&#xff08;三&#xff09;systemd 提供按需启动能力&#xff08;四&#xff09;Systemd 采用 Linux 的 Cgroup 特性跟踪和管理进程…

查询 service monitor 时发生内部错误_通过Service访问应用 (1)

目录通过Service访问应用通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作&#xff0c;应用部署完成了&#xff0c;我们的Demo网站已经成功启动了&#xff0c;那么如何访问网站呢&#xff1f;通过Pod IP访问应用我们可以通过Pod IP来…