动态规化 - 最小编辑距离
最小编辑距离(Minimum Edit Distance)
参考:https://web.stanford.edu/class/cs124/lec/med.pdf
目标(objective):给定两个字符串s1s_{1}s1、s2s_{2}s2及编辑操作,求将字符串s1s_{1}s1转换为s2s_{2}s2所需的最小操作代价。
编辑操作:
插入(insert),插入一个新字符,代价(cost)oio_{\text{i}}oi;
删除(delete),删除一个字符,代价(cost)odo_{\text{d}}od;
替换(substitute),将一个字符替换为另一个字符,代价(cost)oso_{\text{s}}os。
1 递归(Recursion)
计算时间复杂度(time complexity):O(3n)\mathcal{O} (3^{n})O(3n)
import numpy as np
COST_INSERT=1
COST_DELETE=1
COST_REPLACE=2def edit_distance_recur(str1, str2):"""find minimum number operations required to convert string str1 into str2comparing string from right to left (backward)"""op_list = ["insert", "delete", "replace"]if len(str1) == 0:distance = len(str2) * COST_INSERTop_sequence = {"insert": list(str2),"delete": [],"replace": [],}return distance, op_sequenceif len(str2) == 0:distance = len(str1) * COST_DELETEop_sequence = {"insert": [],"delete": list(str1),"replace": [],}return distance, op_sequenceif str1[-1] == str2[-1]:distance, op_sequence = edit_distance_recur(str1[: -1], str2[: -1])else:distance_insert, op_sequence_insert = edit_distance_recur(str1, str2[: -1])distance_delete, op_sequence_delete = edit_distance_recur(str1[: -1], str2)distance_replace, op_sequence_replace = edit_distance_recur(str1[: -1], str2[: -1])distance_insert += COST_INSERTdistance_delete += COST_DELETEdistance_replace += COST_REPLACEop = np.argmin(a=[distance_insert, distance_delete, distance_replace])op = op_list[op]if op == "insert":distance = distance_insertop_sequence = op_sequence_insertop_sequence["insert"].append(str2[-1])elif op == "delete":distance = distance_deleteop_sequence = op_sequence_deleteop_sequence["delete"].append(str1[-1])else:distance = distance_replaceop_sequence = op_sequence_replaceop_sequence["replace"].append(str1[-1] + " with " + str2[-1])return distance, op_sequence
edit_distance_recur("intention", "execution")
(8,{'insert': ['x', 'e', 'c', 'u'],'delete': ['i', 'n', 't', 'n'],'replace': []})
2 动态规化(Dynamic Programming)
动态规化(Dynamic&programming):将问题分解为子问题(subproblem)求解;构造计算表(a tabular computation)D(m,n)D(m, n)D(m,n)
计算时间复杂度为O(mn)\mathcal{O} (mn)O(mn);计算空间复杂度为O(mn)\mathcal{O} (mn)O(mn)
自下而上(bottom-up)
def edit_distance_dp(str1, str2, cost_insert=1, cost_delete=1, cost_replace=1):"""find minimum number operations required to convert string str1 into str2bottom-up"""len_str1 = len(str1)len_str2 = len(str2)str1 = "#" + str1str2 = "#" + str2# initializationdistance_table = np.zeros(shape=(len_str1 + 1, len_str2 + 1))distance_table[:, 0] = np.linspace(start=0, stop=len_str1, num=len_str1 + 1)distance_table[0, :] = np.linspace(start=0, stop=len_str2, num=len_str2 + 1)for idx1 in range(1, len_str1 + 1):for idx2 in range(1, len_str2 + 1):# insertdistance_insert = distance_table[idx1, idx2 - 1] + cost_insert# deletedistance_delete = distance_table[idx1 - 1, idx2] + cost_delete# replace or remainif str1[idx1] == str2[idx2]:distance_replace = distance_table[idx1 - 1, idx2 - 1]else:distance_replace = distance_table[idx1 - 1, idx2 - 1] + cost_replacedistance_table[idx1, idx2] = np.min([distance_insert, distance_delete, distance_replace])return distance_table[-1, -1]
edit_distance_dp("intention", "execution", cost_replace=2)
8.0
3 回溯(Backtrace)
回溯(Backtrace)计算时间、空间复杂度均为O(m+n)\mathcal{O} (m + n)O(m+n)
从(0,0)(0, 0)(0,0)到(M,N)(M, N)(M,N)的任意非减路径均为一条可行对齐路径;最优路径由最优子路径组成。
def edit_distance_dp_backtrace(str1, str2, cost_insert=1, cost_delete=1, cost_replace=1):"""find minimum number operations required to convert string str1 into str2bottom-upbacktrace"""len_str1 = len(str1)len_str2 = len(str2)str1 = "#" + str1str2 = "#" + str2# initializationdistance_table = np.zeros(shape=(len_str1 + 1, len_str2 + 1))distance_table[:, 0] = np.linspace(start=0, stop=len_str1, num=len_str1 + 1)distance_table[0, :] = np.linspace(start=0, stop=len_str2, num=len_str2 + 1)for idx1 in range(1, len_str1 + 1):for idx2 in range(1, len_str2 + 1):# insertdistance_insert = distance_table[idx1, idx2 - 1] + cost_insert# deletedistance_delete = distance_table[idx1 - 1, idx2] + cost_delete# replace or remainif str1[idx1] == str2[idx2]:distance_replace = distance_table[idx1 - 1, idx2 - 1]else:distance_replace = distance_table[idx1 - 1, idx2 - 1] + cost_replacedistance_table[idx1, idx2] = np.min([distance_insert, distance_delete, distance_replace])op_list = ["replace", "insert", "delete"]path = []idx1 = len_str1idx2 = len_str2while (idx1 > 0) & (idx2 > 0):op = np.argmin(distance_table[idx1 - 1: idx1 + 1, idx2 - 1: idx2 + 1])op = op_list[op]if op == "insert":op = "{} {}".format(op, str2[idx2])idx2 -= 1elif op == "delete":op = "{} {}".format(op, str1[idx1])idx1 -= 1else:if str1[idx1] == str2[idx2]:op = "remaind"else:op = "{} {} with {}".format(op, str1[idx1], str2[idx2])idx1 -= 1idx2 -= 1path.append(op)if idx1 == 0:path.extend(["{} {}".format("insert", str2[i]) for i in range(idx2, 0, -1)])if idx2 == 0:path.extend(["{} {}".format("delete", str1[i]) for i in range(idx1, 0, -1)])path.reverse()return distance_table[-1, -1], path
min_edit_distance, optimal_path = edit_distance_dp_backtrace("intention", "execution", cost_replace=2)
print("min edit distance: ", min_edit_distance)
print("optimal path: ", optimal_path)
min edit distance: 8.0
optimal path: ['insert e', 'replace i with x', 'replace n with e', 'replace t with c', 'delete e', 'replace n with u', 'remaind', 'remaind', 'remaind', 'remaind']
动态规化 - 最小编辑距离相关推荐
- 黄金矿工问题【动态规化】
文章目录 黄金矿工 解题思路 递归实现 二维数组实现 一维数组实现 黄金矿工 很久很久以前,有一位国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不同.例如有的金矿储量是500kg黄 ...
- 清华鲁继文团队提出DynamicViT:一种高效的动态稀疏化Token的ViT
[导读] 由于随着ViT中的token数量的增长,会导致计算成本呈平方级急剧增加!近期,清华黄高团队提出了自适应序列长度的DVT方案,本篇文章,我们将介绍另一种方法.6月3日,清华鲁继文教授团队提出了 ...
- python 编辑距离_最小编辑距离python
1 什么是编辑距离 在计算文本的相似性时,经常会用到编辑距离(Levenshtein距离),其指两个字符串之间,由一个字符串转成另一个所需的最少编辑操作次数.在字符串形式上来说,编辑距离越小,那么两个 ...
- 还在用全部token训练ViT?清华UCLA提出token的动态稀疏化采样,降低inference时的计算量...
关注公众号,发现CV技术之美 本文分享一篇由清华& UCLA联合研究的论文『DynamicViT: Effificient Vision Transformers with Dynamic T ...
- mysql 编辑距离 搜索_最小编辑距离(Minimum Edit Distance)
最小编辑距离 1)定义 编辑距离(Minimum Edit Distance,MED),又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需要的最少编辑操作次数.允许的编辑操作包括 ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- 最小编辑距离 (MED)实现-Python
此帖内容是去年9月份自己做的小实验~ 1. 实验目的 最小编辑距离旨在定义两个字符串之间的相似度,定义相似度可以用于拼写纠 错.计算生物学上的序列对比.机器翻译.信息提取和语音识别等. 最小编辑距离就 ...
- Levenshtein distance最小编辑距离算法实现
Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑 ...
- 动态子类化CComboBox以得到子控件EDIT及LISTBOX
动态子类化CComboBox以得到子控件EDIT及LISTBOX Joise.LI写于2004-4-6 ComboBox是比较常用的一个控件,有三种样式:CBS_SIMPLE(简单),CBS_DROP ...
最新文章
- c# 如何找到项目中图片的相对路径
- 金融反欺诈和金融构建信用评分或者金融预测特征抽取案例
- 学好python薪水有多少笔画_Python学到什么程度可以面试工作?
- Android深度探索读书笔记 第六章
- python接口自动化(四十三)-公共模块 pymysql 连接mysql数据库(单独说明)
- [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)
- python-图书管理系统2-整体 代码架构
- python为什么不能删除_为什么python不允许我删除文件?
- 别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)
- 算法入门 13.并查集
- 【每周CV论文推荐】GAN在医学图像生成与增强中的典型应用
- 最近复习了一下JavaScript
- 用php 用拼出一个菱形_用php语言编程:输出一个由“*”符号组成的菱形图形(必须使用for循环语句)...
- [数学学习笔记]函数的连续性
- matplotlib如何绘制圆
- 主机宝iis版_主机宝IIS版|IIS网站宝(IIS科技主机管理系统)下载 v3.0 官方免费版 - 比克尔下载...
- Linux系统 | vim配置
- linux怎么共享打印机驱动程序,为samba共享的打印机添加Windows驱动
- Linux设备驱动程序
- Android 语音播报 , 百度在线语音合成封装;
热门文章
- 【陈工笔记】# 玩转电脑桌面的神器,让每一天不枯燥 #
- HYCON单片机_以32位MCU-HY16F198实现AC电流量测应用-测试测量-与非网
- 计算机本科学生毕业设计课题,计算机科学与技术本科毕业设计选题.doc
- NLP中的数据增强方法
- FHQ-Treap(非旋treap/平衡树)——从入门到入坟
- iPhone XS Max(xr)进入DFU模式的方法
- 88 java反射_4 _注解
- 企业数字化不是各自发展,而是全面SaaS化推进
- vue中使用Echarts绘制K线图
- https://www.jianshu.com/p/15c85b1901f7