- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 C++ 写了 Levenshtein 算法
如果我输入:
字符串 s:民主
字符串 t:共和党
我得到了填充的矩阵 D 并且可以在 D[10][8] = 8 中读取操作次数(Levenshtein 距离)
除了填充矩阵,我想构建最佳解决方案。必须如何看待这个解决方案?我没有想法。
请只写我如何必须寻找这个例子。
最佳答案
问题是
给定 Levenshtein 算法生成的矩阵,如何找到“ 的最优解 ”?
即我们如何找到字符串操作的精确序列:插入、删除和替换 [单个字母],将“字符串”转换为“t 字符串”所必需的?
首先需要说明的是在许多情况下,有几个最佳解决方案 .虽然 Levenshtein 算法提供最少数量的操作(在民主/共和党示例中为 8 个),但有许多序列(8 个操作)可以产生这种转换。
通过“解码”Levenshtein 矩阵,可以枚举所有此类最佳序列。
总体思路是最优解都遵循一条“路径”,从左上角到右下角 (或在另一个方向),由此该路径上的矩阵单元格值要么保持不变,要么增加一(或在相反方向减少一),从 0 开始,以对中的字符串的最佳操作次数结束问题(0 到 8 民主党/共和党案例)。当需要操作时,数字增加,当字符串中相应位置的字母相同时,数字保持不变。
很容易产生产生这样一条路径的算法(产生所有可能的路径稍微复杂一些),并从这样的路径推导出操作的顺序。
这个寻路算法应该从右下角开始并向后工作。这种方法的原因是我们知道这样一个事实,即要成为最佳解决方案,它必须在这个角落结束,并且要在这个角落结束,它必须来自紧邻其左侧、紧邻上方的 3 个单元格之一它或立即对角线。通过在这三个单元格中选择一个满足我们“相同值或减一”要求的单元格,我们可以有效地选择最佳路径之一上的单元格。通过重复操作直到我们到达左上角(或者实际上直到我们到达一个值为 0 的单元格),我们有效地在最佳路径上回溯了我们的方式。
以民主党人的例证 - 共和党人的例子
还应该注意的是,可以通过以下两种方式之一构建矩阵:水平或垂直使用“民主”。这不会改变 Levenshtein 距离的计算,也不会改变所需的操作列表;它只会改变我们解释矩阵的方式,例如在“路径”上水平移动意味着插入一个字符 [从 t 字符串] 或删除一个字符 [从 s 字符串] 取决于“字符串 s”是否是“水平的”或矩阵中的“垂直”。
我将使用以下矩阵。因此,约定是(仅在从左到右和/或从上到下的方向)
r e p u b l i c a n
0 1 2 3 4 5 6 7 8 9 10
d 1 1 2 3 4 5 6 7 8 9 10
e 2 2 1 2 3 4 5 6 7 8 9
m 3 3 2 2 3 4 5 6 7 8 9
o 4 4 3 3 3 4 5 6 7 8 9
c 5 5 4 4 4 4 5 6 6 7 8
r 6 5 5 5 5 5 5 6 7 7 8
a 7 6 6 6 6 6 6 6 7 7 8
t 8 7 7 7 7 7 7 7 7 8 8
Starting at the bottom-rightmost cell, and working our way backward toward
the top left.
For each "backward" step, consider the 3 cells directly adjacent to the current
cell (in the left, top or left+top directions)
if the value in the diagonal cell (going up+left) is smaller or equal to the
values found in the other two cells
AND
if this is same or 1 minus the value of the current cell
then "take the diagonal cell"
if the value of the diagonal cell is one less than the current cell:
Add a SUBSTITUTION operation (from the letters corresponding to
the _current_ cell)
otherwise: do not add an operation this was a no-operation.
elseif the value in the cell to the left is smaller of equal to the value of
the of the cell above current cell
AND
if this value is same or 1 minus the value of the current cell
then "take the cell to left", and
add an INSERTION of the letter corresponding to the cell
else
take the cell above, add
Add a DELETION operation of the letter in 's string'
关于algorithm - 莱文斯坦距离 : Inferring the edit operations from the matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5849139/
我有 Site {{$url}} 和 $(function(){ $('#pencil').click
我在每一行都有一个编辑按钮,我已经设置了 defaultColDef: { editable: false, } 在网格选项中 当我点击编辑按钮时,我希望该行处于编辑模式。如果我设置
我在每一行都有一个编辑按钮,我已经设置了 defaultColDef: { editable: false, } 在网格选项中 当我点击编辑按钮时,我希望该行处于编辑模式。如果我设置
我有一个 html 文件,我想编辑其中的字段。以下是我的 html 代码: ID GROUP NAME GROUP DESCRIPTION IS A
我希望管理员能够编辑普通用户无法编辑的字段。例如作者或订阅者等。 我试过这个:Django admin: How to display a field that is marked as editab
如何将PS文件中间的数据移动到Mainframe的左侧?有什么快捷命令吗? 我有一个数据集,第 13 列有数据,必须将其移动到第 11 列,任何短键都可以移动它。 想要将 DS 中的其余行作为第一行对
我在 div 中有一个可编辑元素,它本身是可点击的。每当我单击 x-editable anchor 元素时,单击会在 DOM 中冒泡并触发对父 div 的单击。我怎样才能防止这种情况发生?我知道可以使
我有一个类似这样的模型: class Product(models.Model): third_party_id = models.CharField(max_length=64, blank
我有一个包含 2 个可编辑文本字段的页面 {{creator.name}} Tell us about yourself in less than 100 words
这是我的架构: id: 'EntryCode', fields: { EntryCode: {editable: true, validation: {required: true}, nul
有人可以帮助确定这个问题 - http://jsfiddle.net/xBB5x/8823/ 我正在尝试实现 x-editable (bootstrap 2) typeahead 功能。 上面的 js
如果我使用例如 g_object_set (renderer, "background", "red", "background-set", FALSE, NULL); 对于文本渲染器, TreeVi
我在创建和编辑页面上都使用了 Angular 文件,但我想知道是否有办法阻止用户在/edit 页面上编辑 Geo Segment 的名称。 geo-region-detail.html: G
我正在尝试向 QListWidget 添加一个项目,选择该项目,然后开始编辑新项目。 该项目被添加,它被选中,但该行没有被引入 QLineEdit,或者它试图使用的任何东西。 这是我的小部件的代码,相
我有一个表格,其中的单元格和列中有多个值。当用户单击 TD 单元格上的任意位置时,我希望它: 成为文本区域 将当前文本粘贴到文本区域 在其下方放置一个取消按钮 一旦按下取消按钮,我希望一切都变回以前的
在我的程序中,会有一个机会编辑框,它可以更改“掉率”或“获胜率” 但我想将其更改为如果用户输入大于 100 的数字并点击编辑框,编辑框文本将变回 100。 我不知道如何实现这个。 最佳答案 看看下面的
我想创建我的编辑表单,以便它将当前用户信息简单地显示为文本,而不是在文本字段中,当用户单击文本时,它将变成文本字段,用户可以编辑他的信息。仅当用户单击提交按钮时,更改才会反射(reflect)在数据库
我有一个 QTreeWidgetItem 添加到 QTreeWidget: QTreeWidgetItem* item = new QTreeWidgetItem(ui->trwPairs); ite
我检查了最新的 Dropbox 和 Excel for iOS。在 Dropbox 中,我们有一个编辑按钮。单击它会打开 Excel 的扩展程序,您可以在其中编辑文件。 保存后,更改也会反射(refl
我目前正在使用pycord创建一个Python语言的不和谐机器人。我有一个发送消息的命令,其中嵌入了两个字段。一个名为Yes,值为0;另一个名为No,值也为0。在选择菜单中,我创建了两个选项。选项是和
我是一名优秀的程序员,十分优秀!