有效地计算两个字符串之间的编辑距离

菱形

我有一个长度为1000的字符串S和一个长度为100的查询字符串Q。我想计算长度为100的字符串S的每个子字符串的查询字符串Q的编辑距离。一种简单的方法是动态计算编辑距离每个子串的独立,即edDist(q,s[0:100])edDist(q,s[1:101])edDist(q,s[2:102])...... edDist(q,s[900:1000])

def edDist(x, y):
""" Calculate edit distance between sequences x and y using
    matrix dynamic programming.  Return distance. """
D = zeros((len(x)+1, len(y)+1), dtype=int)
D[0, 1:] = range(1, len(y)+1)
D[1:, 0] = range(1, len(x)+1)
for i in range(1, len(x)+1):
    for j in range(1, len(y)+1):
        delt = 1 if x[i-1] != y[j-1] else 0
        D[i, j] = min(D[i-1, j-1]+delt, D[i-1, j]+1, D[i, j-1]+1)
return D[len(x), len(y)]

有人可以建议另一种方法来有效地计算编辑距离。我对此的看法是,我们知道这一点edDist(q,s[900:1000])我们可以以某种方式使用此知识来计算edDist[(q,s[899:999])]...,因为那里仅相差1个字符,然后再继续edDist[(q,s[1:100])]使用先前计算的编辑距离?

尼克·祖伯

改善空间复杂度

使Levenshtein距离算法更有效的一种方法是减少计算所需的内存量。

若要使用整个矩阵,则需要利用O(n * m)内存,其中n表示第一个字符串和m第二个字符串的长度

如果您考虑一下,矩阵中我们真正关心的唯一部分就是我们要检查的最后两列-上列和当前列。

知道了这一点,我们可以假装有一个矩阵,但是只有真正创建了这两列;当我们需要更新数据时覆盖数据。

我们需要的是两个大小数组n + 1

var column_crawler_0 = new Array(n + 1);
var column_crawler_1 = new Array(n + 1);

初始化这些伪列的值:

for (let i = 0; i < n + 1; ++i) {
  column_crawler_0[i] = i;
  column_crawler_1[i] = 0;
}

然后检查您的常规算法,但是请确保在进行过程中使用新值更新这些数组:

for (let j = 1; j < m + 1; ++j) {
  column_crawler_1[0] = j;
  for (let i = 1; i < n + 1; ++i) {
    // Perform normal Levenshtein calculation method, updating current column
    let cost = a[i-1] === b[j-1] ? 0 : 1;
    column_crawler_1[i] = MIN(column_crawler_1[i - 1] + 1, column_crawler_0[i] + 1, column_crawler_0[i - 1] + cost);
  }

  // Copy current column into previous before we move on
  column_crawler_1.map((e, i) => {
    column_crawler_0[i] = e;
  });
}

return column_crawler_1.pop()

如果您想进一步分析这种方法,我使用此特定技术编写了一个小型开源库,因此如果您感到好奇,请随时对其进行检查。

改善时间复杂度

没有一种简单的方法可以改善Levenshtein距离算法的执行速度O(n^2)有几种复杂的方法,一种使用VP-Tree数据结构如果您想在此处此处阅读有关此书的信息,那么这里有一些很好的资源,而且这些方法的渐近速度可以达到O(nlgn)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算来自两个不同数据帧的两个字符串列之间的编辑距离

来自分类Dev

使用Python计算组中任何两个字符串之间的最大距离

来自分类Dev

用递归找到两个字符串的编辑距离

来自分类Dev

如何计算两个字符串列表之间的jaccard相似度距离

来自分类Dev

如何有效地找到两个给定的子字符串之间的字符串?

来自分类Dev

如何有效地找到两个给定的子字符串之间的字符串?

来自分类Dev

Python中两个字符串之间的汉明距离

来自分类Dev

创建对称矩阵的有效方法,计算两个字符串属于同一列表的频率

来自分类Dev

获得两个字符串之间的对称差异的最佳有效方法是什么(在python中)?

来自分类Dev

从两个字符串抓取编辑

来自分类Dev

在java中使用两个字符串构建密钥的有效方法?

来自分类Dev

计算字符串中两个字符之间的总字符数-JAVA

来自分类Dev

如何有效地建立这个字符串?

来自分类Dev

删除两个字符串之间的所有字符串

来自分类Dev

如何计算字符串中两个字符之间的长度

来自分类Dev

两个字符串之间的总和

来自分类Dev

如何使用python有效地匹配两个大列表之间的字符串?(510.000.000比较)

来自分类Dev

如何计算两个字符串之间相等单词的数量?

来自分类Dev

计算两个字符串python之间的匹配数

来自分类Dev

计算两个字符串之间的差异

来自分类Dev

如何计算两个字符串向量之间的余弦相似度

来自分类Dev

MySQL-计算两个字符串之间的soundex差异

来自分类Dev

如何计算两个字符串之间相等单词的数量?

来自分类Dev

如何计算两个字符串向量之间的余弦相似度

来自分类Dev

正则表达式:计算两个字符串之间的差异

来自分类Dev

提取两个字符之间的所有字符串

来自分类Dev

提取所有出现的两个字符串之间不同的字符

来自分类Dev

过滤字符_和/之间有两个字符串匹配的对齐方式

来自分类Dev

替换两个字符串之间所有出现的字符

Related 相关文章

  1. 1

    计算来自两个不同数据帧的两个字符串列之间的编辑距离

  2. 2

    使用Python计算组中任何两个字符串之间的最大距离

  3. 3

    用递归找到两个字符串的编辑距离

  4. 4

    如何计算两个字符串列表之间的jaccard相似度距离

  5. 5

    如何有效地找到两个给定的子字符串之间的字符串?

  6. 6

    如何有效地找到两个给定的子字符串之间的字符串?

  7. 7

    Python中两个字符串之间的汉明距离

  8. 8

    创建对称矩阵的有效方法,计算两个字符串属于同一列表的频率

  9. 9

    获得两个字符串之间的对称差异的最佳有效方法是什么(在python中)?

  10. 10

    从两个字符串抓取编辑

  11. 11

    在java中使用两个字符串构建密钥的有效方法?

  12. 12

    计算字符串中两个字符之间的总字符数-JAVA

  13. 13

    如何有效地建立这个字符串?

  14. 14

    删除两个字符串之间的所有字符串

  15. 15

    如何计算字符串中两个字符之间的长度

  16. 16

    两个字符串之间的总和

  17. 17

    如何使用python有效地匹配两个大列表之间的字符串?(510.000.000比较)

  18. 18

    如何计算两个字符串之间相等单词的数量?

  19. 19

    计算两个字符串python之间的匹配数

  20. 20

    计算两个字符串之间的差异

  21. 21

    如何计算两个字符串向量之间的余弦相似度

  22. 22

    MySQL-计算两个字符串之间的soundex差异

  23. 23

    如何计算两个字符串之间相等单词的数量?

  24. 24

    如何计算两个字符串向量之间的余弦相似度

  25. 25

    正则表达式:计算两个字符串之间的差异

  26. 26

    提取两个字符之间的所有字符串

  27. 27

    提取所有出现的两个字符串之间不同的字符

  28. 28

    过滤字符_和/之间有两个字符串匹配的对齐方式

  29. 29

    替换两个字符串之间所有出现的字符

热门标签

归档