折半查找在有序数组A中查找特定的记录K:通过比较K和数组中的中间元素A[mid]进行比较,如果相等,则算法结束;

如果K小于A[mid],则对数组的前半部分进行折半查找;否则对数组的后半部分进行折半查找。根据上述描述,折半查找采用了(62) 算法设计策略。对有序数组(3,14,27,39,42,55,70,85,93,98),成功查找和失败查找所需要的平均比较次数分别是(63) (假设查找每个元素的概率是相同的)


(62)A. 分治

B. 动态规划

C. 贪心

D. 回溯


(63)A. 29/10和29/11  

B. 30/10和30/11

C. 29/10和39/11

D. 30/10和40/11


flag: 折半查找、二分查找

请先 登录 后评论

1 个回答

亚里士德
擅长:互联网

知识点:数据结构 - 静态查找表


软设第五版中分治法在第8章423页。在第3章数据结构,第150页详细说了折半查找。

折半查找也叫二分查找。


根据题目描述可以发现,为了找到问题的解,进行了折半查找后又(有可能)继续折半查找,这符合分治法的描述“这些子问题互相独立且与原问题相同。分治法产生的子问题往往是原问题的较小模式。”。所以62题选A。


=====================================


63题:(注意选项中的左斜线表示分数线,不是或者):


1、先找到成功的次数:

一种简单但是耗时的方式是,可以依次预定每一个数,然后通过不断折半然后去数一下比较次数,加起来算次数总数,最后再除以数组长度10,得到平均比较次数。这样一定能数出来,但是比较耗时,如果考试的时候不知道书上的方法,且有空余时间可以这样去数一下。


另一种简单方式是像书上152页上一样,把这个有序序列构造一个判定树(二叉树),然后可以发现每一层的判定次数是一样的,比如第二层中,每一个节点被找到都会判定两次(根节点一次,自己一次,找到目标就是它),所以如果第二层有两个节点,第二层的总次数就是2x2。然后可以推出第3层3次,4层4次。

所以序列中的每一个数字都被找到的次数相加(总判定次数)= 1x第一层的节点个数+2x第二层的节点个数+3x第三层个数+... 。算出来再除以序列长度10。


所以关键就是如何快速的构造出这一颗树。

第一个节点,就是中间的序号作为根,左右序列依次为左子树右子树(然后里面再分)。(如果遇到双数的,就把小的作为根节点。子树比根小的放左边,大的放右边)。所以根据该原则弄出来的二叉判定树是:

202211271557085.png

所以总对比次数是:1x1+2x2+3x4+4x3 = 29,再除以10就是A或C选项,排除BD。


2、再找失败的次数:

在上图的基础上,把对比失败的空的对比情况补上(模拟为一个节点)↓。可以发现,一共有11个空节点,当对比到空节点的时候,就对比失败了。所以类似上面的计算方法(总次数÷个数=平均次数),总失败次数=3x5+4x6=39 ,再除以情况出现次数11,所以选C。

202211271659204.png

3、书上给平均查找长度给了一个不太好记的公式,记忆牛x的可以自己去记一下。



请先 登录 后评论