python猜数字游戏_不诚实的猜数字游戏

d83e028fb75640f749e888de4f959142.png

猜猜 猜猜猜 猜猜猜猜猜

You got me crazy

I want you baby

猜猜 让你猜 答案 猜出来

猜猜猜 - 赵采儿 - 单曲 - 网易云音乐​music.163.com
ce77913adf487c46fc8939aaffdf1484.png

相信读者都和我一样,了解过“1~100的猜数字游戏”——

(为简单起见先改为1~31之间的整数,其实道理上都是一样的)

(1) 甲悄咪咪地选择一个1~31之间的整数

,但是不告诉乙;

(2) 乙猜测这个数是

(3) 甲(诚实地)告诉乙是“

”(猜中了)、“
”(猜大了)、“
”(猜小了)三种情况中的哪一种;如果是“
”(猜中了)则游戏结束,否则返回
(2)乙继续猜。

问题:乙采用什么样的方法至多多少次一定可以猜中

的值?

这个问题很简单,就是采用“二分”的策略,我简单的用下图表示吧:

b86d1ec7555354d9d0d8e8d65321da8f.png

或者

2a6d35bb01d76ac483b50ecb010ad323.png

那么如果是猜

之间的数字。也可以表示成上图的二叉树,树的
高度
加1
就是乙保证必定猜中所需要的猜测的次数,树的结点数目就恰等于
。可以很容易分析得到
,也就是说这时乙
最多猜测
次必定可以猜中

(熟悉“基于比较的排序算法的复杂度下界”的朋友们一定清楚这个套路。)


可以把问题抽象为:

(1) 甲悄咪咪在集合

中选择一个元素
,但是不告诉乙,假定集合
个元素;

(2) 乙猜测这个数在

的某个子集
中;

(3) 甲(诚实地)回答乙的猜测是正确的还是错误的;

(4) 乙可根据自己是否已经可以确定

来决定是否返回
(2)继续猜。

问题:乙采用什么样的方法至多多少次一定可以猜中

的值?

那么乙的策略就是:

(1) 如果目前已确定

所在的集合中仅有一个元素,则“猜测”那唯一的元素即可;

(2) 如果目前已确定

所在的集合中至少有两个元素,则将该集合等分为基数(几乎)相同(包含的元素个数相等)的两个集合
,之后询问“甲你老实告诉我,你选的元素在集合
里面么?”。之后根据甲的回答将
所在的集合“缩小”至一半,并返回步骤
(1)

这时乙最多猜测

次必定可以猜中

现在问题变化为:

假定集合

个元素。甲悄咪咪在集合
中选择一个元素
,但是不告诉乙;

乙可以提出问题:“你选的数

在集合
中么?”;

甲可以回答“是”或者“否”;然而,甲并不诚实!甲可能说相反的结果(可以理解为“撒谎”,但不是“我哪知道你猜的对不对”这种撒谎),但是

约束(1) 甲不会连续两句话都说相反的结果

然而这时候即使明知
所在的集合中仅有2个元素
,乙提问“它是
么?”而甲回答“是”的时候,乙也不能确认真实的情况是什么;乙提问两次“它是
么?”而甲回答“是”、“否”时,乙也不能确认真实的情况是什么;乙提问三次“它是
么?”而甲回答“是”、“否”、“是”时,乙也不能确认真实的情况是什么;乙提问四次“它是
么?”而甲回答“是”、“否”、“是”、“否”时,乙也不能确认真实的情况是什么……

所以有如下的 约束(2):

约束(2) 且假定:如果乙能够指出

所在集合的元素数目不超过3——也就是可以圈定
的范围不超过3个“嫌疑数”,那么甲就
不再说谎

那么这时乙的策略又是什么呢?


有人提出了以下的(至少让我很震惊的)方法(非本人所创,但目前我也查不到来源了):

(猜测策略1) 如果目前已确定

所在的集合中不超过3个元素,则由约束2可知,乙至多猜测2次即可。

(猜测策略2) 如果目前已确定

所在的集合中至少有4个元素,则将该集合等分为基数(几乎)相同(包含的元素个数相等)的4个集合
,之后询问两个问题“1. 甲你选的元素在集合
里面么?”、“2. 甲你选的元素在集合
里面么?”。之后根据下表将
所在的集合排除掉“
”,继而将
所在的集合“大小缩小”至
,并返回步骤
(1)

a989f2bebc3ce2f30bdbf34f56362c8b.png

下面分析一下乙的保证能够猜中的猜测次数吧:

  • 如果满足(猜测策略1),那么至多需要猜测两次;
  • 如果满足(猜测策略2),那么猜测2次后次就可以将“嫌疑数”的规模缩小到3/4。

表示目前已确定
所在的集合有
个元素时,乙保证可以猜出
所需要的猜测次数的上限。则:
,

倒推可以得到(有些许误差,但不影响复杂度):

。也就是说这时乙
最多猜测
次左右必定可以猜中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值