学习笔记--数据结构与算法基础(青岛大学-王卓)--第七章查找算法

简介: 学习笔记--数据结构与算法基础(青岛大学-王卓)--第七章查找算法

视频链接
在这里插入图片描述
数据结构与算法基础(青岛大学-王卓)--第七章查找

本章知识框架
在这里插入图片描述

1.查找的基本概念

  • 什么是查找表?

在这里插入图片描述

  • 什么是关键字

在这里插入图片描述

  • 什么是查找

在这里插入图片描述

  • 查找是否成功?

  • 查找的目的?

在这里插入图片描述

  • 查找的分类

在这里插入图片描述

  • 如何评价查找算法

在这里插入图片描述

  • 查找过程中我们需要研究什么?

在这里插入图片描述

2.线性表的查找

对于这一部分,该视频讲解了顺序查找(线性查找),折半查找(二分或对分查找)和分块查找这三类查找。
在这里插入图片描述

顺序查找(线性查找)
在这里插入图片描述

  • 顺序查找

在这里插入图片描述
算法1:在这里插入图片描述
算法2:
在这里插入图片描述
算法3:
在这里插入图片描述

算法改进:

把待查关键字key存入表头(“哨兵”、”监视哨”),从后往前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。

在这里插入图片描述
在这里插入图片描述
对改进算法的时间效率进行分析:
在这里插入图片描述
在这里插入图片描述

顺序查找的特点:
在这里插入图片描述

折半查找(二分或对分查找【查找表必须是有序表】)
什么是折半查找:
在这里插入图片描述
非递归算法:
在这里插入图片描述
在这里插入图片描述
递归算法:

int Search Bin(SSTable ST, KeyType key,int low ,int high){
    if(low > high) return 0;
    mid = (low + high)/2;
    if(key == ST.elem[mid].key) return mid;
    else if(key < ST.elem[mid].key)
        high = mid - 1;
    else
        low = mid + 1;
    Bin(ST,key,low,high);
}

折半查找的性能分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分块查找(索引顺序查找)
分块查找:
下面查38,先选择块(38大于22并且小于48所以在索引表序号7开始的块中即第二块),再从块内进行查找(通过顺序查找,即可找到38位于序号10)
在这里插入图片描述
分块查找性能分析:
在这里插入图片描述
分块查找优缺点:
在这里插入图片描述
顺序,折半和分块查找的方法比较

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/d25381a023c54f04b2ed7f2102ccd384.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Zif5Zif55qE56iL5bqP5ZGY6ZOy5bGO5a6Y,size_15,color_FFFFFF,t_70,g_se,x_16)

3.树表的查找

动态查找表:表结构在查找过程中动态生成
在这里插入图片描述

  • 二叉排序树
  • 平衡二叉树
  • 红黑树
  • B-树
  • B+树
  • 建树

二叉排序树

  • 什么是二叉排序树

在这里插入图片描述
二叉排序树
在这里插入图片描述
非二叉排序树
在这里插入图片描述

  • 二叉排序树的性质

中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字排列的递增有序序列。

在这里插入图片描述
中序遍历二叉排序树
在这里插入图片描述

  • 二叉排序树查找操作

在这里插入图片描述
查找105,过程红色箭头
在这里插入图片描述
二叉排序树的存储结构
在这里插入图片描述
二叉排序树算法思想
在这里插入图片描述
算法代码描述:
在这里插入图片描述

  • 二叉排序树的查找分析

在这里插入图片描述
二叉排序树的平均查找长度:
在这里插入图片描述
最好情况和最坏情况:
含有n个结点的二叉排序树的平均查找长度和树的形态有关
在这里插入图片描述

  • 二叉排序树的插入操作

在这里插入图片描述
如果插入的结点为叶子结点
在这里插入图片描述
二叉排序树的生成
在这里插入图片描述
例子1:
在这里插入图片描述
在这里插入图片描述
关键字的输入顺序不同,建立的不同二叉排序树:
在这里插入图片描述

  • 二叉排序树删除操作

在这里插入图片描述
(1)被删除的结点是叶子结点:直接删去该结点。
在这里插入图片描述
在这里插入图片描述
(2)被删除的结点只有左子树或者只有右子树,用其左子树或者右子树替换它(结点替换)。
在这里插入图片描述
在这里插入图片描述
(3)被删除的结点既有左子树,也有右子树
在这里插入图片描述在这里插入图片描述
例子:
在这里插入图片描述

  • 平衡二叉树

在这里插入图片描述
什么是平衡二叉树?
在这里插入图片描述
什么是平衡因子?
根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能是-1、0,或1
在这里插入图片描述
例子1(是一个平衡二叉树):
下图是结点为40的平衡因子计算过程:
在这里插入图片描述
在这里插入图片描述
例子2:
在这里插入图片描述
在这里插入图片描述

  • 失衡二叉排序树的分析和调整

在这里插入图片描述
平衡调整的四种类型:
在这里插入图片描述
调整(调整原则:1.降低高度;2.保持二叉排序树性质):
在这里插入图片描述
LL型调整:
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
RR型调整:
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
LR型:
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
RL型:
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述

4.哈希表的查找

  • 散列表(哈希表)的基本概念

在这里插入图片描述
例1:
在这里插入图片描述
例2:
在这里插入图片描述
在这里插入图片描述
散列表:
在这里插入图片描述
散列表的优缺点:
在这里插入图片描述
散列方法:
在这里插入图片描述
冲突:
在这里插入图片描述

  • 构造散列函数

使用散列表要解决好二个问题
在这里插入图片描述
构造散列函数考虑的因素:
在这里插入图片描述
构造的要求和相关构造方法:
在这里插入图片描述
直接定址法(一个x对应唯一的Y值):
在这里插入图片描述
除留余数法:
在这里插入图片描述

  • 处理冲突的方法

在这里插入图片描述
开放定址法(开地址法)
在这里插入图片描述
线性探测法:
在这里插入图片描述
例子:
在这里插入图片描述
二次探测法:
在这里插入图片描述
伪随机探测法:
在这里插入图片描述

链地址法(拉链法)
在这里插入图片描述
链地址法建立散列表步骤:
在这里插入图片描述
链地址法的优点:
在这里插入图片描述

  • 散列表的查找

在这里插入图片描述
例子1(线性探测法):
在这里插入图片描述
例子2(链地址法):
在这里插入图片描述

  • 散列表的查找效率

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

相关文章
|
2月前
|
存储 算法
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
22 0
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
9 2
|
1月前
|
机器学习/深度学习 存储 算法
【数据结构】算法的复杂度
算法的时间复杂度和空间复杂度
37 1
【数据结构】算法的复杂度
|
26天前
|
搜索推荐 算法
【数据结构】排序算法——Lesson2
【7月更文挑战第24天】
14 3
|
3天前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势
|
1月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
21 1
|
2月前
|
算法 分布式数据库
【数据结构和算法】--- 二叉树(5)--二叉树OJ题
【数据结构和算法】--- 二叉树(5)--二叉树OJ题
25 1
|
1月前
|
算法 安全 调度
逆天改命!Python高级数据结构堆(Heap)与优先队列,让你的算法效率飙升至宇宙级!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue实现了堆和优先队列,提供高效算法解决方案。堆用于Dijkstra算法求解最短路径,例如在图论问题中;PriorityQueue则在多线程下载管理中确保高优先级任务优先执行。这两个数据结构提升效率,简化代码,是编程中的强大工具。
23 0
|
1月前
|
算法 搜索推荐 Java
在Java中实现高效的算法与数据结构
在Java中实现高效的算法与数据结构
|
2月前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
27 0