python – 计算Levenshtein编辑距离的复杂性
作者:互联网
我现在一整天都在看这个简单的Levenshtein Edit Distance python实现.
def lev(a, b):
"""Recursively calculate the Levenshtein edit distance between two strings, a and b.
Returns the edit distance.
"""
if("" == a):
return len(b) # returns if a is an empty string
if("" == b):
return len(a) # returns if b is an empty string
return min(lev(a[:-1], b[:-1])+(a[-1] != b[-1]), lev(a[:-1], b)+1, lev(a, b[:-1])+1)
来自:http://www.clear.rice.edu/comp130/12spring/editdist/
我知道它具有指数复杂性,但我将如何从头开始计算这种复杂性?
我一直在互联网上搜索,但没有找到任何解释,只有它是指数的声明.
谢谢.
解决方法:
>绘制调用树(您显然已经完成了).
>摘要来自调用树.对于任意n,确定树的深度d作为n的函数.
此外,当n接近无穷大时,平均确定每个节点有多少个分支/子节点;这称为平均分支因子b.
>实现访问具有平均分支因子b的深度为d的树中的每个节点至少采用b ^ d运算的顺序.用n表示该数字,并且根据输入大小,您在复杂性方面有一个下限.
更具体地说:你持续递归,直到你击中一个空字符串,每次取消一个字符.如果我们调用字符串m和n的长度,那么树的深度是min(m,n).在除了叶子之外的调用树中的每个节点处,你只递归三次,所以在极限中,平均分支因子是3.这给了我们一个Θ(3 ^ min(m,n))个节点的调用树.最坏的情况发生在m = n时,所以我们可以称之为Θ(3 ^ n).
这仍然只是复杂性的下限.为了全面了解,您还应该考虑递归调用之间完成的工作量.在这个天真的代码中,这实际上是线性时间,因为[: – 1]必须复制(Θ(n)成本)几乎全部a,给出Θ(n 3 ^ n)总复杂度.*
[*我曾经在二元搜索中使用Python的切片捕获了CS教授,结果在时间Θ(n lg n)中运行.
标签:python,algorithm,complexity-theory,levenshtein-distance,dynamic-programming 来源: https://codeday.me/bug/20190529/1179788.html