第六章 查找

news2024/11/28 19:33:09

第六章 查找

  • 基本概念
  • 静态查找表
    • 顺序表上的查找
    • 有序表上的查找
    • 索引顺序表上的查找
  • 二叉排序树
  • 散列表
    • 常见散列法
    • 散列表的实现
  • 小试牛刀

基本概念

  • 查找表是由同一类型的数据元素构成的集合,它是一种以查找为“核心”,同时包括其他运算的非常灵活的数据结构
  • 查找就是从大量的数据元素中找出某个指定的数据元素。
  • 关键字,简称键是数据元素中某个数据项;关键字分为主关键字和次关键字,主关键字可以唯一标识一个数据元素(一行);次关键字可以识别若干数据元素(多行)
  • 静态查找表包括下列三种基本运算:
    • 建表Create(ST):操作结果是生成一个由用户给定的若干数据元素组成的静态查找表ST
    • 查找Search(ST,key):若ST中存在关键字值等于key的数据元素,操作结果为该数据元素的值,否则操作结果为空
    • 读表中元素Get(ST,pos):若ST中存在关键字值等于key的数据元素,操作结果为该数据元素的值,否则操作结果为空
  • 动态查找表包括以下五种基本运算:
    • 初始化Initiate(ST):设置一个空的动态查找表ST
    • 查找Search(ST,key):同静态查找表
    • 读表中元素Get(ST,pos):同静态查找表
    • 插入Insert(ST,key):若ST中不存在关键字值等于key的元素,则将一个关键字值等于key的新元素插入到ST中
    • 删除Delete(ST,key):当ST中存在关键字值等于key的元素时,将其删除

静态查找表

顺序表上的查找

  • 将静态查找表中的数据元素存放在上述数组的第1到n个单元格中,第n+1备用,第0个元素设置“岗哨或参照”、

在这里插入图片描述
查找算法描述如下:

int SearchSqTable(SqTable T,KeyType key)
{
T.elem[0].key=key;		//设置岗哨
i=T.n
while(T.elem[i].key!=key)
	i--;	//未找到,修改位置继续查找
return i;
}

有序表上的查找

  • 顺序表中数据元素是按照键值大小顺序排列的,称为有序表
  • 二分查找:每次用给定值与处在表的中间位置的数据元素的键值进行比较,确定给定值所在的区间,逐步缩小查找区间,直到找到该元素;算法描述如下:
int Search(SqTable T,KeyType key)
{
int low,high;
low=1;high=T.n;		//置查找区间初值
while(low<=high)
	{
	mid=(low+high)/2	//对区间折半,/为整除
	if(key==T.elem[mid].key) return mid;
	else if (key<T.elem[mid].key) high=mid-1;	//在前半区间查找
		else low=mid+1;		//在后半区间查找	
	}
return 0;	//找不到返回0
}
  • 思考:现有一个含有9个数据元素的有序表(关键字即为数据元素的值):(10,13,17,20,30,55,68,89,95)请给出用二分查找算法查找key=17的过程

索引顺序表上的查找

  • 索引顺序表由两部分组成:索引表:通过索引将顺序表分割为若干块;顺序表:存储数据使之呈现按块有序的性质

在这里插入图片描述

  • 按块有序指顺序表中数据元素被划分成一些子块,并且对其中任意两个相邻资本来说,排在后面的子表中的任一数据元素的键值大于排在前面的子表中的所有数据元素的键值
  • 对于顺序表中的每一块,索引表中有相应的一个索引项。每个索引项分为块内最大键值和块初始位置
  • 索引顺序表上的查找即分块查找可以分两步进行:
    • 确定待查数据元素所在块,
    • 在块内顺序查找

注:分块查找时间性能高于顺序查找低于二分查找,但分块查找不要求存储结构中数据元素按键值有序

二叉排序树

  • 一棵二叉排序树或者是一棵空二叉树,或者具有如下性质:
    • 若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值
    • 若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值
    • 根的左右子树也分别为二叉排序树

在这里插入图片描述

  • 二叉排序树上的查找:要找键值比某结点键值小的结点,只需通过该结点的左指针到它的左子树 中去找;算法描述如下:
BinTree SearchBST(BinTree bst,KeyTree key)
//在根指针bst所指的二叉排序树上递归的查找键值等于key的结点,若成功,则返回指向该结点的指针,否则返回空指针
{
if(bst==NULL) return NULL;	//不成功返回NULLL作为标记
else if(key==bst->key) return bst;	//成功返回结点地址
else if(key<bst->key)
	return SearchBST(bst->lchild,key);	//继续在左子树查找
	else
		return SearchBST(bst->rchild,key);	//继续在右子树中查找
}
  • 二叉排序树的插入:必须保证插入一个新结点后,仍为一棵二叉排序树

在这里插入图片描述

  • 二叉排序树上的平均查找长度ASL<=1+log2n介于O(n)和O(log2n)之间

散列表

  • 数据元素的键值和存储位置之间建立的对于关系H称为散列函数
  • 用键值通过散列函数获取存储位置的这种存储方式构造的存储结构称为散列表
  • 用键值通过散列函数获取存储位置的过程称为散列
  • 设有散列函数H和键值k1、k2,若k1!=k2,但是H(k1)=H(k2),则这种现象称为冲突,且称k1、k2是相对于H 的同义词

常见散列法

  • 数字分析法(又称数字选择法),收集所有可能出现的键值,排列在一起,对键值的每一位进行分析,选择分布较均匀的若干位组成散列地址。所取的位数取决于散列表的表长
  • 除留余数法(常用),选择一个不大于散列表长n的正整数p,以键值除以p所得的余数作为散列地址:

H(key)=key mod p (p<=n)

  • 平方取中法:以键值平方的中间几位作为散列地址
  • 基数转换法:将键值看成另一种进制的数再转换成原来进制的数,然后选其中几位作为散列地址

散列表的实现

  • 解决冲突的方法:

    • 线性探测法(先按构造方法求散列地址若冲突则往后移动直到不冲突):对任何键值key,设H(key)=d,设散列表的容量为m;线性探测法容易产生堆积
    • 二次探测法:生成的后继散列地址不是连续的,而是跳跃式的,以便为后续数据元素留下空间以减少堆积,二次探测法不易探测到整个散列表的所有空间:

    d0=H(key)
    di=(d0+i) mod m (i=12,–12,22,-22,…,±k2(k<=m/2))

    • 链地址法:对每一个同义词都建一个单链表解决冲突

在这里插入图片描述

- 多重散列法:设立多规格散列函数,当给定值与散列表中某个键值是相对于某个函数的同义词而冲突时,则换一个函数继续计算散列地址,直到不产生冲突为止;优点:不容易产生“堆积”,计算量大
- 公共溢出区法:散列表由两个一维数组组成,一个为基本表,一个为溢出表,插入首先在基本表进行,发生冲突则将同义词存入溢出表

小试牛刀

  • 一个有序表含有22个数据元素,且第一个元素下标为1,按二分查找方法查找元素A[16],所比较元素下标依次是______
  • 二分查找算法的时间复杂度为______
  • 索引顺序查找通常分两个阶段进行,首先采用顺序查找法或_______确定所要查找的块,然后再用顺序查找法在块中找到具体的元素
  • 在散列函数H(k)=k mod m 中,一般来讲,m应取______
  • 数据在计算机存储器内表示时,根据结点的关键字直接计算出该结点的存储地址,这种方法称为_________
  • 给定有序表D={006,087,155,188,220,465,505,508,511,586,656,670,700,766},用二分查找法在D中查找511,试给出查找过程

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

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

相关文章

Android Studio SDK manager加载packages不全

打开Android Studio里的SDK manager&#xff0c;发现除了已安装的&#xff0c;其他的都不显示。 解决方法&#xff1a; 设置代理&#xff1a; 方便复制> http://mirrors.neusoft.edu.cn/ 重启Android Studio

小主机折腾记17

8月9月10月基本在出差&#xff0c;流水账如下 1.由于出差&#xff0c;租了个公寓&#xff0c;所以买了个r2s&#xff0c;卖家已经安装部署好openwrt&#xff0c;风扇以及无线网卡 着重研究了风扇的脚本以及无线网卡的设置 风扇可以完美设置&#xff0c;但是无线网卡效果差强人意…

k8s-11 网络策略

添加网络策略 限制pod流量 控制的对象是具有appmyapp-v1标签的pod 此时访问svc是不通的 给测试pod添加指定标签后&#xff0c;可以访问 重启一下 限制namespace流量 给namespace添加指定标签 同时限制namespace和pod 给test命令空间中的pod添加指定标签后才能访问 限制集群…

k8s-13 存储之secret

Secret 对象类型用来保存敏感信息&#xff0c;例如密码、OAuth 令牌和 ssh key。 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活 。 Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里 当 kubelet 为 pod 拉…

山西电力市场日前价格预测【2023-10-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-16&#xff09;山西电力市场全天平均日前电价为356.38元/MWh。其中&#xff0c;最高日前电价为502.82元/MWh&#xff0c;预计出现在18: 30。最低日前电价为224.63元/MWh&#xff0c;预计…

PTQ与QAT

对称量化与非对称量化 量化分为对称量化与非对称量化。 非对称量化含有S和Z&#xff0c;对称量化Z为0&#xff0c;计算公式中只需S&#xff0c;为非饱和量化。 动态范围的确认 动态范围的确认Max&#xff08;默认的是对称量化&#xff0c;即不用Z&#xff09;&#xff0c;…

linux 内核中的pid和前缀树

前言&#xff1a; 写这个文章的初衷是因为今天手写了一个字典树&#xff0c;然后写字典树以后忽然想到了之前看的技术文章&#xff0c;linux kernel 之前的pid 申请方式已经从 bitmap 变成了 基数树&#xff0c;所以打算写文章再回顾一下这种数据结构算法 一、内核中pid的申请…

排序算法-基数排序法(RadixSort)

排序算法-基数排序法&#xff08;RadixSort&#xff09; 1、说明 基数排序法与我们之前讨论的排序法不太一样&#xff0c;并不需要进行元素之间的比较操作&#xff0c;而是属于一种分配模式排序方式。 基数排序法比较的方向可分为最高位优先&#xff08;Most Significant Di…

初识容器Docker

目前使用 Docker 基本上有两个选择&#xff1a;Docker Desktop和Docker Engine。Docker Desktop 是专门针对个人使用而设计的&#xff0c;支持 Mac 和 Windows 快速安装&#xff0c;具有直观的图形界面&#xff0c;还集成了许多周边工具&#xff0c;方便易用。 不是太推荐使用D…

【linux kernel】linux内核设备驱动的注册机制

文章目录 1、简介2、driver_register分析&#x1f449;&#xff08;2-1&#xff09;driver_find分析&#x1f449;&#xff08;2-2&#xff09;bus_add_driver分析 3、总结 &#x1f53a;【linux内核系列文章】 &#x1f449;对一些文章内容进行了勘误&#xff0c;本系列文章长…

SpringBoot热部署和整合Mybatis

目录 一、SpringBoot热部署 1.1 添加DevTools依赖 1.2 在idea中设置自动编译 1.3 在Idea设置自动运行 二、SpringBoot整合Mybatis 2.1 准备数据 2.2 添加相关依赖 2.3 在配置文件进行数据源配置 2.4 编写Mapper接口和Mapper文件 2.5 测试 一、SpringBoot热部署 热部…

Spring 事务的简单了解

目录 设计实现 工作原理 简单示例 隔离级别 事务传播机制 Spring框架提供了强大的事务管理支持&#xff0c;它允许开发者以声明性或编程性的方式来管理事务&#xff0c;从而保证数据的一致性和完整性。Spring事务管理的主要特点包括&#xff1a; 声明式事务管理&#xff1…

C语言基础算法复习

003 斐波那契数列问题 #include<stdio.h> int main() {int i,f11,f21,f3,num;printf("%5d %5d",f1,f2);num2;for(i1; i<18; i){f3f1f2;f1f2;f2f3;num;printf("%5d",f3);if(num%40) printf("\n");}return 0; }//#输数斐波那契数列的前20…

k8s-12 存储之configmap

开启之后 先看集群是否正常 Configmap用于保存配置数据&#xff0c;以键值对形式存储configMap 资源提供了向 Pod 注入配置数据的方法旨在让镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用性 典型的使用场景 填充环境变量的值 设置容器内的命令行参数 填充卷的…

百度OCR识别图片文本字符串——物联网上位机软件

一、开发背景 根据项目需求&#xff0c;我们需要完成LED显示屏实时显示歌词的效果。最优的方法是调用歌曲播放器的API获取歌词&#xff0c;但是由于这个开发资格不是很好申请&#xff0c;因此我们采用其他方案&#xff0c;即通过OCR识别获取歌词&#xff0c;并投射到LED显示屏上…

Potato靶机

信息搜集 设备发现 扫描端口 综合扫描 开放了80端口的HTTP服务和7120端口的SSH服务 目录扫描 扫描目录 看看这个info.php&#xff0c;发现只有php的版本信息&#xff0c;没有可以利用的注入点 SSH突破 hydra 爆破 考虑到 7120 端口是 ssh 服务&#xff0c;尝试利用 hydra …

【LeetCode热题100】--169.多数元素

169.多数元素 使用哈希表&#xff1a; class Solution {public int majorityElement(int[] nums) {int n nums.length;int m n/2;Map<Integer,Integer> map new HashMap<>(); //定义一个hashfor(int num:nums){Integer count map.get(num); //Map.get() 方法…

ARM架构的基本知识

ARM两种授权 体系结构授权, 一种硬件规范, 用来约定指令集, 芯片内部体系结构(内存管理, 高速缓存管理), 只约定每一条指令的格式, 行为规范, 参数, 客户根据这个规范自行设计与之兼容的处理器处理IP授权, ARM公司根据某个版本的体系结构设计处理器, 再把处理器设计方案授权给…

Java 全栈体系(三)

第一章 Java 基础语法 八、标识符 业内大多数程序员都在遵守阿里巴巴的命名规则。 1. 硬性要求 必须要这么做&#xff0c;否则代码会报错。 必须由数字、字母、下划线_、美元符号$组成。数字不能开头不能是关键字区分大小写的。 2. 软性建议 如果不这么做&#xff0c;代…