【数据结构】八、查找

一、基本概念

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

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

二、静态查找表

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;elselow = 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);elseinsert(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.rhkb.cn/news/227573.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

【Java JVM】Java 实例对象的访问定位

Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。 但是 reference 类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用, 并没有定义这个引用应该通过什么方式去定位, 访问到堆中对象的具体位置, 所以对象访问方式也是由虚拟机实现而定的&#xff0c;主流…

深入探索小红书笔记详情API:解锁内容创新的无尽潜力

一、引言 在当今信息爆炸的时代&#xff0c;内容创新已经成为品牌和个人脱颖而出的关键。小红书&#xff0c;作为全球最大的消费类口碑库之一&#xff0c;每天产生大量的用户生成内容。而小红书笔记详情API&#xff0c;作为一个强大的工具&#xff0c;能够为内容创作者提供深入…

UG装配-添加组件

添加组件命令位置在如下位置&#xff1a;菜单-装配-组件-添加组件 添加组件命令位置在如下位置&#xff1a;菜单-装配-组件-添加组件

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字&#xff1a; public&#xff1a;表示公共的&#xff0c;可以被任何类访问。 private&#xff1a;表示私有的&#xff0c;只能被定义该关键字的类访问。 cl…

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

(学习打卡1)重学Java设计模式之设计模式介绍

前言&#xff1a;听说有本很牛的关于Java设计模式的书——重学Java设计模式&#xff0c;然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧&#xff0c;本文主要记录笔者的学习笔记和心得。 打卡&#xff01;打卡&#xff01; 设计模式介绍 一、设计模式是什么&#xff1f; …

2023年03月17日_微软和谷歌办公AI的感慨

2023年3月17日 最近这个科技圈的消息 有点爆炸的让人应接不暇了 各种大公司简直就是神仙打架 你从来没有见过这么密集的 这么高频的产品发布 昨天微软是发布了Office 365 Copilot 在里边提供了大量的AI的功能 然后谷歌呢也发布了这个Google Workspace AI 也是跟365 Cop…

据报道,微软的下一代 Surface 笔记本电脑将是其首款真正的“人工智能 PC”

明年&#xff0c;微软计划推出 Surface Laptop 6和 Surface Pro 10&#xff0c;这两款设备将提供 Arm 和 Intel 两种处理器选项。不愿意透露姓名的不透露姓名人士透露&#xff0c;这些新设备将引入先进的人工智能功能&#xff0c;包括配备下一代神经处理单元 (NPU)。据悉&#…

uniapp打包Android、Ios、微信小程序

首先我们需要在我们的代码中&#xff0c;把我们所要用到的配置信息配置好&#xff0c;在检查一下我们测试的内容是否有打开&#xff08;取消注释&#xff09;&#xff0c;在检查一下我们的版本信息是否正确&#xff0c;查看一下接口ip是否是正式线 这里的配置信息一定要配置好…

SpringBoot整合Canal

一 linux docker compose版本 1.第一步&#xff1a;基础环境 &#xff08;1&#xff09;第1步&#xff1a;安装jak、maven、git、nodejs、npm yum install maven mvn -v 安装maven时会帮安装jdkyum install git git --version 2.27.0yum in…

【Echarts】使用echarts和echarts-wordcloud生成词云图

一、下载echarts和echarts-wordcloud 地址&#xff1a;https://download.csdn.net/download/qq_25285531/88663006 可直接下载放在项目中使用 二、词云数据 词云数据是对象的格式&#xff0c;可以从后端获取&#xff0c;这里以下面数据为例 $list3 array(array(name >…

【C语言】分支与循环语句

什么是语句&#xff1f; C语句可分为以下五类&#xff1a; 表达式语句函数调用语句控制语句 &#xff08;本篇重点介绍&#xff09;复合语句空语句 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式。C语言支持三种结构&#xff1a; 顺序结构选择结构循…

【JavaScript】new原理解析

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

汇编语言指令系列

目录 &#xff08;一&#xff09;七大寻址方式 ① 立即寻址&#xff1a; ② 寄存器寻址&#xff1a; ③ 直接寻址&#xff1a; ④ 寄存器间接寻址&#xff1a; ⑤ 变指寻址&#xff1a; ⑥ 相对寻址&#xff1a; ⑦ 位寻址&#xff1a; &#xff08;二&#xff09;重要…

分类模型评估方法

1.数据集划分 1.1 为什么要划分数据集? 思考&#xff1a;我们有以下场景&#xff1a; 将所有的数据都作为训练数据&#xff0c;训练出一个模型直接上线预测 每当得到一个新的数据&#xff0c;则计算新数据到训练数据的距离&#xff0c;预测得到新数据的类别 存在问题&…

冒泡排序--------(C每日一题)

冒泡排序&#xff1a; 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论&#xff1a; n个数要进行n-1轮比较&#xff0c;第j轮要进行n-j次两两比较 循环体代码&#xff1a; int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…

Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络&#xff08;Bluetooth mesh&#xff09;概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范&#xff08;Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol&#xff09;是由蓝牙技术联盟(Bluetooth SIG)开…

力扣刷题总结 栈与队列

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 一、栈和队列的基础知识 队列是先进先出&#xff0c;栈是先进后出。同时二者都是容器适配器而不是容器。 二、题目实战 232.用栈…

Unity AssetBundle学习笔记

目录 基础介绍 动态资源加载 更新和添加内容 打包策略 资源分组 频繁更新的资源 资源压缩 Unload&#xff08;true&#xff09;和Unload&#xff08;false&#xff09; Unload(false) Unload(true) 确定何时卸载 引用计数 场景和状态管理 资源使用频率 内存预算…