关于查找的ASL

考点1:顺序查找、二分查找、分块查找的ASL

Q1

对长度为n的有序单链表,若查找每个元素的概率相等,则顺序查找表中任一元素的查找成功的平均查找长度为( )。

A、n/2

B、(n+1)/2

C、(n-1)/2

D、n/4

【知识点速记】

  在有序单链表上做顺序查找,查找成功的平均查找长度与在无序顺序表或有序顺序表上做顺序查找的平均查找长度相同,都是(n+ 1)/2。

Q2

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

A、37/12

B、35/12

C、39/13

D、49/13

A2

设该有序表的元素为A[0,..,11],可以画出如下判定树,方框内为查找失败的结点(虚构),则ASL成功=(1+2x2+3x4+4x5)/12=37/12,ASL失败=(3x3+4x10)/13=49/13。因为方形结点是虚构的,所以这里查找失败结点的ASL是用方形结点上的圆形结点计算得出。

【Tips】

  在做关于计算折半查找的ASL时,首先应根据题目给出的结点个数n来画出相应的折半查找判定树,再根据判定树来计算ASL。

Q3

设顺序存储的某线性表共有123个元素,按分块查找的要求等分为3块。若对索引表采用顺序查找法来确定子块,且在确定的子块中也采用顺序查找法,则在等概率情况下,分块查找成功的平均查找长度为( )。

A、21

B、23

C、41

D、62

A3

可根据分块查找ASL的公式计算得出ASL成功=LI+LS=(b+1)/2+(s+1)/2=(s2+2s+n)/2s,通过题目可知n=123,s=123/3,b=n/s。计算得出该题ASL成功=LI+LS=23。

【知识点速记】

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

  ASL=LI+LS=(b+1)/2+(s+1)/2=(s2+2s+n)/2s(块内和索引表中均为线性查找)
  ASL=LI+LS=⌈Log2(b+1)⌉+(s+1)/2(块内为线性查找,索引表为折半查找)

考点2:散列查找的ASL

Q1

[2019统考]现有长度为11且初始为空的散列表HT,散列函数是H (key)=key mod 7,采用线性探查(线性探测再散列)法解决冲突。将关键字序列87, 40, 30,6, 11,22, 98, 20依次插入HT后,HT查找失败的平均查找长度是( )。

A、4

B、5.25

C、6

D、6.29

A1

  首先使用线性探测再散列的方法构造出如下散列表:

  因为散列函数H(key)所能得到的值为0~6,故查找失败时对应的地址可能有7个,且散列函数不能计算到地址7。比如,若计算出某关键字的地址为0,则需要比较0至8号地址才能确定查找失败。某关键字的地址为1,则需要比较1至8号地址才能确定查找失败,依此类推。则ASL失败=(9+8+7+6+5+4+3)/7=6
【Tips】
  计算查找失败的ASL时,其分母是根据散列函数能计算出的地址所确定的(mod后的数字)。

Q2

[2010统考]将关键字序列(7, 8, 30, 11, 18, 9, 14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为H (key)= (keyx3)mod 7, 处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。

(1)请画出所构造的散列表。

(2)分别计算等概率情况下,查找成功和查找不成功的平均查找长度。

A2

 (1) 因为装填因子为0.7且元素的数量为7,故散列表的表长为10。利用线性探测再散列法构造出的散列表为:

 (2) 由于每个元素的查找的概率相等,故ASL成功=查找次数/元素个数,

由此可计算出ASL成功=(1+2+1+1+1+3+3)/7=12/7

ASL失败=查找次数/散列函数中mod后的数字,

由此可计算出ASL失败=(3+2+1+2+1+5+4)/7=18/7

【知识点速记】
  采用线性探测再散列方法时,ASL成功=查找次数/元素个数ASL失败=查找次数/散列函数中mod后的数字

Q3

[清华大学]使用散列函数H(key)=key mod 11,把一个整数值转换成散列表下标,现要把数据{1, 13, 12, 34, 38, 33, 27, 22}依次插入散列表。

(1)使用线性探测法来构造散列表。

(2)使用链地址法构造散列表。

试针对这两种情况,分别确定查找成功所需的平均查找长度,及查找不成功所需的平均查找长度。

A3

 (1) 采用线性探测再散列的方法构造的散列表如下:

  ASL成功=查找次数/元素个数=(1+1+1+3+4+1+2+8)/8=21/8
  ASL失败=查找次数/散列函数中mod后的数字=(9+8+7+6+5+4+3+2+1+1+1)/11 =47/11
 (2) 采用链地址法构造的散列表如下:

【知识点速记】采用链地址法构造散列表时

  这里要注意,计算查找失败的ASL时,这里默认认为比较到空结点才算失败,所以比较次数等于冲突次数加1。还有一种可能是认为只有与关键字的比较才算比较次数,故比较次数就为冲突次数。大家在考试时要看清题目要求作答。

参考

https://mp.weixin.qq.com/s/lJz1vv-GfesI5kLANNv0ew

posted @ 2023-12-13 21:50  3cH0_Nu1L  阅读(91)  评论(0编辑  收藏  举报