二分查找判定树怎么画_划重点!轻松搞定查找算法

知识框架 5ed72d7d9ef31185ff9649e923753a04.png 知识点详解

No.1

顺序查找

Q:什么是顺序查找呢? A:顺序查找的原理很简单,就是遍历整个列表,逐个进行比较,若某个关键字和给定值相等,则查找成功。如果直到最后一个记录,其关键字和给定值比较都不等时,则查找失败。 顺序查找一般分为两种:对一般的无序线性表的顺序查找和对按关键字有序的顺序表的顺序查找。下面,分别来讨论这两种顺序查找方法。 78857e30-2f60-eb11-8da9-e4434bdf6706.svg 对一般无序线性表的顺序查找『实现算法』
typedef struct{ //查找表的数据结构   ElemType *elem; //元素存储空间基址,建表时按实际长度分配,0号单元留空   int TableLen; //表的长度 }SSTable; int Search_Seq(SSTable ST , ElemType key) {   ST.elem[0]=key; //哨兵  for(i =ST . TableLen;ST.elem[i) !=key ; --i); //从后往前找   return i; //若表中不存在关键字为key的元素,则找到i为0时退出 for 循环}
上述代码中有一个“哨兵”。通俗来讲,设置哨兵是为了在循环查找时数组不会越界(不管有没有找到,当i=0时必定会退出循环)。设置哨兵也可以使程序不许要多余的判断,从而达到提高程序效率的目的。

查找过程:查找元素(Key):1

21360cba4d80f75b6efed722537f9b08.png

569c7eb6df12e82c5649f09cc682e9fd.png

7985a82c45cf0e60b554d55059f711f1.png

③平均查找长度:由于算法使用的是从后向前查找,故对于有n个元素的表来说,给定值key与表中第i个元素相等时,需要进行n-i+1次比较。查找成功时,顺序查找的平均查找长度A为:

ASL成功=

1acc30aa23993675e3bf1d9b4444579f.png

当每个元素的查找概率相同时Pi=,则 ASL成功=

1acc30aa23993675e3bf1d9b4444579f.png

查找不成功时,显然ASL失败=n+1 ④优缺点 1)  优点:对数据的存储没有要求,顺序存储或链式存储均可(对线性的链表只能采取顺序查找)。对记录的有序性也没有要求。 2)  缺点:当n较大时,平均查找长度过大。 d51196de0e20354a08e1c727ec32e420.gif 序表的顺序查找 与无序表的顺序查找不同,有序表的顺序查找查找失败时不用再比较到表的另一边,这样可以降低查找失败的平均查找长度。

①:

查找过程(判定树):序列(3,4,7,15,18,30)

查找元素:7,12

ace294a2098ab49506ab3eb3b387dd70.png

②平均查找长度

有序表的查找成功的平均查找长度与一般线性表的查找成功时的平均长度相同,都为:

ASL成功=

1acc30aa23993675e3bf1d9b4444579f.png

查找失败时,指针走到了某个查找失败的结点,而这个结点实际上是不存在的,故查找失败时的查找长度为它上一个结点所在的层数。在每个结点查找概率都想同时,查找失败的平均查找长度为:

ASL失败=

052d4846101bee2060fa7fc34ba37626.png

故其查找失败的平均查找长度比一般的顺序查找要好一些。

Tips:这里的有序表的顺序查找看起来与折半查找有些相识,实则不同。有序表的线性表可以是链式存储。

No.2

折半查找

折半查找又称为二分查找 『前提条件』 有序的顺序表,为顺序存储结构 『基本思想』 分而治之地进行关键字的查找。其查找过程是:先确定待查找记录的所在的范围(将待查找记录与中间元素进行比较),然后在缩小的范围内(中间元素以外的前半部分或后半部分)继续进行同样的查找,直至找到该记录为止(也可能查找失败)。 78857e30-2f60-eb11-8da9-e4434bdf6706.svg 实现算法
int Binary_ Search (SeqList L, ElemType key) { int low=0, high=L.TableLen-1, mid; //初始化low,highwhile (1ow<=high) {  mid= (low+high) /2; //取中间位置  if (L.elem [mid]==key)    return mid; //查找成功则返回所在位置  else if (L.elem [mid]>key)     high=mid-1; //从前半部分继续查找 else    low=mid+1;//从后半部分继续查找}return -1 ;//查找失败,返回-1}

①查找过程

在{10,12,14,15,18,20,24,31,35}中查找元素11

7e07b0bccfab19c9313869f032a1874c.png

0cac864ff341ace50b3b212649c5f0d3.png

ba35ca58010d32421ab69a16d5afce2e.png

② 判定树与平均查找长度 上述折半查找过程可以通过下图所示的二叉树来表述,成为判定树。树中下方的方形框代查找不成功的情况。

503d6830604d8275e093ac4f2edd28ed.png

通过上图的判定树,我们可以看到,查找次数不会大于给定判定树的高度,在等概率的情况下,查找成功的平均查找长度为: ASL成功= 1/n(1×1+2×2+...+n×2h-1) 式中的h代表树的高度。而上述查找过程的ASL失败=1/10(3×6+4×4)=3.4。

No.3

分块查找

分块查找又称索引顺序查找,它是顺序查找的一种改进方法,它吸取了顺序查找与折半查找的优点。

①基本思路:分块查找要求把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序。假设是按关键码值非递减的,那么这种块与块之间必须满足已排序要求,实际上就是对于任意的i,第i块中的所有节点的关键码值都必须小于第i+1块中的所有节点的关键码值。此外,还要建立一个索引表,把每块中的最大关键码值作为索引表的关键码值,按块的顺序存放到一个辅助数组中,显然这个辅助数组是按关键码值递减排序的。查找时,首先在索引表中进行查找,确定要找的节点所在的块。由于索引表是有序的,因此,对索引表的查找可以采用顺序查找或折半查找。然后,在相应的块中采用顺序查找,即可找到对应的节点。

②算法流程:

1)先选取各块中的最大关键字构成一个索引表;

2)查找,它分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中。然后,在已确定的块中用顺序法进行查找。

③查找过程:

对{15,24,13,32,45,2,33,56,23,67,53,17}进行分块查找。可画出如下索引表与顺序表。

f6660dc2a2ed5a781349e8c1c7d11eae.png

④平均查找长度:

若将长度为n的查找表均匀的分为b块,每块有s个记录,在等概率的情况下,平均查找长度为:

69e625afcac54d7367c146bdaebd71c2.png

(块内和索引表中均为线性查找)

利用数学知识可知,当s=√n时,ASLmin=√n+1

90bae59ae89144c86d7e2b52b8ffd894.png

(块内为线性查找,索引表为折半查找)

d51196de0e20354a08e1c727ec32e420.gif下面我们来看几道关于图的应用的例题。

问题

1、具有12个关键字的有序表中,对每个关键字的查找概率相同,折半查找算法查找成功 的平均查找长度为( ), 折半查找查找失败的平均查找长度为( )。

A.37/12
B.35/12
C.39/13
D.49/13

Tips:对于本类题目,应先根据所给n的值,画出折半查找判定树。另外,查找失败结点的ASL不是图中的方形结点,而是方形结点上一层的圆形结点。

答案:A、D

2、(2015统考)下列选项 不能构成折半查找中关键字比较序列的是( )

A. 500, 200, 450, 180

B. 500, 450, 200, 180

C. 180, 500, 200, 450

D. 180, 200, 500, 450

Tips:先根据选项画出查找路径图,再根据折半查找判定树的性质(判定树一定是二叉排序树)即可选出答案。

答案:A

3、在一个顺序存储的有序线性表上查找一个数据时,既可以采用折半查找,也可以采用顺序查找,但前者比后者的查找速度()

A. 必然快

B. 取决于表是递增还是递减

C. 在大部分情况下要快

D. 必然不快

Tips:折半查找在一般情况下要快,但当有序有1000个元素时,顺序查找只找1次而折半查找要找将近10次。

答案:C

往期推荐

带你解读图的邻接矩阵和邻接表的变换

链表递归题型大解密

带你解读图的两种遍历方式

带你搞定考研二叉树算法(上)

带你搞定考研二叉树算法(下)

划重点!学姐带你掌握信号量机制

0ef3df391737cfb359eda43143a8e6a5.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值