背景
在计算机科学、信息论与数据通信领域,**汉明距离(Hamming Distance)**是一个极其重要的概念。它用于衡量两个等长字符串之间的差异程度,定义为:
在对应位置上不同字符的个数。
例如:
- "1011101"
- "1001001"
不同位置有 2 处,因此汉明距离为 2。
汉明距离最早由美国数学家理查德·汉明(Richard Hamming)提出,并应用于著名的汉明码(Hamming Code)中,用于错误检测与纠正。
在实际工程中,汉明距离广泛应用于:
- 数据通信中的错误检测
介绍汉明距离(Hamming Distance)的概念及其在 Go 语言中的实现。涵盖字符串版本(支持 Unicode)和整数版本(位运算)。重点讲解了普通位统计法与 Brian Kernighan 优化算法的区别,并提供了完整的可运行代码示例及复杂度分析,适用于算法学习与工程实践参考。
在计算机科学、信息论与数据通信领域,**汉明距离(Hamming Distance)**是一个极其重要的概念。它用于衡量两个等长字符串之间的差异程度,定义为:
在对应位置上不同字符的个数。
例如:
不同位置有 2 处,因此汉明距离为 2。
汉明距离最早由美国数学家理查德·汉明(Richard Hamming)提出,并应用于著名的汉明码(Hamming Code)中,用于错误检测与纠正。
在实际工程中,汉明距离广泛应用于:
在算法面试中,汉明距离也是经典高频题目之一,尤其是'两个整数之间的汉明距离'问题。
本项目将使用 Go 语言系统实现汉明距离算法,并从多个角度进行教学级讲解。
本项目实现一个完整的汉明距离算法系统,具体需求如下:
在正式编码前,我们需要理解几个核心知识点。
定义: 对于两个等长字符串 s1 和 s2: HammingDistance = Σ (s1[i] != s2[i]) 即逐字符比较,不同则计数。
适用于:
时间复杂度:O(n)
对于两个整数 x 和 y: 步骤:
因为:
这就是汉明距离。
统计二进制中 1 的个数优化方法:
while n != 0:
n = n & (n - 1)
每次操作都会消除最右侧的 1。
时间复杂度:O(k),其中 k 为 1 的个数。
本项目实现三种版本:
步骤:
步骤:
步骤:
// =============================================
// 文件:main.go
// =============================================
package main
import (
"errors"
"fmt"
)
// =============================================
// 方法一:字符串版本(支持 Unicode)
// =============================================
// HammingDistanceString 计算两个字符串的汉明距离
// 参数:两个字符串
// 返回:距离值,错误信息
func HammingDistanceString(s1, s2 string) (int, error) {
// 转换为 rune 切片,支持 Unicode
r1 := []rune(s1)
r2 := []rune(s2)
// 长度必须相等
if len(r1) != len(r2) {
return 0, errors.New("两个字符串长度必须相等")
}
distance := 0
// 逐字符比较
for i := 0; i < len(r1); i++ {
if r1[i] != r2[i] {
distance++
}
}
return distance, nil
}
// =============================================
// 方法二:整数版本(普通统计法)
// =============================================
// HammingDistanceInt 普通位统计版本
func HammingDistanceInt(x, y int) int {
// 异或运算
n := x ^ y
count := 0
// 统计二进制中 1 的个数
for n > 0 {
if n&1 == 1 {
count++
}
n >>= 1
}
return count
}
// =============================================
// 方法三:整数版本(优化 Brian Kernighan)
// =============================================
// HammingDistanceOptimized 优化版本
func HammingDistanceOptimized(x, y int) int {
n := x ^ y
count := 0
// 每次消除一个 1
for n != 0 {
n = n & (n - 1)
count++
}
return count
}
// =============================================
// 主函数测试
// =============================================
func main() {
fmt.Println("====== 字符串版本测试 ======")
d1, err := HammingDistanceString("karolin", "kathrin")
if err != nil {
fmt.Println("错误:", err)
} else {
fmt.Println("汉明距离:", d1)
}
d2, err := HammingDistanceString("1011101", "1001001")
if err != nil {
fmt.Println("错误:", err)
} else {
fmt.Println("汉明距离:", d2)
}
fmt.Println("\n====== 整数版本测试 ======")
x := 1
y := 4
fmt.Println("普通版本汉明距离:", HammingDistanceInt(x, y))
fmt.Println("优化版本汉明距离:", HammingDistanceOptimized(x, y))
}
作用:
作用:
作用:
本项目系统实现了三种汉明距离算法版本,并详细讲解其原理。
我们掌握了:
算法复杂度:
在工程实践中,推荐使用优化版本。
汉明距离定义前提是等长字符串。
因为: 相同位 → 0 不同位 → 1
因为循环次数等于 1 的个数,而不是位数。
可以使用 math/big 实现。
用于图像相似度批量计算。
比较图片相似度。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online