查找算法学习(1)

1.对于静态表的顺序查找法,若在表头设置监视哨,则正确的查找方法:从n个元素开始往前查找该数据元素。

分析:常把第一个或最后一个元素作为哨兵

表头设置监视哨,就是将空出来的下标为0的这个元素的值设为Key,

这样我们就不用多次判断 i 是否越界,因为就算静态表中找不到,也会在0位置上配对成功,返回0

n个元素都要比较一次,但都不成功,最后监视哨也要比较一次,比较成功,一共比较n+1.

例子:有5个元素,分别是1,2,3,4,5.要找的元素是8.那么8就是监视哨,数列如下: 8,1,2,3,4,5.

5开始向前查找,一共要比较6,比较到监视哨成功,监视哨所在的下标是0,所以返回值为0.

 

2.10个元素{54,28,16,34,73,62,95,60,26,43},按照依次插入方法生成一颗二叉排序树,查找值为62的结点所需要比较次数:3

分析:依次插入将带插入值直接放入二叉搜索树符合条件位置,使得整棵树左子树均比根小,右子树均比根大,结果如图所示

《查找算法学习(1)》
查找62需要比较3次,分别是和52、73、62比较

 

3.二元查找树的任何结点的左右子树都是二元查找树。

二元查找树的任意子树都是二元查找树。

二元查找树:它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;3)左、右子树也分别为二元查找树;

 

4.给定一个整数sum,有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum最快的平均数据复杂度是:O(N)

分析:思想类似于两端向中间扫描

1)、设定两个指针P1P2,分别指向数组开始和结尾,即P1指向最小值,P2指向最大值;

2)、计算 *P1+*P2 的值为 SUM,与 sum 比较,记录它们的差值 DIF SUM,若 SUM<sumP1++,若SUM>sumP2–;

3)、重复以上过程直到DIF最小

 

5.对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找情况下,对于查找失败,它们的平均查找长度是:不同的

对于查找成功,它们的平均查找长度是:相同的

 

6. 折半查找属于随机访问特性链表不行

堆排序也不能用链表因为调整堆时没法随机访问底层孩子节点

快速排序可以链表

归并排序可用链表

基数排序可用链表

插入排序链表比数组要快一些减少移动次数

 

7.一个长度为32的有序表,采用二分查找一个不存在的元素,则最多比较次数是:6

分析:这题其实是考察完全二叉树的深度问题,比较次数也就是深度,只含有一个节点的时候深度为1,假设深度为k,则有2^k-1>=n>2^(k-1)-1,其中2^k-1对应深度为k的满二叉树对应节点数,那么等价于2^k>=(n+1)>2^(k-1),不等式两边同时取log,k>=log(n+1)>(k-1),此时k等于log(n+1)向上取整数,因此log(32+1)向上取整为6。

 

8.对于二分搜索法,下面描述正确的是(AC)

A 可用于数组 B 可用于单链表 

C 只能在已排序的数据上进行

D 最坏情况下数据复杂度为O(N*log N)


分析:最坏时间复杂度为边缘位置,即O(log N)

 

9.二分查找要满足顺序存储。链存储、按value有序中的哪些条件? 顺序存储、按value有序

分析:首先二分查找要求序列必须有序的;其次序列可以随机访问任何有效范围内索引的值,链式存储不能随机访问,必须是顺序存储。


10顺序查找法适用于查找顺序存储或链式存储的线性表,平均查找次数为 N/2;二分查找只适用于查找顺序存储的有序表,平均查找次数为logN。在此假定N为线性表中结点数,且每次查找都是成功的。


二叉查找树的查找效率与二叉树的树型有关,在呈单支树时其查找效率最低。

    原文作者:查找算法
    原文地址: https://blog.csdn.net/wangdd_199326/article/details/72771158
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞