您的位置:首页 > 编程语言 > Java开发

二分搜索及其变形--java实现

2016-11-13 22:57 387 查看
在数据结构中,二分法搜索非常容易受到考察,它还有很多变形。这里来记录一下学习过程中的两个变形:二分搜索找出第一个和最后一个符合要求的值的位置。

首先,来看二分法的思想:

每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字,返回-1。

java代码如下:public class BinarySearch {

public static void main(String[] args) {
int a[] = {1,2,3,4,5,6,7,8};
System.out.println(binarySearch(a,5));
}

public static int binarySearch(int[] a,int goal){
int low=0;
int high = a.length-1;
while(low <= high){
int middle = (low + high)/2;
if(goal == a[middle]){
return middle;
}else if(goal < a[middle]){
high = middle -1;
}else{
low = middle + 1;
}
}
return -1;
}
}

其算法复杂度为logn。测试用例可以有如下几种:假设goal值为2,a数组:[ ],[1],[2],[1,2],[2,3],[1,2,3],[0,1,2,3],[3,4,5],以及大数组。

那么想要返回第一个符合条件的值要怎么办呢?直接上代码:

public class FirstGoal {

public static int binarySearch(int[] a,int low,int high,int goal) {
if(a == null) return -1;
while(low <= high){
int mid = (low + high)/2;
if(a[mid] == goal){
return mid;
}else if(a[mid] > goal){
low = mid + 1;
}else{
high = mid -1;
}
}
return -1;
}

public static int getFirstGoal(int[] a,int goal) {
int num = a.length -1;
int mid = binarySearch(a,0,num,goal);

for(int i = mid-1; i<num; i++){
if(a[i] == goal){
mid--;
}else{
break;
}
}
return mid;

}

public static void main(String[] args) {
int[] a = {1,3,3,3};
int place = getFirstGoal(a,3);
System.out.println(place);
}
}
测试用例设计如下:goal值为2,a数组:[],[1],[2],[2,2],[2,2,2],[0,1,2],[2,3,4],[1,2,2],[2,2,3]...

那么如果想要返回最后一个符合条件的值,只需要把
for(int i = mid-1; i<num; i++){
if(a[i] == goal){
mid--;
}else{
break;
}
}
return mid;

}
这段改为:
public static int getLastGoal(int[] a,int goal) {
int num = a.length -1;
int mid = binarySearch(a,0,num,goal);

for(int i = mid+1; i<num; i++){
if(a[i] == goal){
mid++;
}else{
break;
}
}
return mid;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 java