数据结构—线性表的查找

news2024/12/30 3:49:56

7.查找

《数据结构与算法分析》 思维导图复习_ManLok.的博客-CSDN博客

7.1查找的基本概念

问题:在哪里找?——查找表

查找表是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。

问题:什么查找?——根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)

关键字:用来标识一个数据元素(或记录)的某个数据项的值

  • 主关键字 可唯一地标识一个记录的关键字时主关键字;

  • 次关键字 反之,用以识别若干记录的关键字是次关键字。

问题:查找成功否?——根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)

  • 若查找表中存在这样一个记录,则称“查找成功”。

    • 查找结果给出整个记录的信息,或指示该记录在查找表中的位置;
  • 否则称“查找不成功”。

    • 查找结果给出“空记录”或“空指针”。

问题:查找目的是什么?

对查找表经常进行的操作:

  1. 查询某个 “特定的” 数据元素是否在查找表中;
  2. 检索某个 “特定的” 数据元素的各种属性;
  3. 在查找表中插入一个数据元素;
  4. 删除查找表中的某个数据元素。

问题:查找表怎么分类?

查找表可分为两类:

  • 静态查找表:
    • 仅作 “查询” (检索)操作的查找表。
  • 动态查找表:
    • 作 “插入” 和 “删除” 操作的查找表。
    • 有时在查询之后,还需要将 “查询” 结果为 “不在查找表中” 的数据元素插入到查找表中;或者,从查找表中删除其 “查询” 结果为 “在查找表中” 的数据元素,此类表为动态查找表。

问题:如何评价查找算法?

查找算法的评价指标:

​ 关键字的平均比较次数,也称平均查找长度 ASL(Average Search Length)

数据结构:二叉查找树 BST 平均查找长度 ASL 的计算_asl数据结构_寒泉Hq的博客-CSDN博客

问题:查找过程中我们要研究什么?

​ 查找的方法取决于查找表的结构,即表中数据元素是依何种关系组织在一起的。

​ 由于对查找表来说,在集合中查询或检索一个 “特定的” 数据元素时。若无规律可循,只能对集合中的元素——加以辨认直至找到为止。

​ 而这样的 “查询” 或 “检索” 是任何计算机应用系统中使用频度都很高的操作,因此设法提高查找表的查找效率,是本章讨论问题的出发点。

​ 为提高查找效率,一个办法就是在构造查找表时,在集合中的数据元素之间人为地加上某种确定的约束关系。

​ 研究查找表的各种组织方法及其查找过程的实施。

7.2线性表的查找

7.2.1顺序查找

应用范围

  • 顺序表或线性链表表示的静态查找表
  • 表内元素之间无序

数据元素类型定义:

typedef struct{
  KeyType key;//关键字域
  ......//其他域
}ElemType;
typedef struct{//顺序表结构类型定义
  ElemType *R;//表基址
  int length;
}SSTable;
SSTable ST;//定义顺序表ST

在顺序表ST中查找值为key的数据元素,从最后一个元素开始比较

img

int Search_Seq(SSTable ST,KeyType key){
  for(i=ST.length;i>=1;--i)
    if(ST.R[i].key) return i;
  return 0;
}

其他形式:

int Search_Seq(SSTable ST,KeyType key){
  for(i=ST.length;ST.R[i].key!=key;--i)
    if(i<=0) break;
  if(i>0) return i;
  else return 0;
}

或者:

int Search_Seq(SSTable ST,KeyType key){
  for(i=ST.length;ST.R[i].key!=key&&i>0;--i);
    if(i>0) return i;
  else return 0;
}

改进:把待查找关键字key存入表头(“哨兵”、“监视哨”),从后往前逐个比较,可免去查找过程中每一部都要检测是否查找完毕,加快速度。

img

int Search_Seq(SSTable ST,KeyType key){
  ST.R[0].key=key;
  for(i=ST.length;ST.R[i].key!=key;--i);
  return i;
}

当ST.length较大时,此改进能使进行一次查找所需的平均时间几乎减少一半。

时间效率分析:比较次数与key位置有关:

  • 查找第i个元素,需要比较n-i+1次
  • 查找失败,需要比较n+1次

1.记录的查找的概率不相等时如何提高查找效率?

​ 查找表存储记录原则——按查找概率高低存储:

​ 1)查找概率越高,比较次数越少;

​ 2)查找概率越低,比较次数越多。

2.记录的查找概率无法测定时如何提交查找效率?

​ 方法——按查找概率动态调整记录顺序:

​ 1)在每个记录中设一个访问频度域;

​ 2)始终保持记录按非递增有序的次序排列;

​ 3)每次查找后均将刚查到的记录直接移至表头。

顺序查找表的特点

​ 优点:算法简单,逻辑次序无要求,且不同存储结构均适用。

​ 缺点:ASL太长,时间效率太低。

7.2.2折半查找

折半查找:每次将待查记录所在区间缩小一半。

折半查找(折半查找定义+折半查找过程+折半查找算法实现+折半查找判定树+折半查找ASL+折半查找性能T(n))_xyl-CSDN博客_折半查找asl

mid = (low + high)/2
key<mid 则:high = mid - 1
key>mid 则:low = mid + 1
key == mid,找到
high<low,结束

折半查找算法:(非递归算法)

  • 设表长为 n,low、high 和 mid分别指向待查元素所在区间的上界、下界和中点,key为给定的要查找的值:
  • 初始时,令low=1,high=n,mid=[(low+high)/2]
  • 让k与mid指向的记录比较
    • 若key==R[mid].key,查找成功
    • 若key<R[mid].key,则high=mid-1
    • 若key>R[mid].key,则low=mid+1
  • 重复上述操作,直至low>high时,查找失败
int Search_Bin(SSTable ST,KeyType key){
  low=1;
  high=ST.length;//置区间初值
  while(low<=high){
    mid=(low+high)/2;
    if(ST.R[mid].key==key) return mid;//找到待查元素
    else if(key<ST.R[mid].key)//缩小查找区间
      high=mid-1;//继续在前半区间进行查找
    else low=mid+1;//继续在后半区间进行查找
  }
  return 0;//顺序表中不存在待查元素
}

折半查找:递归算法

int Search_Bin(SSTable ST,keyType key,int low,int high){
  if(low>high) return 0;//查找不到时返回0
  mid=(low+high)/2;
  if(key==ST.elem[mid].key) return mid;
  else if(key<ST.elem[mid].key)
    ......//递归,在前半区间进行查找
  else ......//递归,在后半区间进行查找
}

折半查找的性能分析—判定树

折半查找(折半查找定义+折半查找过程+折半查找算法实现+折半查找判定树+折半查找ASL+折半查找性能T(n))_xyl-CSDN博客_折半查找asl

考研之数据结构026_算法查找_折半查找(重要)分块查找_折半查找判定树的特点_BigTree的学习之路的博客-CSDN博客

折半查找优点:效率比顺序查找高。

折半查找缺点:只适用于有序表,且限于顺序存储结构(对线性链表无效)。

7.2.3分块查找

分块查找(索引顺序查找)

条件:

  1. 将表分成几块,且表或者有序,或者分块有序;若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字。
  2. 建立“索引表”(每个结点含有最大关键字域和指向本块第一个结点的指针,且按关键字有序)。

数据结构之分块查找_AAS48的博客-CSDN博客

查找过程:先确定待查记录所在快(顺序或折半查找),再在块内查找(顺序查找)。

分块查找优点:插入和删除比较容易,无需进行大量移动。

分块查找缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。

适用情况:如果线性表既要快速查找又经常动态变化,则可采用分块查找。

查找方法比较

顺序查找折半查找分块查找
ASL最大最小中间
表结构有序表、无序表有序表分块有序
存储结构顺序表、线性链表顺序表顺序表、线性链表

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

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

相关文章

07- RTC实时时钟

RTC实时时钟 RTC实时时钟RTC时钟来源&#xff1a;RTC的特征&#xff1a;简化的RTC框图及原理简介&#xff1a;RTC由两部分组成&#xff1a;RTC相关库函数&#xff1a;库函数的讲解和使用&#xff1a;RTC配置步骤&#xff1a; 示例 RTC实时时钟 RTC时钟来源&#xff1a; RTC的特…

并发编程4:Java 中的并发基础构建模块

目录 1、同步容器类 1.1 - 同步容器类的问题 1.2 - 迭代和容器加锁 2、并发容器类 2.1 - ConcurrentHashMap 类 2.2 - CopyOnWriteArrayList 类 3、阻塞队列和生产者-消费者模式 3.1 - 串行线程封闭 4、阻塞方法与中断方法 5、同步工具类 5.1 - 闭锁 -> CountDow…

【分布式共识算法】Basic Paxos 算法

basic paxos算法&#xff1a;描述的是多个节点就某个值达成共识。 muti-paxos 算法&#xff1a;描述的是执行多个basic paxos实例&#xff0c;就一系列值达成共识。 共识其实&#xff0c;比如当多个客户端请求服务器&#xff0c;修改同一个值X 多个阶段达成共识。 原理 角色…

213、仿真-基于51单片机智能电表电能表用电量电费报警Proteus仿真设计(程序+Proteus仿真+原理图+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

ARM DIY 硬件调试

前言 之前打样的几块 ARM 板&#xff0c;一直放着没去焊接。今天再次看到&#xff0c;决定把它焊起来。 加热台焊接 为了提高焊接效率&#xff0c;先使用加热台焊接。不过板子为双面贴片&#xff0c;使用加热台只能焊接一面&#xff0c;那就优先焊主芯片那面&#xff0c;并…

分布式链路追踪——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

要解决的问题 如何记录请求经过多个分布式服务的信息&#xff0c;以便分析问题所在&#xff1f;如何保证这些信息得到完整的追踪&#xff1f;如何尽可能不影响服务性能&#xff1f; 追踪 当用户请求到达前端A&#xff0c;将会发送rpc请求给中间层B、C&#xff1b;B可以立刻作…

End-to-End Object Detection with Transformers

DERT 目标检测 基于卷积神经网络的目标检测回顾DETR对比Swin Transformer摘要检测网络流程DERT网络架构编码器概述解码器概述整体结构object queries的初始化Decoder中的Muiti-Head Self-AttentionDecoder中的Muiti-Head Attention 损失函数解决的问题 基于卷积神经网络的目标检…

使用JavaMail发送邮件时嵌入公司logo图片

使用JavaMail发送邮件时嵌入公司logo图片 第一种方式&#xff1a;img标签和logo图片链接第二种方式&#xff1a;使用img标签和图片base64字符串第三种方式&#xff08;推荐&#xff09;&#xff1a;将logo当做附件一起发送并设置ContentID&#xff0c;再使用img标签&#xff0c…

C++——移动构造和完美转发

1.什么是右值 右值引用是C11的概念&#xff0c;与之对应的是左值引用。 当一个对象被用作右值的时候&#xff0c;用的是对象的值(内容)&#xff1b;当对象被用作左值的时候&#xff0c;用的是对象的身份(在内存当中的位置)。 以上的概念是摘录自《C primer》。 但是这样的概…

【SentenceTransformer系列】计算句子嵌入的概念(01/10)

一、说明 要分清词嵌入和句子嵌入的区别。 句子嵌入是指将句子或文档表示为固定长度的向量的过程&#xff0c;使得向量能够捕获句子的语义和上下文信息。它是自然语言处理 (NLP) 和机器学习中的常见任务&#xff0c;因为它可以帮助对句子之间的关系和相似性进行建模&#xff0c…

接口自动化测试(添加课程接口调试,调试合同上传接口,合同列表查询接口,批量执行)

1、我们把信息截取一下 1.1 添加一个新的请求 1.2 对整个请求进行保存&#xff0c;Ctrl S 2、这一次我们添加的是课程添加接口&#xff0c;以后一个接口完成&#xff0c;之后Ctrl S 就能够保存 2.1 选择方法 2.2 设置请求头&#xff0c;参数数据后期我们通过配置设置就行 3、…

Lua 位和字节

一、位运算 从 Lua 5.3 版本开始&#xff0c;提供了针对数值类型的一组标准位运算符&#xff0c;与算数运算符不同的是&#xff0c;运算符只能用于整型数。 运算符描述&按位与|按位或&#xff5e;按位异或>>逻辑右移<<逻辑左移&#xff5e;&#xff08;一元运…

安全学习DAY17_信息打点-语言框架组件识别

信息打点-WEB打点-语言框架&开发组件 文章目录 信息打点-WEB打点-语言框架&开发组件本节涉及链接&工具本节知识&思维导图基础概念介绍框架&#xff1a;组件&#xff1a;Web架构 对应Web测试手法后端&#xff1a;前端组件&#xff1a;java居多&#xff0c;框架&…

RP2040开发板自制树莓派逻辑分析仪

目录 前言 1 准备工作和前提条件 1.1 Raspberry Pi Pico RP2040板子一个 1.2 Firmware-LogicAnalyzer-5.0.0.0-PICO.uf2固件 1.3 LogicAnalyzer-5.0.0.0-win-x64软件 2 操作指南 2.1 按住Raspberry Pi Pico开发板的BOOTSEL按键&#xff0c;再接上USB接口到电脑 2.2 刷入…

产品帮助中心怎么做?这两点不能忽略,让用户自助解决问题!

对于大部分线上产品&#xff0c;因为其功能和系统的复杂性&#xff0c;使得新手客户入门学习非常复杂&#xff0c;为了快速响应并且解决问题&#xff0c;一套系统完整的产品帮助中心必不可少&#xff01; 产品帮助中心 因此&#xff0c;对于很多产品开发者来说&#xff0c;借助…

pg简单使用

1.创建服务器 2.创建数据库 3.修改默认连接数据库 工具都是链接到这里 4.数据库代码工具

ByteBuffer 使用

ByteBuffer 使用 1 java.nio包中的类定义的缓冲区类型2 缓冲区常用属性2.1缓冲区的容量(capacity)2.2 缓冲区的位置(position)2.3 缓冲区的限制(limit)2.4 缓冲区的标记(mark)2.5 剩余容量 remaining/hasRemaining 3 缓冲区常用方法3.1 创建缓冲区3.1.1 allocate方法3.1.2 wrap…

交叉编译之wiringPi库,【全志H616,orangepi-zero2】

文章目录 书接上回wiringPi全志库下载建立软链接软连接软连接创建 硬链接硬链接创建 测试树莓派运行servo文件 结束 书接上回 上回已经完整的安装了全志的gcc交叉编译工具 https://blog.csdn.net/qq_52749711/article/details/132306764 wiringPi全志库下载 下载链接 先搞到…

Jmeter+ant+jenkins实现持续集成

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具&#xff0c;并配置好环境变量&#xff1b;参考&#xff1a;https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件&#xff0c;要设置一下bin/jmeter.properties,文件内容…

中国电信物联网收入33亿元,用户达到4.73亿户!

近日&#xff0c;中国电信发布2023中期业绩&#xff0c;物联网迎来强劲增长&#xff0c;物联网收入33亿元&#xff0c;同比增长75.7%&#xff0c;物联网用户4.73亿户&#xff0c;同比增长31.5%。天翼物联自主研发的AIoT物联网平台&#xff0c;升级为云原生3AZ架构&#xff0c;提…