一、查找分类
1.根据逻辑关系可分为线性查找结构(顺序表、链表、散列表)和树形查找结构(B树、B+树、R树);
2.根据查找结构中的内容是否可变可分为静态查找结构和动态查找结构。
二、线性查找表
1.顺序查找
//查找值为o的元素的下标,顺序查找
public int indexof(T o){
if(o=null){
for (int i=0; i<length; i++){
if(data[i]=null)
return i;
}
else{
for(int i=0;i<length; i++)
if(compare(o,(T)data[i]) == 0)
return i;
}
return -1;
}
查找算法的时间复杂度最好情况是O(1),最差的情况是O(n)。
2.二分查找
前提是顺序必须有序,并且只适用于顺序存储结构,不能用链式的。因为链式的无法实现随机访问。
public int binSearch(int a[], int key){
int low=0,high=a.length-1.mid;
while(low<high){
mid = (low+high)/2;
if(a[mid] == key)
return mid;
if(a[mid] <= key)
high = mid;
else
low = mid;
}
return -1;
}
二分法的复杂度为T(n)=O(
log
2
n)
3.分块查找
分块查找的基本思想是将原表分成若干块,各块内部不一定有序,但第i块内所有记录的关键字都小于第i+1块内所有记录的关键字。抽取最大关键字及其起始位置建立索引表,因为原表是分块有序的,所以索引必定有序。
分块查找就是先用二分查询或顺序查找确定待查节点在那一块,然后在已确定的块中进行顺序查找。算法效率介于顺序查找和二分查找之间。