相似度计算方法-汉明距离 (Hamming Distance)

定义

        汉明距离(Hamming distance)是一种衡量两个等长字符串或整数位表示之间的差异的方法。它定义为对应位置的不同符号的个数。汉明距离通常用于编码理论、密码学、信息论和计算机科学中的多个领域。

公式

        对于两个等长的字符串或两个整数的二进制表示,汉明距离是对应位置上不同字符或位的数目。

        对于两个等长的字符串 \mathbf{S_1}=(s_{11},s_{12},\dots,s_{1n})\mathbf{S_2}=(s_{21},s_{22},\ldots,s_{2n})

        d_{\mathbf{H}}(\mathbf S_1,\mathbf S_2)= \sum_{i=1}^{n}1_{s_{1i}\neq s_{2i}}

        对于两个整数 \mathbf A\mathbf B 的二进制表示:

        d_H(\mathbf A,\mathbf B)=\text{popcount}(\mathbf A\oplus \mathbf B)

其中 1_{s_{1i}\neq s_{2i}} 是指示函数,当 s_{1i}\neq s_{2i} 时返回 1,否则返回 0;\text{popcount}(\mathbf X) 表示 \mathbf X的二进制表示中 1 的个数;\bigoplus表示按位异或操作。

代码实现

string:

public class HammingDistanceString {

    public static void main(String[] args) {
        String str1 = "karolin";
        String str2 = "kathrin";

        int distance = calculateHammingDistance(str1, str2);
        System.out.printf("The Hamming distance between '%s' and '%s' is: %d\n", str1, str2, distance);
    }

    /**
     * 计算两个字符串之间的汉明距离。
     *
     * @param s1 第一个字符串
     * @param s2 第二个字符串
     * @return 两个字符串之间的汉明距离
     */
    public static int calculateHammingDistance(String s1, String s2) {
        if (s1.length() != s2.length()) {
            throw new IllegalArgumentException("Strings must have the same length.");
        }

        int distance = 0;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                distance++;
            }
        }
        return distance;
    }
}

int:

public class HammingDistanceInt {

    public static void main(String[] args) {
        int num1 = 0b101010;
        int num2 = 0b111000;

        int distance = calculateHammingDistance(num1, num2);
        System.out.printf("The Hamming distance between %d and %d is: %d\n", num1, num2, distance);
    }

    /**
     * 计算两个整数之间的汉明距离。
     *
     * @param n1 第一个整数
     * @param n2 第二个整数
     * @return 两个整数之间的汉明距离
     */
    public static int calculateHammingDistance(int n1, int n2) {
        int xorResult = n1 ^ n2;
        int distance = 0;
        while (xorResult != 0) {
            distance += xorResult & 1;
            xorResult >>>= 1;
        }
        return distance;
    }
}

优劣势

优势

  1. 概念简单直观

    • 汉明距离的定义简单明了,易于理解和实现。
    • 对于字符串,汉明距离是指两个字符串中不同字符的数量。
    • 对于整数,汉明距离是指两个整数的二进制表示中不同位的数量。
  2. 计算简便

    • 汉明距离的计算基于简单的数学公式,易于编程实现。
    • 对于低维空间,计算速度较快。
  3. 适用于固定长度的数据

    • 汉明距离要求两个比较的对象必须具有相同的长度,这在很多应用场景中是合理的假设。
  4. 适用于纠错码

    • 在编码理论中,汉明距离是衡量纠错码能力的重要指标。
    • 一个纠错码的最小汉明距离越大,其能够纠正的错误越多。
  5. 适用于信息安全

    • 在密码学中,汉明距离可以用于评估密钥的随机性和安全性。
    • 例如,通过计算两个密钥之间的汉明距离来评估密钥的强度。

劣势

  1. 不适用于长度不同的数据

    • 汉明距离要求两个比较的对象必须具有相同的长度,这限制了它的适用范围。
    • 当两个字符串或整数的长度不同,则无法直接计算汉明距离。
    • 在这些情况下,可能需要使用其他度量方法,如编辑距离(Levenshtein distance)等。
  2. 不考虑数据的顺序

    • 汉明距离只关注对应位置的不同,而不考虑数据的整体顺序或相邻位置之间的变化。
    • 这在某些情况下可能不足以反映数据之间的实际差异。
  3. 不适用于非二进制数据

    • 对于非二进制数据,汉明距离可能不是最佳选择。
    • 例如,在处理多值或连续值数据时,可能需要考虑其他度量方法,如欧几里得距离或曼哈顿距离等。

应用场景

  1. 纠错码

    • 在通信和存储系统中,汉明距离用于设计能够纠正错误的编码方案。
    • 例如,汉明码(Hamming code)是一种能够纠正单比特错误的纠错码。
  2. 生物信息学

    • 在DNA或蛋白质序列比对中,汉明距离用于比较序列之间的相似性。
    • 例如,通过计算两条DNA序列之间的汉明距离来评估它们的相似度。
  3. 数据校验

    • 在数据传输过程中,汉明距离可以用于检测数据传输中的错误。
    • 例如,通过比较发送数据和接收数据之间的汉明距离来检测传输错误。
  4. 信息安全

    • 在密码学中,汉明距离可以用于评估密钥的随机性和安全性。
    • 例如,通过计算两个密钥之间的汉明距离来评估密钥的强度。
  5. 计算机科学

    • 在计算机科学中,汉明距离用于比较整数或字符串之间的差异。
    • 例如,在位操作中,汉明距离可以用于比较两个整数的二进制表示中的不同位数。
    • 文本相似性比较中一个典型的case是先算文本的SimHash,然后比较两个Hash值的汉明距离。
  6. 信号处理

    • 在信号处理中,汉明距离可以用于比较信号之间的差异。
    • 例如,在数字信号处理中,汉明距离可以用于评估信号的质量。
  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值