Búsqueda binaria
Prerrequisitos
Nuestra búsqueda binaria debe realizarse en una matriz ordenada.
Ya sea de pequeño a grande o de grande a pequeño
tema
Realice una búsqueda binaria {1, 8,10,89,1000,1234} en una matriz ordenada , ingrese un número para
ver si la matriz está en este número y proporcione el subíndice; de lo contrario, le indicará que hay no hay tal cantidad".
Ideas
Usaremos el pensamiento recursivo en nuestra búsqueda binaria esta vez. Por supuesto, también hay métodos no recursivos. Aprenderé por separado.
1. Primero determine el subíndice del medio de la matriz mid mid = (izquierda + derecha) / 2
2. Compare findValue con nuestro arr [mid]
Si findValue> arr [mid], búscalo de forma recursiva a la derecha
Si findValue <arr [mid], busque de forma recursiva a la izquierda
Si lo encuentra, regrese
¿Cuál es nuestra salida recursiva (condición final)?
1. Lo encontré, regrese y salga
2. Cuando se recupera toda la matriz, no se encuentra findValue, y necesitamos finalizar la recursividad, cuando nuestra izquierda> derecha significa que ha terminado.
Código
//二分查找
//@author 王
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {
1,8,10,89,1000,1234};//必须是有序数组
int resultIndex = binarySearch(arr, 0, arr.length -1, 1234);
System.out.println(resultIndex);
}
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param findValue 需要找的数字,找到返回下标,未找到返回-1
* @return
*/
//二分查找算法
public static int binarySearch(int[] arr,int left,int right,int findValue) {
int mid = (left+right)/2;
int midValue = arr[mid];
if(findValue >midValue){
//向右递归
return binarySearch(arr, mid+1, right, findValue);
}else if(findValue < midValue){
//向左递归
return binarySearch(arr, left, mid-1, findValue);
}else{
return mid;
}
}
}
Es fácil para nosotros encontrar el problema. Hay un problema con nuestra recursividad. Si encontramos un rescate de datos inexistente, se informará un error. Este error es causado por una recursión muerta.
Exception in thread "main" java.lang.StackOverflowError
at 查找算法.BinarySearch.binarySearch(BinarySearch.java:27)
Entonces tenemos que escribir esta salida final recursiva
Mejorar
//二分查找
//@author 王
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {
1,8,10,89,1000,1234};//必须是有序数组
int resultIndex = binarySearch(arr, 0, arr.length -1, 123);
if(resultIndex != -1){
System.out.println(resultIndex);
}else{
System.out.println("没有找到这个数字");
}
}
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param findValue 需要找的数字,找到返回下标,未找到返回-1
* @return
*/
//二分查找算法
public static int binarySearch(int[] arr,int left,int right,int findValue) {
if(left > right){
return -1;
}
int mid = (left+right)/2;
int midValue = arr[mid];
if(findValue >midValue){
//向右递归
return binarySearch(arr, mid+1, right, findValue);
}else if(findValue < midValue){
//向左递归
return binarySearch(arr, left, mid-1, findValue);
}else{
return mid;
}
}
}
Ampliémoslo un poco, que también es el ejercicio
extracurricular del profesor {1,8,10,89,1000,1000,1000,1234} Cuando hay varios valores idénticos en una matriz ordenada, cómo encontrar todos los valores A, por ejemplo, 1000 aquí.
La idea es similar a lo que aprendí la última vez, podemos usar una colección para almacenar nuestro valor de índice y regresar a nuestra colección.
Código
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {
1,8,10,89,1000,1000,1000,1234};//必须是有序数组
ArrayList<Integer> resultIndex = binarySearch2(arr, 0, arr.length -1, 1000);
if(resultIndex.size() == 0){
System.out.println("没有找到这个数字");
}else{
System.out.println(resultIndex);
}
}
public static ArrayList<Integer> binarySearch2(int[] arr,int left,int right,int findValue) {
if(left > right){
return new ArrayList<Integer>();
}
int mid = (left+right)/2;
int midValue = arr[mid];
if(findValue >midValue){
//向右递归
return binarySearch2(arr, mid+1, right, findValue);
}else if(findValue < midValue){
//向左递归
return binarySearch2(arr, left, mid-1, findValue);
}else{
ArrayList<Integer> list = new ArrayList<Integer>();
int temp = mid -1;
//向左边扫描
while(true){
if(temp < 0 || arr[temp] != findValue){
//退出
break;
}else{
//否则就将temp放到集合中
list.add(temp);
temp -= 1;//temp左移
}
}
list.add(mid);
//向右扫描
temp = mid +1;
while(true){
if(temp > arr.length - 1 || arr[temp] != findValue){
//退出
break;
}else{
//否则就将temp放到集合中
list.add(temp);
temp += 1;//temp左移
}
}
return list;
}
}
}