Python[数据结构及算法 --- 查找]

一.顺序查找(无序表):

def sequentialSearch(alist, item):pos = 0found = Falsewhile pos < len(alist) and not found:if alist[pos] == item:found = Trueelse:pos = pos + 1return foundtestlist = [1, 2, 32, 8, 17, 19, 42, 13, 0]
print(sequentialSearch(testlist, 3))
print(sequentialSearch(testlist, 13))

 

二.顺序查找(有序表):

def orderedSequentialSearch(alist, item):pos = 0found = Falsestop = Falsewhile pos < len(alist) and not found and not stop:if alist[pos] == item:found = Trueelse:if alist[pos] > item:stop = Trueelse:pos = pos + 1return foundtestlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(orderedSequentialSearch(testlist, 3))
print(orderedSequentialSearch(testlist, 13))

 

以下是对两段代码的详细对比分析:

代码对比:

维度无序表顺序查找有序表顺序查找
核心逻辑逐个比较元素,直到找到目标或遍历结束逐个比较元素,若当前元素大于目标值则提前终止
数据要求无要求必须有序(如升序)
提前终止条件仅在找到目标时终止找到目标遇到更大元素时终止
场景无序表时间复杂度有序表时间复杂度说明
目标存在于列表中O(n/2)O(n/2)平均比较次数相同
目标不存在于列表中O(n)O(n/2)有序表可提前终止,效率提升
最好情况(目标在首位)O(1)O(1)一次比较即终止
最坏情况(目标在末位)O(n)O(n)需遍历全量元素

场景推荐算法原因
数据频繁变动无序表顺序查找维护有序性成本高
数据有序且查找频繁有序表顺序查找可利用有序性提前终止
大规模有序数据二分查找(非顺序查找)时间复杂度 O (log n),效率更高

总结:

  • 无序表:实现简单,适用于小规模或无需维护顺序的数据。
  • 有序表:通过提前终止优化了查找失败的场景,但依赖数据有序性。
  • 性能提升:仅在查找失败时显著提升效率(平均减少约 50% 的比较次数)。

三.二分查找:

对于有序表,二分查找将会是更好的选择:

def binarySearch(alist, item):first = 0last = len(alist) - 1found = Falsewhile first <= last and not found:midpoint = (first + last) // 2if alist[midpoint] == item:found = Trueelse:if item < alist[midpoint]:last = midpoint - 1else:first = midpoint + 1return foundtestlist = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binarySearch(testlist, 3))
print(binarySearch(testlist, 13))

算法核心逻辑:

  • 分治思想:每次将搜索范围缩小一半,直到找到目标或确定目标不存在。
  • 关键点
    1. 有序性:要求输入列表必须按升序排列。
    2. 中间点计算:通过 midpoint = (first + last) // 2 确定当前搜索区间的中间位置。
    3. 区间调整
      • 若目标值小于中间值,搜索左半区间(last = midpoint - 1)。
      • 若目标值大于中间值,搜索右半区间(first = midpoint + 1)。

四.冒泡排序:

 

def bubbleSort(alist):for passnum in range(len(alist)-1, 0, -1):for i in range(passnum):if alist[i] > alist[i+1]:temp = alist[i]alist[i] = alist[i+1]alist[i+1] = tempalist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubbleSort(alist)
print(alist)

冒泡排序相对较为简单,所以对于代码逻辑不加以过多赘述,但是此代码存在些许缺点,我们可以进行相应的改进:

优化:

def shortBubbleSort(alist):exchanges = Truepassnum = len(alist) - 1while passnum > 0 and exchanges:exchanges = Falsefor i in range(passnum):if alist[i] > alist[i + 1]:exchanges = Truetemp = alist[i]alist[i] = alist[i + 1]alist[i + 1] = temppassnum = passnum - 1alist = [20, 30, 40, 90, 50, 60, 70, 80, 100, 110]
shortBubbleSort(alist)
print(alist)

 这段 Python 代码实现了短冒泡排序(优化的冒泡排序)算法,通过设置 exchanges 标志来判断某一轮排序中是否发生了交换,若未发生交换则提前终止排序过程,以优化性能,最后对给定列表进行排序并输出 。

五.选择排序:

def selectionSort(alist):for fillslot in range(len(alist)-1, 0, -1):positionOfMax = 0for location in range(1, fillslot + 1):if alist[location] > alist[positionOfMax]:positionOfMax = locationtemp = alist[fillslot]alist[fillslot] = alist[positionOfMax]alist[positionOfMax] = temp

 这段代码实现了选择排序算法,其基本思想是:每次从未排序的部分中找到最大(这里是升序排序,找最大元素放到未排序部分末尾 )的元素,与未排序部分的最后一个元素交换位置,逐步完成列表的排序 。

六.插入排序:

def insertionSort(alist):for index in range(1, len(alist)):currentvalue = alist[index]position = indexwhile position > 0 and alist[position - 1] > currentvalue:alist[position] = alist[position - 1]position = position - 1alist[position] = currentvalue

 这段 Python 代码实现了插入排序算法,其工作原理是:从列表的第二个元素开始,将当前元素(currentvalue)依次与前面已排序部分的元素进行比较,如果前面元素大于当前元素,就将前面元素后移,直到找到当前元素应该插入的位置,最后将当前元素插入到该位置,逐步构建有序列表 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913211.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Seata Saga模式实战:Java微服务中的分布式事务管理

在分布式系统中&#xff0c;Saga模式是一种用于管理跨多个服务的事务的柔性事务解决方案。它通过将长事务拆分为多个本地事务&#xff08;每个事务对应一个服务的操作&#xff09;&#xff0c;并通过补偿机制保证最终一致性。以下是Java中Saga模式的详细介绍&#xff0c;包括实…

若依学习笔记1-validated

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保证 Spring AOP 相关的依赖包 --><dependency><groupId>org.springframework.boot<…

Excel 如何处理更复杂的嵌套逻辑判断?

处理复杂的嵌套逻辑判断&#xff0c;是Excel进阶路上必然会遇到的一道坎。当简单的IF函数“套娃”变得冗长、难以阅读和维护时&#xff0c;我们就需要更高级、更清晰的工具。 这里介绍三种从基础到高级的处理方法&#xff1a; 传统的 IF 函数嵌套 (经典&#xff0c;但容易混乱)…

使用Claude和MCP增强Selenium

1.配置MCP服务器打开Claude Desktop—>Settings—>Developer—>Edit Config{"mcpServers": {"selenium": {"command": "npx","args": ["-y", "angiejones/mcp-selenium"]}} }配置完成后重启Cl…

数据仓库锚点建模方法的前世今生

数据仓库锚点建模方法&#xff08;Anchor Modeling&#xff09;作为一种面向复杂数据环境的创新方法论&#xff0c;其发展历程与技术演进深刻反映了数据管理从结构化到动态化的转型需求。以下从起源、发展、核心思想、技术演进及未来趋势五个维度&#xff0c;系统梳理锚点建模的…

<三>Sping-AI alibaba 文生图

环境和配置请看&#xff1c;二&#xff1e;Sping-AI alibaba 入门-记忆聊天及持久化 源代码&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/exam…

vue组件和模板

好的&#xff0c;我们来详细解释一下在 Vue&#xff08;以及现代前端开发&#xff09;中两个最核心的概念&#xff1a;组件 (Component) 和 模板 (Template)。 理解了它们&#xff0c;就等于掌握了现代 Web 应用开发的基石。 一个核心比喻&#xff1a;乐高积木 在开始前&…

python学习打卡:DAY 18 推断聚类后簇的类型

浙大疏锦行 聚类后的分析&#xff1a;推断簇的类型 知识点回顾&#xff1a; 推断簇含义的2个思路&#xff1a;先选特征和后选特征通过可视化图形借助ai定义簇的含义科研逻辑闭环:通过精度判断特征工程价值 作业&#xff1a;参考示例代码对心脏病数据集采取类似操作&#xff0c;…

Ubuntu for ARM 更换为阿里云镜像源

1. 简介 该镜像适用于配置 ARM, PowerPC 等其他架构的 ubuntu系统&#xff0c;不适用 x86 &#xff01;&#xff01;&#xff01; 各种版本的Ubuntu for ARM下载地址&#xff1a;https://cdimage.ubuntu.com/releases 2. 配置方法 打开 sources.list 文件。 vim /etc/apt/s…

HTML与JavaScript:构建动态交互式Web页面的基石

HTML与JavaScript&#xff1a;构建动态交互式Web页面的基石 在现代Web开发中&#xff0c;HTML和JavaScript是不可或缺的两位主角。HTML负责页面的结构和内容&#xff0c;而JavaScript则赋予页面生命&#xff0c;使其能够响应用户交互、动态更新内容&#xff0c;并与后端服务进…

Python数据分析基础03:探索性数据分析

相关文章&#xff1a; 《python数据分析基础02&#xff1a;数据可视化分析》 《Python数据分析基础01&#xff1a;描述性统计分析》 探索性数据分析&#xff08;Exploratory Data Analysis, EDA&#xff09; 的深度解析&#xff0c;涵盖核心目标、方法论框架、关键技术及可视…

D3 面试题100道之(41-60)

这里是D3的面试题,我们从第 41~60题 开始逐条解答。一共100道,陆续发布中。 🟩 面试题(第 41~60 题) 41. D3 中如何添加图例? 图例可以通过手动创建 SVG 元素或使用 D3 的辅助函数来实现。常见做法是结合 d3.scaleOrdinal() 和 .range() 创建颜色映射图例。 示例: c…

Spring Boot事件驱动模型深度解析

目录 一、什么是Spring事件机制&#xff1f; 与传统方法调用的对比&#xff1a; 二、四大核心组件解析 1. ApplicationEvent&#xff1a;事件对象 2. ApplicationEventPublisher&#xff1a;事件发布器 3. ApplicationListener&#xff1a;事件监听接口 4. EventListener…

Python gmssl.SM4使用案例

Python gmssl.SM4使用案例 摘要:在异构计算系统验证中,通常会有数据加解密的要求,例如用户数据、权重参数等,本文将详细介绍在UVM验证环境中,调用Python的gmssl库,用SM4实现加解密的验证方案。 一、Python gmssl 库介绍 gmssl 是一个开源的、纯Python实现的国密算…

迅为高情性6TOPS算力的RK3576开发板NPU rknn-model-zoo例程演示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。支持INT4/INT8/INT16/FP16/BF16/TF32混合运算&am…

rsync 命令详解

目录 rsync 传输备份工作原理详解一、核心算法:差异传输二、传输流程三、关键技术四、与cp/scp复制的本质区别rsync的使用基本语法常用选项常用组合案例1. **本地目录同步**2. **远程同步(SSH协议)**3. **删除目标端多余文件**4. **排除特定文件**5. **限速传输(避免占用带…

【MySQL进阶】错误日志,二进制日志,mysql系统库

目录 一.错误日志 1.1 配置错误日志 1.1.1 Windows的默认错误日志路径 1.1.2 Unix和Linux系统的默认错误日志路径 1.2 错误日志中事件的字段 1.2.1 核心错误事件字段 1.2.2.MySQL 错误消息的两种不同输出渠道 1.2.3 可选错误事件字段 1.3. 刷新错误日志文件和重命名 二…

day45-nginx复杂跳转与https

1. ✅nginx复杂跳转 客户端ip不是内网(172.16/192.168)ip时&#xff0c;维护文件存在时&#xff0c;返回503或者错误页面 1.1. &#x1f4dd;修改配置文件 server {listen 80;server_name re.linux.cn; root /app/code/re/;set $flag 0;if ( $remote_addr !~* "^172…

基于pcl点云库实现激光雷达数据采集

基于pcl点云库实现倍加福R2000激光雷达数据采集 一、项目介绍二、开发详情三、显示效果展示四、说明 一、项目介绍 最近用pcl库实现了倍加福R2000激光雷达的数据采集&#xff0c;并实时在viewer上实时更新显示。软件的开发是基于vs2019qt插件pcl库实现&#xff0c;可以完成如下…

微信小程序61~70

1.组件wxml的slot-插槽 在使用基础组件时&#xff0c;可以在组件中间写子节点&#xff0c;从而将子节点内容展示到页面中&#xff0c;自定义组件也可以接收子节点但是要在组件模板中定义节点&#xff0c;承载组件中间的子节点需要使用多个插槽时&#xff0c;要在组件.js中声明…