线性查找主要分以下三种情况:
(1)线性查找
(2)二分查找(折半查找)
(3)分块查找
(1)线性查找
在待查数据中进行顺序性轮询查找,当存在待查的数据时返回当前数据索引位置,如果不存在则返回不存在表示-1
平均查找长度: 1/2(n+i)
计算方式:为当前元素查找到的概率乘上所匹配的次数
时间复杂度: O(N)
Java代码实现:
public class 线性查找 {
public static int search(int[] number,int key){
int[] temp = new int[number.length+1];
//设置末尾为监视哨
for(int i=0;i<number.length;i++){
temp[i] = number[i];
}
temp[number.length] = key;
int result = 0;
//进行查找匹对
for(int i=0;;i++){
if(temp[i] == key){
result = i;
break;
}
}
if(result < number.length){
return result;
}else{
return -1;
}
}
public static void main(String[] args){
int[] number = {12,24,53241,126,52,35,5263,7};
int key= 52;
System.out.println(线性查找.search(number, key));
}
}
(2)二分查找(折半查找)
特点是待查询的表为有序表,设置一个左标示为0一个右标示为当前数组长度,让当前待查元素与表中间元素进行匹配,如果一致则直接返回中间索引,如果小于中间索引则让右标示等于middle,如果大于中间索引,则让左标示等于middle。
优缺点:
优点就是因为比较的次数大大减少索引效率很高
缺点就是要待查询的表为有序表,这就大大限制的所能操作的领域,并且只对查询效率有所优化,当修改和插入数据的时候这种效率就很低了。因为还有考虑修改或插入之后元素之间顺序的问题。
平均查找长度: (n+1/n)*(log2(n+1))-1
时间复杂度: O(logN)
Java代码实现:
public class 折半查找 {
public static int halfSort(int[] data,int key){
int left = 0;//左标记
int right = data.length-1;//右标记
int result = -1;
while(left<=right){ //进行中间判断
int half = (left+right)/2;
if(data[half] == key){
result = half;
break;
}else if(data[half] < key){
left = half;
}else{
right = half;
}
}
return result;
}
public static void main(String[] args){
int[] number = {1,2,3,4,5,6,7,8,9,10};
int key = 6;
int result = 折半查找.halfSort(number, key);
if(result == -1){
System.out.println("当前数据不存在");
}else{
System.out.println(result);
}
}
}
(3)分块查询
先建立一个索引表,索引表中对当前待查的元素进行了分块处理,每一块中包含了当前块中的最大元素,并且后一块中的元素全部大于之前元素,块的个数一般都是平均分割的。这样当查询某一元素的时候只需要先再确定属于哪一个块,之后再到块中进行查找定位,他的效率是基于顺序查找和折半查找中间的,并且他比折半查找要更加灵活,不在局限于有序表。
时间复杂度及平均查找长度:
当采用不同顺序查找方式进行分块查找和块内查找不同。
当采用顺序查找时:1/2(n/s + s) +1
当采用折半查找时: log2(n/s + 1) + 1
参考:http://www.cnblogs.com/hanjun/archive/2013/02/05/2892826.html