TIPS:本节的重点在于查找的算法效率评价,考试会考。
查找定义:在数据集合中寻找满足某种条件的数据元素的过程。
查找表:用于查找的数据集合,由同一类型的数据元素(记录)组成。
关键字:唯一标识该元素某数据项的值。所以如果使用基于关键字的查找,查找的结果必然是唯一的。
对查找表的常见操作:查找符合条件的数据元素;插入/删除某个数据元素。
由此可将查找表分为:静态查找表(查询操作,仅关注查找的效率即可)和动态查找表(不仅关注查找效率,还要关注插入/删除)。
(以上概念并不重要,了解即可,后期甚至不需要了解,对于考试而言卵用没有。)
查找算法的评价指标————查找长度。
查找长度:在查找运算中,需要对比关键字的次数。
平均查找长度ASL(Average Search Length)——所有查找过程中,进行关键字比较次数的平均值(个人理解:一般是用查找到该关键字通过的次数除以表长)。
一个不重要的王道上的知识点:ASL的数量级反应了查找算法时间复杂度。(了解即可,不了解也行,于考试无卵用)
评价一个查找算法效率时,通常将将两种情况分开计算:查找成功的ASL和查找失败的ASL。
顺序查找:又叫线性查找,通常用于线性表(顺序表/链表);算法思想:从头到尾/从尾到头挨个找。
顺序查找的代码实现:
关注王道选择题和真题,大题后续跟进。
需要关注的是,顺序查找可从前往后,此为传统思想;也可使用哨兵,即:将带查找关键字放入数组下标0中,然后数组末尾反向遍历数组。
哨兵的优点在于不需要关注边界值的判断,对代码进行了优化。
顺序查找——查找效率分析
ASL查找成功=(n+1)/2;ASL查找失败=n+1; 可得知,顺序查找的时间复杂度为O(n)。
顺序查找的优化1——对有序表的优化
对有序表的优化在于:查找表中元素是有序存放,那么当关键字>i,而关键字<i+1时,后续可以不用进行查找,节省了开销。
由此可以生成顺序查找的查找判定树(针对有序表),此时,如果有N个元素,那么就会有N+1种查找失败的情况,如图所示:
针对以上情况有:
一个成功结点的查找长度=自身所在层数;一个失败结点的查找长度=其父结点所在层数。
默认各种失败情况或成功情况都等概率发生。
顺序查找的优化2——被查找概率不相等的情况下,将被查找概率大的放在靠前位置。