位的巧妙应用

前言

前几天做了一个笔试题目,当时没多想,今天翻看博客才发现,原来每个笔试题都藏的很深啊。

原文链接:http://blog.csdn.net/u010429424/article/details/77856133。
先说题目
面试题:8个试剂,其中一个有毒,毒性一定时间后发作,最少多少只小白鼠能检测出有毒试剂。

方法一:二分

这个题目,第一反应就是二分,4 4分,两个老鼠各喝四瓶,活下来的接着用。2 2分,再拿一只新老鼠,上一轮活着的接着用。最后直接在毒死老鼠的那两瓶中随意找一瓶,所以3只老鼠就够了。8-15只都一样,3只足够了。以15只为例,7 7分,3 3分,1 1,也就是log2n向下取整个。但这个方法比较耗时,只有等前面的死了之后才能进行下一轮,而且需要的瓶子数量也蛮多,至少保正每种酒需要三瓶(不知道哪瓶有毒)。

额外说些废话。没有时间上面的考虑,一只老鼠足够了,一瓶一瓶去喝,总能试出来,但时间太慢了。考虑下其他几只老鼠的情况,纯属于锻炼思维,跟这个题毫无关系,没兴趣的下面就不用看了。两只老鼠怎么样?从8瓶酒中选出四瓶,每只老鼠喝两瓶,有一只中毒死了,说明一定是在这两瓶中,另一只老鼠再从两瓶酒中随机选取一瓶,就不多说了。如果两只老鼠都没有死,说明在另一堆中,每只老鼠再喝两瓶,判断方法就和上面差不多了。就是说,2只老鼠,把一只老鼠时间减少了4倍左右。三只老鼠呢?一样,选8瓶,每次喝四瓶,把一只老鼠的时间缩短了8倍左右。这里的分析纯属无聊,因为用不上,下面这个解法,才应该是本题想考察的意图。

方法二:位

这个方法楼主思考了好久,发现结果和推到过程对应起来,怎么说都有些牵强,所以,这里的过程,仁者见仁,智者见智,欢迎大家留言,这里只是给出我的看法。
假设我们有n只老鼠,那么可以对应多少种情况?即Cn0+Cn1+…+Cnn是多少?
很显然,这里需要数学功底,答案是Cn0+Cn1+…+Cnn=2n
所以,很明显,2^3=8,所以三只老鼠足够了,即三个老鼠喝出八种状态,分别是死0只老鼠(0种情况),死1只老鼠(3种情况),死2只老数(3种情况),死3只老鼠(1种情况)。为1的死了,为0的活着。具体关系可以用位如下所示:

# [3、2、1]
0 0 1 = 1  # 2、3没死,1死了
0 1 0 = 2  # 1、3没死,2死了
0 1 1 = 3  # 3没死,1、2死了
1 0 0 = 4  # 1、2没死,3死了
1 0 1 = 5  # 2没死,1、3死了
1 1 0 = 6  # 1没死,2、3死了
1 1 1 = 7  # 三只都死了
0 0 0 = 0  # 三只都没死

这里每种情况都是独立且唯一的,能唯一判断出某只试剂有毒,咱们这里就假设从上到下,分别对应具体数值,即001是第一支实际有毒,010第二支有毒…对应如下

# [3、2、1]
0 0 1 = 1  # 2、3没死,1死了,说明第1支试剂有毒
0 1 0 = 2  # 1、3没死,2死了,说明第2支试剂有毒
0 1 1 = 3  # 3没死,1、2死了,说明第3支试剂有毒
1 0 0 = 4  # 1、2没死,3死了,说明第4支试剂有毒
1 0 1 = 5  # 2没死,1、3死了,说明第5值试剂有毒
1 1 0 = 6  # 1没死,2、3死了,说明第6值试剂有毒
1 1 1 = 7  # 三只都死了,说明第7值试剂有毒
0 0 0 = 0  # 三只都没死,说明第8值试剂有毒

这样就方便写出每只小老鼠应该喝哪几瓶了。下面一步一步分析

# 2、3没死,1死了,说明第1支试剂有毒。即第一只老鼠喝了1,二三没喝1
1:[1]
2:[]
3:[]
# 1、3没死,2死了,说明第2支试剂有毒。同上
1:[1]
2:[2]
3:[]
# 3没死,1、2死了,说明第3支试剂有毒。即一二喝了第3支试剂,三没有
1:[1,3]
2:[2,3]
3:[]
# 1、2没死,3死了,说明第4支试剂有毒。同上面情况1,2
1:[1,3]
2:[2,3]
3:[4]
# 2没死,1、3死了,说明第5值试剂有毒。说明1,3和了第5试剂,1没有
1:[1,3,5]
2:[2,3]
3:[4,5]
...依次类推,这样推很烦,看下面的巧记思路。

简而言之,看竖列,数列为1的,就是需要喝的。
比如第一只老鼠的数列为10101010,就是需要1,3,5,7
第二只老鼠的数列为0110 0110 ,就是需要2,3,6,7
第三只老鼠的数列为00011110,就是需要4,5,6,7

八皇后问题

这个问题,给出一个参考链接,以后有时间,看看自己能否总结一遍图解算法:摘取位运算的王冠「八皇后问题」!
位在算法题目中经常使用,巧就巧在01的分布上。不知道发明计算机的人是怎么想的,怎么可以这么用,也不知道出题人怎么想的,竟然可以这么用!位运算在很多地方都有运用。
比如,
1暴力的时候,利用某一位为0或者为1判断这种情况是否成立,涂色的时候,用0或1判断这个位置是否涂色。
2笔试中一般看到如果数据量小于20的时候,就可以考虑用位运算来表示所有情况
再比如,状态压缩,就是基于位的思想。这里就不写了,以后遇到题目再来详细扩展。
看看这个解法和二分法有什么不同,这里的解法有的需要1支,有的需要3支。但是时间上 只需一次药效的时间。如果这个题目要求时间最短的,而且老鼠要比较少,那就是这种方法了。只需一次药效的时间,目前我没有想到比这种方法更少的老鼠。这种方法解决的话,按分析就需要4位。所以,时间比较急迫,酒也没有限制的话,就可以采用这种方法。
这只是我在观看别人博客后自己的一点小总结,如果各位有更好的理解,或者我有不足之处,欢迎大家指出,因为我在学习的路上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值