Python数据结构与算法(p7-p10)-查找
创始人
2025-06-01 18:47:54

主要内容:

什么是列表查找

顺序查找

二分查找

一、什么是查找?

(1)查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。

(2)列表查找(线性表查找):从列表中查找指定元素。

a.输入:列表、待查找的元素;

b.输出:元素下标(未找到元素时一般返回None或者-1)

(3)内置列表查找函数:index()

二、顺序查找(Linear Search)

1、定义

顺序查找,也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到或搜索到列表最后一个元素为止。

2、顺序查找代码

(1)使用enumerate()函数获得列表list的索引。

enumerate()函数,多用于在for循环中得到计数,利用它可以同时获得索引和值。

# 顺序查找,时间复杂度O(n)
def linear_search(li,val):for ind, v in enumerate(li): #使用enumerate函数,输出索引和值if v == val:  #当当前值等于所需要的值return ind  #返回索引else:return None  #针对最后一个if的else,最后一个if仍旧不成立,则输出Nonelis = [1,6,7,8,56,7,0,23,5]
lin = linear_search(lis,0)
print(lin)#输出结果
6

(2)使用range函数和len函数读取list的索引。

#顺序查找——不用enumerate()函数
def lin_search(data, value):for i in range(len(data)):  #len()得到列表的长度,range()函数生成连续整数if data[i] == value:return ielse:return Noneli = lin_search(lis,0)
print(li)#输出结果
6

3、二分查找介绍

(1)定义

二分查找又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一般。

(2)实例介绍

例如在有序列表中查找元素3:

第一步:

定义两个变量,left 和right,表示当前列表的索引(即位置)。首先,left表示索引0,right表示索引n-1,那么中间值索引为(0+n-1)/2。

第二步:

第一个mid中间索引为8/2=4, 索引4对应的值为5。且5大于3,因此,查找的候选区更新为5的左侧列表。

第三步:

right所代表的索引值,更改为mid所代表索引值的左侧,即mid的索引值-1,即4-1=3。

第四步:

重新更新mid代表的索引值,同样根据公式计算,(0+3)/2=1.5,向下取整得到1。即mid的索引值变成1,对应的列表数值为2。

第五步:

重复之前的操作,对比列表值2小于3,则候选区更新为2的右侧,left代表的索引值移动到mid+1的位置,即索引值为1+1=2。候选区索引更新为[2,3]。

第六步:

重新计算mid代表的索引,(2+3)/2=2.5,向下取整为2。mid索引对应的列表值为3,与所查找的值一致。

4、二分查找代码

代码的时间复杂度为O(logn)。

def binary_search(li,val):  #li是列表,val是需要查找的值left = 0  #left初次索引right = len(li) - 1 #right的初次索引while left <= right:mid = (left + right) // 2 #向下取整if li[mid] == val:return midelif li[mid] > val: #待查值在mid的左侧right = mid - 1  #更新right的值else:  #li[mid] < val 待查值在mid右侧left = mid + 1else:  #对应最后一个ifreturn None #验证代码   
lis = [1,2,3,4,5,6,7,8]
bin = binary_search(lis,3) #待查值为3
print(bin)#输出结果
2

5、二分查找与线性查找的比较

(1)时间复杂度

线性查找(顺序查找):O(n); 二分查找:O(logn)

因此,二分查找的速度大于顺序查找。

1)时间装饰器

装饰器的原理认识,可参考:http://c.biancheng.net/view/2270.html

带参数的时间装饰器代码如下:

import time #调用时间模块#时间装饰器
def cal_time(func): def wrapper(*args, **kwargs): #函数参数不确定的时候,用*args和**kwargs,前者叫位置参数,后者叫关键字参数。t1 = time.time()result = func(*args, **kwargs) #运行被装饰的函数t2 = time.time()print("%s running time: %s secs." % (func.__name__,t2-t1)) #func.__name__装饰器的函数,表示函数名称return resultreturn wrapper

2)同数据下线性查找和二分查找运行时间代码

from cal_time import cal_time# 线性查找
@cal_time
def linear_search(li,val):for ind, v in enumerate(li): #使用enumerate函数,输出索引和值if v == val:  #当当前值等于所需要的值return ind  #返回索引else:return None#二分查找  
@cal_time
def binary_search(li,val):left = 0right = len(li) - 1 while left <= right:mid = (left + right) // 2if  li[mid] == val:return midelif li[mid] > val:right = mid - 1else:left = mid + 1else:return Nonelis = list(range(10000000))
binary_search(lis,389000)
linear_search(lis,389000)

3)输出时间对比

binary_search running time: 0.0 secs.
linear_search running time: 0.03690075874328613 secs.

对比可以看出,确实是二分查找的时间更快。

(2)使用范围

1)python自带的函数index(),使用的就是顺序查找。可以发现,顺序查找可以任何情况,一般没有顺序的列表使用线性查找(顺序查找)。

2)二分查找一般用于顺序列表,若顺序是乱的,就需要先排序后使用二分查找,然而,排序的时间复杂度往往很高,将会导致所需时间比顺序查找更慢。

3)当某个无顺序的列表,需要多次查找的情况,可先给列表排序后使用二分查找,时间效率较高。

相关内容

热门资讯

篮球记录表填写方法,如何填写篮... 篮球记录表填写方法目录篮球记录表填写方法如何填写篮球比赛记录表篮球比赛违反体育道德的犯规记录表上怎么...
阳澄湖大闸蟹做法有哪些,阳澄湖... 阳澄湖大闸蟹做法有哪些目录阳澄湖大闸蟹做法有哪些阳澄湖大闸蟹怎么吃?阳澄湖大闸蟹的吃法有哪些?阳澄湖...
广州bw是什么意思,广州9号车... 广州bw是什么意思目录广州bw是什么意思广州9号车房bilibili在哪
广州市内有哪几个区,广州有几个... 广州市内有哪几个区目录广州市内有哪几个区广州有几个区广州市有哪几个区?广州市内一共分几个区?广州市内...
729车牌啥意思(729车牌号... 本篇文章极速百科给大家谈谈729车牌啥意思,以及729车牌号什么意思对应的知识点,希望对各位有所帮助...
MTV中文是什么意思(mtv什... 今天给各位分享MTV中文是什么意思的知识,其中也会对mtv什么含义进行解释,如果能碰巧解决你现在面临...
花王纸尿裤u版e版区别 极速百... 花王纸尿裤u版e版区别目录花王纸尿裤u版e版区别花王纸尿裤u版e版区别花王纸尿裤底部有u字和e字,s...
代表奋斗的成语有哪些,表示坚持... 代表奋斗的成语有哪些目录代表奋斗的成语有哪些表示坚持不懈,努力拼搏的成语有哪些?写出四个表示艰苦奋斗...
奔腾B50的油耗是多少?(奔腾... 本篇文章极速百科给大家谈谈奔腾B50的油耗是多少?,以及奔腾b50的油耗怎么样对应的知识点,希望对各...
鼓励事业低谷男人的话,鼓励事业... 鼓励事业低谷男人的话目录鼓励事业低谷男人的话鼓励事业低谷男人的话 鼓励事业低谷男人的话列述老公事业不...
陪练车哪里找汽车陪练?驾驶陪练... 本篇文章极速百科给大家谈谈陪练车哪里找汽车陪练?驾驶陪练价格表,以及汽车陪练去哪个平台对应的知识点,...
四川音乐学院是一本吗,四川音乐... 四川音乐学院是一本吗目录川音是一本还是二本?四川音乐学院是一本吗,是二本吗? 川音是一本还是二本?二...
海信电视启动不起来怎么办,海信... 海信电视启动不起来怎么办目录海信电视启动不起来怎么办海信电视机启动不了怎么办海信液晶电视无法正常开机...
豆豆鞋配什么裤子好看,豆豆鞋穿... 豆豆鞋配什么裤子好看目录豆豆鞋配什么裤子好看豆豆鞋穿什么裤子搭配好看那个红色豆豆鞋搭配什么裤子好看豆...
五大洲四大洋(五大洲四大洋八方... 本篇文章极速百科给大家谈谈五大洲四大洋,以及五大洲四大洋八方聚对应的知识点,希望对各位有所帮助,不要...
拌面的酱汁怎么做好吃,拌面酱怎... 拌面的酱汁怎么做好吃目录拌面的酱汁怎么做好吃拌面酱怎么做简单又好吃拌面的拌酱怎么做好吃拌面的酱料怎么...
油价调整消息:明日国内油价或将... 今天给各位分享油价调整消息:明日国内油价或将下调,车主喜讯!的知识,其中也会对明日油价上涨进行解释,...
汽车汽油泵损坏有什么症状,汽油... 汽车汽油泵损坏有什么症状目录汽车汽油泵损坏有什么症状汽油泵坏了通常有什么异常现象汽油泵坏了有什么症状...
狗狗为什么跟疯了似的来回跑 极... 狗狗为什么跟疯了似的来回跑目录狗狗为什么跟疯了似的来回跑狗狗为什么跟疯了似的来回跑小狗有时像疯了一样...
在支付宝上怎么贷款,支付宝贷款... 在支付宝上怎么贷款目录在支付宝上怎么贷款支付宝贷款在哪里 支付宝贷款怎么申请在支付宝上怎么贷款在支付...
赛艇运动起源于哪个国家,奥运会... 赛艇运动起源于哪个国家目录赛艇运动起源于哪个国家奥运会传统比赛项目“赛艇”起源于欧洲哪个国家?赛艇运...
时空猎人首充号为什么充值会打折... 时空猎人首充号为什么充值会打折目录时空猎人首充号为什么充值会打折安卓手游充值折扣平台安卓手游充值折扣...
自助无人洗车机多少钱一台(24... 今天给各位分享自助无人洗车机多少钱一台的知识,其中也会对24小时自助共享洗车店要多少钱进行解释,如果...
白粥的做法,白粥的做法,白粥怎... 白粥的做法目录白粥的做法白粥的做法,白粥怎么做好吃,白粥的家常做法怎样煮白粥啊?白粥的做法 制...
包含抖音很火的叫爸爸是什么梗的... 今天给各位分享抖音很火的叫爸爸是什么梗的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别...
深圳欢乐谷的门票是怎么收费得,... 深圳欢乐谷的门票是怎么收费得目录深圳欢乐谷的门票是怎么收费得2022深圳欢乐谷万圣节老人免费吗?深圳...
阴阳师青蛙瓷器哪里多 极速百科... 阴阳师青蛙瓷器哪里多目录阴阳师青蛙瓷器哪里多阴阳师青蛙瓷器哪里多阴阳师的青蛙瓷器在哪个副本出现青蛙瓷...
一个G流量是多少MB流量,手机... 一个G流量是多少MB流量目录一个G流量是多少MB流量1G上网流量是多少MB一个G的流量等于多少MB一...
道台是什么官职 极速百科网 极... 道台是什么官职目录道台是什么官职道台是什么官职在清朝道台是个什么官“道台”是官职名吗道台是什么官职 ...
描写可怕的笑的成语笑得阴险可怕... 描写可怕的笑的成语笑得阴险可怕目录描写可怕的笑的成语笑得阴险可怕描写阴险的笑的成语表示阴险的笑有哪些...