C++求解汉明距离

article/2025/9/20 5:23:53

目录

  • 汉明距离介绍
  • 汉明距离应用
  • 解法1:Brian Kernighan算法
  • 解法2
  • 解法3


汉明距离介绍

leetcode 461 汉明距离,难度:简单

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

示例 1:

输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)

对应二进制位不同的位置个数为2

示例 2:

输入:x = 3, y = 1
输出:1

提示:

0 <= x, y <= 231 - 1

汉明距离应用

汉明距离广泛应用于多个领域。在编码理论中用于错误检测,在信息论中量化字符串之间的差异。

两个整数之间的汉明距离是对应位置上数字不同的位数。

解决此题,可以使用异或运算,当对应的二进制为不同时,输出为1,然后统计异或后1的个数。

统计二进制中1的个数,主要有3种方法:

  • Brian Kernighan算法,
  • 移位运算
  • 直接使用系统API.

下面分别介绍这3种算法

解法1:Brian Kernighan算法

Brian Kernighan算法可以用于清除二进制数中最右侧的1。Brian Kernighan算法的做法是先将当前数减一,然后在与当前数进行按位与运算。

x=x&(x-1)

示意图
在这里插入图片描述
x&(x-1)的结果变成了1110

利用此算法我们可以统计一个数字的二进制中的1的个数,即一比特数:

#include <iostream>using namespace std;int oneCounts(int num) {int ones = 0;while (num > 0) {num &= num - 1;ones++;}return ones;
}int main()
{int num = 23;  // 1 0111cout << oneCounts(num) << endl;return 0;
}

对应的此题的解法

class Solution {
public:int hammingDistance(int x, int y) {int s = x ^ y, ret = 0;while (s) {s &= s - 1;ret++;}return ret;}
};

复杂度分析

时间复杂度:O(logC),其中 C 是元素的数据范围;
空间复杂度:O(1)。

确实简单,简单的前提是得知道Brian Kernighan算法.

解法2

不知道Brian Kernighan算法也可以解决。
使用异或运算,记 s = x⊕y,我们可以不断地检查 s 的最低位,如果最低位为 1,那么令计数器加一,然后我们令 s 整体右移一位,这样 s 的最低位将被舍去,原本的次低位就变成了新的最低位。我们重复这个过程直到 s=0 为止。这样计数器中就累计了 s 的二进制表示中 1 的数量。

代码

class Solution {
public:int hammingDistance(int x, int y) {int s = x ^ y, ret = 0;while (s) {ret += s & 1;s >>= 1;}return ret;}
};

代码说明s&1, 如果最末位是1,那么s&1 = 1, ret += 1,否则ret += 0, 然后s右移一位。

解法3

使用系统内置API: __builtin_popcount, 该函数可以统计二进制数中1的个数,但是仅在gcc/g++下可使用。
代码

#include <iostream>using namespace std;class Solution {
public:int hammingDistance(int x, int y) {return __builtin_popcount(x ^ y);}
};int main(){Solution s;cout << s.hammingDistance(1, 4) << endl;return 0;
}

虽然这是一道简单题,但是并不简单,leetcode没哪道题简单。

本文参考资料
(1)https://leetcode.cn/problems/hamming-distance
(2)https://zhuanlan.zhihu.com/p/498119781


http://chatgpt.dhexx.cn/article/rSOCAIAj.shtml

相关文章

计算快速汉明距离

汉明距离,作为一种衡量特征距离的计算方法,在很多场合都有应用,其主要思想是找到两个特征之间的差异大小,也可以说是相似性。 我是在图像处理中用到的,项目中需要计算图像梯度方向,我选择了四个方向,这样就可以用二位二进制表示,分别为 0,1,2,3,也就是 00,01,10,11,…

汉明距离、汉明损失详解及代码(python)

文章目录 引言汉明距离(Hamming distance)代码示例 汉明损失(Hamming loss)代码示例 参考链接 引言 汉明距离是机器学习中的常用度量。本文整理了具体的图示代码&#xff0c;帮你形象化理解汉明距离(Hamming distance)、汉明损失(Hamming loss)。 汉明距离(Hamming distance)…

汉明距离的计算

汉明距离&#xff0c;作为一种衡量特征距离的计算方法&#xff0c;在很多场合都有应用&#xff0c;其主要思想是找到两个特征之间的差异大小&#xff0c;也可以说是相似性。 我是在图像处理中用到的&#xff0c;项目中需要计算图像梯度方向&#xff0c;我选择了四个方向&#…

汉明距离问题详解

https://leetcode.cn/problems/hamming-distance/solution/yi-ming-ju-chi-by-leetcode-solution-u1w7/ 前言 汉明距离广泛应用于多个领域。在编码理论中用于错误检测&#xff0c;在信息论中量化字符串之间的差异。 两个整数之间的汉明距离是对应位置上数字不同的位数。 根据…

介绍汉明距离及计算示例

汉明距离(Hamming distance)是计算两个向量之间不同对应元素数量之和。本文介绍R、Python语言的计算过程。 汉明距离概述 汉明距离是以美国数学家理查德汉明的名字命名的&#xff0c;他在1950年关于汉明码的论文中提出了该举例度量指标。它被广泛用于多个学科&#xff0c;如信…

汉明距离讲解

文章目录 汉明距离的计算最小汉明距离汉明距离纠错例题 汉明距离的计算 码字A为 10001001 码字B为 10110001 那么不同的字符数为3&#xff0c;汉明距离就是3 不难看出&#xff0c;汉明距离就是两个码不同的数的个数。 最小汉明距离 在一个码组集合中&#xff0c;任意两个码…

距离度量 —— 汉明距离(Hamming Distance)

Python学习系列文章&#xff1a;&#x1f449; 目录 &#x1f448; 文章目录 一、概述二、计算方式三、汉明重量 一、概述 汉明距离&#xff08;Hamming Distance&#xff09;&#xff0c;就是将一个字符串变成另一个字符串所需要的替换次数。 二、计算方式 举个例子&#…

【猿知识】汉明距离(Hamming Distance)

文章目录 汉明距离汉明重量汉明距离计算汉明距离应用例子参考 汉明距离是以理查德卫斯里汉明的名字命名的&#xff0c;汉明在误差检测与校正码的基础性论文中首次引入这个概念。在通信中累计定长二进制字中发生翻转的错误数据位&#xff0c;所以它也被称为信号距离。 汉明距离…

js设置居中

我们在编写html页面的时候&#xff0c;不可避免的会遇到元素居中的问题&#xff0c;水平居中还好说 我们可以通过设置margin: auto;text-align: center;来实现水平居中。垂直居中的话&#xff0c;单个标签我们可以通过设置line-height来实现垂直居中&#xff0c;但是多个标签的…

CSS常见图片居中,文字居中,版心居中集合

1.margin:0 auto&#xff1b;&#xff08;水平居中&#xff09; 适用于&#xff08;块级元素&#xff09; wrapper&#xff08;wrapper只负责版心的效果&#xff09;定义一个固定的宽度&#xff1b;margin&#xff08;外边距&#xff09;左右的值设置为auto。 让带有wrapper…

垂直居中的方法

总结垂直居中的方法 <div class"layout-wrapper"><div class"box1"><h4>垂直居中方法</h4></div></div>.layout-wrapper{width:300px;height:300px;border: 1px solid red; } .box1{height:150px;width:150px;border…

win10任务栏怎样居中win10任务栏居中设定教程

win11系统内置任务栏居中的设置项&#xff0c;但是win10系统没有&#xff0c;倘若win10顾客也想让自己的任务栏居中的话&#xff0c;应当怎样设置呢&#xff1f;你先撤销任务栏锁住&#xff0c;随后新建菜单栏。之后选定一个空白文件夹&#xff0c;之后任务栏就会发生两条竖杠&…

HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结

最近写网页经常需要将div在屏幕中居中显示&#xff0c;遂记录下几个常用的方法&#xff0c;都比较简单。 水平居中直接加上<center>标签即可&#xff0c;或者设置margin:auto;当然也可以用下面的方法 下面说两种在屏幕正中&#xff08;水平居中垂直居中&#xff09;的方…

css字体居中(css字体居中对齐)

css如何让表格居中 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 关于网页设计CSS文本垂直居中的问题 text-align:center;文本居中显示 vertical-align…

css图片居中

相信很多工程师都搜索过css图片居中的方法吧&#xff0c;但总是出现各种各样的问题。其实css图片居中分为很多种情况 第一种&#xff1a;已知父元素的高度&#xff0c;单独设置文字水平垂直居中&#xff0c;我们只需要设置css样式line-hight:同父元素高度&#xff0c;text-alig…

html中如何居中

第一步&#xff1a;打开网页编辑器&#xff0c;新建一个网页文件。 第二步&#xff1a;我们编写两个div标签用来做一个对比演示&#xff0c;既嵌套式div。 第三步&#xff1a;首先我想让最外层的div进行真正意义上的居中——既在浏览器页面水平方向和垂直方向都居中显示。 …

HTML中进行居中设置

html居中的方法如下&#xff1a; 1、打开HTML的编辑器。 2、找到需要居中的图片或者文字。 3、在body里面&#xff0c;设置CSS样式。 4、添加样式为&#xff1a;text-align&#xff1a;center &#xff1b;即可。 超文本标记语言&#xff08;Hyper Text Markup Language&a…

div居中

HTML的div居中 一、margin:0px auto; 给需要居中的div设置一个宽度&#xff0c;然后设置元素的上下外边距为 相等 左右外边距为 auto&#xff0c;比如&#xff0c;margin:0px auto。 则可以实现 div 居中显示。 对于浮动元素&#xff0c;设置其左右外边距为关键字 auto 是无效…

HTML元素居中(文字居中,块居中【垂直/水平居中】)

一、文字、行内元素水平居中 给父级属性设置text-align: center即可 HTML代码: <div><p>p</p></div> <div><span>span</span></div> <div><a href"#">a</a></div>CSS代码&#xff1a; …

html让文字居中

html让文字居中的方法&#xff1a;1、给文本所在标签加CSS属性值“text-align:center”&#xff1b;2、在行内标签或行内块级标签中加CSS属性值“text-align:left”。 本文操作环境&#xff1a;windows7系统、HTML5&&CSS3版、Dell G3电脑。 两种情况&#xff1a;1、文…