第六章:查找
查找的基本概念和顺序查找
- 查找定义:在数据集合中寻找满足某种条件的数据元素的过程称为查找
- 关键字:数据元素中某个可以以唯一标识该元素的数据项
- 平均查找长度(ASL:Average Search Length):在查找的过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字的比较次数的平均值
- 顺序查找(线性查找),主要用于在线性表中进行查找。从查找表的一端开始,顺序扫描查找表,依次将扫描到的关键字和待查找的值key进行比较。如果相等,则查找成功。如果扫描结束仍然没有发现相等的数据元素,则查找失败。
public static int orederSearch(int[] array, int key) {
if (array.length > 0) {
for (int i = 0; i < array.length; i++) {
if (array[i] == key) {
return i;
}
}
}
return -1;
}
* 时间复杂度为O(n)
折半查找
- 算法思路:
- 首先将给定值key与表中中间位置元素的关键字比较,若相等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分中。然后在缩小的范围内继续进行同样的查找,如此重复直到找到为止,或者确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。
- 折半查找分析
- 折半查找判定树
- 对于折半查找,查找的比较次数就是从根结点到该结点经历的结点数
- 时间复杂度为O(logn)
- 概要: 具有N个(N>0)结点的完全二叉树的高度为 [log2(N+1)] 或 [log2N] +1。
public static int binarySearch(int[] array, int key) {
if (array.length > 0) {
int low, high, mid;
low = 0;
high = array.length - 1;
while (low <= high) {
mid = (low + high) / 2;
if (key < array[mid])
high = mid - 1;
else if (key > array[mid])
low = mid + 1;
else
return mid;
}
}
return -1;
}
分块查找
- 分块查找又称为索引顺序查找
- 分块查找思想:
①确定待查找值在哪个块(折半查找)
②在确定的块中查找待查找值(顺序查找) - 分块查找分析
- 由于分块查找实际是进行两次查找,所以整个算法的平均查找长度是两次查找的平均查找长度之和。
即ASL分块=ASL折半+ASL顺序