《programming for the puzzled》第20章
涉及到的知识和算法:面向对象变成,二叉搜索树
问题描述:你的朋友想一个从1到7的数字,你要用最少的猜测次数猜到这个数。接着你朋友猜你想的数字。猜的次数少的人赢。猜的时候,对方会提示高了,低了,还是正确。
可以用二叉搜索来解决。对于小于7的数字,最多猜3次。
可以用二叉搜索树来表示猜测过程,从中间的数字(4)开始,4为根节点,小于4的数字在左子树,大于4的数字在右子树。你朋友也知道这些内容,因此你们获胜的概率一样。但是后来你发现你的朋友想的数字都是奇数的,因为奇数都在最下一层。于是你给不同的数字不同的概率,根节点4的概率为0,第一层子树(2,6)的概率是0.1,第二层(即底层,1,3,5,7)的概率为0.2。
能否创建一个新的二叉搜索树使得可以猜测更少的次数。即构造一个二叉搜索树使得weight = ΣPr(i)(D(i) + 1), D(i)是数字i在树中的深度。
这是结果:
树的深度是比上面第一颗树大1.
可以使用字典来表示树,key是每个节点,值是这个节点的子节点。
用面向对象的方法封装树的操作。
1 | # 《programming for the puzzled》实操 |
现在来解决我们的问题。用贪心算法,把概率最大的节点放到根节点。
1 | # 解决猜数字问题 |
这样整本书就完了,基本的数据结构都讲了,跟着书把代码敲了一遍当练习“语感”吧。
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地