【11】数据结构之基于线性表的查找算法
目录标题
- 平均查找长度ASL(Average Search Length)
- 顺序表查找法
- 折半查找法
- 索引顺序查找法
平均查找长度ASL(Average Search Length)
- 定义:为确定元素在列表中的位置,需要和给定值进行比较的关键字个数的期望值,称之为查找算法成功时的平均查找长度.
ASL = P 1 C 1 + P 2 C 2 + ⋯ + P n C n = ∑ i = 1 n P i C i \text{ASL} = P_1C_1 + P_2C_2 + \cdots + P_nC_n = \sum_{i=1}^{n} P_iC_i ASL=P1C1+P2C2+⋯+PnCn=i=1∑nPiCi
其中,P为第i个元素的概率,C为找到列表中第i个元素时,已经进行过的关键字比较次数.
顺序表查找法
- 简单粗暴的查找方法,从头开始扫描,直到查找到或扫描结束.
# 1.顺序表查找法
class SeqList:def __init__(self, items):# 顺序表self.items = itemsdef seqSearch(self, key):# 顺序表查找法index = -1for i in range(len(self.items)):if self.items[i] == key:index = i + 1return indexif __name__ == '__main__':print('PyCharm')# 1.顺序表调试nums = [15, 22, 83, 54, 6, 65, 96, 72, 38, 46]sqlist = SeqList(nums)print(sqlist.seqSearch(72))
- 运行结果
- 顺序表查找法的ASL:
- 假设长度为n,
- 假设最后一个元素为查找目标,需比较n次,
- 倒数第二个元素为查找目标,需比较n-1次,
- 依此类推,
- 第一个元素为查找目标,需比较1次.
- 设每个元素为目标元素的概率一致,则概率值为1/n.
ASL = 1 × 1 n + 2 × 1 n + ⋯ + n × 1 n = ( 1 + 2 + ⋯ + n ) × 1 n = n + 1 2 \text{ASL} = 1 \times \frac{1}{n} + 2 \times \frac{1}{n} + \cdots + n \times \frac{1}{n} = \left(1 + 2 + \cdots + n\right) \times \frac{1}{n} = \frac{n+1}{2} ASL=1×n1+2×n1+⋯+n×n1=(1+2+⋯+n)×n1=2n+1
折半查找法
-
前提条件:
- 1.采用顺序存储结构
- 2.必须按关键字大小有序排列
-
基本思想:
-
关键字先与中间元素比较:
- 若相等,则查找成功
- 若关键字大,则与后一子表的中间元素比较大小,
- 若关键字小,则与前一子表的中间元素比较大小,
-
重复查找,直到查找成功,或比较结束,未查找到.
-
-
查找失败情况
-
查找成功情况
# 2.折半查找法
class SeqList:def __init__(self, items):# 有序的顺序表self.items = itemsdef binarySearch(self, key):# 折半查找法index = -1low = 0high = len(self.items) - 1while high >= low:mid = (low + high) // 2if self.items[mid] == key:index = mid + 1breakelif self.items[mid] > key:high = mid - 1else:low = mid + 1return indexif __name__ == '__main__':print('PyCharm')# 2.折半查找调试nums = [6, 12, 15, 18, 22, 25, 28, 35, 46, 58, 60]sqlist = SeqList(nums)num = 12index = sqlist.binarySearch(num)if index == -1:print(f"{num}在{nums}中未找到")else:print(f"{num}在{nums}中的位置为{index}")num = 50index = sqlist.binarySearch(num)if index == -1:print(f"{num}在{nums}中未找到")else:print(f"{num}在{nums}中的位置为{index}")
- 运行结果
- 折半查找法的ASL:
ASL = ∑ i = 1 n P i C i = 1 n ∑ j = 1 n j × 2 j − 1 = n + 1 n log 2 ( n + 1 ) − 1 ≈ log 2 ( n + 1 ) − 1 \text{ASL} = \sum_{i=1}^{n} P_i C_i = \frac{1}{n} \sum_{j=1}^{n} j \times 2^{j-1} = \frac{n+1}{n} \log_2(n+1) - 1 \approx \log_2(n+1) - 1 ASL=i=1∑nPiCi=n1j=1∑nj×2j−1=nn+1log2(n+1)−1≈log2(n+1)−1
-
优点:
- 比较次数少,查找速度快,平均性能好.
-
缺点:
- 要求待查表为有序表且插入/删除困难.
索引顺序查找法
-
分块查找法,介于顺序查找法和折半查找法之间的一种查找方法.
-
关键:建立索引表
-
前提条件:要求将列表组织称索引顺序结构
-
索引表示意图
# 3.索引顺序查找表
class Block:def __init__(self, key, low, high):self.key = keyself.low = lowself.high = high + 1class SeqList:def __init__(self, blocks, items):self.blocks = blocksself.items = itemsdef seqSearch(self, cur, key):# 索引顺序查找index = -1low = self.blocks[cur].lowhigh = self.blocks[cur].highfor i in range(low, high):if self.items[i] == key:index = i + 1return indexdef blockSearch(self, key):low = 0high = len(self.blocks) - 1mid = 0while low <= high:mid = (low+high)//2if mid == 0 or mid == len(self.blocks) -1:breakelif key < self.blocks[mid].key and key > self.blocks[mid-1].key:breakelif key > self.blocks[mid].key:low = mid + 1elif key < self.blocks[mid].key:high = mid - 1index = self.seqSearch(mid, key)return indexif __name__ == '__main__':print('PyCharm')# 3.索引表查找调试nums = [18, 14, 12, 25, 8, 28, 32, 45, 36, 58, 60, 88, 71]blocks = [Block(25, 0, 4),Block(58, 5, 9),Block(88, 10, 12)]sqlist = SeqList(blocks, nums)num = 36print(f"{num}在{nums}中的位置为{sqlist.blockSearch(num)}")
- 运行结果
-
36查找的过程:
- 将36与索引表中最大关键字25与58比较,介于他们之间,则表明36在第二块索引表中.
- 从第二块索引表的起始地址开始扫描,最后找到36所在位置.
-
索引表查找的ASL:
- 其中,n为数组数量,s是每块含有元素的个数.
ASL = 1 2 ( n s + s ) + 1 \text{ASL} = \frac{1}{2} \left( \frac{n}{s} + s \right) + 1 ASL=21(sn+s)+1
相关文章:
【11】数据结构之基于线性表的查找算法
目录标题 平均查找长度ASL(Average Search Length)顺序表查找法折半查找法索引顺序查找法 平均查找长度ASL(Average Search Length) 定义:为确定元素在列表中的位置,需要和给定值进行比较的关键字个数的期望值,称之为查找算法成功时的平均查…...
铼赛智能Edge mini斩获2025法国设计大奖 | 重新定义数字化齿科美学
铼赛智能(RAYSHAPE)革命性新品——椅旁3D打印机Edge mini荣获2025年法国设计奖(FRENCH DESIGN AWARDS,简称FDA)产品设计类大奖。作为全球工业设计领域最具影响力的奖项之一,这一殊荣不仅是对产品极简美学的…...
成为一种国家战略范畴的新基建的智慧园区开源了
智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界…...
Codeforces Round 1016 (Div. 3)题解
题目地址 https://codeforces.com/contest/2093 锐评 在所有题意都理解正确的情况下,整体难度不算太难。但是偏偏存在F这么恶心的题意,样例都不带解释一下的,根本看不懂题。D题也恶心,在于递归过程的拆分,需要点数学…...
安全理念和安全产品发展史
从安全理念的发展历史来看,技术与产品的演进始终围绕 “威胁对抗” 与 “业务适配” 两大核心展开。以下从七个关键阶段解析安全技术与产品的发展脉络,并结合最新实践与未来趋势提供深度洞察: 一、密码学奠基阶段(1970s 前) 安全理念:以 “信息保密” 为核心,防御手段…...
【深度学习】Downstream Model:预训练模型的下游应用与微调技术
Downstream Model:预训练模型的下游应用与微调技术 文章目录 Downstream Model:预训练模型的下游应用与微调技术1 什么是Downstream Model(下游模型)2 预训练模型与下游任务的关系3 微调技术与迁移学习微调的必要性高效迁移学习参…...
每日算法-250409
这是我今天的算法学习记录。 2187. 完成旅途的最少时间 题目描述 思路 二分查找 解题过程 为什么可以使用二分查找? 问题的关键在于寻找一个最小的时间 t,使得在时间 t 内所有公交车完成的总旅途次数 sum 大于等于 totalTrips。 我们可以观察到时间的单…...
【CSS 选择器组合规则详解】
基础选择器组合 空格:后代选择器 > 直接子元素选择器 . 类选择器 : 伪类选择器 多类选择器 .class1.class2 :多类组合 .class1 .class2 :类的所有后代 .class1 > .class2 :类的子元素特殊选择器 :nth-child() :nth-of-…...
手机静态ip地址怎么获取?方法与解析
而在某些特定情境下,我们可能需要为手机设置一个静态IP地址。本文将详细介绍手机静态IP地址详解及获取方法 一、什么是静态IP地址? 静态IP:由用户手动设置的固定IP地址,不会因网络重启或设备重连而改变。 动态IP:由路…...
NumPy对二维矩阵中的每个元素进行加减乘除和对数运算
使用NumPy对二维矩阵中的每个元素进行加减乘除和对数运算的方法如下: 1. 加减乘除运算 对每个元素进行标量运算,可直接使用算术运算符。 示例代码: import numpy as nparr np.array([[1, 2], [3, 4]])# 加法 result_add arr 5 print(&…...
基于C8051F340单片机的精确定时1S的C程序
一、前言 C8051F340单片的定时器2 是一个 16 位的计数器/定时器,由两个 8 位的 SFR 组成:TMR2L(低字节)和TMR2H(高字节)。定时器 2 可以工作在 16 位自动重装载方式、8 位自动重装载方式(两个 …...
提升Windows安全的一些措施
由简单到复杂,仅供参考 一、杀毒软件: 1、杀毒能力: https://haokan.hao123.com/v?vid3883775443252827335&pdhaokan_share 2、使用注意: 一台主机只安装一个杀毒软件就可以了 杀毒软件会误报,造成正常文件…...
中科岩创基坑自动化监测解决方案
1.行业现状 城市基坑开挖具有施工风险高、施工难度大等特点。由于地下土体性质、荷载条件、施工环境的复杂性,单根据地质勘察资料和室内土工试验参数来确定设计和施工方案,往往含有许多不确定因素,对在施工过程中引发的土体性状、环境、邻近建…...
Elasticsearch 系列专题 - 第二篇:数据建模与索引管理
在掌握了 Elasticsearch 的基本概念和操作后,本篇将重点介绍如何设计和管理索引,以及如何高效地导入和维护数据。这对于构建一个高效、可扩展的搜索系统至关重要。 1. 索引设计 1.1 如何选择合适的索引结构 索引是 Elasticsearch 的核心,设计时需考虑以下因素: 数据用途:…...
解决缓存穿透的布隆过滤器与布谷鸟过滤器:谁更适合你的应用场景?
目录 一、布隆过滤器:高效的空间节省者 1.1 布隆过滤器是什么? 1.2 工作原理 1.3 优点 1.4 缺点 1.5 适用场景 二、布谷鸟过滤器:解决删除难题的创新者 2.1 布谷鸟过滤器是什么? 2.2 工作原理 2.3 优点 2.4 缺点 2.5 适用场景 三、…...
OpenHarmony子系统开发 - 调测工具(一)
OpenHarmony子系统开发 - 调测工具(一) 一、bytrace使用指导 简介 bytrace是开发人员用于追踪进程轨迹、分析性能的一种工具,主要对内核ftrace进行了封装和扩展,来支持用户态的打点。通过该工具可以打开想要查看的用户态和内核l…...
Qt中的鼠标事件
1.鼠标进入事件和鼠标离开事件 1.1添加新文件 1.2ui界面 拖出一个Label控件,修改frameShape为Box,使边框更明显 1.3代码实现 #ifndef MYLABEL_H #define MYLABEL_H#include <QLabel>class myLabel : public QLabel {Q_OBJECT public:explicit m…...
MySQL JOIN详解:INNER JOIN与LEFT JOIN的选择与应用
在数据库查询中,JOIN操作是最常用也最重要的操作之一。不同的JOIN类型会导致完全不同的查询结果,正确选择JOIN类型是编写高效、准确SQL查询的关键。本文将深入探讨INNER JOIN和LEFT JOIN的区别、应用场景以及常见问题。 一、JOIN基础概念 1. 什么是JOI…...
Flink 反压下的 TCP 流控制
1. 什么是 Flink 反压和 TCP 流控制? 反压(Backpressure)是什么? 反压是分布式流处理系统中一种自我调节机制。当下游处理数据的速度跟不上上游发送数据的速度时,反压会让上游放慢发送速度,以避免系统过载…...
山东大学软件学院项目实训开发日志(7)之测试前后端本地部署
基于队长搭建的springbootvue框架,在本地进行测试搭建。 在运行后端过程中,出现下图错误: 查找后发现这个问题出现在 Maven 项目的 pom.xml 文件中,显示找不到一些依赖项。所以在此进行最简单的重新加载项目得以解决,…...
YOLOv11训练中精准率召回率与mAP@0.5的动态变化分析
目标检测模型的训练过程涉及多个关键性能指标和损失函数的变化,这些数据能够直观反映模型的收敛速度、最终精度以及改进效果。本文旨在通过绘制YOLOv11模型在训练过程中的精准率(Precision)、召回率(Recall)、mAP0.5 、…...
Windows下ElasticSearch8.x的安装步骤
下载ElasticSearch:https://www.elastic.co/downloads/elasticsearch (我下载的是目前最新版8.17.4)解压ElasticSearch 进入到ElasticSearch的bin目录下双击elasticsearch.bat 弹出控制台并开始执行,在这一步会输出初始账号和密码…...
Leetcode hot100 (day 8,9)
爬楼梯 做法一:小斐波那契数列,只要注意记忆化递归即可 class Solution { public:int dp[50];int climbStairs(int n) {if(dp[n])return dp[n];if(n2){return dp[2]2;}if(n1){return dp[1]1;}//if(dp[n])return dp[n];return dp[n]climbStairs(n-1)clim…...
LinuxSocket套接字编程
1.介绍函数使用 1.创建套接字 int socket(int domain, int type, int protocol); domain:指定协议族,如AF_INET(IPv4)或AF_INET6(IPv6)。 type:指定套接字类型,如SOCK_DGRAM&#…...
青少年编程考试 CCF GESP Python五级认证真题 2025年3月
Python 五级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 A A A B D B A D A D C A A D B 1 单选题(每题 2 分,共 30 分) 第 1 题 链表不具备的特点是( )。 A. 可随机访问任何一个元素 B. 插入、删除操作不需要移动元素 C…...
Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌套list等场景
实体字段比较器(对比两组对象找出发生变化的字段工具类开发) 支持枚举映射 支持时间 支持显示对应字段中文描述 支持嵌套list等场景 下载地址: Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌…...
电影舆情分析可视化平台管理端实现
电影舆情分析可视化平台管理端实现 系统概述 本系统的用户主要有三类,游客、普通用户以及电影从业人员。 面向游客和普通用户的是电影网站,系统提供一个便捷的平台,供普通用户搜索和了解电影的基本信息,支持电影预告片播放&…...
【Linux】进程信号(下)
在上一篇中,我们详细探讨了信号的预备知识和产生方式(如硬件异常、终端输入、kill命令、系统调用等)及其背后的操作系统行为。信号作为进程间异步通信的核心机制,其生命周期远不止“产生”这一环节——信号的保存与处理才是实现可…...
华为数字芯片机考2025合集2已校正
单选 1. 题目内容 关于亚稳态的描述错误的是( )。 1. 解题步骤 1.1 理解亚稳态(Metastability)的核心特性 亚稳态是指触发器无法在指定时间内稳定输出有效逻辑电平(0或1)的状态,其关键特点…...
【大模型微调】如何解决llamaFactory微调效果与vllm部署效果不一致如何解决
以下个人没整理太全 一、生成式语言模型的对话模板介绍 使用Qwen/Qwen1.5-0.5B-Chat训练 对话模板不一样。回答的内容就会不一样。 我们可以看到例如qwen模型的tokenizer_config.json文件,就可以看到对话模板,一般同系列的模型,模板基本都…...
基于视觉语言模型的机器人实时探索系统!ClipRover:移动机器人零样本视觉语言探索和目标发现
作者:Yuxuan Zhang 1 ^{1} 1, Adnan Abdullah 2 ^{2} 2, Sanjeev J. Koppal 3 ^{3} 3, and Md Jahidul Islam 4 ^{4} 4单位: 2 , 4 ^{2,4} 2,4佛罗里达大学电气与计算机工程系RoboPI实验室, 1 , 3 ^{1,3} 1,3佛罗里达大学电气与计算机工程系F…...
Java常用工具算法-6--秘钥托管云服务AWS KMS
前言: 之前我们介绍了一些常用的加密算法(如:对称加密AES,非对称加密RSA,ECC等),不论是哪一种都需要涉及到秘钥的管理。通常的做法都是把秘钥放到配置文件中进行配置,但是对于一些高…...
Shell脚本的学习
编写脚本文件 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释,否则使用默认shel 第一步:编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步:加上执行权限:chmod x 脚本文件名.sh 第三步&…...
Java——pdf增加水印
文章目录 前言方式一 itextpdf项目依赖引入编写PDF添加水印工具类测试效果展示 方式二 pdfbox依赖引入编写实现类效果展示 扩展1、将inputstream流信息添加水印并导出zip2、部署出现找不到指定字体文件 资料参考 前言 近期为了知识库文件导出,文件数据安全处理&…...
Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案
在现代的高性能应用开发中,Redis作为一款极为热门的内存数据库,其快速的读写性能和丰富的数据结构使其在缓存、消息队列等诸多领域得到了广泛应用。然而,在实际使用过程中,处理好Redis过期key、选择合适的内存淘汰策略以及确保缓存…...
深入 C++ 线程库:从创建到同步的探索之旅
C在<thread>中定义了C线程库. 创建多线程 #include <iostream> #include <thread> using namespace std; void show(int id, int count) { //线程函数for (int i 0; i < count; i) {cout << "id:" << id << ",值:&qu…...
LangChain使用大语言模型构建强大的应用程序
LangChain简介 LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互ÿ…...
程序化广告行业(72/89):Tag Manager系统代码操作与行业发展剖析
程序化广告行业(72/89):Tag Manager系统代码操作与行业发展剖析 大家好!在技术领域不断探索的过程中,我深刻体会到知识共享的重要性。写这篇博客,就是希望能和大家一起深入了解程序化广告行业,…...
数据结构实验3.3:求解迷宫路径问题
文章目录 一,问题描述二,基本要求三,算法分析(一)整体思路(二)详细步骤1. 输入迷宫大小并生成迷宫2. 定义走步规则3. 深度优先搜索(DFS)4. 输出结果 (三&…...
基于SpringBoot的线上历史馆藏系统【附源码】
基于SpringBoot的线上历史馆藏系统(源码L文说明文档) 4 系统设计 系统在设计的过程中,必然要遵循一定的原则才可以,胡乱设计是不可取的。首先用户在使用过程中,能够直观感受到功能操作的便利性,符合…...
Mybatis的springboot项目使用
删除数据 & 占位符 一般常用占位符进行数据库操作,也就是预编译sql。 在UserMapper中定义删除接口 /** 根据id删除用户*/ Delete("delete from user where id #{id}") void deleteById(Integer id);若想要获取返回值,声明为Integer (s…...
网站集群批量管理-Ansible剧本与变量
复盘内容:链接指北 查看ansible命令文档 ansible-doc -s systemd一、剧本 何为剧本: playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量 剧本yaml格式,yaml格式的文件:空格,冒号. 剧本未来我们批量管理,运维必会的内容. …...
HOW - React Developer Tools 调试器
目录 React Developer Tools使用Components 功能特性1. 查看和编辑 props/state/hooks2. 查找组件3. 检查组件树4. 打印组件信息5. 检查子组件 Profiler 功能特性Commit ChartFlame Chart 火焰图Ranked Chart 排名图 why-did-you-render 参考文档: React调试利器&a…...
Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析
一、引言 在微服务架构中,服务发现、配置管理、流量控制是保障系统稳定性的核心问题。Spring Cloud Netflix 生态曾主导微服务解决方案,但其部分组件(如 Eureka、Hystrix)已进入维护模式。 Spring Cloud Alibaba 凭借 高性能、轻…...
《AI换脸时代的攻防暗战:从技术滥用走向可信未来》
技术迭代图谱 过去五年里,Deepfake技术经历了飞速迭代,从最初的萌芽到如今的广泛应用和对抗措施形成。2017年前后,利用深度学习进行人脸换装的技术首次在社区中出现。一位Reddit网友昵称“deepfakes”,将名人面孔替换到色情影片上…...
25/4/9 算法笔记 DBGAN+强化学习+迁移学习实现青光眼图像去模糊1
整体实验介绍 实验主要是结合DBGAN对抗网络强化学习增强迁移学习增强实现青光眼图像去模糊。今天则是先完成了DBGAN板块模型的训练。 实验背景介绍 青光眼的主要特征有: 视盘形态与杯盘比CDR:青光眼患者主要表现为视杯扩大,盘沿变窄。 视…...
【Claude AI大语言模型连接Blender生成资产】Windows安装Blender MCP教程
前言 最近在学习资产制作,了解到了个好玩的东西,利用AI一步一步搭建资产: 上面这副图就是利用Claude AI调用Blender的Python接口一步一步实现的,挺丑但好玩。 安装教程 进入Github: Blender-MCP 网站,下载该项目&a…...
JSP运行环境安装及常用HTML标记使用
制作一个静态网站的基本页面index.html 实验代码:<form> <label for"username">用户名:</label> <input type"text" id"username" name"username"><br> <label for"password&…...
Git 的进阶功能和技巧
1、分支的概念和使用 1.1、什么是分支? 分支(Branch)是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中,分支是 Git 强大功能之一,它允许我们从主开发线分离出来,在不…...
WSL1升级到WSL2注意事项
今天要在WSL上安装docker,因为机器上安装了wsl1,docker安装后启动不了,通过询问deepseek发现docker只能在wsl2上安装,因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10(版本 1903 及以上&…...