首页 > 编程语言 >数据结构与算法Python版 顺序查找与二分查找

数据结构与算法Python版 顺序查找与二分查找

时间:2024-12-21 17:29:16浏览次数:5  
标签:数据项 search Python list item 算法 查找 数据结构

文章目录


一、顺序查找

顺序查找 Sequential Search

  • 通过下标,我们就可以按照顺序来访问和查找数据项,这种技术称为“顺序查找
  • 如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系
  • 在Python列表中,这些数据项的存储位置称为下标(index),这些下标都是有序的整数。首先从列表的第1个数据项开始,按照下标增长的顺序,逐个比对数据项,如果到最后一个都未发现要查找的项,那么查找失败。
    在这里插入图片描述

顺序查找-算法分析

  • 要对查找算法进行分析,首先要确定其中的基本计算步骤。在查找算法中,这种基本计算步骤就是进
    行数据项的比对。当前数据项等于还是不等于要查找的数据项,比对的次数决定了算法复杂度
  • 列表中的数据项是无序的,数据项在列表中各个位置出现的概率相同,顺序查找的算法复杂度是O(n)
Case最好Case最差Case平均Case
item存在1nn/2
item不存在nnn
  • 列表中的数据项是有序的,item不存在时有所不同,但顺序查找的算法复杂度也是O(n)。当数据项存在时,比对过程与无序表完全相同;如果数据项不存在,比对可以提前结束。
Case最好Case最差Case平均Case
item存在1nn/2
item不存在1nn/2

示例:查找数据项50,当看到54时,可知道后面不可能存在50,可以提前退出
在这里插入图片描述

def sequential_search(lst, item):
    """顺序查找无序数据项"""
    for i in lst:
        if i == item:
            return True

    # 找不到时返回False
    return False

test_list = [50, 88, 76, 65, 74, 16]
print(sequential_search(test_list, 74))
print(sequential_search(test_list, 50))
print(sequential_search(test_list, 22))


### 输出结果
True
True
False

二、二分查找

二分查找Binary Search

  • 对于有序表(约定:数据项由小到大排列),从列表中间开始比对!如果列表中间的项匹配查找项,则查找结束;如果不匹配,那么就有两种情况:
    • 列表中间项比查找项大,那么查找项只可能出现在前半部分
    • 列表中间项比查找项小,那么查找项只可能出现在后半部分
  • 重复采用上面的方法查找,无论如何,我们都会将比对范围缩小到原来的一半:n/2
比较次数剩余项目的大致数量
1n/2
2n/4
3n/8
in/2^i
def binary_search(sequence_list, item):
    begin = 0
    end = len(sequence_list) - 1

    while begin <= end:
        middle = (begin + end) // 2
        if sequence_list[middle] == item:  # 查找成功
            return True
        elif item < sequence_list[middle]:
            end = middle - 1  # 在左半部分查找
        else:
            begin = middle + 1  # 在右半部分查找

    # 查找失败
    return False


test_list = [2, 3, 4, 7, 9, 33, 88]
print(binary_search(test_list, 33))
print(binary_search(test_list, 2))
print(binary_search(test_list, 22))


### 输出结果
True
True
False

二分查找-递归形式

def binary_search_recursion(sequence_list, item):
    if len(sequence_list) == 0:
        return False
    else:
        middle = len(sequence_list) // 2
        if sequence_list[middle] == item:
            return True
        elif item < sequence_list[middle]:
            return binary_search_recursion(sequence_list[:middle], item)
        else:
            return binary_search_recursion(sequence_list[middle + 1 :], item)


test_list = [2, 3, 4, 7, 9, 33, 88]
print(binary_search_recursion(test_list, 33))
print(binary_search_recursion(test_list, 2))
print(binary_search_recursion(test_list, 22))


### 输出结果
True
True
False

二分查找- 算法分析

  • 二分查找,每次比对都将下一步的比对范围缩小一半。当比对次数足够多以后,比对范围内就会仅剩余1个数据项,即n/2^i=1。所以二分法查找的算法复杂度是O(log n)。
  • 一个系统在算法选择问题上,要综合考虑多种因素
    • 二分查找在时间复杂度上优于顺序查找,但前提是数据项是有序的。如果一次排序后可以进行多次查找,那么排序的开销就可以摊薄;否则,排序所占成本高,导致总体算法开销大。
    • 二分查找算法中,除了对比,还对列表进行切片操作带来额外开销。也可以不切片,传入起始和结束的索引值即可
  • 二分查找体现了解决问题的策略:分而治之
    在这里插入图片描述

您正在阅读的是《数据结构与算法Python版》专栏!关注不迷路~

标签:数据项,search,Python,list,item,算法,查找,数据结构
From: https://blog.csdn.net/zljgzw/article/details/144565194

相关文章

  • 29.Python基础篇-网络基础理论
    重要知识点BS与CS架构BS(Browser/Server)架构:基于浏览器和服务器的架构,客户端通过浏览器访问服务器上的应用程序或服务。特点:客户端只需要一个浏览器,无需安装复杂的软件,服务器端处理大部分业务逻辑。应用:Web应用(如Web浏览器访问网站)。CS(Client/Server)架构:客户端和服务......
  • 基于 Django和Python 的影视数据可视化系统
    文章目录程序资料获取一、项目技术二、项目内容和项目介绍三、核心代码四、效果图五、资料获取程序资料获取......
  • python语言jjsp爬虫程序代码
    importrequestsimportreimportosy=‘https://vip.lz-cdn5.com/20220705/30947_eb6de902/1200k/hls/mixed.m3u8’h={‘user-agent’:‘Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/131.0.0.0Safari/537.36Edg/131.0.......
  • C语言-jum-python-简单四则运算
    本题要求编写程序,计算2个整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。输入格式:输入2个正整数A和B。每行输入一个数据。输出格式:在4行中按照格式“A运算符B=结果”顺序输出和、差、积、商。输入样例:83输出样例:8+3=118-3= 58*3=......
  • 使用Anaconda和PyTorch编写深度学习Python代码
    摘要:通过Anaconda的虚拟环境和PyTorch的深度学习框架来建立Python的深度学习代码一、安装Anaconda在官网下载Anaconda,DownloadAnacondaDistribution|Anaconda等待漫长的下载过程这时候我推荐来一把酣畅淋漓的原神:二、配置Anaconda的国内镜像源参考:conda安装包_......
  • Python常用77个函数总结
    01、print()函数:打印字符串02、raw_input()函数:从用户键盘捕获字符03、len()函数:计算字符长度04、format(12.3654,‘6.2f’/‘0.3%’)函数:实现格式化输出05、type()函数:查询对象的类型06、int()函数、float()函数、str()函数等:类型的转化函数07、id()函数:获取对象的内......
  • 27.Python基础篇-configparse模块
    介绍用于处理配置文件的读取和写入。配置文件通常包含以键值对的形式存储的配置信息,常见的格式是.ini文件。该模块提供了对这些配置文件的解析功能,支持读取、写入、更新和删除配置。 配置文件的格式配置文件一般由多个部分(Section)组成,每个部分下面有多个键值对(Option)。配置......
  • 28.Python基础篇-logging模块
    介绍:logging模块是Python内置的强大日志记录工具,支持多种输出方式、格式化选项及多进程支持。日志的级别logging模块有五个内置的日志级别,从低到高:DEBUG:详细信息,用于诊断问题。INFO:常规信息,表示程序正常运行的状态。WARNING:警告信息,表示潜在问题或即将发生的错误。ERROR......
  • Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
    前言:在Python编程的广阔天地中,字符串处理无疑是一项基础而关键的技能。正则表达式,作为处理字符串的强大工具,以其灵活的模式匹配能力,在文本搜索、数据清洗、格式验证等领域发挥着不可替代的作用。本系列博客已经带领大家逐步深入了Python字符串操作的多个方面,从基础的字符串操......
  • Python调用星火认知大模型API(流式传输)
    Python调用星火认知大模型API流式传输前言1.获取API认证信息2.快速调用集成星火认知大模型3.实现AI流式回复1)SparkApi.py2)SparkApiMain.py3)SparkPicture.py4)spider.py5)开始测试参考文档前言最近对大模型比较感兴趣,想要调用大模型的API,实现AI助手那种问答效果,正......