• 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()函数。

  • 相关阅读:
    spring配合junit测试 initializationError 错误
    hashmap为什么不安全
    关于使用iframe标签自适应高度的使用
    关于highcharts(功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库)
    富文本web编辑器(UEditor)
    css行级块级区别总结摘录
    jquery mobile 主题
    jquery mobile selectmenu下拉菜单
    jquery mobile popup 弹出窗口
    jquery mobile navbar
  • 原文地址:https://www.cnblogs.com/darkchii/p/9414054.html
走看看 - 开发者的网上家园