常见的三大线性查找:
- 线性查找
- 二分查找(折半查找)
- 分块查找
线性查找思路:
在待查数据中进行顺序性轮询查找,当存在待查的数据时返回当前数据索引位置,如果不存在则返回不存在表示-1,技巧为了增加效率减少主要代码的操作,可以设置一个监视哨在数组的最后一位,这样就可以有效的防止数据越界的比较了只需要比较当前数据是否是所需要的数据就OK了。
平均查找长度:
1/2(n+i)
计算方式:为当前元素查找到的概率乘上所匹配的次数
时间复杂度:
O(N)
代码:
package 顺序查找;
public class Test02 {
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,52,35,5263,7};
int key= 52;
System.out.println(Test02.search(number, key));
}
}
二分查找(折半查找)思路:
特点是待查询的表为有序表,设置一个左标示为0一个右标示为当前数组长度,让当前待查元素与表中间元素进行匹配,如果一致则直接返回中间索引,如果小于中间索引则让右标示等于middle,如果大于中间索引,则让左标示等于middle。
优缺点:
优点就是因为比较的次数大大减少索引效率很高
缺点就是要待查询的表为有序表,这就大大限制的所能操作的领域,并且只对查询效率有所优化,当修改和插入数据的时候这种效率就很低了。因为还有考虑修改或插入之后元素之间顺序的问题。
平均查找长度:
(n+1/n)*(log2(n+1))-1 类似于树结构的思路
时间复杂度:
O(logN)
代码:
package 折半查找;
public class Test02 {
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 = Test02.halfSort(number, key);
if(result == -1){
System.out.println("当前数据不存在");
}else{
System.out.println(result);
}
}
}
分块查询的思路:
先建立一个索引表,索引表中对当前待查的元素进行了分块处理,每一块中包含了当前块中的最大元素,并且后一块中的元素全部大于之前元素,块的个数一般都是平均分割的。这样当查询某一元素的时候只需要先再确定属于哪一个块,之后再到块中进行查找定位,他的效率是基于顺序查找和折半查找中间的,并且他比折半查找要更加灵活,不在局限于有顺序表的这一套路中了。
时间复杂度及平均查找长度:
当采用不同顺序查找方式进行分块查找和块内查找不同。
当采用顺序查找时:1/2(n/s + s) +1
当采用折半查找时: log2(n/s + 1) + 1
代码思路:
建立索引表之后再进行操作,建立和操作的过程采用顺序查找以及折半查找,参考上面读者自行进行结合处理。
欢迎批评指正