ARTS for week2(20181026)_汉明距离

新的一天,大家早上好~

ARTS for week2(20181026)_汉明距离

提醒

本文预计阅读时间7分钟

每周完成一个ARTS
每周至少做一个 LeetCode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称ARTS)

由于微信公众号后台不支持在原文中添加链接,所以大家在文章最后面点击阅读原文就可以点击原文中插入的链接了,有问题随时留言交流~

一 

Algorithm

LeetCode 461.Hamming Distance 

【题意】

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers ​​x​​​ and ​​y​​, calculate the Hamming distance.

给定两个整数x,y,计算x和y的汉明距离。汉明距离是指x、y的二进制表示中,相同位置上数字不相同的所有情况数。

Note:
0 ≤ ​​​x​​​, ​​y​​ < 2^31.

Example:

1
2
3
4
5
6
7
8
9
10
Input: x = 1, y = 4

Output: 2

Explanation:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑

The above arrows point to positions where the corresponding bits are different.

【思路】

计算汉明距离,按位异或运算

在信息理论中,两个等长字符串之间的汉明距离是两个字符串对应位置上不同字符的个数:

容易想到的一种解法:分别列出两个数字的二进制形式,放在两个数组中,数组的索引级二进制形式中的位数,元素值即位数上对应的值。逐个的比较元素值,从而得出结果。 但是这种解法效率比较低。

第二种解法:我们稍微再想一想,其实可以直接将两个数字取异或(异或的运算方法是一个二进制运算: 1^1=0 0^0=0 1^0=1 0^1=1 两者相等为0,不等为1),然后再求出异或结果的二进制形式中有多少个1即可。

【参考代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int hammingDistance(int x, int y) {
int hw = 0;
int n = x^y;
while (n != 0)
{
if (n % 2) ++hw;
n >>= 1;
}
return hw;
}
};

二 

Review

Low Level Bit Hacks You Absolutely Must Know

这篇文章介绍了一些大家平时想不到的,但是用起来的时候你会感觉非常巧妙的位运算的一些小技巧。

在开始阅读这篇文章之前,最好先复习一遍常见的位运算符号,下面的a和b都是整数类型,则有:

ARTS for week2(20181026)_汉明距离_03

文章一共介绍了以下位运算的十种技巧

Bit Hack #1. Check if the integer is even or odd(判断一个数是奇数还是偶数)

Bit Hack #2. Test if the n-th bit is set(判断二进制第n位是否是1).

Bit Hack #3. Set the n-th bit(设置二进制第n位为1).

Bit Hack #4. Unset the n-th bit(设置二进制第n位为0).

Bit Hack #5. Toggle the n-th bit(二进制第n位取反).

Bit Hack #6. Turn off the rightmost 1-bit(二进制最右边第一个1取反).

Bit Hack #7. Isolate the rightmost 1-bit(保留二进制最右边第一个1将其余所有位设置0).

Bit Hack #8. Right propagate the rightmost 1-bit(将二进制最右边第一个1到低位的所有位设置1).

Bit Hack #9. Isolate the rightmost 0-bit(保留二进制最右边第一个0将其余所有位设置0).

Bit Hack #10. Turn on the rightmost 0-bit(二进制最右边第一个0取反).

另:Bit Hack #7 里介绍到的技巧也普遍运用在算法竞赛里常用的一种数据结构:树状数组。

在树状数组里,对应的有一个函数 ​​lowbit(x)​​ 它的作用是x的二进制表达式中最低位的1所对应的值。

如果想进一步了解更多,可以参考我的下一篇文章 ​​你必须所知道的位运算的hack技巧!​

三 

Tip

最近一段时间重新回顾了一遍 ​​C++​​​ 中 ​​const​​​ 关键字以及 ​​const​​ 成员函数的理解和应用

①const Car & Car::topval (②const Car & s) ③const

①处 ​​const​​​:确保返回的 ​​Car​​ 对象在以后的使用中不能被修改

②处 ​​const​​​:确保此方法不修改传递的参数 ​​s​

③处 ​​const​​​:保证此方法不修改调用它的对象,​​const​​​ 对象只能调用 ​​const​​​ 成员函数,不能调用非 ​​const​​ 函数

mutable

如果需要在 ​​const​​​ 成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为 ​​mutable​​​ 。即用 ​​mutable​​​ 修饰的成员变量不受 ​​const​​成员方法的限制;

可以认为 ​​mutable​​​ 的变量是类的辅助状态,但是只是起到类的一些方面表述的功能,修改他的内容我们可以认为对象的状态本身并没有改变的。实际上由于 ​​const_cast​​ 的存在,这个概念很多时候用处不是很到位 。

四 

Share

感知概率

平时在交谈中,我们会使用”可能”、”很可能”、”极有可能”、”大概”、”不肯定”、”不太可能”等等词语来描述一个事件的可能性。但是,这些词语到底表示多大的概率?每个人都有不一样的理解。

比如,有的人心目中,”可能”就意味着50%的概率,”很可能”就意味着70%的概率,而”不太可能”就是30%的概率。另一些人可能会认为,”很可能”应该是75%的概率。

耶鲁大学教授谢尔曼·肯特(Sherman Kent)做过一个统计调查。他询问许多人,将得到的数据做成了下图,给出了每一个用词所代表的概率区间。

ARTS for week2(20181026)_成员变量_04

可以看到,在他的调查中,”probable”、”likely”、”probably”和”we believe” 的区间都大约是 62-85% 。

有人在 reddit 上重新做了一次统计,然后用 R 语言程序计算出每个短语的箱形图(box plot),再用 ggplot2 绘图包制作出漂亮的图表。

ARTS for week2(20181026)_成员变量_05

ARTS for week2(20181026)_位运算_06

ARTS for week2(20181026)_成员变量_07

ARTS for week2(20181026)_位运算_08