IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 经典问题 小白鼠试毒药 这个算法你绝对不知道 -> 正文阅读

[数据结构与算法]经典问题 小白鼠试毒药 这个算法你绝对不知道

问题

有1000瓶液体,其中1瓶是毒药,其余的都是水,小白鼠喝了之后一个小时才会生效,问怎样用较少的时间和较少的小白鼠找出这瓶毒药呢?

1000个小白鼠,1个小时?或者1只小白鼠,1000个小时?显然都不是

有一个直观的办法,假如有9个小白鼠,我们把1000瓶药分为10份,每只小白鼠吃一份,这样一次过后就可以把范围缩小到100瓶药,继续实验

但以上均不是最优的办法,其实只需要10只小白鼠,1个小时就可以了!

下面看讲解:

我们可以利用二进制很好地解决这个问题!
首先我们给1000瓶药按999,998,997,996…,3,2,1,0编好号,看了下图就差不多明白了
在这里插入图片描述
999对应的二进制位就是10位,为什么需要10只小白鼠正是这么来的,我们让这些小白鼠分别对应一位二进制位,假如对应的二进制位值为1,就让小白鼠喝下该瓶液体
比如:
第一只小白鼠喝下编号为999、998、997、996…的液体
第二只小白鼠喝下编号为999、998、997、996…的液体
第三只小白鼠喝下编号为999、998、997、996…的液体
第四只小白鼠喝下编号为999、998、997、996…的液体
第五只小白鼠喝下编号为999、998、997、996…的液体
第六只小白鼠喝下编号为…的液体
第七只小白鼠喝下编号为…的液体
第八只小白鼠喝下编号为999、998、997、996…3的液体
第九只小白鼠喝下编号为999、998…2的液体
第十只小白鼠喝下编号为999、997…3、1的液体

那么死掉的老鼠代表的二进制位就是1,没死掉的就代表0!
假如有毒的液体编号是3,那么第八只和第十只老鼠死了。
反过来,第八只和第十只老鼠死了,我们也可以推出有毒的液体编号是3。

再用一个结果举个例子,假如第八、九、十只老鼠死了,那么代表的二进制为0000000111,可以推出有毒的液体编号是7

是不是很神奇呢!等等!这个问题还没有解决呢!

进阶知识

请读者先理解好上面的讲解再继续看下去哈,防止懵逼!

那么问题来了,上面解读的是1次实验,10只小白鼠,那么假如进行两次实验,至少需要多少只小白鼠呢?答案是七只

两次实验,问题又来了!二进制不能用,那么用三进制!

同样地,我们给1000瓶药按999,998,997,996…,3,2,1,0编好号
在这里插入图片描述
第一次实验
我们的目的是确定进制位值为2的位,假如对应的二进制位值为2,就让小白鼠喝下该瓶液体

比如:
第一只小白鼠喝下编号为…的液体
第二只小白鼠喝下编号为…的液体
第三只小白鼠喝下编号为…的液体
第四只小白鼠喝下编号为…的液体
第五只小白鼠喝下编号为998、997、996…的液体
第六只小白鼠喝下编号为998、997、996…的液体
第七只小白鼠喝下编号为998、2…的液体

哪只小白鼠死掉了就代表对应位三进制的值为2

第二次实验
我们的目的是确定进制位值为1的位,假如对应的二进制位值为1,就让小白鼠喝下该瓶液体

同样的道理,哪只小白鼠死掉了就代表对应位三进制的值为1

进制位值为2、1的都测出来了,0的就没必要测了;

举个例子,6、7号小白鼠第一天死了,3、4号小白鼠第二天死了,那么毒药三进制表示为0011022,可以推出有毒的液体编号是116

当然了,三次实验的就要用四进制了,每次实验就验证一个四进制值就可以了,小白鼠的数量就是进制的最大位数啦!

知识总结

根据以上解读,知道小白鼠数量和实验次数的关系了吧!
小白鼠数量=液体的瓶数转换为实验次数+1进制的最大位数

计算公式就是:
小白鼠数量=[ l o g 实 验 次 数 + 1 液 体 数 量 log_{实验次数+1}{液体数量} log+1?]
[]是向下取整的意思

小疑惑:
1、实验过程中小白鼠死掉会影响后面的实验吗?
不会的,小白鼠死掉了,那么其代表的进制位的值已经知道了

2、这是最优的解法吗?
以目前的知识证明,是的,感兴趣可以自行去了解香农熵

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:10:58  更:2022-01-30 19:11:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:45:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码