首页 > 编程语言 >我们常用于猜数字游戏的二分查找算法怎么用python实现呢?

我们常用于猜数字游戏的二分查找算法怎么用python实现呢?

时间:2022-12-10 23:31:26浏览次数:45  
标签:二分 python mid high 查找 low print

原理简单介绍

类比猜数游戏

我们上篇文章唠了唠经典的冒泡排序算法,如果说经典算法,那怎么少得了二分查找呢.可以说它是经典中的经典,就我们常用于猜数字方法.就是他.比如猜1到100的数字,目标数字的34.这时候你就猜一个数50,出题人会跟你说是大了还是小了.明显你猜的50比34大,那出题人就会跟你说你猜的数大了,那你可猜的数的范围变小了.变成了1-49,你继续猜25,这时候猜的数小了,猜数范围变成26-50,你继续猜38,范围缩小到26-38.你继续猜32,范围缩小到33-38,你继续对半猜35,范围变成33-34,这时候最多两轮你就猜到目标数了,6轮就可得出目标数,不过在游戏中还是有次数限制的,这就是经典的猜数字游戏

游戏代码如下:

限制只能猜五次

digital=int(input('请设定猜数的数值:'))
if 1<=digital<=100:
print(digital)
else:
print('无效数值,请重新输入1-100以内的数值') #输入数值

for g in range(1,6):
guess=int(input('请输入第%d次猜的数值为:'%g))
if guess==digital:
print('恭喜你,猜对了')
break
elif g==5:
print('很遗憾,你的次数已用完')
elif guess<digital:
print('猜小了')
elif guess>digital:
print('猜大了')

言归正传,那具体二分法是怎么实现的呢?

二分查找的原理

简单说二分查找就是把一堆东西,折半分,缩小查找范围,直到找到目标为止.

不过二分查找法需要符合一定条件.二分查找法作用于一个有序数据集合上,所以要注意的是有序,首先要查找的是有序集合的中间元素,如果中间元素比要查找的元素大,接着转向较小的半集进行查找,反之,若中间元素比要查元素小,则转向较大的半集进行查找,转进范围更小的数据集后重复这个查找步骤.直到招到要查找的元素或数据集不能再分割.

这就是传说中的经典算法--二分查找.二分查找实质上就是不断地将有序数据集对半分割,并检查分区中的中间元素,是不是跟我们上面的猜数字游戏差不多呢?

见证奇迹的时刻--实操

下面我们就通过实例来检验上面的原理,我们现在有一个有序集合:[12,16,17,19,20],我们要从中查找16这个元素

下面我们就先通过图示来展示一下查找过程

我们常用于猜数字游戏的二分查找算法怎么用python实现呢?_二分查找法

图中的low和high是用来控制查找元素的两个边界值,下面[12,16,17,19,20]就是要查找的有序数据集合,mid表示的是low和high之间的中间值,接着我们就按照图示进行代码实现:

lists = [12,16,17,19,20]
val = 16
low = 0
high = len(lists) - 1
trace = False
while low <= high:
mid = (low + high) // 2
if lists[mid] == val:
trace = True
break
elif lists[mid] > val:
high = mid - 1
else:
low = mid + 1

if trace:
print("找到 {0} 的索引是 {1}".format(val, mid))
else:
print("没有找到 {0}".format(val))

我们常用于猜数字游戏的二分查找算法怎么用python实现呢?_二分查找_02

总结

随着循环不断推进,low从左向右移,high从右往左移,更新搜索范围,当mid找到目标时,将trace标记为True,并跳出循环.如果目标一直没有找到,那low和high的指向将会重合并退出循环.

标签:二分,python,mid,high,查找,low,print
From: https://blog.51cto.com/micai01/5927893

相关文章

  • python replace的用法
    用法newstr=string.replace(old,new,max)参数old: 被替换的元素new: 替代old的新元素max: 可选,代表替换几个,默认全部替换全部匹配的old元素#定义超长字符串in......
  • python操作数据编程
    支持数据库类型:Mysql,Oracle,SQLServerRedis,memcached连接Mysql数据库pipinstallpymysql流程:1、创建数据库连接2、基于数据库连接创建游标cursor  1)向数据库服务器......
  • PYTHON爬取图片
    fromthreadingimportThreadfromconcurrent.futuresimportThreadPoolExecutorfrommultiprocessingimportProcess,Queueimportrequestsfromlxmlimportetreefro......
  • Selenium4+Python3系列(十二) - 测试框架的设计与开发
    前言自己从未没想过能使用python来做自动化测试框架的设计、开发。可能有人会好奇说,六哥,你怎么也用python写测试框架了?领导说:python你也没有实际工作经验,可能就是是自......
  • python 笔记
    1、Myfirstprocedure。#我的第一个程序。print('Helloworld!')#print:打印到屏幕。(‘打印到屏幕的内容’)print('Ilikeyou!')#例一执行程序,输出如下:......
  • Selenium4+Python3系列(十二) - 测试框架的设计与开发
    前言自己从未没想过能使用python来做自动化测试框架的设计、开发。可能有人会好奇说,六哥,你怎么也用python写测试框架了?领导说:python你也没有实际工作经验,可能就是自己......
  • python之路46 django request对象 form表单 pycharm连接数据库 ORM简介
    静态文件配置1.编写一个用户登录页面2.静态文件不怎么经常变化的文件主要针对html文件所使用的到的各种资源css文件、js文件、img文件、第三方框架文件......
  • Python实战案例,tkinter+random模块,实现课堂随机抽选提问并语音播报学生姓名
    先看运行结果前言今天给大家介绍Python实现课堂随机抽选提问并语音播报学生姓名实战案例,废话不多说直接开整~开发工具Python版本:3.8相关模块:tkinter模块time模块......
  • 原来Python自带了数据库,用起来真方便
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • (转)shell命令:find查找命令
    原文:https://blog.csdn.net/xuejianbest/article/details/84988196?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-84......