编辑距离(同源去重算法)

来源:互联网 发布:排序算法中空间复杂度 编辑:程序博客网 时间:2024/06/08 05:50

原理:表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数。(以下方框中的数字就表示的步骤数)

step 1:初始化如下矩阵
这里写图片描述

step 2:从源串的第一个字符(“j”)开始,从上至下与目标串进行对比,如果两个字符相等,则在从此位置的左,上,左上三个位置中取出最小的值;若不等,则在从此位置的左,上,左上三个位置中取出最小的值再加上1;
第一次,源串第一个字符“j” 与目标串的“j”对比,左,上,左上三个位置中取出最小的值0,因为两字符相等,所以加上0;接着,依次对比“j”→“e”,“j”→“r”,“j”→“r”,,“j”→“y” 到扫描完目标串。

这里写图片描述

step3:同理
这里写图片描述

step4:
这里写图片描述

step5:
这里写图片描述

step6:
这里写图片描述

// 计算相似度
float similarity = 1-(最后一个字符的距离)上题为例也就是2/Max(x,y)两个字符的最长的。上述例子中是(1-2/5);
求出编辑距离,那么两个字符串的相似度 Similarity = (Max(x,y) - Levenshtein)/Max(x,y),其中 x,y 为源串和目标串的长度。

 /**     *  编译距离算法     * @param str1     * @param str2     * @return     */    public static float levenshtein(String str1, String str2) {        int len1 = str1.length();        int len2 = str2.length();        int[][] dif = new int[len1 + 1][len2 + 1];        //初始化行列矩阵        for (int a = 0; a <= len1; a++) {            dif[a][0] = a;        }        for (int a = 0; a <= len2; a++) {            dif[0][a] = a;        }        int temp;        for (int i = 1; i <= len1; i++) {            for (int j = 1; j <= len2; j++) {                //源字符与目标字符相比相等,则为左,左上,上三个数最小的,不相等,则最小的加1                if (str1.charAt(i - 1) == str2.charAt(j - 1)) {                    temp = 0;                } else {                    temp = 1;                } // 取三个值中最小的  dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,                        dif[i - 1][j] + 1);            }        }        //System.out.println("字符串\"" + str1 + "\"与\"" + str2 + "\"的比较");        //System.out.println("差异步骤:" + dif[len1][len2]);        // 计算相似度        float similarity = 1 - (float) dif[len1][len2]                / Math.max(str1.length(), str2.length());        return similarity;    }    private static int min(int... is) {        int min = Integer.MAX_VALUE;        for (int i : is) {            if (min > i) {                min = i;            }        }        return min;    }
0 0
原创粉丝点击