编辑距离算法解释

2024-03-22

根据维基百科,计算两个字符串 a 和 b 之间的编辑距离的递归公式的定义如下:

我不明白为什么我们不考虑删除的情况a[j],或者我们插入b[i]。另外,如果我错了,请纠正我,插入的情况和删除的情况不一样吗?我的意思是,我们可以在第二个字符串中插入相同的字符,而不是从一个字符串中删除一个字符,反之亦然。那么为什么不将插入/删除操作合并为一个操作,其成本等于min{cost_insert, cost_delete}?


未完成此操作,因为不允许您编辑这两个字符串。编辑距离的定义(来自维基百科)是:

将 a 转换为 b 的最小权重系列编辑操作。

因此,您专门寻找要在字符串上执行的操作序列(的权重)a将其转换为字符串b.

此外,编辑距离不一定是对称的。如果插入和删除的成本相同,则距离是对称的:d(a,b) = d(b,a)

考虑维基百科的例子,但成本不同:

  • 插入成本:w_ins = 1
  • 删除成本:w_del = 2
  • 替换成本:w_sub = 1

的距离为kitten and sitting仍然是3,

kitten -> sitten  (substitution k->s, cost 1)
sitten -> sittin  (substitution e->i, cost 1)
sittin -> sitting (insertion of g, cost 1)
=> d(kitten, sitting) = 3

但距离sitting and kitten is not:

sitting -> kitting  (substitution s->k, cost 1)
kitting -> kitteng  (substitution i->e, cost 1)
kitteng -> kitten (deletion of g, cost 2)
=> d(kitten, sitting) = 4

你看到了d(kitten, sitting) != d(kitten, sitting).

另一方面,如果您确实使用对称成本,就像编辑距离(具有单位成本的编​​辑距离)一样,您可以假设:d(a,b) = d(b,a)成立。那么,即使考虑相反的情况,你也不会赢得任何东西。您丢失的是哪个字符在哪个字符串中被替换的信息,这使得之后提取操作序列变得更加困难。

The 瓦格纳-费舍尔算法 https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm您在问题中显示的内容可以通过以最小成本回溯路径来从 DP 矩阵中提取此内容。考虑这两个编辑矩阵to and foo单位成本:

  t o       f o o
f 1 2     t 1 2 3
o 2 1     o 2 1 2
o 3 2

请注意,如果将矩阵转置为d(to, foo)你得到的矩阵d(foo, to)。请注意,通过这种方式,第一个矩阵中的插入将成为第二个矩阵中的删除,反之亦然。所以这就是你所寻找的对称性再次出现的地方。

我希望这有帮助 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编辑距离算法解释 的相关文章

  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex

随机推荐

  • 函数指针的函数模板专业化

    我有一个清理函数 我只想在 传统 指针类型上运行 我的问题是函数模板 我可以将函数限制为仅指针 但是由于函数指针和常规指针之间的转换规则差异 我遇到了问题 The Sanitize 函数需要针对大量类型运行 其中一些是指针 需要进行清理 其
  • 上传文件 spring boot 所需的请求部分“文件”不存在

    我想为我的 Spring Boot 应用程序添加上传功能 这是我的上传休息控制器 package org sid web import java io BufferedOutputStream import java io File imp
  • 使用 numpy 数组左移大量数字

    Python确实可以左移一位大整数 1L lt lt 100 1267650600228229401496703205376L 但 NumPy 似乎有一个问题 a np array 1 2 100 output np left shift
  • 复制大文件时如何避免 StorageFile.CopyAsync() 抛出异常?

    我将通过以下方式将一些文件从视频库复制到我的应用程序存储StorageFile CopyAsync 方法 但如果文件大小超过1GB 则会抛出异常 如下所示 类型 System Runtime InteropServices COMExcep
  • 如何以编程方式在 Android 中加入 2 个联系人?

    我需要知道是否可以加入两个或多个联系人 以编程方式 使用联系人 android API 或其他方式 例如 我有一个联系人 Axel Rose 有一个电子邮件帐户和电话号码 我注意到一些应用程序 如 Whatsapp Facebook 和 S
  • 如何更改物料表操作字段图标

    actions icon edit tooltip Edit User onClick event rowData gt alert You are editing rowData name icon delete tooltip Dele
  • 从物化路径构建 JSON 树

    我计划在 MongoDB 中使用物化路径来表示树 并且需要将物化路径转换回 JSON 树 前任 物化路径 var input id 0 path javascript id 1 path javascript database id 2 p
  • 将本地 TIMESTAMP 转换为 UTC 时间

    我有两张带有时间戳的表 TABLE1带有当地时间的 TIMESTAMP TABLE2带有 UTC 时间戳 我需要做类似的事情 select count from TABLE1 where TIME STAMP gt TABLE2 TIME
  • 我可以从打开的文件中读取新数据而不重新打开它吗?

    考虑有一个文件test txt其中有一些随机文本 现在我们运行以下代码 f open test txt r f read 现在我们将数据附加到test txt来自其他一些进程 有没有办法不用重新打开f我们可以read新数据 这个问题仅限于P
  • 我如何使用 ie6 测试我的网站

    我在最新的 Firefox 中开发了一个网站 然后在一台只有 ie6 的机器上展示了它 看起来很糟糕 无论如何 我可以测试它在 IE6 中的外观 而无需实际下载 我看到ie8有一个兼容模式 以显示它在ie7中的样子 ie 6有类似的东西吗
  • Cassandra 0.8 = 提供什么样的“行计数”功能?

    同时支持 Cassandra 中的 行计数 在 CF 中 a 随机分区器 b OrderPreservingPartitioner http www datastax com dev blog whats new in cassandra
  • 如何删除 TextBox 控件的默认上下文菜单? C#

    如何删除默认的上下文菜单TextBox控制 有属性可以禁用它吗 谢谢 您还可以设置ShortcutsEnabled财产给false 这将删除默认的上下文菜单和所有剪贴板功能 我想这就是你试图抑制菜单的原因 除了故意阻止用户使用复制 粘贴之外
  • C++:使用 CRTP,派生类中定义的类无法在基类中访问

    这是 简化的 基类 template
  • 模拟单元测试中时间的流逝

    我已经为客户构建了一个付费 CMS 发票系统 我需要更加严格地进行测试 我将所有数据保存在 Django ORM 中 并有一堆以不同时间间隔运行的 Celery 任务 以确保发送新发票和发票提醒 并在用户不支付发票时切断访问权限 例如 我希
  • Quartz.Net 和在链接作业之间传递数据

    我必须实施一个简单的工作流程 某些作业 A 必须在指定时间运行 cron 触发器 该作业搜索未处理的数据 比如说一些 IThingToDo 并对其进行处理 作业 B 必须在作业 A 完成后立即执行 并且已处理的数据列表 ITingToDo
  • jquery多下拉过滤菜单

    我根据多个下拉菜单选择隐藏和显示图片 我正在尝试让 2 个和可能更多的下拉菜单一起工作来优化搜索 如果我在第一个下拉列表中选择一个项目 我想应用第二个过滤器 依此类推 以及任何其他下拉列表 我需要一些关于 jquery 的帮助 我当前的问题
  • 无法打开故事板(com.apple.InterfaceBuilder 错误 -1。)

    在几位开发人员在我们的一个应用程序中处理故事板后 我们现在在尝试在 Xcode Interface Builder 中打开故事板时收到此错误 无法打开文档 MainStoryboard iPhone storyboard 操作无法完成 co
  • 我需要在外部脚本和样式表中使用 rel="nofollow" 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经阅读了很多有关 SEO 和网络性能的文章 但现在我有一个愚蠢的问题 我试图回答自己 但我不能 好用吗rel nofollow 在许多
  • 如何在 Access 2007 中使用 VBA 保存 SQL COUNT 查询的结果?

    我正在尝试计算表中满足特定条件的记录数 我更喜欢使用 SQL 而不是 Dcount 因为我想更好地使用 SQL 下面是我当前的代码 Dim countString As String Dim count countString SELECT
  • 编辑距离算法解释

    根据维基百科 计算两个字符串 a 和 b 之间的编辑距离的递归公式的定义如下 我不明白为什么我们不考虑删除的情况a j 或者我们插入b i 另外 如果我错了 请纠正我 插入的情况和删除的情况不一样吗 我的意思是 我们可以在第二个字符串中插入