hamming distance(汉明距离)

  看knn算法时无意间发现这个算法,但是维基上有错误的示例和python代码。。。因为汉明距离并不是求相同长度字符串(或相同长度的整数)之间的字符(或数位)差异个数。

  正确的详见:https://en.wikipedia.org/wiki/Talk:Hamming_distance

  然而,我发现百度百科和一些博客都是参考的汉明距离-维基百科,所以都有错 = =。。。

  认真分析正确代码后,我认为汉明距离指的是将两个字符串或两个整数编码为一组二进制数,然后计算两二进制bit之间的差异个数。

  给一个维基上的正确的代码吧,省的大家麻烦:

s1 = 'karolin'
s2 = 'kerstin'


def hamming_distance(s1, s2):
    b1, b2 = bytearray(s1, encoding='utf8'), bytearray(s2, encoding='utf8')
    diff = 0
    for i in range(len(b1)):
        if b1[i] != b2[i]:
            diff += bin(b1[i] ^ b2[i]).count("1")
    return diff


print(hamming_distance(s1, s2))

  C/C++:

#include <iostream>
#define ull unsigned long long
int hamming_distance(ull x, ull y)
{
	int dist = 0;
	ull or = x ^ y;
	while (or)
	{
		dist++; or &= or - 1;
	}
	return dist;
}
int main()
{
	ull x, y;
	while (std::cin >> x >> y)
		std::cout << "最小汉明距离为:" << hamming_distance(x, y) << std::endl;
	return 0;
}

  以C代码为例,比如两个整数:1, 2,他们的二进制分别为 001, 010 ,从 001 → 010 最少需要2步替换,也就是最小汉明距离为2;又比如两整数:12, 34,他们的二进制分别为 001100, 100010,001100 → 100010 的最小汉明距离为4。

  运行示例:

  注:第三个可以自己动手验证一下~

  然后维基上还有一段代码:

int hamming_distance(unsigned x, unsigned y)
{
    return __builtin_popcount(x ^ y);
}
//if your compiler supports 64-bit integers
int hamming_distance(unsigned long long x, unsigned long long y)
{
    return __builtin_popcountll(x ^ y);
}

  好像我的电脑上不行,没有__builtin_popcountll()函数。

转载于:https://www.cnblogs.com/darkchii/p/9414054.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值