猜数字里的算法思想

我们先来玩一个猜数字游戏:

我心里默念一个1~64之间的数,你来猜(你只能问答案是“是”或“否”的问题)。为了保证不论在什么情况下都能以尽量少的次数猜中,你应该采取什么策略呢?

很显然,二分。先是猜是不是位于1~32之间,排除掉一半可能性,然后对区间继续二分。这种策略能够保证无论数字怎么跟你捉迷藏,都能在log2n次以内猜中。用算法的术语来说就是它的下界是最好的。(算法的下界 :一个问题的下界是用来解决该问题的任意算法所需要的最小时间复杂度。 )

我们再来回顾一下这个游戏所蕴含的本质:为什么这种策略具有最优下界?

答案也很简单,这个策略是平衡的。反之如果策略不是平衡的,比如问是不是在1~10之间,那么一旦发现不是在1~10之间的话就会剩下比N/2更多的可能性需要去考察了。

这种策略的本质可以概括成“让未知世界无机可乘”。它是没有“弱点的”,答案的任何一个分支都是等概率的。反之,一旦某个分支蕴含的可能性更多,当情况落到那个分支上的时候你就郁闷了。比如猜数字游戏最糟糕的策略就是一个一个的猜:是1吗?是2吗?… 因为这种猜法最差的情况下需要64次才能猜对,下界非常糟糕。二分搜索为什么好,就是因为它每次都将可能性排除一半并且无论如何都能排除一半(它是最糟情况下表现最好的)。永盈会娱乐城

猜数字的时间复杂度

猜数字的时间复杂度其实就是二分查找的复杂度。

二分查找的基本思想是将n个元素分成大致相等的两部分,然后用a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x < a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。

所以二分查找的时间复杂度无非就是while循环的次数。

我们可以跟着循环去想。总共有n个元素,跟下去就是n, n/2, n/4, ...., n/2k,其中k就是循环的次数。

每比较一次,查找范围被缩短为原来1/2,当范围长度被缩短为1的时候,就完成查找了,然后要比较多少次,高中时的数学问题了。

另 n/2k = 1,即 2k = n,所以 k = log2n。

k 为次数,时间复杂度可以表示O()=O(logn)。

时间: 2024-10-13 15:19:19

猜数字里的算法思想的相关文章

快速排序里的学问:从猜数字开始 猜数字里的算法思想

我们先来玩一个猜数字游戏: 我心里默念一个1~64之间的数,你来猜(你只能问答案是“是”或“否”的问题).为了保证不论在什么情况下都能以尽量少的次数猜中,你应该采取什么策略呢? 很显然,二分.先是猜是不是位于1~32之间,排除掉一半可能性,然后对区间继续二分.这种策略能够保证无论数字怎么跟你捉迷藏,都能在log2n次以内猜中.用算法的术语来说就是它的下界是最好的.(算法的下界 :一个问题的下界是用来解决该问题的任意算法所需要的最小时间复杂度. ) 我们再来回顾一下这个游戏所蕴含的本质:为什么这种

算法习题---3.01猜数字游戏提示

一.题目 实现一个经典“猜数字”游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列,猜测序列全0时该组数据结束.n=0时输入结束. 二:样例输入: 4 //列数 1 3 5 5 //答案序列 1 1 2 3 //猜测序列--下面都是--直到结束序列 4 3 3 5 6 5 5 1 6 1 3 5 1 3 5 5 0 0 0 0 //结束序列 10 //

普里姆算法-prim

算法代码: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 /* Prim算法生成最小生成树  */ void MiniSpanTree_Prim(MGraph MG) { int min, i, j, k; int adjvex[MAXVEX];/* 

八大算法思想

八大算法思想分别是:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 1.比较“笨”的枚举算法思想 枚举最大的缺点是运算量比较大,解题效率不高. 如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法,而无须太在意是够还有更快的算法,这样可以使你有更多的时间去解答其他难题. //枚举法解决“填写运算符”的问题 import java.util.Scanner; public class meijujisuan5ge5 { public static voi

(一)八大算法思想

八大算法 八大算法:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 一.枚举算法思想(暴力算法) 将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现. 经典运用:百钱买百鸡.填写运算符 二.递推算法思想 1.顺推法:从已知条件出发,逐步推算出要解决问题的方法. 2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程. 经典运用:斐波那契数列(顺推法).银行存款(逆推法) 三.递归算法思想 1.递归过程一般通过函数或子过程实现:

ACM第四站————最小生成树(普里姆算法)

对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成树. 其中运用到了回溯,贪心的思想. 废话少说吧,这个其实是一个模板,直接套用就好!直接上题吧!这些东西多练就好! 一.最小生成树: 题目描述 求一个连通无向图的最小生成树的代价(图边权值为正整数). 输入 第 一行是一个整数N(1<=N<=20),表示有多少个图需要计算.以下有N个图,第i图的第

基本算法思想Java实现的详细代码

基本算法思想Java实现的详细代码 算法是一个程序的灵魂,一个好的算法往往可以化繁为简,高效的求解问题.在程序设计中算法是独立于语言的,无论使用哪一种语言都可以使用这些算法,本文笔者将以Java语言为例介绍一些常用的算法思想. 分类 穷举算法思想 递推算法思想 递归算法思想 分治算法思想 概率算法思想  穷举算法思想 穷举算法的基本思想 从所有可能情况中搜索正确答案 1. 对于一种可能情况,计算其结果. 2. 判断结果是否满足,如不能满足者执行第一步来搜索下一个可能的情况:如满足则表示选找到一个

46. 蛤蟆的数据结构笔记之四十六普里姆算法

46. 蛤蟆的数据结构笔记之四十六普里姆算法 本篇名言:"手莫伸 ,伸手必被捉.党与人民在监督 ,万目睽睽难逃脱.汝言惧捉手不伸 ,他道不伸能自觉 , 其实想伸不敢伸 ,人民咫尺手自缩.-- 陈毅" 连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最

原创Android游戏--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了. 本次更新信息如下: 1.改正了随机数生成算法,更正了不能产生数字'9'的bug 2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据 3.保存数据为: 总盘数,猜中的盘数 4.使用了Simp