Python语言实现二分法查找
作者:五包辣条! 发布时间:2021-12-01 18:39:49
标签:Python,二分法,查找
前言:
二分法也就是二分查找,它是一种效率较高的查找方法
假如公司新来了一个人,叫张三,他是你们公司第47个人,过了一段时间后,有些人呢看张三不爽,离职了,那这时候张三肯定不是公司第47个人了,怎么样才知道张三排第几呢,下面我们用二分法把他找出来
思路:
给你一本1000页的书籍,随机给定一个页码,如何用最快的方式找到它?如果一页一页逐步去查找,则最高需要查找一千次!那我们如何用二分法来解决这个问题呢?二分法的关键就是二分这个词。
步骤1:设定一个页码作为中心点来将1000页分为两份,中位数的作用就是每次缩小一半查找范围,即达到开方的效果。即可以用 (首位+末位)/2 = 中位数。
步骤2:将需要查找的页码与中位数比价,如果大于中位数则舍弃对中位数的前一半查找,反之则舍弃对后一半范围查找,达成开方效果。 步骤3:在新的查找范围重新计算出中位数
步骤4:查找页码对比中位数,确定新的查找范围
步骤5:循环以上步骤,直到找到该页码为止
代码:
通过以上思路解析,我们知道了二分法实行步骤,接下来就通过代码来实现步骤,首先是循环实现
#模拟页码
array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107]
#首位值
low = 0
#末位值
height = len(array)-1
#设定查找页码
findNum = 1
#循环查找
while True:
#获取中位数
mid = int((low+height)/2)
#打印中位数,查看循环次数
print(array[mid])
#如果中位数小于查找值,则锁定后半段
if array[mid] < findNum:
#重置低位数
low = mid + 1
#如果中位数大于查找值,则锁定前半段
elif array[mid] > findNum:
#重置高位值
height = mid - 1
#找到数字则打印该值下标,终止循环
elif array[mid]==findNum:
print('find it:',array[mid],' index:',mid)
break
除了上述方式外,也可以使用递归来实现,代码更加简洁
array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107]
#函数递归
#定义一个函数,给三个形参:低位值,高位值,查找值
def BinarySearch(low,height,findNum):
#计算出中位数
middle = (low+height)//2
#如果中位数小于查找值,则锁定后半段
if findNum >array[middle]:
#重置低位数
low = middle +1
#如果中位数大于查找值,则锁定前半段
elif findNum<array[middle]:
#重置高位值
height = middle - 1
else:
#找到该值并返回
return '该值下标为:%s,值为:%s'%(middle,array[middle])
#没有找到则调用自身继续查找
return BinarySearch(low,height,findNum)
print(BinarySearch(array[0],len(array)-1,19))
总结:
根据结果反馈,使用二分法常规Python检索用循环方式找数字21,他是排在11位,中位数查询3次,使用Python二分法检索递归方式先取查询数字的倍数,然后锁定前半段进行索引,索引的步骤耗时更少
来源:https://blog.csdn.net/AI19970205/article/details/123464424
0
投稿
猜你喜欢
- 1. 鼠标的哪个按键被点击?<html><head><script type="text/javas
- 一、merge(合并)的语法:pd.merge(left, right, how='inner', on=None, lef
- props传值时子组件检测不到我们在Vue项目开发的过程中,经常会需要在父子组件传值,我们都知道,父子组件传值的时候是通过 props 来进
- InstrRev描述:返回某字符串在另一个字符串中出现的从结尾计起的位置。语法:InstrRev(string1, string2
- 如果要得到返回值,需要用Command的方法。 首先说明,返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那
- import matplotlib.pyplot as plt #plt用于显示图片import matplotlib.image as m
- 发现错误利用Python库xlrd中的xlrd.open_workbook()函数读取自定义xlsx表格文件时出错如下:Traceback
- 本文实例为大家解析了vue中track-by的属性,供大家参考,具体内容如下api:http://cn.vuejs.org/guide/li
- 本文为大家分享了python操作excel的包,供大家参考,具体内容如下现在支持python操作excel的包有下列这些官网上最推荐的是op
- Django是一个基于Python Web框架的高级Web框架,允许快速开发和干净,务实的设计。今天,我们将创建一个待办事项应用程序,以了解
- 本文实例讲述了python3 常见解密加密算法。分享给大家供大家参考,具体如下:一.使用base64Base64编码,64指A-Z、a-z、
- 一、类和对象Python属于动态类型的语言,而动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时创建的,而是运行时动态创建的,比方
- 脚本之家下载地址:https://www.jb51.net/softs/79861.html官网下载地址:http://www.micros
- 本文实例讲述了Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法。分享给大家供大家参考。具体如下:这个东东本来是做来给公司数据
- 我们将使用2019年全国新能源汽车的销量数据作为演示数据,数据保存在一个csv文件中,读者可以在GitHub仓库下载到 https://gi
- 本文实例讲述了Python排序搜索基本算法之冒泡排序。分享给大家供大家参考,具体如下:冒泡排序和选择排序类似,也是第n次把最小的元素排在第n
- paramiko模块paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用pytho
- 先看效果图 GY-85.py:#!/usr/bin/python3# -*- coding: utf-8 -*-import cursesf
- django配置mysql数据库:1.首先更改django项目文件中的settings.py的数据库配置DATABASES = { &nbs
- 最近由于单位数据库硬盘空间不足,整理的时候查了许多文章,也进行了测试,整理后得出一些经验供大家参考。首先,在网上看到一篇文章,如何Shrin