汉明距离,又称编辑距离,是一种衡量两个等长字符串之间的不同之处的度量方法,它在信息论和计算机科学领域中有着广泛的应用。
汉明距离是由理查德·汉明(Richard Hamming)在1950年提出的,用于衡量两个等长字符串之间的不同之处。它在错误检测和纠正编码、网络编码、密码学等领域有着广泛的应用。汉明距离的概念也被应用于DNA序列分析、图像处理、语音识别等领域。
汉明距离的计算方式很简单,它是通过对比两个等长字符串对应位置上的字符来计算的。如果两个字符串在相同位置上的字符不同,那么它们之间的汉明距离就会加一。字符串之间的相似度越高,对应的汉明距离越小。
换句话说,两个字符串的汉明距离就是将字符串其对应位置上的不同字符的个数加起来。
例如,现在有两个十进制数a=93
和b=73
,如果将这两个数用二进制表示的话,即a=0b1011101
和b=0b1001001
,这两者的汉明距离为2,因为它们中有两个字符不一致,即在第三和第五个位置上的字符不同。
在计算汉明距离时,我们的目标是计算两个字符串对应位不同的字符个数,因此可以使用异或运算。
异或运算的规则是相同为0,不同为1。
我们可以计算c = a XOR b
,再去统计c
中出现1
的个数和,这个就是a和b的汉明距离。
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次。
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作为物理指纹的独特性。
汉明距离不仅是一种简单而有效的度量方法,还在信息论和计算机科学领域中有着广泛的应用。它不仅在通信、编码、模式识别等领域发挥着重要作用,还在密码学中有着重要的应用价值。