C语言-数据结构-查找

目录

一,查找的概念

二,线性查找

1,顺序查找

2,折半查找

3,分块查找

三,树表的查找

1,二叉排序树

(1)查找方式:

(2)、二叉排序树的插入和生成

(3)、二叉排序树的删除

2,平衡二叉树 

(1)、什么是平衡二叉树

(2)、平衡二叉树的插入调整

(1)LL型调整

(2)RR型调整

(3)LR型调整

(4)RL型调整

3,B-树

4,B+树

四,哈希查找

1,基本概念

2,哈希函数构造方法

3 哈希冲突解决方法

1、开放定址法

2、拉链法


一,查找的概念

查找表:是由一组记录组成的表或文件,而每个记录由若干个 数据项组成,并假设每个记录都有一个能唯一标识该记录的关键字。
内查找:若整个查找过程都在内存进行,则称之为内查找;
外查找:若查找过程中需要访问外存,则称之为外查找。
动态查找表;若在查找的同时对表做修改操作(如插入和删除), 则相应的表称之为动态查找表;否则称之为静态查找表。

平均查找长度(ASL):

其中:n是查找表中记录的个数。pi 是查找第i个记录的概率,ci 是找到第i个记录所需进行的比较次数。

二,线性查找

1,顺序查找

顺序表的表示:

typedef struct{KeyType key;...//其他数据    
}ElemType;typedef struct{ElemType *R;int length; 
}SSTable;

顺序查找的算法如下(在顺序表R[0..n-1]中查找关键字为k的元 素,成功时返回找到的元素的逻辑序号,失败时返回0)

int Search_Seq(SSTable ST ,KEYType key){for(i=ST.length;i>=1;--i)if(ST.R[i].key==key)return i;return 0;
}

增加"哨兵"和"监视哨",将key值放到数组下标为0的地方,这样就可以免去每次对i的比较验证,加快查找速度,这样查找可以使查找的时间减少一半

int Search_Seq(SSTable ST ,KEYType key){ST.R[0].key=key;for(i=ST.length;ST.R[i].key!=key;--i);return i;
}
成功情况下的平均查找长度ASL: (无论是否有序查找长度不变)
不成功情况下的平均查找长度ASL: n    (有序表和无序表的平均查找长度是不同的)

2,折半查找

折半查找也称为二分查找,要求线性表中的记录必须己按关键 字值有序(递增或递减)排列。

int BinSearch(SeqList R,int n,KeyType k){ int low=1,high=ST.length,mid;while (low<=high){mid=(low+high)/2;if (ST.R[mid].key==k)return mid;if (k<ST.R[mid].key)high=mid-1;elselow=mid+1;}return 0;
}

二分查找过程可用二叉树来描述: 把当前查找区间的中间位置上的记录作为 根; 左子表和右子表中的记录分别作为根的 左子树和右子树。 这样的二叉树称为判定树或比较树

成功时的平均查找长度为:
失败时的平均查找长度为:外部节点(i-n+1)*(所在层数-1)/外部节点总数

对于n个元素,二分查找,成功时最多的关键字比较次数为:log2(n+1)  ; 不成功时关键字比较次数为:log2(n+1) 。

二分查找的时间复杂度为O(log2n)。
内部节点为n,则外部节点为n+1

3,分块查找

索引存储结构=数据表+ 索引表;

分块查找方法: 索引表(有序):可以顺序查找块,也可以二分查找块。

数据块(无序):只能 顺序查找块中元素。

查找效率:

顺序查找折半查找分块查找
ASL最大最小中间
表结构有序表/无序表有序表分块有序
存储结构顺序表/线性链表顺序表顺序表/线性链表

三,树表的查找

1,二叉排序树

二叉排序树(简称BST)又称二叉查找(搜索)树. 其定义为:二叉 排序树或者是空树,或者是满足如下性质(BST性质)的二叉树: 若它的左子树非空,则左子树上所有节点值(指关键字值)均小于根节点值; 若它的右子树非空,则右子树上所有节点值均大于根节点值; 左、右子树本身又各是一棵二叉排序树

二叉排序树的中序遍历序列递增

typedef struct node{KeyType key;//关键字项InfoType data;//其他数据域struct node *lchild,*rchild; //左右孩子指针
} BSTNode;

(1)查找方式:

BSTNode *SearchBST(BSTNode *bt,KeyType k){if (bt==NULL|| bt->key==k) //递归出口return bt;if (k<bt->key)return SearchBST(bt->lchild,k); //在左子树中递归查找elsereturn SearchBST(bt->rchild,k); //在右子树中递归查找
}
n个节点的二叉排序树的平均查找长度和树的形态有关
最好情况:ASL:时间复杂度:O(log2 N)
最坏情况:ASL: 时间复杂度:O(n)

(2)、二叉排序树的插入和生成

(1)若二叉排序树T为空,则创建一个key域为k的节点,将它作为 根节点;

(2)否则将k和根节点的关键字比较,若两者相等,则说明树中已 有此关键字k,无须插入,直接返回0;

(3)若k<T->key,则将k插入根节点的左子树中。

(4)否则将它插入右子树中。

任何节点插入到二叉排序树时,都是以叶节点插入的。

(3)、二叉排序树的删除

(1)被删除的节点是叶子节点:直接删去该节点。
(2)被删除的节点只有左子树或者只有右子树,用其左子树或者 右子树替换它(节点替换)。

(3)被删除的节点既有左子树,也有右子树:

以其中序前趋值替换之(值替换),然后再删除该前趋节点。 前趋是左子树中最大的节点。

也可以用其后继替换之,然后再删除该后继节点。后继是右子树 中最小的节点。

二叉排序树的特点
二叉排序树的中序序列是一个递增有序序列
根节点的最左下节点是关键字最小的节点
根节点的最 右下节点是关键字最大的节点

2,平衡二叉树 

(1)、什么是平衡二叉树

若一棵二叉树中每个节点的左、右子树的高度至多相差1,则称 此二叉树为平衡二叉树(AVL)。 平衡因子:该节点左子树的高度 - 右子树的高度。

(2)、平衡二叉树的插入调整

(1)LL型调整

LL型调整过程:

a, B节点带左子树α一起上升

b, A节点成为B的右孩子

c, 原来 B节点的右子树β作为A 的左子树

(2)RR型调整

RR型调整过程:

a, B 节点带右子树β一起上升

b, A节点成为B的左孩子 

c, 原来 B节点的左子树α作为A 的右子树

(3)LR型调整

LR型调整过程:

a, C节点穿过A、B节点上升

b, B节点成为C的左孩子,A 节点成为C的右孩子

c, 原来 C节点的左子树β 作为 B的右子树;原来C节点的 右子树γ 作为A的左子树

(4)RL型调整

RL型调整过程:

a, C节点穿过A、B节点上升

b, B节点成为C的右孩子,A 节点成为C的左孩子

c, 原来 C节点的左子树β 作为 A的右子树;原来C节点的 右子树γ 作为B的左子树

练习:

含有n个节点的平衡二叉树的平均查找长度为O(log2n)。

3,B-树

B-树又称为多路平衡查找树,是一种组织和维护外存文 件系统非常有效的数据结构。

定义一棵m阶B:

1, 树中每个节点至多有m个孩子节点(即至多有m-1个关键字) 最多关键字个数Max = m-1
2, 除根节点外,其他非叶子节子点至少有[m/2](向上取整)个孩子节点,最少关键字个数Min = [m/2]-1
3, 若根节点不是叶子节点,则根节点至少有两个孩子节点
4, 每个节点的结构如下,节点中按关键字大小顺序排列
5, 所有外部节点都在同一层上。B-树是所有节点的平衡因子均 等于0的多路查找树
6, 一棵B-树中总有n个关键字,则外部节点个数为n+1(外部节点就是失败节点,指向它的指针为空,不含有任何信 息,是虚设的)。

元素的添加:

1, 插入节点有空位置,即关键字个数n<m-1:直接把关键字k 有序插入到该节点的合适位置上。

2, 插入节点没有空位置,即原关键字个数n=m-1 进行分裂

元素的删除:

1,加入删除节点在叶子节点上,观察删除后是否会出现下溢出,即关键字个数小于min,如果小于观察兄弟是否有多余的节点,若有借过来,如果没有,将父节点里面的关键字下放到兄弟节点里面,然后,在与兄弟节点进行合并

2,如果不是叶子节点,找该节点的前驱或者后驱,将其顶替

4,B+树

定义m阶B+树:

1, 每个分支节点至多有m棵子树
2, 有n棵子树的节点恰好有n个关键字。
3, 所有叶子节点包含全部关键字及指向相应记录的指针,而且叶子节点按关键字大小顺序链接。并将所有叶子节点链接起来。
4, 所有分支节点(可看成是索引的索引)中仅包含它的各个子节点 (即下级索引的索引块)中最大关键字及指向子节点的指针。

四,哈希查找

1,基本概念

哈希函数把关键字为ki 的对象存放在相应的哈希地址中
哈希冲突对于两个关键字分别为ki 和kj (i≠j)的记录,有ki ≠kj ,但h(ki )=h(kj )。 把这种现象叫做哈希冲突(同义词冲突)
哈希表设计

与装填因子有关。装填因子α=存储的记录个数/哈希表的大小 =n/m α越小,冲突的可能性就越小;α越大(最大可取1), 冲突的可能性就越大。通常使最终的控制在0.6~0.9的范围内。

散列法的平均检索长度不随表中节点个数的增加而增加,而是随α的增加而增加的

与所采用的哈希函数有关 。好的哈希函数会减少冲突的发生;不 好的哈希函数会增加冲突的发生
与解决冲突方法有关 。好的哈希冲突解决方法会减少冲突的发生。

2,哈希函数构造方法

1、直接定址法: 直接定址法是以关键字k本身或关键字加上某个数值常量c作为哈希地 址的方法。直接定址法的哈希函数h(k)为: h(k) = kx+b
2、除留余数法:h(k)=k mod p ,p通常取小于等于表长的素数
3、数字分析法

3 哈希冲突解决方法

1、开放定址法

(1)线性探查法:d0 =h(k)  => d i =(di-1 +1) mod m (1≤i≤m-1)
(2)平方探查法: d0 =h(k) => d i =(d0 ± i^2) mod m (1≤i≤m-1)

2、拉链法

拉链法是把所有的同义词用单链表链接起来的方法。

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

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

相关文章

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…

macrodroid通过http请求控制手机运行宏

macrodroid adb命令 adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS例:http请求手机播放指定MP3文件 声音素材_电量过低提醒 新建一个宏 添加触发器-连接-http服务器请求 路径随意填,最好不要有特殊符号,不然浏览器识别链接会出错,…

【CSS in Depth 2 精译_098】17.3:CSS 动画延迟技术与填充模式设置 + 17.4:通过 CSS 动画传递意图的秘诀

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 17 章 动画】 ✔️ 17.1 关键帧17.2 3D 变换下的动画设置 17.2.1 添加动画前页面布局的构建17.2.2 为布局添加动画 17.3 动画延迟与填充模式 ✔️17.4 通过动画传递意图…

慧集通客户案例:致远OA与熵基考勤机集成方案

本原型公司是一家专注大健康产业的综合性高新科技形实体企业&#xff0c;按照单位的战略业务布局&#xff0c;围绕“做强做优、世界一流”的目标&#xff0c;加快内外部资源整合、加强业务协同、优化资源配置&#xff0c;有序推进大健康及相关产业的有机融合&#xff0c;加快构…

深度学习笔记(6)——循环神经网络RNN

循环神经网络 RNN 核心思想:RNN内部有一个“内部状态”,随着序列处理而更新 h t f W ( h t − 1 , x t ) h_tf_W(h_{t-1},x_t) ht​fW​(ht−1​,xt​) h t h_t ht​是new state, h t − 1 h_{t-1} ht−1​是old state, x t x_t xt​是当前时间步的输入,所有时间步共享 f W…

电脑卡顿救星,Mem Reduct 智能清理 10%以上内存

作为一款专业的内存优化工具&#xff0c;Mem Reduct凭借其强大的功能和极致的性能表现&#xff0c;成为众多用户管理系统内存的首选软件。它采用先进的内存管理算法&#xff0c;通过调用系统底层API接口&#xff0c;能够智能识别并清理各类内存占用&#xff0c;包括但不限于系统…

kibana启动报错:Invalid character in header content [“kbn-name“]

启动时候kibana报错&#xff1a; 打开 kibana配置文件&#xff0c;config/kibana.yml&#xff0c;配置上server.name即可&#xff0c;如下&#xff1a;

短视频矩阵系统后端源码搭建实战与技术详解,支持OEM

一、引言 随着短视频行业的蓬勃发展&#xff0c;短视频矩阵系统成为了众多企业和创作者进行多平台内容运营的有力工具。后端作为整个系统的核心支撑&#xff0c;负责处理复杂的业务逻辑、数据存储与交互&#xff0c;其搭建的质量直接影响着系统的性能、稳定性和可扩展性。本文将…

sql group by 多个字段例子

有表如下&#xff1b; 获取某年份、某地区、某产品的销售总额&#xff0c; 或者根据需要把字段顺序换一下&#xff1b; insert into sales (product, year, region, amount) values (飞机,2000,东部,5); insert into sales (product, year, region, amount) values (飞机,2001,…

RBAC权限控制

1、Spring Security 是一个功能强大的Java安全框架&#xff0c;它提供了全面的安全认证和授权的支持。 2 SpringSecurity配置类&#xff08;源码逐行解析&#xff09; Spring Security的配置类是实现安全控制的核心部分 开启Spring Security各种功能&#xff0c;以确保Web应…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图&#xff0c;如下&#xff1a; 图片可点击放大 接下来我们来介绍一下 推荐学习&#xff1a;GIS入门模型构建器Arcpy批量…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

Web API和Web Services的区分

前些年一提及自动化测试&#xff0c;大多是指UI界面层的自动化测试。近几年&#xff0c;随着分层自动化测试概念的兴起&#xff0c;以及自动化测试自身的发展与细分&#xff0c;自动化测试包含了更多的内容。 API(Application ProgrammingInterface&#xff0c;应用程序编程接…

使用c#制作坐标

1、建立坐标 2、坐标系的放大缩小 3、标定刻度 4、实时显示鼠标在坐标系上的坐标 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using S…

JVM实战—JVM内存设置与对象分配流转

1.JVM内存划分的原理细节 (1)背景引入 接下来介绍JVM内存的分代模型&#xff1a;新生代、老年代、永久代。现在已知代码里创建的对象&#xff0c;都会进入到Java堆内存中。如下所示&#xff0c;main()方法会周期性执行loadReplicasFromDisk()方法来加载副本数据。 public class…

Debian 12 安装配置 fail2ban 保护 SSH 访问

背景介绍 双十一的时候薅羊毛租了台腾讯云的虚机, 是真便宜, 只是没想到才跑了一个月, 系统里面就收集到了巨多的 SSH 恶意登录失败记录. 只能说, 互联网真的是太不安全了. 之前有用过 fail2ban 在 CentOS 7 上面做过防护, 不过那已经是好久好久之前的故事了, 好多方法已经不…

ASP.NET Core Web API Hangfire

ASP.NET Core Web API Hangfire 前言一、安装二、相关代码1.代码片段2.代码片段3.运行效果 三、测试代码1.即发即弃作业2.延迟作业3.重复作业4.延续作业5.页面调度作业 前言 &#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f33e;&#x1f4dd;记录学习成果&#xff0c;以…

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【Ubuntu 20.4安装截图软件 flameshot 】

步骤一&#xff1a; 安装命令&#xff1a; sudo apt-get install flameshot 步骤二&#xff1a; 设置快捷方式&#xff1a; Ubuntu20.4 设置菜单&#xff0c;点击 号 步骤三&#xff1a; 输入软件名称&#xff0c; 软件快捷命令&#xff08;flameshot gui&#xff09;&am…

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结&#xff1a; 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框&#xff0c;使用加减乘除 4.1 表面采样器 …