首页 > 其他分享 >408数据结构-折半查找,分块查找 自学知识点整理

408数据结构-折半查找,分块查找 自学知识点整理

时间:2024-10-20 20:21:36浏览次数:3  
标签:折半 知识点 结点 right 分块 mid 查找 left

前置知识:查找的基本概念


折半查找

折半查找 又称 二分查找 ,它仅适用于有序的顺序表。
因个人习惯,下文均用二分代替折半
二分查找的基本思想:

  1. 首先将给定值 k e y key key与表中中间位置的元素比较,若相等,则查找成功,返回该元素的存储位置;
  2. 若不等,则所需查找的元素只能在中间元素以外的前半部分或者后半部分,然后在缩小的范围内继续进行同样的查找;
    例如,在查找表升序排列时,若 k e y key key大于中间元素,则所查找的元素只可能在后半部分。

重复上述步骤,直到查找成功。或者确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。
当二分查找算法选取中间结点时,既可以采用向下取整,又可以采用向上取整。但每次查找的取整方式必须相同。
算法实现如下:

inline int Search_Seq(SSTable L, ElemType key) {//升序排列
	int l = 1, r = L.TableLen, mid;//l为left,r为right
	while (l <= r) {
		mid = (l + r) / 2;//取中间位置
		if (L.elem[mid] == key)return mid;//查找成功则返回所在位置
		else if (L.elem[mid] > key)r = mid - 1;//从前半部分继续查找
		else l = mid + 1;//从后半部分继续查找
	}
	return -1;//查找失败,返回-1
}

完整代码可看我的Github:传送门

(补充了降序排列的写法,实际上很简单,把从前半部分继续和后半部分继续对调一下即可)

(图片来自王道考研408数据结构2025)
图片来自王道考研408数据结构2025
二分查找的过程可用上图所示的二叉树来描述,称为 判定树 。树中每个圆形结点表示一个记录,结点中的值为该记录的关键字值;树中最下面的叶结点都是方形的,它表示查找失败的区间。
从判定树可以看出,查找成功时的查找长度为从根节点到目的结点的路径上的结点数,而查找失败时的查找长度为从根节点到对应失败结点的父结点的路径上的结点数;每个结点值均大于其左子结点值,且均小于其右子节点值。

二分查找的判定树中,若 m i d = ⌊ ( l + r ) / 2 ⌋ mid=\left \lfloor \left ( l+r \right ) /2 \right \rfloor mid=⌊(l+r)/2⌋,则对于任何一个结点,必有右子树结点数-左子树结点数=0或1;若采用向上取整,则反之。
(下图来自王道考研408数据结构课程视频的截图 - 折半查找
折半查找
若有序序列有 n n n个元素,则对应的判定树有 n n n个圆形的非叶结点和 n + 1 n+1 n+1个方形的叶结点。因此,判定树是一棵平衡二叉树。(后续博客会写)

分析可知,用二分查找法找到给定值的比较次数最多不会超过判定树的高度。在等概率查找时,查找成功的平均查找长度为: A S L = 1 n ∑ i = 1 n l i = 1 n ( 1 × 1 + 2 × 2 + ⋯ + h × 2 h − 1 ) = n + 1 n log ⁡ 2 ( n + 1 ) − 1 ≈ log ⁡ 2 ( n + 1 ) − 1 ASL=\frac{1}{n} \sum_{i=1}^{n}l_i=\frac{1}{n} \left ( 1\times 1+ 2\times 2+\cdots + h\times 2^{h-1} \right )=\frac{n+1}{n}\log_{2}{\left ( n+1 \right ) }-1 \approx \log_{2}{\left ( n+1 \right ) }-1 ASL=n1​i=1∑n​li​=n1​(1×1+2×2+⋯+h×2h−1)=nn+1​log2​(n+1)−1≈log2​(n+1)−1
式中, h h h是树的高度,并且元素个数为 n n n时树高 h = ⌈ log ⁡ 2 ( n + 1 ) ⌉ h=\left \lceil \log_{2}{\left ( n+1 \right ) } \right \rceil h=⌈log2​(n+1)⌉。所以,二分查找的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2​n),平均情况比顺序查找的效率高。

知识点回顾:完全二叉树

在图 7.2 7.2 7.2所示的判定树中,等概率的情况下,查找成功(圆形结点)的 A S L = ( 1 × 1 + 2 × 2 + 3 × 4 + 4 × 4 ) / 11 = 3 ASL=(1×1+2×2+3×4+4×4)/11=3 ASL=(1×1+2×2+3×4+4×4)/11=3,查找失败(方形结点)的 A S L = ( 3 × 4 + 4 × 8 ) / 12 = 11 / 3 ASL=(3×4+4×8)/12=11/3 ASL=(3×4+4×8)/12=11/3。

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

分块查找

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

typedef struct {
	ElemType maxValue;
	int left, right;
}Index;//索引表

ElemType List[114];//顺序表存储实际元素

分块查找的基本思想:将查找表分为若干子块。块内的元素可以无序,但块间的元素是有序的,即第一个块中的最大关键字小于第二个块中的所有记录的关键字,第二个块中的最大关键字小于第三个块中的所有记录的关键字,以此类推。再建立一个索引表,索引表中的每个元素含有各块的最大关键字和各块中的存储区间,索引表按关键字有序排列。(块内无序,块间有序)
分块查找的过程分为两步:第一步是在索引表中确定待查记录所在的块,可以顺序查找或二分查找索引表;第二步是在块内顺序查找。
特别的,若索引表中不包含目标关键字,则二分查找索引表最终会停在 l e f t > r i g h t left>right left>right,此时必须在 l e f t left left所指的分块中查找。因为在 l e f t > r i g h t left>right left>right的上一步,根据二分查找的步骤,一定是 l e f t = = r i g h t left==right left==right的情况,此时同样 m i d = = l e f t mid==left mid==left,会有两种情况:

  1. m i d < k e y mid<key mid<key:此情况 l e f t left left后移一位,此时 l e f t left left所指的这个元素一定比 m i d mid mid所指的元素更大。
  2. m i d > k e y mid>key mid>key:此情况 r i g h t right right前移一位,此时 l e f t left left指向位置不变,所指的这个元素也一定比目标关键字更大。

因此二分查找索引表最终停在 l e f t > r i g h t left>right left>right时,必须在 l e f t left left所指的分块中查找。
若 l e f t left left此时超出索引表范围,则查找失败。

分块查找的平均查找长度为索引查找和块内查找的平均长度之和。设索引查找和块内查找的平均查找长度分别为 L I L_I LI​和 L S L_S LS​,则分块查找的平均查找长度为: A L S = L I + L S ALS=L_I+L_S ALS=LI​+LS​
将长度为 n n n的查找表均匀地分为 b b b块,每块有 s s s个记录( n = b s n=bs n=bs),在等概率情况下,若在块内和索引表中均采用顺序查找,则平均查找长度为: A L S = L I + L S = b + 1 2 + s + 1 2 = s 2 + 2 s + n 2 s ALS=L_I+L_S=\frac{b+1}{2}+\frac{s+1}{2}=\frac{s^2+2s+n}{2s} ALS=LI​+LS​=2b+1​+2s+1​=2ss2+2s+n​
此时,若 s = n s=\sqrt{n} s=n ​,则平均查找长度取最小值 n + 1 \sqrt{n}+1 n ​+1。

(下图来自王道考研408数据结构课程视频的截图 - 分块查找
分块查找
当需要在块内插入新元素,或者删除元素时,可以采用链式存储结构。

虽然索引表占用了额外的存储空间,索引查找也增加了一定的系统开销,但由于其分块结构,使得在块内查找时的范围较小,因此与顺序查找相比,分块查找的总体效率提升了不少。


二分查找在大题小题中都容易考察,需要重点掌握。分块查找主要在选择题中考察,因此重点掌握其算法思想即可(不会考太复杂的分块平均查找长度计算)。
以上。

标签:折半,知识点,结点,right,分块,mid,查找,left
From: https://blog.csdn.net/Engels_Si_Fish/article/details/143095684

相关文章

  • 二分查找
    1.好处二分查找(折半查找)效率高,时间复杂度低,但是仅能用于有序数组2.代码及其逻辑二分查找的逻辑就是通过我们想要找到的值与中间量(mid)作比较,来不断缩小范围,如果说我们想要查找的值比中间量要大,那么我们就会取前半个区间,在进行一次与中间量的比较,不断的循环,就能找到我们想要查......
  • Java中的进程与线程(如果想知道Java中有关进程与线程的知识点,那么只看这一篇就足够了!)
        前言:在现代计算机系统中,进程和线程是实现并发和高效任务管理的核心概念。理解这两者的区别和联系,不仅对软件开发者至关重要,还能帮助用户更好地理解计算机的工作原理。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN......
  • 软考系统分析师知识点十七:系统运行与维护
    前言今年报考了11月份的软考高级:系统分析师。考试时间为:11月9日。倒计时:20天。目标:优先应试,其次学习,再次实践。复习计划第一阶段:扫平基础知识点,仅抽取有用信息,可有缺失,但得过眼。第十五章:系统运行与维护内容总结知识点1:系统运行与维护概述概念:系统运行与维护是信......
  • [全国/全省/全市]初赛知识点复习大汇总
    目录计算机结构与组成原理计算机发展及应用1、第一台电子计算机的诞生:ENIAC2、第一台具有存储程序功能的计算机:EDVAC。图灵计算机发展阶段世界上最快的超级计算机计算机应用计算机保护知识产权计算机病毒硬件系统的组成概述CPU中央处理器存储器概述存储容量......
  • JSONPath,一个事半功倍的查找取数工具
    目录前言JSONPath介绍操作项筛选器运算符函数样本使用说明延伸前言日常在书写用例断言的时候,经常会遇到这样的场景:从结果中提取关键属性用于后续业务或者断言。一般遇到这类情况,处理方式基本都跟剥洋葱一样,遇到数组/集合,一层层循环读取,遇到对象套对象,一层层对象点......
  • 704.二分查找
    题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums=[-1,0,3,......
  • 洛谷知识点——C++ 11 实现一次性输出多行文本
    完整语法是R"deli(...)deli"。(其中deli并不是固定的,那里其实是一个用户自定义的字符序列,最多16个基本字符,不可含反斜线,空格和小括号。)故P1000超级玛丽游戏解法为#include<iostream>usingnamespacestd;intmain(){cout<<R"(********......
  • 【数据结构与算法】之二分查找
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来工作,从而将搜索范围缩小到一半,也称折半查找,是一种非常高效的工作于有序数组的查找算法。本文主要介绍二分查找及其几个变种,包括基础版、改变版、平衡版和Java版,以及Leftmost......
  • MATLAB 工具箱详细重点知识点概述 MATLAB 工具箱使用案例
    一、章节目录MATLAB工具箱概述常见MATLAB工具箱介绍MATLAB工具箱使用案例展示学习MATLAB工具箱的方法MATLAB工具箱的发展趋势二、各章节知识点总结MATLAB工具箱概述MATLAB是一种广泛应用于科学计算、数据分析、算法开发等领域的高级编程语言和交互式环境。MA......
  • python在word文档中插入题注和查找题注
    目录1、打开word文档2、在文档中为图片插入题注3、在文档中为表格插入题注4、遍历所有题注5、更新题注编号在自动化处理word时,可以使用脚本为word文档中图片和表格插入题注;也可以查找word文档中已经插入的题注,查看并修改。1、打开word文档importwin32com.clientas......