数据结构与算法之查找

查找
基本概念:
查找表:是由同一个类型的数据元素构成的集合,对查找表经常进行的操作:
①查询某个特定的数据元素是否在查找表中。
②检索某个特定的数据元素的各种属性。
③在查找表中插入一个数据元素。
从查找表中删去某个数据元素。
静态查找表:只操作上述的1和2操作的查找表。
动态查找表:在查找到特定元素之后,对其进行修改等其他操作。
查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录。
平均查找长度:衡量查找算法的指标,查找一个结点所作的平均比较次数。所有结点查找时比较的次数和除以结点个数。

静态查找:
顺序查找:从表的一端开始,用给定值k与表中各个结点的关键字逐个比较。当查找到表的另一头的时候,还没有发现给定值,那么查找失败。
提示:此处可以设置一个监视哨,来监视数组下标是否越界。
监视哨的作用:作为越界的检测条省去在循环中每次均要判断是否越界,从而节省比较的时间。
将要查找的元素放在监视哨的位置,此处要查找的元素是25.
占用了数组的一个元素的位置。
在这里插入图片描述
在这里插入图片描述
当从最后一个元素开始查找,发现直至访问到数组下标为0的时候才相等,那么因为这个位置放的是监视哨,并不是数组里面的值。
所以查找失败。监视哨应该放在一个固定知道的位置上,最好是第一个。但是不一定必须是第一个。
查找表的存储结构:可以是一个结构体,里面有一个唯一标识此元素的成员变量,例如:id,那么查找的时候就以这个唯一标识来进行查找。
查找成功的平均查找长度(在等概率的前提下)
ASL=(1+2+…+n)/n=(n+1)/2。
查找失败的平均查找长度是n+1;
顺序查找的特点:
①算法简单,对线性表的逻辑次序无要求。
②存储结构可采用顺序或链式存储结构均可,但其平均查找长度比较大,均为:(n+1)/2。

二分查找(折半查找):
条件:表中结点必须按关键字有序且采用顺序存储。
思想:取中,比较。
①用给定的k与有序表的中间位置mid上的 结点的关键字比较,若相等,查找完毕,否则:②③两种情况
②若r[mid].key>k,则在左子表中继续进行二分查找;若r[mid].key<k,则执行(3):
③在右子表中继续进行二分查找。
示例:
元素线性表必须有序。
查找k=35.
在这里插入图片描述
使用两个变量,i指向第一个元素,j指向最后一个元素。
当前面指向i大于最后指向j时,查找失败。
取另一个变量来存储中间元素的下标。m=(i+j)/2=6;r[m]>k:在左半部分继续查找。
此时:i=1;j=m-1=5;m=(i+j)/2=3;r[m]<k:在右半部分继续查找。
接着:i=m+1=4;j=5;m=(i+j)/2=4;r[m]==k。:查找成功。

查找失败的示例:
在这里插入图片描述
算法描述:
在这里插入图片描述
算法衡量:从上至下是与指定值比较的是元素的先后顺序。借用二分查找判定树。
1:查找第五个元素;22:查找第二个或者第八个元素。
4
3:查找第1、3、6、9。
3*4:查找第4、7、10。
在这里插入图片描述
如果n=11;
在这里插入图片描述

索引顺序表的查找:
分块查找,又称为索引顺序查找。是顺序查找的改进。需要建立一个索引表。
标识是每个块中的最大关键字。
在这里插入图片描述
例如查找45:45大于22,小于48,那么45就在第二个块当中。
整个查找的过程是:在索引表中查找一遍,确定在哪个块当中,
在确定的块当中查找一遍,确定目标查找元素的下标。

动态查找表
树表的查找。
1、二叉排序树
可以为空。否则:
①有一个根,若根的左子树非空,则左子树上的所有结点的关键字值均小于根结点的值,若根的右子树非空,则右子树上的所有结点的关键字值均大于根结点的值。
②左右子树同样是二叉排序树。
二叉排序树的特点:中序遍历得到的是一个有序序列(升序)。

查找方法:
若根结点的关键字值等于查找的关键字,查找成功。
否则,若小于根结点的关键字值,查其左子树。若大于根结点的关键字的值,则查找其右子树。子树的操作类似。
在这里插入图片描述
查找成功:
如果查找24:24小于45,则查找左子树,45大于12,则查找12 的右子树,24小于37,则查找37的左子树。发现正好等于24.则查找成功。

查找失败:
如果查找60:60大于45,则查找右子树,60大于53,则查找53的右子树,60小于100,则查找100的左子树,60小于61,则查找61的左子树,发现61的左子树为空,那么查找失败。

结点结构及类型定义:
一个关键字,和两个指向左右孩子的指针。
在这里插入图片描述
非递归算法:
在这里插入图片描述
p表示要找到的结点的双亲结点的指针。(方便进行修改等操作)
k表示要查找的结点值。
t表示根结点。

递归算法:
在这里插入图片描述
t:根结点指针。
k:目标结点值。

二叉排序树的插入

若二叉树为空。则先生成根结点。

若二叉树非空:

①首先执行查找算法,找出被插结点的双亲结点。

②判断被插结点是其夫妻结点的左、右孩子,将其作为叶子结点插入。

在这里插入图片描述
此处的60就是插入的结点。整个查找线路用箭头表示出来了。

插入算法:

k:表示要插入的关键字值。

t:根结点指针。

在这里插入图片描述
其中:bstsearch函数是查询k结点的双亲结点。

构造二叉排序树:

将目标数值组中的数字逐个插入。起初的树是一个空树。
在这里插入图片描述
二叉排序树的查找分析
在这里插入图片描述
如果是左右子树相对平衡的话,那么查找长度比相对不平衡的查找长度低,由此引出平衡二叉排序树。

二叉排序树的删除:

1、
在这里插入图片描述
将24的双亲结点的指针赋值为空,就是删除。

2、子树的根结点的删除
在这里插入图片描述
3、被删除结点的左子树和右子树都不为空时。
①用左子树中最大的结点值来代替删除结点的位置。
②用被删除结点的左子树的跟结点来替代。此时被删除结点的右子树移至被删除结点的左子树的最大值结点的右子树位置上。
在这里插入图片描述
算法:①查找
②若被删除结点没有左子树,则用右孩子代替他。
③若被删除结点有左子树,则在其左子树中找到中序遍历下最后一个结点r,使被删结点的右子树称为r结点的右子树,并用被删结点的左孩子代替被删结点。
在这里插入图片描述
2、平衡二叉树
又称为AVL树。可以是空树,或者:左子树和右子树都是平衡二叉树,且左子树和右子树深度之差的绝对值不超过1.

平衡因子:当前结点的左子树深度-右子树深度。
s
在这里插入图片描述
每一个结点的平衡因子为:0,1,-1(当一棵树的每个结点的平衡因子都在这三个值的范围内的话,那么当前这棵树一定是平衡二叉树);
平衡二叉树的插入:
(1)找插入位置;
(2)插入结点;
(3)若插入后导致当前树不平衡,则进行调整。
插入之后平衡的例子:
在这里插入图片描述

插入后导致不平衡的例子:
在这里插入图片描述
插入结点15之后,发现当前树的结点的平衡因子超出范围,所以不平衡。
在这里插入图片描述
平衡二叉树的四种方式:(旋转前后树的中序遍历次序不变)
(1)LL;单向右旋平衡处理:插入结点的位置在首影响的第一个结点(也就是插入结点后,距离插入结点最近的超出平衡因子范围的结点)的左子树的左子树上。
在这里插入图片描述通俗解释:因为导致树不平衡的原因是左子树深度大于右子树深度,所以应该想办法让根结点的左子树变短,右子树变长,则将根结点的左子树的根结点作为整棵树的根结点,A就成了B的右子树的根结点了,其次E原本是B的右子树,所以大于B,但是原本E小于A,那么将E结点作为A结点的左子树。

(2)LR;新插入结点在首影响结点的左子树的右子树上。(插入结点在C结点上,但是不确定在C的左子树或者右子树上插入新结点,可以不用刻意去纠结这个,直接按照这里的思维进行旋转即可)
在这里插入图片描述
先左转,将C作为A的左子树的根结点,接着将A向右转。也可以理解为先将C绕着B往左转(逆时针),接着绕着A向右转(顺时针)
如果插入点在Cr上,那么旋转之后就在A的左子树Cr上插入。
在这里插入图片描述
(3)RR旋转:在右子树的右子树上加一个结点。
在这里插入图片描述
在这里插入图片描述
(4)RL:双向旋转(先右后左):插入结点位于受影响结点的右子树的左子树上。先向右旋转,在向左旋转。
也可以借用平衡方法来构造平衡二叉树。
在这里插入图片描述

B树

B树不是二叉树。
1、B-树
m阶B-树,要么是一颗空树,要么是一颗满足以下条件的树。
(1)树中每个结点最多有m个子树。
(2)若根结点不是叶子结点,则至少有2个子树;
(3)除根结点外的所有非叶子结点至少有m/2个子树。
在这里插入图片描述
4阶B-树
在这里插入图片描述
1:n,关键字的个数。
35:ki,关键字。
Ri:记录35的地址。
4阶B-树,说明这个树里面结点最多有四个子树。
B-树柿一颗m叉平衡排树。

B-树的查找:
例如找47:
47大于35,则按照35结点的右指针指向的子树中找,接着47>43,但是47<78,则在中间指针指向的结点查找。

例如查找30:
首先小于35,去左边找,大于18,接着去右边找,大于27,去右边找,发现下面的是叶子结点,那么此次数值查找失败。

B-树的插入:
先进行查找,如果找到该结点,那么不需要插入了,如果没有找到,也就是找到叶子结点,那么此时可以插入。
因为在定义中表明了叶子结点都在同一层,且没有携带信息,所以插入结点的位置不可能是叶子结点。
在这里插入图片描述
插入之后不能破坏之前定义时的规定,也就是当前结点的的子节点不能超过这个B-树的阶数。

2、B+树
与B-树的区别在于
(1)有n个子树的结点中含有n个关键字。
(2)所以叶子结点中包含了所以关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
(3)所以非终端结点可以看成是索引部分,结点中只含有子树中最大(或最小)的关键字。
在这里插入图片描述
整体构造就是索引记录索引,多层索引确定最终的数据集合。
每一层的查找算法如同前面的索引顺序表的查找。通过索引查找索引,一直到索引查找到具体的数值。

这里需要注意,在叶子结点中查找到具体数值才算找到,在索引表中找到相等的值还需要继续向下找。因为所有的数据都存放在叶子结点中。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
前言&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.2 第1章 ASP简介&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.&hellip;..1 1.1ASP的特点&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.1 1.2ASP的优势&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.2 1.3 ASP与HTML&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.3 1.4 ASP的内置对象&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;..4 1.4.1 Request对象&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.4 1.4.2 Response对象&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;..4 第2章 为什么要开发一个新闻发布系统&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.6 第3章 Access数据库&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;8 3.1 数据库概念&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.8 3.2 Access数据库特点&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;.8 3.3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值