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二分法检索递归方式先取查询数字的倍数,然后锁定前半段进行索引,索引的步骤耗时更少

到此这篇关于Python语言实现二分法查找的文章就介绍到这了,更多相关Python二分法查找内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python二分法查找实例代码

    对于要搜索的元素越多,二分查找速度比简单查找快的更多 这是二分查找算法的优点,但二分算法也有缺点,二分算法只针对有序的列表,这样插入和删除就会很困难,因此,折半查找方法只适合不经常变动的有序列表  二分查找有个很重要的特点,就是不会查找数列的全部元素,而查找的数据量其实正好符合元素的对数,正常情况下每次查找的元素都在一半一半地减少.所以二分查找的时间复杂度为 O(log2n) 是毫无疑问的.当然,最好的情况是只查找一次就能找到,但是在最坏和一般情况下的确要比顺序查找好了很多. 题目一:给定一个

  • python二分法查找函数底值

    假设连续函数f(x)在区间(a,b)上有一个底值m,且在该底值下的函数输出值为M,即f(m)=M,利用二分法查找该底值:(s为足够小的数) 令t=(a+b)/2,若|f(t)-M|<=s,则m=t,若|f(t)-M|>s,如果(f(t)-M)和(f(a)-M)同号,a=t,反之b=t,继续二分法t=(a+b)/2...直到|f(t)-M|<=s,则m=t. 例如:一项一年期投资,每个季度初投入10000元,期满时收入44163.225,求内部收益率(已设定为0.04). 收益函数为: 从

  • python有序查找算法 二分法实例解析

    这篇文章主要介绍了python有序查找算法 二分法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 但是需要注意: 待查找的序列区间单调有序 例如需要查找有序数组arr里面的某个关键字key的位置,那么首先确认arr的中位数或者中点center,下面分为三种情况: 假如arr[center]>key,说明key在arr中心左边范围: 假如arr[

  • Python真题案例之二分法查找详解

    目录 写在前面的话

  • Python有序查找算法之二分法实例分析

    本文实例讲述了Python有序查找算法之二分法.分享给大家供大家参考,具体如下: 二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 例如需要查找有序数组arr里面的某个关键字key的位置,那么首先确认arr的中位数或者中点center,下面分为三种情况: ① 假如arr[center]>key,说明key在arr中心左边范围: ② 假如arr[center]<key,说明key在arr中心右边范围: ③ 假如arr[center]=key,说明key

  • python二分法查找算法实现方法【递归与非递归】

    本文实例讲述了python二分法查找算法实现方法.分享给大家供大家参考,具体如下: 二分法查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过

  • Python语言实现二分法查找

    前言: 二分法也就是二分查找,它是一种效率较高的查找方法 假如公司新来了一个人,叫张三,他是你们公司第47个人,过了一段时间后,有些人呢看张三不爽,离职了,那这时候张三肯定不是公司第47个人了,怎么样才知道张三排第几呢,下面我们用二分法把他找出来 思路: 给你一本1000页的书籍,随机给定一个页码,如何用最快的方式找到它?如果一页一页逐步去查找,则最高需要查找一千次!那我们如何用二分法来解决这个问题呢?二分法的关键就是二分这个词.  步骤1:设定一个页码作为中心点来将1000页分为两份,中位数的

  • Python 语言实现六大查找算法

    目录 一.顺序查找算法 二.折半查找算法 三.插补查找算法 四.哈希查找算法 五.分块查找算法 六.斐波那契查找算法 七.六种查找算法的时间复杂度 一.顺序查找算法 顺序查找又称为线性查找,是最简单的查找算法.这种算法就是按照数据的顺序一项一项逐个查找,所以不管数据顺序如何,都得从头到尾地遍历一次.顺序查找的优点就是数据在查找前,不需要对其进行任何处理(包括排序).缺点是查找速度慢,如果数据列的第一个数据就是想要查找的数据,则该算法查找速度为最快,只需查找一次即可:如果查找的数据是数据列的最后一

  • C语言数据结构之二分法查找详解

    问题:在有序数组中查找给定元素的下标goal. 在查找一个数组元素的下标,可以用循环来解决,但是如果一个数足够大,比如说手机的价格,用循环来查找,就相当于叫一个人猜,从0开始,需要猜很久.这时候就出现了二分查找,也叫对半查找. 对半查找顾名思义就是猜一次,下次猜的内容就减少一半              这时候定义一个变量left表示最左边元素的下标,在定义一个right表示最右边元素的下标,而mid就表示中间元素的下标. 当中间值小于目标值,left重新定义. if (mid < goal)

  • C语言实现折半查找法(二分法)

    折半查找法也叫做二分查找,顾名思义,就是把数据分成两半,再判断所查找的key在哪一半中,再重复上述步骤知道找到目标key; 注意:折半查找法仅适用于对已有顺序的数组.数据进行操作!!! 很显然,折半查找法相对于其他查找方法例如顺序查找法效率要高很多: 下面我们来实际操作一下,了解二分查找的奥义. 例如:要在数组arr[]={8,7,9,6,4,1,2,5,3,10,11};中查找key=7的位置:首先,我们要先将数组arr中的数据成员进行排序.arr[]={1,2,3,4,5,6,7,8,9,1

  • Python语言描述KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可

  • C++和python实现阿姆斯特朗数字查找实例代码

    1.题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数. 例如1^3 + 5^3 + 3^3 = 153. 1000以内的阿姆斯特朗数: 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407 2.判断一个数是否为阿姆斯特朗数 1.先来一个简单的代码,判断一个数是否为阿姆斯特朗数: 来看看C++写的 #include <iostream> using namespace std; int main() { int n, r, su

  • Python语言规范之Pylint的详细用法

    1.Pylint是什么 pylint是一个Python源代码中查找bug的工具,能找出错误,和代码规范的运行.也就是你的代码有Error错误的时候能找出来错误,没有错误的时候,能根据Python代码规范给你建议修改代码,让代码变更美观. 2.安装pylint pip3 install pylint 3.查找pylint的安装地址 $ which pylint /Library/Frameworks/Python.framework/Versions/3.9/bin/pylint 4.Pychar

随机推荐