【数据结构】八、查找

一、基本概念

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

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

二、静态查找表

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.mzph.cn/news/586129.shtml

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

相关文章

macos下转换.dmg文件为 .iso .cdr文件的简单方法

为了让镜像文件在mac 和windows平台通用, 所以需要将.dmg格式的镜像文件转换为.iso文件, 转换方法也非常简单, 一行命令即可 hdiutil convert /path/to/example.dmg -format UDTO -o /path/to/example.iso 转换完成后的文件名称默认是 example.iso.cdr 这里直接将.cdr后缀删…

C#高级 08Json操作

1.概念 Json是存储和交换文本信息的语法。类似于XML。Json比XML更小、更快、更易解析。Json与XML一样是一种数据格式。Json是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。Json采取完全独立于语言的文本格式&#xff0c; 但是也使用了类似于C语言的习惯。这些特性使…

2047过滤空格(C语言)

目录 一&#xff1a;题目 二&#xff1a;思路分析 三&#xff1a;代码 一&#xff1a;题目 二&#xff1a;思路分析 1.首先&#xff0c;这道题是一个字符串的问题&#xff0c;我们要先知道字符串存放在char类型的数组中的&#xff0c;并不是一个变量就可直接存放的下一个完整…

1.Linux快速入门

Linux快速入门 Linux操作系统简介Linux操作系统优点Linux操作系统发行版1. Red Hat Linux2. CentOS3. Ubuntu4. SUSE Linux5. Fedora Linux 32位与64位操作系统的区别Linux内核命名规则 Linux操作系统简介 Linux操作系统是基于UNIX以网络为核心的设计思想&#xff0c;是一个性…

云计算:OpenStack 配置云主机实例的存储挂载并实现外网互通

目录 一、实验 1. 环境 2.配置存储挂载 3.云主机实例连接外部网络&#xff08;SNAT&#xff09; 4.外部网络连接云主机实例&#xff08;DNAT&#xff09; 二、问题 1.云主机 ping 不通外部网络 2.nova list 查看云主机列表报错 3.nova list 与 virsh list --all有何区…

【代码随想录】刷题笔记Day42

前言 这两天机器狗终于搞定了&#xff0c;一个控制ROS大佬&#xff0c;一个计院编程大佬&#xff0c;竟然真把创新点这个弄出来了&#xff0c;牛牛牛牛&#xff08;菜鸡我只能负责在旁边喊加油&#xff09;。下午翘了自辩课来刷题&#xff0c;这次应该是元旦前最后一刷了&…

行车记录仪变清晰,变高清的办法一定要收藏

有时候我们会发现行车记录仪拍摄的视频不够清晰&#xff0c;特别是出现事故需要视频为证的时候&#xff0c;如果视频太模糊&#xff0c;很难获得交警的支持&#xff0c;那么如何让行车记录仪拍摄的视频变得更加清晰呢&#xff1f; 小编给大家分享几个办法&#xff0c;建议收藏…

Android实验:contentprovider 实验+SQLite 数据库的实现

目录 SQLite实验目的实验内容实验要求项目结构代码实现结果展示 SQLite SQLite 是一个开源的嵌入式关系数据库&#xff0c;实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库系统不同&#xff0c;…

轻松实现iphone截图传电脑

目录 摘要 引言 用户登录工具和连接设备 生成截图 摘要 本篇博文介绍了克魔助手这款工具&#xff0c;解决了iPhone与Windows系统下图片传输的烦恼。通过连接同一Wi-Fi&#xff0c;使用克魔助手轻松实现了iPhone截图传输到电脑上的便捷操作。用户只需简单地下载并安装克魔助…

前端优化 - 防抖和节流

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

Harmony全局应用生命周期 EntryAbility.ts 讲解

之前 我们说过 page页面的生命周期 组件的生命周期 其实他和uni一样有一个整个应用的生命周期 我们如下图打开EntryAbility.ts 这是我们整个程序app的状态控制 他这里也有几个全局的生命周期 比如 我们手机 点开当前 App 启动 app 会触发 它的 onCreate 生命周期 当我们从手…

Elasticsearch 8.X进阶搜索之“图搜图”实战

Elasticsearch 8.X “图搜图”实战 1、什么是图搜图&#xff1f; "图搜图"指的是通过图像搜索的一种方法&#xff0c;用户可以通过上传一张图片&#xff0c;搜索引擎会返回类似或者相关的图片结果。这种搜索方式不需要用户输入文字&#xff0c;而是通过比较图片的视…

前端八股文(工程化篇)

目录 1.常用的git命令有哪些&#xff1f; 2.git rebase和git merge的区别 3.有哪些常见的Loader和Plugin&#xff1f; 4.webpack的构建流程 5.bundle,chunk,module是什么&#xff1f; 6.如何提高webpack的打包速度 7.vite比webpack快在哪里 8.说一下你对Monorepo的理解 …

MySQL MVCC精讲

版本链 我们前面说过&#xff0c;对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff08;row_id并不是必要的&#xff0c;我们创建的表中有主键或者非NULL的UNIQUE键时都不会包含row_id列&#xff09;&#xff1a; trx_id&#xff…

GBASE南大通用-GBase 8s分片表操作 提升大数据处理性能

目录 一、GBase 8s分片表的优势 二、六种分片方法 轮转 1.轮转法 基于表达式分片 2.基本表达式 3.Mod运算表达式 4.Remainder关键字方式 5.List方式 6.interval 固定间隔 三、分片表的索引 1.创建索引的注意事项 2.detach索引替代delete功能展现 3.在现有分片表上增加一个新…

状态模式-概述

在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c; 而且对象在不同的状态下也将具有不同的行为。相同的方法在不同的状态中可能会有不同的实现。 为了实现不同状态下对象的各种行为以及对象状态之间的相互转换…

【Apache Doris】自定义函数之 JAVA UDF 详解

【Apache Doris】自定义函数之 JAVA UDF 详解 一、背景说明二、原理简介三、环境信息3.1 硬件信息3.2 软件信息 四、IDE准备五、JAVA UDF开发流程5.1 源码准备5.1.1 pom.xml5.1.2 JAVA代码 5.2 mvn打包5.2.1 clean5.2.2 package 5.3 函数使用5.3.1 upload5.3.2 使用 六、注意事…

2023年03月18日_微软office365 copilot相关介绍

文章目录 Copilot In WordCopilot In PowerpointCopilot In ExcelCopilot In OutlookCopilot In TeamsBusiness Chat1 - copilot in word2 - copilot in excel3 - copilot in powerpoint4 - copilot in outlook5 - copilot in teams6 - business chat word 1、起草草稿 2、自动…

JavaScript使用教程(二):类型、值和变量

计算机程序通过操作值&#xff08;如数值3.14&#xff09;或文本&#xff08;如“Hello World”&#xff09;来工作。编程语言中这些可以表示和操作的值被称为类型&#xff0c;而一门语言支持的类型集也是这门语言最基本的特征。程序在需要把某个值保存下来以便将来使用时&…

VSCODE 修改Test模式下的的java jvm堆内存大小

在settings.json中添加如下语句 "java.test.config": {"vmArgs": ["-Xmx12G"]},