查找,又称搜索,检索。
查找运算的主要操作是关键字的比较, 通常把查找过程中的平均比较次数(也称为平均查找长度) 作为衡量一个查找算法效率优劣的标准。
平均查找长度(Average Search. Length ASL) 的计算公式为
A S L = ∑ i = 1 n P n C i ASL = \sum\limits_{i=1}^{n} P_{n}C_i ASL=i=1∑nPnCi
其中, n n n 为结点的个数, P i P_i Pi 是查找第 i i i 个结点的概率。
在本文,设定查找每个结点是等概率的, 即 P 1 = P 2 = . . . = P i = 1 n P_1 = P_2 = ...=P_i = \frac{1}{n} P1=P2=...=Pi=n1 ;
C i C_i Ci 为找到第 i i i 个结点所需要比较的次数。 因此,平均查找长度计算公式可简化为
A S L = 1 n ∑ i = 1 n C i ASL =\frac{1}{n} \sum\limits_{i=1}^{n} C_i ASL=n1i=1∑nCi
一 顺序表的查找
顺序表是指线性表的顺序存储结构。
在顺序表上的查找方法有多种, 我介绍最常用、最主要的两种方法
1.1 顺序查找
顺序查找 又称线性查找。其基本思想是: 从表的一端开始, 顺序扫描线性表, 依次把扫描到的记录关键字与给定的值 k k k 相比较, 若某个记录的关键字等于 k k k, 则查找成功, 返回该记录所在的下标; 若直到所有记录都比较完, 仍未找到关键字 与 k k k 相等的记录, 则表明查找失败, 返回 -1。
以java 为例, 看一个demo.
public static int sequentialSearch(int[] array, int key) {for (int i = 0; i < array.length; i++) {if (array[i] == key) {return i; // 找到元素,返回其索引}}return -1; // 如果没有找到,返回-1}