IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法——查找 -> 正文阅读

[数据结构与算法]算法——查找

文章目录

一. 基本概念和评价

1. 相关概念

在这里插入图片描述

2. 查找表

2.1 常见操作

在这里插入图片描述

2.2 分类

  • 静态查找表
  • 动态查找表

在这里插入图片描述

3. 查找算法的评价指标

在这里插入图片描述

  • ASL的数量级反应了查找算法时间复杂度

查找成功的平均查找长度
在这里插入图片描述

查找失败的平均查找长度

在这里插入图片描述

二. 线性结构查找

1. 顺序查找算法

1.1 定义

在这里插入图片描述

1.2 算法思想

在这里插入图片描述

1.3 特点

在这里插入图片描述

1.4 分类

在这里插入图片描述

1)无哨兵的无序线性表的顺序查找

在这里插入图片描述

2)有哨兵的无序线性表的顺序查找

优点:无需判断是否越界,效率更高

在这里插入图片描述

3)对有序表进行顺序查找

在这里插入图片描述
优点:查找失败时ASL更少

  • 查找失败时可以不用再比较到表的另一端就能返回查找失败的信息,从而降低顺序查找失败的平均查找长度

4)各关键字被查概率不同

在这里插入图片描述
优点:查找成功时ASL更少

1.5 查找判定树

对有序表用查找判定树分析ASL

  • 树中的圆形结点表示有序线性表中存在的元素;树中的矩形结点称为失败结点(若有n个结点,则相应地有n+1个查找失败结点),它描述的是那些不在表中的数据值的集合。若查找到失败结点,则说明查找不成功

在这里插入图片描述
在这里插入图片描述

1.6 查找效率分析(ASL)

在这里插入图片描述

2. 折半查找算法

2.1 算法思想

在这里插入图片描述
特点:

  • 因为折半查找需要方便地定位查找区域,所以它要求线性表必须具有随机存取的特性。因此,该查找法仅适合于顺序存储结构,不适合于链式存储结构,且要求元素按关键字有序排列

在这里插入图片描述

2.2 算法实现

在这里插入图片描述

2.3 查找判定树

1)定义

用来描述折半查找过程的二叉树,称为判定树

  • 树中每个圆形结点表示一个记录,结点中的值为该记录的关键字值;树中最下面的叶结点都是方形的,它表示查找不成功的情况。
  • 从判定树可以看出,查找成功时的查找长度为从根结点到目的结点的路径上的结点数,而查找不成功时的查找长度为从根结点到对应失败结点的父结点的路径上的结点数;
  • 每个结点值均大于其左子结点值,且均小于于其右子结点值

2)构造

在这里插入图片描述

3)特性

性质1:
在这里插入图片描述

  • 用折半查找法查找到给定值的比较次数最多不会超过树的高度

性质2:
在这里插入图片描述

2.4 查找效率分析(ASL)

在这里插入图片描述
在这里插入图片描述

三. 树形结构查找

1. 二叉排序树(二叉查找树/BST)

1.1 相关概念

在这里插入图片描述

1.2 基本操作

1)查找操作

在这里插入图片描述
在这里插入图片描述

2)插入操作

在这里插入图片描述

3)构造二叉排序树、

  • 二叉排序树作为一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字值等于给定值的结点时再进行插入的

在这里插入图片描述

4)删除操作

  • 在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点从存储二叉排序树的链表上摘下
  • 将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会丢失

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.3 查找效率分析(ASL)

  • 二叉排序树的查找效率,主要取决于树的高度

在这里插入图片描述

1)查找成功

在这里插入图片描述

2)查找失败

在这里插入图片描述

3)二叉排序树与二分查找的比较

在这里插入图片描述

2. 二叉平衡树(AVL)

2.1 相关概念

1)为什么需要平衡二叉树

为避免树的高度增长过快,降低二叉排序树的性能,规定在插入和删除二叉树结点时,要保证任意结点的左、右子树高度差的绝对值不超过1

2)定义

在这里插入图片描述

2.2 基本操作

1)插入

在这里插入图片描述

  • 每次调整的对象都是最小不平衡子树,即以插入路径上离插入结点最近的平衡因子的绝对值大于1的结点作为根的子树

在这里插入图片描述

2)调整最小不平衡子树

在这里插入图片描述

  1. LL:调整A的左孩子节点右上旋
    在这里插入图片描述

  2. RR:调整A的右孩子节点左上旋
    在这里插入图片描述
    在这里插入图片描述

  3. LR:调整A的左孩子的右孩子,先左上旋再右上旋
    在这里插入图片描述
    在这里插入图片描述

  • LR和RL旋转时,新结点究竟是插入C的左子树还是插入C的右子树不影响旋转过程
  1. RL:调整A的右孩子的左孩子,先右上旋后左上旋
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.3 查找效率分析(ASL)

在这里插入图片描述

3. B树(多路平衡查找树)

3.1 基本概念

1)来源

在这里插入图片描述
如何进行查找?
在这里插入图片描述

2)如何保证查找效率

策略1:
在这里插入图片描述
策略2:
在这里插入图片描述

4)B树定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5)m阶B树的核心特性

在这里插入图片描述

3.2 B树的高度

在这里插入图片描述
在这里插入图片描述

3.3 B树的基本操作

1)B树的查找

  • 在B树上进行查找与二叉查找树很相似,只是每个结点都是多个关键字的有序表,在每个结点上所做的不是两路分支决定,而是根据该结点的子树所做的多路分支决定

在这里插入图片描述

2)B树的插入

easy,见笔记

3)B树的删除

easy,见笔记

4. B+树

4.1 基本概念

在这里插入图片描述
在这里插入图片描述

4.2 基本操作

1)B+树的查找

见笔记

4.3 B树和B+树的区别

见笔记

5. 红黑树

见笔记

四. 索引结构查找

1. 分块查找(索引顺序查找)算法

1.1 算法思想

特点

  • 它吸取了顺序查找和折半查找各自的优点,既有动态结构,又适于快速查找

算法基本思想:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1)用折半查找查索引

见笔记

2)用顺序查找查索引

见笔记

1.2 查找效率分析(ASL)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五. 散列结构(哈希结构)查找

在这里插入图片描述
散列查找:基于散列表的数据结构,通过 哈希函数建立关键字与存储地址的联系

1. 基本概念

在前面介绍的线性表和树表的查找中,记录在表中的位置与记录的关键字之间不存在确定关系,因此,在这些表中查找记录时需进行一系列的关键字比较。这类查找方法建立在“比较”的基础上,查找的效率取决于比较的次数

散列函数:

  • 一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr (这里的地址可以是数组下标、索引或内存地址等)。

散列表:

  • 根据关键字而直接进行访问的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系

在这里插入图片描述

2. 哈希函数 (散列函数) 的构造方法

2.1 概述

对于一个给定的关键字key,根据散列函数可以计算出其散列地址,执行步骤如下:
在这里插入图片描述

  • 散列函数是典型的用空间换时间的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低

2.2 常见的散列函数

设计目标:让不同关键字的冲突尽可能少

1)除留余数法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)直接定址法

在这里插入图片描述

3)数字分析法

在这里插入图片描述

4)平方取中法

在这里插入图片描述

3. 处理冲突的方法

  • 任何设计出来的散列函数都不可能绝对地避免冲突。为此,必须考虑在发生冲突时应该如何处理,即为产生冲突的关键字寻找下一个“空”的Hash地址

3.1 拉链法

在这里插入图片描述

3.2 开放定址法

在这里插入图片描述
在这里插入图片描述

1)线性探测法

在这里插入图片描述
在这里插入图片描述
线性探测的缺点:
在这里插入图片描述

2)平方探测法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3)伪随机序列法

在这里插入图片描述

3.3 再散列法

在这里插入图片描述

4. 散列查找操作步骤

4.1 拉链法查找步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1 线性探测法查找操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.2 线性探测法删除操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 散列查找的性能分析

5.1 概述

  • 散列表的查找过程与构造散列表的过程基本一致
  • 对同一组关键字,设定相同的散列函数,则不同的处理冲突的方法得到的散列表不同,它们的平均查找长度也不同
  • 虽然散列表在关键字与记录的存储位置之间建立了直接映像,但由于“冲突”的产生,使得散列表的查找过程仍然是一个给定值和关键字进行比较的过程。因此,仍需要以平均查找长度作为衡量散列表的查找效率的度量

散列表的查找效率取决于三个因素:散列函数、处理冲突的方法和装填因子

在这里插入图片描述

  • 散列表的平均查找长度依赖于散列表的装填因子a,而不直接依赖于”或刃

在这里插入图片描述

5.2 拉链法性能分析

在这里插入图片描述

在这里插入图片描述

5.3 线性探测法性能分析

在这里插入图片描述
在这里插入图片描述


参考文献:王道数据结构

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:36:44  更:2022-09-04 01:37:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:43:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码