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;
    }
}

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


相关文章
|
5月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
961 35
|
5月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
478 41
|
5月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
10月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
420 0
|
5月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
9月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
565 58
|
8月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
222 5
|
8月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
331 1
|
7月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
293 0
|
8月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
332 0

热门文章

最新文章