【数据结构】八、查找

news2025/1/17 1:08:05

一、基本概念

静态查找:只查找,不改变集合内数据元素

动态查找:有则输出元素,无则添加元素

二、静态查找表

2.1顺序查找

在线性表、链表、树中依次查找

2.2折半查找(二分查找)

有序的线性表中,每次都与中间位置元素进行比较,根据大小向左或向右缩小查找区域

#include<stdio.h>
#include<stdlib.h>

//void search(int l[], int low, int high, int value)  //二分查找递归版
//{
//	if (high < low)
//		return;
//	int mid = (low + high) / 2;
//	if (l[mid] == value)
//	{
//		printf("第%d个", mid+1);
//		return;
//	}
//	if (l[mid] < value)
//		search(l, mid, high, value);
//	else
//		search(l, low, mid, value);
//}

int search2(int* l, int n, int target)   //二分查找非递归版
{
	int low = 0, high = n - 1, mid;
	while (low <= high)   //相等时还可以比较一次
	{
		mid = (low + high) / 2;
		if (target == l[mid])
			return mid;
		else if (target < l[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}
	return -1;    //不能return0
}

int main() {
	int l[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//search(l, 0, 9, 9);
	printf("%d", search2(l, 10, 3));
}

折半查找的ASL

第一趟能比较一个元素,第二趟能比较两个元素,第三趟能比较三个元素……

总共查找次数为1*1 + 2*2 + 3*4 + 4*8+……当比较过的总元素等于表中关键字个数位置

ASL=总次数/总个数

具有12个关键字的有序表,折半查找的平均查找长度(   )

答案:(1*1 + 2*2 + 3*4 + 4*5)/ 12 = 3.1 (最好写成小数形式)

在有序线性表a[20]上进行折半查找,则平均查找长度为()

答案:3.7

(多选题)使用折半查找算法时,要求被查文件()

A.采用链式存贮结构   B.记录的长度≤12 C.采用顺序存贮结构   D.记录按关键字递增有序

答案:CD

折半查找失败的平均查找长度

构建二分查找树

第一次找到(1+12)/2=6,6就为第一个节点。如果向左,(1+5)/2=3为左孩子。如果向右,(7+12)/2=9为右孩子,如此把节点都放入树中。

补上所有空节点(图中绿色方块),这就是查找失败的位置。

失败的平均次数=求和(根节点到失败节点经过的边数)/失败节点个数

二分查找树

具有12 个关键字的有序表中,对每个关键字的查找概率相同,折半查找查找成功和查找失败的平均查找长度依次为( )

答案: 37/12,49/13

2.3分块查找

让数据分成若干子表,子表内不必有序,但要求每个子表中的数据元素值都比后一块中的数值小。然后将各子表中的最大(或最小)关键字构成一个索引表,表中还要包含每个子表的起始地址(即头指针)。

特点:块间有序,块内无序

查找:块间折半,块内线性

三、二叉排序树

定义:左子树的所有结点均小于根的值,右子树的所有结点均大于根的值;它的左右子树也分别为二叉排序树。

分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()

A.100,80, 90, 60, 120,110,130

B.100,120,110,130,80, 60, 90

C.100,60, 80, 90, 120,110,130

D.100,80, 60, 90, 120,130,110

答案:C  按照左小右大进行插入

查找:与节点比大小,往左右走;当查不到时,新建节点

node* newnode(int v) {    //新建节点,返回地址
	node* newnode = (node*)malloc(sizeof(node));
	if (!newnode) return NULL;
	newnode->data = v;
	newnode->lchild = NULL;
	newnode->rchild = NULL;
	return newnode;
}

void insert(pnode& root, int value) {  //递归寻找,定位到值该在的位置
	if (root == NULL) {
		root = newnode(value);
		return;
	}
	if (root->data > value)
		insert(root->lchild, value);
	else
		insert(root->rchild, value);
}

删除节点

节点是叶子:直接删

节点一个孩子:删掉节点,把孩子接上去

节点两个孩子:用左子树最大值或右子树最小值覆盖该节点,然后删去左子树最大值或右子树最小值

四、平衡二叉树

每个节点有一个平衡因子,它等于左子树高度 - 右子树高度

任一结点的平衡因子只能取:-1、0 或 1的树为平衡二叉树

4.1平衡旋转

插入节点导致不平衡,要进行旋转

无论哪种情况,都从最下层不平衡节点开始处理

LL型:从不平衡点开始,沿着失衡路径的下一个节点要变为新的根节点,他的孩子和父亲变为左右节点

RR型:同LL

LR型:新节点先不插入。不平衡节点的下二层节点要变为新的根,他的上面两代节点做他的左右孩子,其他节点照抄,再插入新节点

RL型:同LR

五、哈希表

哈希表是散列存储结构,由关键码的值决定数据的存储地址。查找效率O(1),与元素个数无关

冲突:由于hash函数自身存在的问题,因而经过哈希函数变换后,可能将不同的关键码映射到同一个哈希地址上,这种现象称为冲突。

装填(载)因子:a=n/m ,其中n 为关键字个数,m为表长。 装填(载)因子是表示Hsah表中元素的填满的程度。若:装载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了。反之,装载因子越小,填满的元素越少,冲突的机会减小了,但空间浪费多了。冲突的机会越大,则查找的成本越高,反之查找时间越小。

5.1哈希函数构建

除留余数法

Hash(key) = key mod p   (p是整数)

以关键码除以p的余数作为哈希地址

p的选取:若设计的哈希表长为m,则一般取p≤m且为质数

5.2冲突处理方法

线性探测法

有冲突时,向后寻找下一个空的地址,将元素存入

二次探测法

有冲突时,按照1,-1,4,-4……的次序寻找(全是平方,正负交替)

链地址法

建立一个从0到p-1的指针数组,把对应的元素链接到后面

设{ 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89 ,10}的哈希函数为:Hash(key)=key mod 11, 用拉链法处理冲突,如下图

5.3ASL

顺序表:

哈希表查找成功的平均查找长度:查找每个元素所需的对比次数求和,除以元素数

哈希表查找失败的平均查找长度:设取余数时模m。则在哈希表0~m-1号元素中,每一位查找到空元素所需要的次数求和,除以m

链表:

查找成功的平均查找长度:纵向来看,第i层元素数*i求和/元素数

查找失败的平均查找长度:横向来看,每一行查到空元素的对比次数求和/总行数

六、B树

B树是一种  m叉  平衡  排序树

1.每个节点的子树数=关键字数+1

2.根节点关键字为1~m-1

3.非根节点中关键字个数为\left \lceil m/2 \right \rceil-1~m-1

4.非根节点中子树个数为\left \lceil m/2 \right \rceil~m

三阶B树关键字数:1~2;五阶B树关键字数:2~4

5.所有的叶子结点都出现在同一层次上,并且不带信息(实际上不存在,指向这些节点的指针为空)

在一棵高为2 的5阶B树中,所含关键字的个数最少是()

答案:5    根节点最少一个,则有两个子树,非根节点最少两个,1+2+2=5

在一棵具有15个关键字的4阶B树中,含关键字的结点数最多为()

答案:15     4阶B树关键字1~3,每个节点一个关键字时节点最多

B树插入

根据大小将插入节点放到合适的区域;如果该区域超出m-1,将中间一位数上移,左右分裂

B树删除

删除叶子节点:删了不满足下限要求的时候,若兄弟有富余,删除数据后通过旋转向兄弟借;若兄弟无富余,不论父节点如何,父节点数据下移,与左右孩子节点合并。(当一个节点内无数据时,要当作数据为0的节点,不是没有节点)

删除非叶子节点:用左子树最大值进行替换,对不符合要求的节点进行删除叶子节点后同样的处理。

已知一棵3阶B树,如下图所示。删除关键字78得到一棵新B树,其最右叶结点中的关键字是(    )

答案:65    兄弟有,从兄弟借

七、B+树

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

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

相关文章

HTML5+CSS3+JS小实例:过年3D烟花秀

实例:过年3D烟花秀 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

【机器学习合集】深度生成模型 ->(个人学习记录笔记)

深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下&#xff0c;学习一个映射函数F&#xff0c;使得F(X)Y 判别模型 Discriminative Model&#xff0c;即判别式模型&#xff0c;又称为条件模型&#xff0c;或条件概率模型 生…

【privateGPT】使用privateGPT训练您自己的LLM

了解如何在不向提供商公开您的私人数据的情况下训练您自己的语言模型 使用OpenAI的ChatGPT等公共人工智能服务的主要担忧之一是将您的私人数据暴露给提供商的风险。对于商业用途&#xff0c;这仍然是考虑采用人工智能技术的公司最大的担忧。 很多时候&#xff0c;你想创建自己…

网大为卸任腾讯CXO;Midjourney 1 月训练视频模型;2023年马斯克赚了7700亿

投融资 • 2023 年大型科技公司在生成式 AI 初创企业上的投资远超风险投资集团• 恒信东方与无锡政府合作成立布局 MR/XR 技术及 3D 数字资产 AIGC 产业投资基金• 新公司法完善注册资本认缴登记制度• 网大为卸任腾讯CXO&#xff0c;曾促成南非MIH的投资• 宁波蔚孚科技完成数…

c语言函数篇——递归函数

递归函数的工作原理 递归函数的工作原理基于两个主要部分&#xff1a;基本情况和递归情况。基本情况是函数不再调用自身的条件&#xff0c;当达到基本情况时&#xff0c;递归停止并返回结果。递归情况是函数调用自身的部分&#xff0c;它将问题分解为更小的、相似的子问题。 …

【eclipse】eclipse开发springboot项目使用入门

下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 安装eclipse 其他一步一步即可 我们是开发java web选择如下 界面修改 Window->Preferences-> 修改eclipse风格主题 Window->Preferences->General->Appearance 修改字体和大小…

【力扣100】207.课程表

添加链接描述 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 思路是计算每一个课的入度&#xff0c;然后使用队列进行入度为0的元素的进出# 数组&#xff1a;下标是课程号&#xff0c;array[下标]是这个课程的入度# 哈希…

【华为机试】2023年真题B卷(python)-解密犯罪时间

一、题目 题目描述&#xff1a; 警察在侦破一个案件时&#xff0c;得到了线人给出的可能犯罪时间&#xff0c;形如 “HH:MM” 表示的时刻。 根据警察和线人的约定&#xff0c;为了隐蔽&#xff0c;该时间是修改过的&#xff0c;解密规则为&#xff1a; 利用当前出现过的数字&am…

回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 &#xff08;多指标&a…

DHCP学习记录

目录 客户端向DHCP服务端申请租用IP的4个阶段: 客户端向HDCP服务器续租IP过程: 客户端重新连接租用IP过程: 客户端释放IP 声明: (Dynamic Host Configuration Protocol)动态主机配置协议&#xff0c;客户端向DHCP服务端申请获得ip的一种约定俗成的话语(协议) 手工配置方式…

AJAX:整理3:原生AJAX的相关操作

注意AJAX的步骤 // 1.创建对象 const xhr new XMLHttpRequest()// 2.初始化 设置 请求方法 和 url xhr.open("GET", "http://localhost:9090/server")// 3.发送 xhr.send()// 4.事件绑定 处理服务端返回的结果 // readyState 是xhr对象中的属性&#xff…

初识javaWeb

一、JavaWeb是什么&#xff1f; 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…

如何处理并下载Sentinel-5数据

SENTINEL-5是欧洲空间局&#xff08;European Space Agency&#xff0c;ESA&#xff09;Copernicus计划中的一颗地球观测卫星。SENTINEL-5的主要任务是监测大气成分&#xff0c;特别是臭氧、氮二氧化物、二氧化硫、甲烷和其他气体的分布。这些观测对于了解大气污染、气候变化和…

再见2023,你好2024(附新年烟花python实现)

亲爱的朋友们&#xff1a; 写点什么呢&#xff0c;我已经停更两个月了。2023年快结束了&#xff0c;时间真的过得好快&#xff0c;总要写点什么留下纪念吧。这一年伴随着许多挑战和机会&#xff0c;给了我无数的成长和体验。坦白说&#xff0c;有时候我觉得自己好像是在时间的…

亚信安慧AntDB数据库引领数字时代通信创新

在数字经济与实体经济深度融合的时代&#xff0c;通信行业正迎来前所未有的新机遇。特别是在中国信通院的预测中&#xff0c;2027年5G专网市场规模预计将达到802亿元&#xff0c;呈现出显著的增长态势&#xff0c;年复合增长率高达42%。 亚信安慧AntDB数据库一直致力于紧跟科技…

AppWeb认证绕过漏洞(CVE-2018-8715)

一、环境搭建 二、影响版本 三、构造payload Authorization: Digest usernameadmin 四、抓包获取sesion 五、修改数据包、认证头 记得设置用户名 六、漏洞存在特征&#xff08;Gigest&#xff09;

实验九 基于FPGA的计数译码显示电路设计

基本任务一&#xff1a;利用FPGA硬件平台上的4位数码管做静态显示&#xff0c;用SW0-3输入BCD码&#xff0c;用SW4-7控制数码管位选 m100&#xff1a; frediv&#xff1a; decoder&#xff1a; 基本任务二&#xff1a;利用FPGA硬件平台上的4位数码管显示m10技术结果 扩展任…

centos 7.9 升级系统默认的python2.7到python 2.7.18

centos 7.9 升级系统默认的python2.7到python 2.7.18 备份旧版本 mv /usr/bin/python /usr/bin/python_2.7.5 下载新版本 Download Python | Python.org Python Release Python 2.7.18 | Python.org wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz cd /…

gitLab页面打tag操作步骤

作者&#xff1a;moical 链接&#xff1a;gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源&#xff1a;稀土掘金 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 ---------------------------------------------------------------------…

如何确定微服务项目中Spring Boot、Spring Cloud、Spring Cloud Alibaba三者之间的版本

文章目录 1. 版本说明2. 版本依赖关系(推荐使用)3. 用脚手架快速生成微服务的pom.xml 本文描述如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本。 1. 版本说明 我们知道Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本选择一致性非常重要…