查找的基本概念
什么是查找?
查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素。
查找算法的分类
若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表;
否则,称之为静态查找表。
此外,如果查找的全过程都在内存中进行,称之为内查找;
反之,如果查找过程中需要访问外存,称之为外查找。
查找算法性能比较的标准
——平均查找长度ASL(Average Search Length)
由于查找算法的主要运算是关键字的比较过程,所以通常把查找过程中对关键字需要执行的平均比较长度(也称为平均比较次数)作为衡量一个查找算法效率优劣的比较标准。
选取查找算法的因素
(1) 使用什么数据存储结构(如线性表、树形表等)。
(2) 表中的次序,即对无序表还是有序表进行查找。
顺序查找
要点
它是一种最简单的查找算法,效率也很低下。
存储结构
没有存储结构要求,可以无序,也可以有序。
基本思想
从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;
若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
核心代码
public int orderSearch(int[] list, int length, int key) {
//从前往后扫描list数组,如果有元素的值与key相等,直接返回其位置 for (int i = 0; i
if (key == list[i]) {
return i;
}
}
//如果扫描完,说明没有元素的值匹配key,返回-1,表示查找失败 return -1;
}
算法分析
顺序查找算法最好的情况是,第一个记录即匹配关键字,则需要比较 1 次;
最坏的情况是,最后一个记录匹配关键字,则需要比较 N 次。
所以,顺序查找算法的平均查找长度为
ASL = (N + N-1 + ... + 2 + 1) / N = (N+1) / 2
顺序查找的平均时间复杂度为O(N)。
二分查找
要点
二分查找又称折半查找,它是一种效率较高的查找方法。
存储结构
使用二分查找需要两个前提:
(1) 必须是顺序存储结构。