二分搜索及其变形--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],以及大数组。
那么想要返回第一个符合条件的值要怎么办呢?直接上代码:
那么如果想要返回最后一个符合条件的值,只需要把
首先,来看二分法的思想:
每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字,返回-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; }
相关文章推荐
- 概率语言模型及其变形系列(5)-LDA Gibbs Sampling 的JAVA实现
- [转]编程珠玑第五章二分搜索(折半查找)之java实现
- [未读] 概率语言模型及其变形系列(5)-LDA Gibbs Sampling 的JAVA实现
- 编程珠玑第五章二分搜索(折半查找)之java实现
- 算法与数据结构-二分搜索 讲解与java代码实现
- java实现二分搜索树
- 二分搜索的java实现
- 二分搜索学习笔记 Java实现
- Java使用分治算法实现排序数索引功能示例【二分搜索】
- 二分查找算法原理及其java循环实现
- 二分搜索及其变形应用
- 算法入门---java语言实现的二分搜索树小结
- Java 分治算法实现排序数索引(二分搜索)
- 概率语言模型及其变形系列(5)-LDA Gibbs Sampling 的JAVA实现
- 实验一 分治与递归―二分搜索 java实现
- 常见算法学习及其Java实现--插入排序算法
- java 实现魔兽搜索器 魔兽对战平台
- 搜索文本内容——Java代码的简单实现(修改版)
- 常见算法学习及其Java实现--冒泡算法实现
- 常见算法学习及其Java实现--有序区和无序区的冒泡算法实现