【数据结构】数据结构与算法基础 课程笔记 第七章 查找

news2024/11/23 11:28:16

🚀Write In Front🚀
📝个人主页:令夏二十三
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:【数据结构】
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊

文章目录 

目录

前言

一、 查找的基本概念

1、在哪里查找?

2、什么是查找?

3、如何显示查找的结果?

4、查找的目的是什么?

5、查找表怎么分类?

6、如何评价查找算法的优劣性?

 7、在学习查找算法的过程中,我们要研究的是什么?

二、线性表的查找

1. 顺序查找

1.1 顺序表的类型定义

1.2 顺序查找应用范围

1.3 顺序查找算法

1.4 提高查找效率的方法

 1.5 查找算法的优缺点

2. 折半查找

2.1 折半查找算法

2.2 性能分析

​编辑

三、树表的查找

1. 二叉排序树

1.1 二叉排序树的查找

 1.2 二叉排序树的插入、生成与删除

四、散列表的查找

1. 散列表的基本概念

1.1 基本思想

 1.2 散列表的若干术语

2. 散列函数的构造方法

 3. 处理冲突的方法

3.1 开放地址法


前言

在这里插入图片描述

 关于我写这篇文章的原因及目的

我在今年寒假期间就开始看B站王卓老师的《数据结构和算法》课程了,一直想看完并完成这门课的笔记,但是前段时间由于各种其他学科的学习、算法竞赛备赛和人工智能的学习,中断了这门课的笔记记录。

趁现在处于期末复习期间,我打算继续更新这门课的笔记,既能兼顾课内复习,又可以锻炼自己写博客输出的能力,还可供其他小伙伴们阅读学习。

另外,从本篇笔记开始,我会学习各位C站大佬的排版和写作方式(这一篇的排版就很大程度上借鉴了夏目大佬的博客),争取成为一个优秀的博主!


提示:以下是本篇文章的正文内容

一、 查找的基本概念

 在前几个章节的学习中,我们探究了数据结构的三大组成部分,也就是数据的存储结构、逻辑结构和数据的运算,我们认识了线性表、树、图等数据结构,学习了它们的各种算法,接下来我们会对其中的查找和排序算法进行进一步的研究。

而这一章要研究的,就是查找算法。我们将通过几个 What、Why、How 来认识查找的基本概念。

1、在哪里查找?

凡是算法,必须要明确它的使用场景,才能实现它的价值,查找算法的使用场景就是查找表

查找表的定义区别于之前学习的线性表,它更具普适性,线性表可以说是查找表的子集。只要是同一类型数据元素构成的集合,就可以称为查找表,表内元素的关系可以自由设置,因此其应用方式灵活

2、什么是查找?

查找就是,根据给定的值,在查找表中确定一个其 关键字等于给定值 的数据元素。

这里的关键字是用来标识一个数据元素的某种数据项的值(也可以称作符号)。

分类作用
关键字唯一地标识一条记录(只对应一个数据元素)
关键字可用于识别若干记录(用次关键字找具体的数据项)

3、如何显示查找的结果?

若查找成功,则结果给出整个记录的信息,或给出记录在查找表中的位置;

若查找失败,则结果给出 “空记录” 或 “空指针” 。

4、查找的目的是什么?

  • 在不在:查询某个特定的元素是否在表中
  • 有没有:检索某个特定元素的各种属性
  • 打基础:作为之后将要进行的插入或删除操作的基础

5、查找表怎么分类?

类型功能
静态查找表仅作查询操作
动态查找表做插入和删除操作

6、如何评价查找算法的优劣性?

我们评价查找算法的优劣性的根据,是算法中关键字的比较次数,也就是平均查找长度(ASL,Average Search Length)。

平均查找长度就是关键字比较次数的期望值(查找第i个记录的概率乘以找到它所需的比较次数,再求和)

 7、在学习查找算法的过程中,我们要研究的是什么?

查找的方法取决于查找表的结构,我们在对算法进行优化之前,就要先研究查找表的存储结构,在集合中的数据元素之间人为地加上某种确定的约束关系,提高查找的效率。

总之,我们要研究的就是查找表的各种组织方法及其查找过程的实施。

作者离期末考只剩两周啦!正在紧张备考中,所以接下来就只是记录一下知识的自用笔记,没有过多的讲解,等到暑假再做一下优化~


二、线性表的查找

1. 顺序查找

1.1 顺序表的类型定义

typedef struct{
	KeyType key;//关键字域 
}ElemType;

typedef struct{
	ElemType *R;//表的基地址 
	int length;//表长 
}SSTable;//Sequential Search Table
SSTable ST;//定义顺序表ST 

1.2 顺序查找应用范围

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

1.3 顺序查找算法

初始版

int Search_Seq(SSTable ST,KeyType key){
	for(int i=ST.length;i>=1;i--)
		if(ST.R[i].key==key) return i;
	return 0;
}//若查找成功,则返回其位置信息,否则返回0 

进阶版(设置监视哨兵,减少比较次数)

int Search_Seq(SSTable ST,KeyType key){
	ST.R[0].key=key;
	for(i=ST.length;ST.R[i].key!=key;i--)
		return i;
}//若查找成功,则i不为0,返回当前i的值 

改进前后的顺序查找算法,时间复杂度都为O(n)。

1.4 提高查找效率的方法

 1.5 查找算法的优缺点

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

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

2. 折半查找

又称二分查找,每次将待查记录所在区间缩小一半。

2.1 折半查找算法

int Search_Bin(SSTable ST,KeyType key){
	int 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;//顺序表中不存在待查元素 
} 

2.2 性能分析

  •  优点:效率比顺序查找高。
  • 缺点:只适用于有序表,且仅限于顺序存储结构,对线性链表无效。


三、树表的查找

当表的插入、删除操作频繁时,为了维护表的有序性,需要移动表中的很多记录,基于此,我们会使用动态查找表,也就是几种特殊的树,表结构在查找的过程中动态生成

1. 二叉排序树

二叉排序树又称为二叉搜索树、二叉查找树,其定义如下:

二叉排序树或是空树,或是满足如下性质的二叉树:

(1)若其左子树非空,则左子树上所有结点的值均小于根节点的值;

(2)若其右子树非空,则右子树上所有结点的值均大于等于根节点的值;

(3)其左右子树本身又各是一棵二叉排序树。

 二叉排序树的性质:中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字排列的递增有序序列。

1.1 二叉排序树的查找

算法描述:

 算法分析:

 

 

 1.2 二叉排序树的插入、生成与删除

1.2.1 二叉排序树的插入:

 1.2.2 二叉排序树的生成

 一个无序序列可通过构造二叉排序树而变成一个有序序列。

插入的结点均为叶子结点,故无需移动其他结点,相当于在有序序列上插入记录而无需移动其他记录。

但需要注意的是,关键字的输入顺序不同,建立的二叉排序树也不同

1.2.3 二叉排序树的删除


四、散列表的查找

1. 散列表的基本概念

1.1 基本思想

 1.2 散列表的若干术语

散列方法(杂凑法)

        选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;

        查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比较,确定查找是否成功。

散列函数(杂凑函数)

        散列方法中使用的转换函数

散列表(杂凑表)

        按上述思想构造的表。

冲突

        不同的关键码映射到同一个散列地址。

同义词

        具有相同函数值的多个关键字。

2. 散列函数的构造方法

使用散列表要解决好两个问题:

  1. 构造好的散列函数
  2. 制定一个好的解决冲突的方案

 

 3. 处理冲突的方法

3.1 开放地址法

 

 

 

 

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

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

相关文章

Emacs之解决gtags -i --single-update占用率100%卡死问题(一百零六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

python --自动化测试UiAutomator2

安装adb 安装adb后使用命令 adb devices 出现下图即可; 安装python依赖(uiautomator2,weditor) pip install uiautomator22.16.23 weditor0.6.8 -i https://pypi.doubanio.com/simple# 在手机上安装 atx-agent 应用 # 安装apk服务到手机上 python -m uiautomator2 init脚本…

基于 Docker 部署 Mysql8.0.27_单机_主从复制

文章目录 单机部署集群部署master 部署slave 部署错误记录 单机部署 通过 dockerhub 或 docker search 查找镜像。拉取 mysql 镜像。 docker pull mysql:8.0.27创建挂载目录&#xff0c;并赋予权限。 mkdir -p /var/docker_data/mysql/data mkdir -p /var/docker_data/mysql/co…

一些关于c++的琐碎知识点

目录 bool强转 const构成重载:const修饰*p 移动构造 new int (10)所做的四件事 this指针---为什么函数里面需要this指针&#xff1f; .和->的区别 new创建对象 仿函数 new和malloc的区别 c系统自动给出的函数有 delete和delete[ ]区别何在 检查有没有析构函数 e…

六一,用前端做个小游戏回味童年

#【六一】让代码创造童话&#xff0c;共建快乐世界# 文章目录 &#x1f4cb;前言&#x1f3af;简简单单的弹球游戏&#x1f3af;代码实现&#x1f4dd;最后 &#x1f4cb;前言 六一儿童节。这是属于孩子们的节日&#xff0c;也是属于我们大人的节日&#xff08;过期儿童&…

chatgpt赋能python:**Python免费编辑器:提高开发效率和便捷性**

Python 免费编辑器&#xff1a;提高开发效率和便捷性 Python 编程语言已经成为了越来越多开发者的首选。这是因为 Python 语言非常直观易懂&#xff0c;同时也拥有庞大的第三方开源库&#xff0c;方便开发人员快速实现项目功能。Python 编程之所以如此受欢迎&#xff0c;除了这…

Java基础编程

Java入门 1. JDK的安装目录介绍 目录名称说明bin该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。conf该路径下存放了JDK的相关配置文件。include该路径下存放了一些平台特定的头文件。jmods该路径下存放了JDK的各种模块。legal该路径下存放了JDK各模块的授权文…

使用kettle进行数据统计

1.使用kettle设计一个能生成100个取值范围为0到100随机整数的转换。 为了完成该转换&#xff0c;需要使用生成记录控件、生成随机数控件、计算器控件及字段选择控件。控件布局如下图所示 生成记录控件可以在限制框内指定生成记录的个数&#xff0c;具体配置如图所示 生成随机数…

chatgpt赋能python:Python免费教学:让编程更便捷

Python免费教学&#xff1a;让编程更便捷 Python是一门广泛应用于机器学习、数据分析、网络编程和自动化测试等领域的高级编程语言。随着人工智能和大数据分析的兴起&#xff0c;Python的应用广泛受到了各个行业的欢迎&#xff0c;越来越多的人开始学习Python。在这篇文章中&a…

STM32之任务的创建与删除

目录 1. 什么是任务&#xff1f; 2. 任务创建与删除相关函数 任务动态创建与静态创建的区别&#xff1a; xTaskCreate 函数原型 官方案例&#xff1a; vTaskDelete 函数原型 3. 实操 1. 什么是任务&#xff1f; 任务可以理解为进程 / 线程&#xff0c;创建一个任务&#…

【生物力学】《人体骨肌系统生物力学》- 王成焘老师 - 第2章 - 人体几何学测量与仿真建模

第1章回到目录第3章 文章目录 2.1 概论2.2 人体几何学测量2.2.1 人体外部几何形态2.2.2 人体尺寸测量与统计处理2.2.3 中国人体尺寸标准统计测量数据2.2.4 人体各部位比例及人体间尺寸换算2.2.5 人体活动范围测量 2.3 人体骨肌系统三维几何建模的数据来源2.3.1 冷冻切片数字摄像…

“微商城”项目(2准备工作)

一.安装Node.js 本项目使用Vue.js前端框架进行开发&#xff0c;在创建项目之前需要先下载Node.js环境。Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它可以让JavaScript运行在服务器端。接下来对Node.js的下载和安装进行详细讲解。 打开Node.js官方网站&a…

RabbitMQ高频面试题

RabbitMQ的使用场景 异步发送消息&#xff08;验证码、短信、邮件…&#xff09;mysql、redis、es之间的数据同步分布式事务削峰填谷… 面试题&#xff1a;RabbitMQ如何保证消息不丢失 消息丢失原因 生产者发送的消息未到达交换机交换机未把消息路由到队列mq服务器宕机&…

辅助驾驶功能开发-功能算法篇(1)-ACC-多目标选择

1、总体架构 2、漏斗概念(Funnel) 路径漏斗是围绕着自车预测轨迹的一片区域。换言之,漏斗的中心应该根据预测的轨迹方向相应的弯曲。 2.1、普通&略宽漏斗(Normal Funnel & Wider Funnel) 普通漏斗用于选择路径中最近的目标车辆A和次近的车辆B。 更宽的漏斗用于选择…

@SentinelResource和openFeign+sentinel 对远程调用熔断降级加规则持久化的具体实 现

SentinelResource 自定义全局限流处理类 需求分析/图解 先看前面的一段代码 这个就是上面的Sentinel 热点规则 注意看我们的限制处理方法在本类中代码的耦合度高 阅读性差 不利于程序的扩展 SentinelResource的作用就是解决这个需求将处理方法放到一个类中 GetMapping("…

Docker从入门到会搭建一个简单的系统

一、环境准备 1、查看Llinux的版本 [rootlocalhost ~]# cat /etc/redhat-release 2、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld.service 3、设置开机不启动防火墙 [rootlocalhost ~]# systemctl disable firewalld.service 二、Docker的安装 1、Docker是中高…

单片机GD32F303RCT6 (Macos环境)开发 (三十二)—— GD32 SPI主从实验 中断模式

GD32 SPI主从实验 中断模式 1、接线 SPI0 PA4 PA5 PA6 PA7SPI1 PB12 PB14 PB14 PB15采用全双工模式SPI0 SPI1CS PA4----------------PB12CLK PA5----------------PB13MISO PA6----------------PB14MOSI PA7----------------PB152、spi0 主设…

chatgpt赋能python:Python简单游戏开发入门

Python简单游戏开发入门 Python作为一门流行的编程语言&#xff0c;可以用来开发各种各样的应用&#xff0c;包括游戏。虽然Python不是游戏开发的主流语言&#xff0c;但我们可以用它来制作一些简单而有趣的游戏。在这篇文章中&#xff0c;我们将介绍如何用Python创建一个简单…

批量剪辑视频工具源码开发搭建分享

搭建步骤 1. 首先需要根据自身产品确定视频类型及需要实现的视频效果 2. 根据预期视频效果选择视频上传模式&#xff0c;并将视频素材进行上传 3. 添加音频、字幕&#xff0c;标题等与素材进行组合。 4. 设置投放计划&#xff0c;包括&#xff1a;视频标题、视频话题等 5.…

Are Emergent Abilities of Large Language Models a Mirage?

Paper name Are Emergent Abilities of Large Language Models a Mirage? Paper Reading Note Paper URL: https://arxiv.org/pdf/2304.15004.pdf Video URL: https://www.youtube.com/watch?vhZspGdApDIo TL;DR 2023 年斯坦福的研究&#xff0c;探索大语言模型表现出涌…