java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】

简介: java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】

编辑距离算法其实就是,在规定的编辑操作(替换字符串、插入字符串、删除字符串)中,经过几步可以把一个字符串变成另一个字符串,而这个所需的步数就是你的编辑距离。


测试样例:

str1 = abc


str2 = yabd


表里的每一个值都代表着将str1转换成str2所需要的步数,每个单元格的值都遵循这样一个规律,第一行和第一列都是从0到n;其他的值要分情况计算,行索引和列索引对比大小,相同的话直接取左上方单元格的值,不同的话对比其左上方、左边、上边,找到三个单元格之中的最小值再加1即这个单元格的值。


str1  a b c

str2

0 1 2 3

y 1 1 2 3

a 2 1 2 3

b 3 2 1 2

d 4 3 3 2

最后一个单元格的值就是两个字符串间不同字符的个数,利用这个数与两个字符串中最长的长度相除就得到了不相似的程度,再用1减去就是相似率。


public class FileCompared {
    public static void main(String[] args) {
        String str1 = "ABCDEFGZ";
        String str2 = "ABFDFEGXY";
        System.out.println("两个字符串的相似率为:" + similarRates(str1,str2) +"%");
    }
    //定义一个similarRates方法获取两个字符串间不同字符的个数并求出两个字符串的相似率
    public static int similarRates(String str1 , String str2){
        //确定二维距离表distance的维度
        int str1Len = str1.length();
        int str2Len = str2.length();
        //如果一个字符串的内容为空就返回另一个字符串的长度
        if (str1Len == 0) return str2Len;
        if (str2Len == 0) return str1Len;
        //定义一张二维距离表distance
        int[][] distance = new int[str1Len + 1][str2Len + 1];
        //给二维数组的第一行第一列赋值
        int maxLen = str1Len > str2Len ? str1Len : str2Len;
        for (int num = 0; num < maxLen + 1; num++){
            if (num<str1Len + 1) distance[num][0] = num;
            if (num<str2Len + 1) distance[0][num] = num;
        }
        /**
         * 补全二维数组除第一行第一列的其他值
         * 行列索引进行对比,相同的话直接取左上方值,不同的话采用最小距离算法
         */
        for (int row = 1; row < str1Len+1; row++){
            char c1 = str1.charAt(row - 1);
            for (int col = 1; col < str2Len+1; col++){
                char c2 = str2.charAt(col - 1);
                if (c1 == c2) {
                    distance[row][col] = distance[row - 1][col - 1];
                } else {
                    // 最小距离算法就是,取该元素左上方值、左边值、上边值,找到三个之中的最小值再加1即最终距离
                    distance[row][col] = mostMin(distance[row-1][col], distance[row][col-1], distance[row-1][col-1]) + 1;
                }
            }
        }
        //二维数组中的最后一个元素即是两个字符串间不同字符的个数
        int notSimilarNum = distance[str1Len][str2Len];
        //求出相似率
        double similarRates = (1- (double)notSimilarNum / maxLen)*100;
        return (int)similarRates;
    }
    //取三个数中的最小值
    public static int mostMin(int up, int left, int upLeft){
        int min = up < left ? up : left;
        min = min < upLeft ? min : upLeft;
        return min;
    }
}

如此便求出了两个字符串的相似率,字符串换成读取文件的话就可以得到两个文件的相似度。


相关文章
|
11月前
|
SQL JSON Java
告别字符串拼接:用Java文本块优雅处理多行字符串
告别字符串拼接:用Java文本块优雅处理多行字符串
633 108
|
12月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
451 4
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
529 14
|
SQL JSON Java
告别拼接噩梦:Java文本块让多行字符串更优雅
告别拼接噩梦:Java文本块让多行字符串更优雅
998 82
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
394 13
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
439 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
407 1
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案