【Python 百炼成钢】二分法查找

简介: 【Python 百炼成钢】二分法查找

写在前面的话🪐


学了Python一些基础知识之后,相信大家对Python使用方法有了一定的感悟,想要追求深层次的东西还要细细的学、慢慢的学。Python基础教程更新到今天语法基础算是完了,本专栏后续会对面向对象模块更新。在进行面向对象更新之前呢会有一步小插曲就是Python 百炼成钢系列。主要的作用呢就是使用Python刷一刷算法题,使自己的基础更加稳固。在更新期间收到了广大小伙伴的喜爱,博主的知识水平也有所提升。下面呢咱们进入正题讲解今天咱们要学习的二分查找法。


问题描述🪐


在学习一门语言的时候,咱们做的最多的一件事就是对数据进行增删改查,而对于增删改查操作中最常做的就是查,因为一个软件主要的作用就是对亲爱的用户进行信息展示,只有少部分管理员或者拥有权限的用户才可以操作数据。比如在链表、数组中查找东西,咱们需要从头开始遍历,挨个检索。数据量庞大的时候会很令人头疼。今天介绍的二分法查找(或称折半查找) 主要是针对有序数列(也就是说数据要先排序)。然后每次取中值进行比较,依次折半缩小查找范围。


573916004c754452878613e297cfbe1d.png


原理分析🪐


1.实现步骤


1)确定该区间的中间位置K,在数组两边加上区间左右边界l,r

2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。

区域确定如下:


每一次查找与中间值比较,判断是否查找成功,不成功当前查找区间将缩小一半。

视情况重新定左右边界与中间索引k

时间复杂度为:O(log2n)。


2.图解


图片源于网络


2d57677c1bdf4f1baa5e9b349ac57407.png


参考代码🪐


这里在写代码的时候对比了系统内置查找关键字in与二分法查找的运行效果

打印结果如下:


605bbb15b8a9424dac23d51516c7c42a.png


由此可见Python底层的查找算法还是超级快的。使用起来也很方便

二分查找在本次实验中输在了需要对列表进行排序上

对于有序量大的数据就可以体现出来二分查找的优势了



import time,math,random
#计时器(使用的是函数装饰器前面说函数的时候提到过)
def timeT(func):
    def wapper(*s):
        start=time.perf_counter()
        judge=func(*s)
        end=time.perf_counter()
        return judge,start-end
    return wapper
# 使用内置查找方法
@timeT
def serch1(lists,e):
    return e in lists
# 二分法
@ timeT
def serch2(lists,e):
    flag=False
    lists=sorted(lists)
    # print(lists)
    # 左游标
    lo=0
    # 右游标
    ma=len(lists)-1
    # 中间位置
    mid=len(lists)//2
    # 没有在列表内
    if lists[ma]<e:
        return False
    if lists[lo]>e:
        return False
    # 依次缩小左右游标,直到lo>ma
    while lo<=ma:
        if lists[mid]>e:
            ma=mid
            mid=(lo+ma)//2
        elif lists[mid]<e:
            lo=mid
            mid=(lo+ma)//2
        else:
          #标记位,True代表查到了
            flag=True
            break
    return flag
def main():
  #生成一个含有10000个元素的列表
    numarr=[x for x in range(10000)]
    #打乱列表顺序
    random.shuffle(numarr)
    print(*serch1(numarr,23))
    print(*serch2(numarr,223))
    print(223 in numarr)
    # print(numarr)
if __name__=="__main__":
    main()  



相关文章
|
7月前
|
SQL Python
基于 sqli-labs-Pass08,利用Python 实现 SQL盲注(含二分法)
基于 sqli-labs-Pass08,利用Python 实现 SQL盲注(含二分法)
|
6月前
|
Python
【Python 训练营】N_16 二分法查找
【Python 训练营】N_16 二分法查找
25 1
|
Python
Python 二分法和牛顿迭代法求算术平方根的一点小改进
Python 二分法和牛顿迭代法求算术平方根的一点小改进
99 0
|
人工智能 Go Python
CSP 202112-2 序列查询新解 python 离散+二分法
CSP 202112-2 序列查询新解 python 离散+二分法
CSP 202112-2 序列查询新解 python 离散+二分法
|
算法 Python
【Python基础之函数:二分法、三元表达式、生成/推导式、匿名函数、内置函数】
【Python基础之函数:二分法、三元表达式、生成/推导式、匿名函数、内置函数】
122 0
|
索引 Python
Python语言二分法查找
Python语言二分法查找Python语言二分法查找
103 0
|
14天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
13天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。