【发布时间】:2021-11-01 03:24:39
【问题描述】:
我得到了这段代码,它可以快速返回两个字符串之间的Levenshtein distance 是否正好是 2。
def li(s, i):
try:
return s[i]
except IndexError:
return None
def f(str1, str2):
t = [4, 4, 1, 2, 3]
for i, str1_symb in enumerate(str1):
p = 4
res = []
for j, t_val in enumerate(t):
p = min(t_val - (str1_symb == li(str2, i + j - 2)), p, li(t, j + 1) or 4) + 1
res.append(p)
t = res
return li(t, len(str2) - len(str1) + 2) == 3
您可以使用以下方法对其进行测试:
f("zzzzfood", "zzzzdodod")
例如将返回True
和
f("zzzzfood", "zzzzdodo")
这将返回 False。
计算 Levenshtein 距离的标准算法构建一个动态规划表,并使用公式从左到右、从上到下填充元素:
(来自上面链接的 wiki 页面)
如果您只想在 Levenshtein 距离最多为 2 的情况下返回,则只能查看动态规划的单元格,该单元格距离对角线的右侧或左侧最多 2 个。
上面的代码显然没有这样做,我无法弄清楚它在做什么。一些特别神秘的部分:
- t = [4, 4, 1, 2, 3]的作用是什么?
- li() 函数在此代码中同时获取字符串和列表。仅当索引
i大于或等于len(s)时才返回 None。有时i会是负数,它仍然会返回来自s的信。 -
如果
li(t, j + 1)是None,li(t, j + 1) or 4返回 4,但我不知道它的用途是什么。 -
p的目的/含义是什么?
谁能破解?
【问题讨论】:
-
这是非常糟糕的代码。变量的名字很糟糕,所以很难理解它们应该做什么。
-
有比这个更好的代码来阅读和理解......这是一个经典 - 所以应该不难找到它。
-
为什么还要解码乱码;写一个更容易理解的实现。
-
"如果你只想在 Levenshtein 距离最多为 2 的情况下返回,你只能查看动态规划中距离对角线最多 2 个左右的单元格。" 注意如果要检查两个单词
a和b是否在距离2,然后计算距离为2的单词集合d2a与a并检查b是否在其中效率很低。计算距离a距离为1 的单词和距离b距离为1 的单词的两组d1a和d1b会更有效,然后看看这两组中是否有共同的单词。 -
@Stef 代码根本不计算
d2a。这不是动态规划表的作用。
标签: python algorithm levenshtein-distance