数据结构【查找】

news2024/10/11 6:29:05

第八章 查找

提前了解:
1、关键字: 若关键字能唯一标识一个数据元素,则关键字称为主关键字;若能标识若干个数据元素的关键字称为次关键字;
2、查找(检索):顾名思义,给定一个值,进行查找;若存在值则查找成功,反之查找失败;
3、查找方法评价指标:其中pᵢ为查找第i个记录的概率;cᵢ查找第i个记录需要进行比较的次数;
在这里插入图片描述

一、静态查找
1、定义:在查找时只对数据元素进行查询或检索,查找表称为静态查找表;
2、顺序查找:给定值,挨个找,从大往小比;

  • 算法分析:
    • 查找成功时的平均查找长度ASL;
      在这里插入图片描述
    • 查找不成功时ASL=3(n+1)/4;

3、折半查找(二分查找):效率高;查找表中的所有记录都是按照关键字有序或者降序排好的;查找时都是将待查记录所在的区间缩一半,直到找到或者找不到为止;查找成功时ASL=n+1/n·log₂(n+1)-1,但n>50时,ASL=log₂(n+1);

  • 查找思想:采用Mid、Low、Hight指针;和二分排序差不多;Mid=(Low+Hight)/2取下整(就是数学里的取中位数);
    在这里插入图片描述

4、散列查找
二、动态查找
1、定义:在实施查找的同时,插入查找表中不存在的记录,或从查找表中删除已存在的某个记录,查找表称为动态查找表;
2、二叉排序树的查找:找最大值即为右子树最后的结点值,找最小值即左节点最后的结点值;或为空,或具有以下性质;

  • 左子树不为空即所有左子树上的结点都小于根结点的值;
  • 右子树不为空即所有右子树上的值大于根结点的值;
  • 左右子树也分为二叉排序树;

3、二叉排序树的插入:遇到比根大值往右走,遇到比根小值往左走;
在这里插入图片描述

4、二叉排序树的删除:如果被删的结点只有一个子结点,可直接将子结点连到被删结点的父结点上;若被删结点有两结点,那就以右子树内最小的结点代替被删的结点树;
在这里插入图片描述
在这里插入图片描述

5、二叉排序树的性能分析:插入和删除运行时间为O(H),H为树的高度;
6、二叉排序树的查找如何求ASL:左是等概率的情况,右是最坏的情况;
在这里插入图片描述

7、二叉排序树查找算法的平均查找长度ASL,主要取决于树的高度,即与二叉树的形态有关。如果二叉排序树是一个单支树,其平均查找长度与单链表相同,为O(n);如果二叉排序树的左右子树的高度差不超过1,这样的二叉排序树称为平衡二叉树。它的平均查找长度达到O(log₂n)。
8、平衡二叉树:左右子树深度之差不超过1,左右子树也都是平衡二叉树;递归定义;

  • 平衡因子:左子树的深度减去右子树的深度则称为该结点的平衡因子;一般只能是-1、0、1;一棵二叉树既是二叉排序树又是平衡二叉树则称为平衡二叉排序树;
  • 平衡旋转:保持有序性,又具有平衡性;
    在这里插入图片描述
  • LL型平衡化旋转(右单旋转):若在结点A的左孩子B结点的左子树上插入新结点,则回导致不平衡,那么先保持左孩子B结点和孩子的左子树不动,将它孩子的右子树移到结点A的左边,最后进行右翻转,A结点变成B结点(连带它们的子树一起变);
  • LR型平衡化旋转(先左后右双旋转):若在A的左孩子(L)的右子树®上插入了新结点,A的平衡因子由1增至2,导致以A为根失去平衡,需要进行两次旋转操作。先左旋转后右旋转。先将A结点的左孩子B的右子树的根结点C向左上旋转提升到B结点的位置,然后再把该C结点向右上旋转提升到A结点的位置;
  • RL平衡旋转(先右后左双旋转):若在A的右孩子®的左子树(L)上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要进行两次旋转操作。先右旋转后左旋转。先将A结点的右孩子B的左子树的根结点C向右上旋转提升到B结点的位置,然后再把该C结点向左上旋转提升到A结点的位置。RL型平衡化旋转;
  • RR平衡旋转(左单旋转):若在A的右孩子®的右子树®上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。将A的右孩子B向左上旋转代替A成为根结点,将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树。

三、散列表
1、哈希函数:简单理解就是你给一个数据,它给你个对应的地址;
2、哈希表:应用哈希函数,由记录的关键字确定记录在表中的地址,并将记录放入此地址,然后构成的表(里头是数据对应着地址位);
3、哈希查找:利用哈希函数进行查找的过程;
4、冲突:两不同数据地址一样;
5、同义词:两不同数据地址一样;
6、设计方法(由于哈希函数通常是一种压缩映象,所以冲突不可避免,只能尽量减少;当冲突发生时,应该有处理冲突的方法)

  • 散列表的空间范围,即确定散列函数的值域;
  • 构造合适的散列函数,使得对于所有可能的元素(记录的关键字),函数值均在散列表的地址空间范围内,且出现冲突的可能尽量小;
  • 处理冲突的方法;即当冲突出现时如何解决。
    7、如何构造:只要使任何关键字的哈希函数值都落在表长允许的范围之内即可;
    8、评价因素:
  • 散列函数的构造简单;
  • 能“均匀”地将散列表中的关键字映射到地址空间;所谓“均匀”(uniform)是指发生冲突的可能性尽可能最少。

9、方法:直接定址法、数字分析法、除留余数法、冲突处理法;
10、冲突处理方法:开放定址法;

  • 线性探测法
    • 优点:只要表不满总会找到个地址;
    • 缺点:容易聚集(也就是每个冲突的地址都会比较靠近,那么会产生更多的冲突机会);
      在这里插入图片描述
  • 二次探测法(循环的表)
    • 优点:探测序列跳跃式地散列到整个表中,不易产生冲突的“聚集”现象;
    • 缺点:不能保证探测到散列表的所有地址;
      在这里插入图片描述
  • 再散列法
    • 优点:不易产生冲突的“聚集”现象;
    • 缺点:计算时间增加;
  • 链地址法(简单来说就是余数相同的放一块)
    • 优点:不易产生聚集,删除也很简单;
      在这里插入图片描述

11、散列查找性能分析:尽管散列表在关键字与记录的存储地址之间建立了直接映象,但由于“冲突”,查找过程仍是一个给定值与关键字进行比较的过程,评价哈希查找效率仍要用ASL;

  • 哈希查找时关键字与给定值比较的次数取决于:
    • 哈希函数;
    • 处理冲突的方法;
    • 哈希表的填满因子a;
    • a=表中填入的记录数/哈希表长度;

12、散列表的ASL总结公式:
在这里插入图片描述

13、例题:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

T113-S3-全志平台wpa_supplicant/hostapd交叉编译移植

目录 前言 一、源码获取 二、编译前准备 三、hostapd交叉编译 四、wpa_supplicant交叉编译 总结 前言 在嵌入式系统开发中,交叉编译和移植wpa_supplicant和hostapd是实现无线网络功能的重要步骤。本文将分享在T113-S3全志平台上成功交叉编译和移植wpa_supplicant和h…

Visual Studio Code Python 扩展中的包管理

排版:Alan Wang Python 凭借其简单的语法和强大的库,目前已成为最流行的编程语言之一,也是最适合那些刚接触编程的人们的语言。但是,随着项目复杂性和规模的增长,管理依赖项的复杂性也会增加。当新用户不断承接更成熟的…

【C++STL标准库】算法,仿函数与空间适配器

仿函数: 长得像函数,但是不是函数 实际上就是在类或结构体中重载了()运算符 结构体仿函数: struct aMax {int operator()(int a, int b) {return a > b ? a : b;} };类仿函数: class Max{ public:i…

YOLO 划分数据集(训练集、验证集、测试集)

目录 前言训练集、验证集(8:2)训练集、验证集、测试集(7:2:1) 前言 本博客是在我的另一篇博客 VOC 格式与 YOLO 格式的相互转换 的基础上进行的,有需要可以参考 以下代码亲测可以直接复制运行(以下所有的路…

13.5 【Linux】使用者的特殊 shell 与 PAM 模块

13.5.1 特殊的 shell, /sbin/nologin 我们所谓的“无法登陆”指的仅是:“这个使用者无法使用 bash 或其他 shell 来登陆系统”而已,并不是说这个帐号就无法使用其他的系统资源。举例来说,各个系统帐号,打印工作由 lp这个帐号在管…

【100天精通python】Day15:python 第三方模块和包,模块如何以主程序形式执行

目录 1 常用的第三方模块 2. 第三方模块的安装和使用 2.1 安装第三方模块: 2.2 导入第三方模块: 2.3 使用第三方模块: 3 模块以主程序形式执行 4 python 中的包 4.1 python程序的包结构 4.2 创建包 4.3 python中包的导入和使用 5 …

不同起点转角相遇,从抖音和小红书看「社区产品」宿命 | 融云观察

点击报名 8 月 3 日(周四)融云直播课~ 作为社交产品全球热点,Threads 偷袭 Twitter 以及由此升级的马斯克和扎克伯格约架给全球用户上演了一出好戏。关注【融云全球互联网通信云】了解更多 别打啦~ 马斯克直接在新闻下面回复“竞争可以&#…

Ubuntu 22.04下对无线网络作静态ip设置

内容如题所示,最近本人安全毕业,参加工作了,此处应有鲜花和掌声,哈哈哈。但新的生活总是有很多的小问题,坎坎坷坷,所以,我继续记录工作和学习生活中遇到的问题。 今天带我的云哥给了我一个ip&am…

Docker——compose单机容器集群编排

Docker——compose单机容器集群编排 一、Docker-compose概述1.为何需要Docker-compose2.Docker-compose 的特征3.Docker-compose 的优势4.Docker-compose 的劣势5.Docker-compose 的生产环境 二、Docker Compose 环境安装三、YAML 文件格式及编写注意事项四、Docker Compose配置…

最快桌面UI:Siticone Desktop UI 2.1.1 cRACK

富图尔主义控制 80 多个 .NET UI 组件和控件 现代未来 UI/UX 组件 为 Visual Studio 开发做好准备 无限的免费产品支持案例 超轻量和快速性能 广泛可定制和主题化 低资源消耗和占地面积 免版税开发和部署 NET 的最佳 UI 和 UX 库 从最好的图书馆探索无缝流畅的体验 使…

vue项目 运行时出现It works!却不显示页面 问题解决方案

问题描述 运行一个vue项目时,一切正常,没有报错,但是点开网页链接后,显示空白页面,空白页面上有个It works! 如图所示 问题分析 It works!页面出现说明vue项目配置正常,但是无法显示…

JenKins工作流程

程序员提交代码到Git/SVN仓库,触发钩子程序向 JenKins 进行通知,Jenkins 调用Git/SVN插件获取源码,调用Maven打包为war包,调用Deploy to web container插件部署到Tomcat服务器。

【AST抽象语法树】结构分析及特性

什么是AST? AST译名抽象语法树(Abstract Syntax Tree),是一种用于表示源代码结构的数据结构。 它在编译器、解析器和静态代码分析等领域中被广泛使用。 AST结构分析 我们利用成熟的astexplorer来进行结构化的比较和分析。可以尝试登录以下网…

Fiddler学习笔记

Fiddler简介 学习Fiddler的基础前置知识 请求行又包括请求方法,统一资源定位符、请求协议及版本号 统一资源定位符就是资源的绝对路径 请求体里写服务器需要的参数 304是服务器没有变化,根据请求头发现请求的内容和本地一样,就不再发回来了 …

【雕爷学编程】Arduino动手做(172)---WeMos D1开发板模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

7.python设计模式【桥结模式】

内容:将一个事物的两个维度分离,使其都可以独立变化角色: 抽象(Abstraction)细化抽象(RefinedAbstraction)实现者(Implementor)具体实现者(ConcreteImplement…

Ubuntu16.04LTS安装ROS测试小海龟样例

一、参考资料 在Ubuntu中安装ROS Kinetic ROS安装ubuntu16.04 无需科学上网解决sudo rosdep init初始化问题 二、安装ROS关键步骤 1. 选择ROS版本 ROS安装选择 Ubuntu版本不同,对应安装的ROS版本也不同,务必版本对齐;Kinetic版本的ROS对…

iPortal 注册登录模块扩展开发

作者:yx 文章目录 前言一、示例代码简介二、对接 iPortal REST API 接口2.1、登录模块扩展开发2.2、注册模块扩展开发 三、页面内容及样式实现四、配置启用定制页面 前言 针对注册登录模块,iPortal 允许用户通过 iFrame 方式接入自行开发的页面&#xf…

JavaWeb开发(后端Web开发【一】)

文章目录 前言一、Maven1.Maven概述-介绍1.1.Maven概述-介绍1.2.Maven概述-安装 2.IDEA集成Maven2.1.IDEA集成Maven-配置Maven环境2.2.IDEA集成Maven-创建Maven项目2.3.IDEA集成Maven-导入Maven项目 3.Maven-依赖管理3.1.Maven-依赖管理-依赖配置3.2.Maven-依赖管理-依赖传递3.…