最近在复习数据结构,看到查找算法,很有启发,哪怕是最简单的顺序查找,也有可以优化的地方。
例:给定一个整数数组,求数列中是否存在指定关键字K,若存在返回K所在的数组下标。
普通顺序查找:
一般地,大家都会想到就顺序查找呗,简单粗暴,数组遍历一遍就完事儿了。
伪代码
for (i=0; i<arr.length; i++){
if (arr[i] == k) return i;
}
哨兵顺序查找
经过学习,可以在数组头插入一个哨兵值为K,这样查找时不需要判断边界,只要最后返回的值和哨兵下标不一致,那么数组中存在K,否则没找到,因为最后最后循环下标总会遇到哨兵。
伪代码
arr[0] = K; // 设第一个元素为哨兵
for(i=arr.length-1; arr[i]!=K; i--);
return i;
对比
两种写法对比就是,只需要牺牲一个整数的空间,就可以减少n次对比次数,普通顺序查找每次循环需要做2次判断 i<arr.length ,arr[i] == k 即2n次判断;而哨兵顺序查找只需要比较一次 i!=K ,只需要做n次判断;
虽说这在一定程度上提高了查找效率,但是效率还是很低下的,时间复杂度还是O(n),只能说有一定的优化,大家最好还是用二分查找。
启发:
解决问题方法的效率,和算法的巧妙程度有关。