编辑距离(Edit Distance)

这个算法是我面试的时候遇到了,觉得很有趣,也很实用,故收纳到我的记录中。

原理

百度百科的解释:
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
例如将kitten一字转成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)

算法

还是百度百科的例子,比如要计算cafe和coffee的编辑距离。cafe→caffe→coffe→coffee
先创建一个6×8的表(cafe长度为4,coffee长度为6,各加2)

接着,在如下位置填入数字(表2):


从3,3格开始,开始计算。取以下三个值的最小值:
如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字+1。(对于3,3来说为0)
左方数字+1(对于3,3格来说为2)
上方数字+1(对于3,3格来说为2)

按照这个原理,我们得出下表:

Java实现

原理很简单,我们看看在Java怎么实现。

public static int ld(String s, String t) {  
    int d[][];                                
    int sLen = s.length();  
    int tLen = t.length();  
    int si;   
    int ti;   
    char ch1;  
    char ch2;  
    int cost;  
    if(sLen == 0) {  
        return tLen;  
    }  
    if(tLen == 0) {  
        return sLen;  
    }  
    d = new int[sLen+1][tLen+1];  
    for(si=0; si<=sLen; si++) {  
        d[si][0] = si;  
    }  
    for(ti=0; ti<=tLen; ti++) {  
        d[0][ti] = ti;  
    }  
    for(si=1; si<=sLen; si++) {  
        ch1 = s.charAt(si-1);  
        for(ti=1; ti<=tLen; ti++) {  
            ch2 = t.charAt(ti-1);  
            if(ch1 == ch2) {  
                cost = 0;  
            } else {  
                cost = 1;  
            }  
            d[si][ti] = Math.min(Math.min(d[si-1][ti]+1, d[si][ti-1]+1),d[si-1][ti-1]+cost);  
        }  
    }  
    return d[sLen][tLen];  
}  

附加一个相似度函数:

public static double similarity(String src, String tar) {  
    int ld = ld(src, tar);  
    return 1 - (double) ld / Math.max(src.length(), tar.length());   
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,450评论 4 61
  • 马上六一儿童节了,想问一下大朋友们你们的梦想都实现了吗? 言不同不是故意来扎心的,只是前段时间又看到一篇写关于梦想...
    言不同阅读 1,886评论 0 1
  • 今天小组U-hub学习,看到世界的三大鸿沟:生态鸿沟、社会鸿沟和精神鸿沟。如冰山之上的显化,下潜一层,从组织系统角...
    韧性十足的牛皮糖阅读 3,301评论 0 1
  • 中午我们一起在院子里捡了好多树叶,发现了枫叶的不同颜色,学着猪爸爸摇树干,希望可以摇下来一些叶子,可是力量不...
    静雨逸桥阅读 1,373评论 0 0
  • 刚才睡着了,梦到爷爷送我一个大熊,背面乳白色,正面浅棕色的熊。 爷爷说,是送你的生日礼物,但我玩够了在给你。 八年...
    大太阳爱谁阅读 1,756评论 0 0

友情链接更多精彩内容