相似度计算——汉明距离

汉明距离,又称编辑距离,是一种衡量两个等长字符串之间的不同之处的度量方法,它在信息论和计算机科学领域中有着广泛的应用。

汉明距离的发展及介绍

汉明距离是由理查德·汉明(Richard Hamming)在1950年提出的,用于衡量两个等长字符串之间的不同之处。它在错误检测和纠正编码、网络编码、密码学等领域有着广泛的应用。汉明距离的概念也被应用于DNA序列分析、图像处理、语音识别等领域。

汉明距离的原理及计算方式

汉明距离的计算方式很简单,它是通过对比两个等长字符串对应位置上的字符来计算的。如果两个字符串在相同位置上的字符不同,那么它们之间的汉明距离就会加一。字符串之间的相似度越高,对应的汉明距离越小。

换句话说,两个字符串的汉明距离就是将字符串其对应位置上的不同字符的个数加起来。

例如,现在有两个十进制数a=93和b=73,如果将这两个数用二进制表示的话,即a=0b1011101和b=0b1001001,这两者的汉明距离为2,因为它们中有两个字符不一致,即在第三和第五个位置上的字符不同。

在计算汉明距离时,我们的目标是计算两个字符串对应位不同的字符个数,因此可以使用异或运算。

异或 运算的规则是相同为0,不同为1。

我们可以计算c = a XOR b,再去统计c中出现1的个数和,这个就是a和b的汉明距离。

c++ 复制代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        int c = x^y;
        int d = 0;
        while(c) {
            if(c & 1) d++;
            c = c>>1;
        }
        return d;
    }
};

上面的代码通过与运算和移位运算实现,但还有种优化方案,拿c = 0b00101000举例,c-1=0b00100111,再进行与运算c&(c-1),这个时候倒数最后一个1被消掉,此时还剩下一个1,再进行一次这样的操作,将1全部消掉。这样计算我们只执行了两次,而上面的操作执行了8次。

c++ 复制代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        int c = x^y;
        int d = 0;
        while(c) {
            d++;
            c &= (c-1);
        }
        return d;
    }
};

明白了汉明距离原理的友友,可以做下这个题:汉明距离

汉明距离的应用场景

汉明距离在很多领域都有着广泛的应用。

在通信领域,汉明距离被用来检测和纠正传输中出现的错误。

在编码理论中,汉明距离被用来评估纠错码的性能。

此外,汉明距离还被用于模式识别、数据挖掘、文本相似度计算等方面。

汉明距离在密码学中的应用

在密码学中,汉明距离被用来衡量两个密文之间的相似度。它可以被用来判断密文是否被篡改或者被破解。此外,汉明距离还被用来衡量密钥的相似度,评估密码系统的安全性。

如在 SRAM PUF 计算时,通过片内汉明距离可以判断SRAM 上电序列之的稳定性,或通过片间汉明距离判断SRAM PUF作为物理指纹的独特性。

总结

汉明距离不仅是一种简单而有效的度量方法,还在信息论和计算机科学领域中有着广泛的应用。它不仅在通信、编码、模式识别等领域发挥着重要作用,还在密码学中有着重要的应用价值。

相关推荐
朝朝辞暮i2 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J3 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent4 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼4 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60164 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent4 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
All for pursuit.5 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青5 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq5 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq5 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询