顺序查找
就是从一端开始比较,直到找到或者全部计较完。
平均查找长度(n+1)/2
折半查找
首先必须是有序表,然后每次和表中中间的元素比较,如果相等则找到,不相等就排除一半的数据元素。
有两种实现,迭代和递归
平均查找长度为O()。
对于有序表还有斐波拉契查找和插值查找。
下面给出顺序查找和折半查找的迭代、递归查找算法。
public class App
{
int[] array;
public static void main(String[] arg) {
App app=new App();
app.array= new int[]{8,11,23,34,39,46,68,71,86};
//顺序查找
System.out.println(app.search(46));
//折半查找的迭代算法
System.out.println(app.binarySearch(34));
//折半查找的递归算法
System.out.println(app.binarySearch(0, app.array.length-1, 23));
}
int search(int k) {
for(int i=0;i<array.length;i++) {
if(k==array[i]) {
return i;
}
}
return -1;
}
int binarySearch(int k) {
int low=0,high=array.length-1;
while(low<=high) {
int mid=(low+high)/2;
if(k<array[mid]) {
high=mid-1;
}else if(k>array[mid]) {
low=mid+1;
}else {
return mid;
}
}
return -1;
}
int binarySearch(int low,int high,int k) {
if(low>high) {
return -1;
}
int mid=(low+high)/2;
if(k<array[mid]) {
int t;
if((t=binarySearch(low,mid-1,k))!=-1) {
return t;
}
}else if(k>array[mid]) {
int t;
if((t=binarySearch(mid+1, high, k))!=-1) {
return t;
}
}else {
return mid;
}
return -1;
}
}
索引顺序表
当数据表很大,内存不足时,可以采用索引顺序表来存储和查找。索引顺序表由主表和索引表组成。索引表由索引项组成,索引项含有关键字和对应数据元素在主表中的地址信息。主表可放入辅存中,含有数据元素全部信息。左边的索引表也称完全索引表。
如果完全索引表分块,并使用一张表指出该块,该表为二级索引表。二级索引表给出了每一块的最大关键值的值和该块的起始地址。
倒排索引表
如果仅使用主关键字查找数据元素,索引顺序表很合适。但是实际上还要针对其他属性进行查找,比如查询所有上海籍通信专业的男生信息。因此,其他常用的属性可设为次关键字,为每个次关键字建立次索引表。
链式倒排索引表:
对次关键字的所有取值,建立一个有序链表。
比如查找所有的男同学,在倒排索引表中找到对应的有序表,如1010、1028、...、4078,从完全索引表中找到主表中对应的元素。
单元式倒排索引表:
倒排索引表中各个索引项存放表示各外存区域是否存有相应数据元素的标识。
若要查上海通信专业的男生,可将三张表进行“与”运算。
即可找打数据元素在外存的区号。