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

主要内容:

什么是列表查找

顺序查找

二分查找

一、什么是查找?

(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)当某个无顺序的列表,需要多次查找的情况,可先给列表排序后使用二分查找,时间效率较高。

相关内容

热门资讯

AGI的不归之途 AGI,即通用人工智能,正踏上一条不归之途。它犹如一艘在未知海域航行的巨轮,不断探索着智慧的边界。一...
欧盟起草对俄第18轮制裁措施 ... 来源:新华网新华社布鲁塞尔6月2日电(记者张兆卿)欧盟委员会2日发表声明说,欧盟正制定针对俄罗斯的第...
原创 心... 在现代商业环境中,烘焙行业作为食品产业的一个重要分支,正快速发展,面包作为其核心产品,备受瞩目。如今...
首次披露:五台山王黎明,已被查... 政事儿微信公号消息,据山西省纪委监委6月2日消息:日前,经山西省委批准,山西省纪委监委对五台山风景名...
深夜突发!关税升级,特朗普似乎... 当地时间6月2日,美股三大指数集体收涨,道指涨0.08%,纳指涨0.67%,标普500指数涨0.41...
年内创业板首批IPO获受理 创... 5月30日,陕西旅游、三瑞智能、宏明电子、大亚股份4家公司IPO获得受理,创下2025年以来单日受理...
国金证券:创新药密集获批 后续... 智通财经APP获悉,国金证券发布研报称,国家药监局批准11 款全新创新药的上市申请,另外还有2款创新...
美国房地产经纪公司Redfin... 观点网讯:6月2日,美国房地产经纪公司Redfin最新统计数据显示,美国待售房屋总价值高达6980亿...
移出经营异常名录不留痕 监管有... 汪昌莲近日,市场监管总局印发《关于贯彻落实有关事项的通知》,对已经移出经营异常名录的经营主体,不再公...
美股三大指数飘红,白银期货飙涨...   中新经纬6月3日电 美股三大指数低开,盘中走势转强,集体收红。道指收涨0.08%,纳指涨0.67...
特朗普升级贸易战 欧盟警告:可... 财联社6月3日讯(编辑 夏军雄)当地时间周一(6月2日),欧盟警告称,如果美国总统特朗普兑现其最新的...
每经实探|网红家装企业“住范儿... “(端午节)放假前,每天有百把号人来找(住范儿)呢,欠了不少钱。”6月1日下午,《每日经济新闻》记者...
BD交易大爆发,今年总额已超4... 一笔笔BD(business development,业务发展)交易订单让中国创新药又香了起来。据澎...
美股零日期权大热!特朗普交易再... 刚过去的5月,在特朗普政府推迟贸易谈判期限,并与多个主要贸易伙伴展开积极对话后,市场风险偏好有所改观...
海昌海洋公园即将易主?祥源集团... 6月2日,海昌海洋公园控股有限公司(海昌海洋公园,02255.HK)发布公告,由祥源集团间接全资控制...
鲍威尔出席美联储国际金融司活动... 美联储主席鲍威尔(Jerome Powell)周一在美联储国际金融司(IF)成立75周年活动上发表讲...
安联El Erian:美联储进... 知名投资管理公司安联(Allianz)首席经济顾问Mohamed El-Erian近日在《金融时报》...
国产豪车崩盘预警?亏损18亿,... 端午时节,华为发布了尊界S800,价格70.1-101.8W。一石激起千层浪,这个价格引起了巨大的争...
见证历史!新一轮货币战争在路上... 美元信誉持续受损。无论是沙特、还是俄罗斯,越来越多的国家对美国的36万亿美元债务表现出担忧。现在,中...
从一面之恩到千亿帝国CEO,安... 近日,吉利汽车管理层大调整引发行业聚焦。在吉利一季度财报发布的当天,吉利控股集团宣布重大人事调整:极...
智岩科技启动上市辅导 今年10...   近期,深圳智岩科技股份有限公司(以下简称“智岩科技”)正式启动上市辅导,辅导机构为中金公司。智岩...
银发跑者越跑越快,还最能“买买... 文/段修健近日,国家体育总局体科所中国体育经济研究中心发布《中国路跑人群消费与赛事经济发展趋势与特征...
【美股】美股走“V”全线收涨 ... 6月2日,美股走V全线收涨。道指涨0.08%,报42305.48点,收复早盘约1%跌幅并录得三连涨;...
涉嫌虚假记载细节曝光,锦富技术... 锦富技术5月30日晚公告称,公司当日收到中国证监会下发的《行政处罚事先告知书》。锦富技术披露的202...
6.3股市早8点丨三天假发生了... 三天假发生了啥事?股市早8点 老沙自媒体2025年6月3日(周二)每日大道正道消息▊美股小涨北京时间...
绿通科技:拟现金收购大摩半导体... 【绿通科技筹划收购大摩半导体不低于51%股权】6月2日晚间,绿通科技公告,筹划现金收购江苏大摩半导体...
股市必读:爱博医疗(68805... 截至2025年5月30日收盘,爱博医疗(688050)报收于71.41元,下跌1.76%,换手率1....
销售会“提问”,再冷淡的客户,... 回复“9”限时领《9套销售话术资料包》 作者:Dora 在销售咨询过程中,“高效提问”不仅是获取客户...
原创 德... 2025年2月24日,恰逢俄乌冲突爆发三周年,德国也于前一天举行了新一轮的议会选举。在过去的三年中,...
明天沪主板新股海阳科技申购!聚... 明天,沪主板将迎来一家新股申购! 格隆汇获悉,海阳科技(603382)于6月3日申购,发行价格为11...