Algoritmo de búsqueda --------- Búsqueda de Fibonacci

Hallazgo de Fibonacci

También conocido como el método de la sección áurea , aquellos que estén interesados ​​pueden entender qué es el punto de la sección áurea.

¿Qué tiene que ver la proporción áurea con la secuencia de Fibonacci?

Secuencia de Fibonacci : 1,1,2,3,5,8,13,21,34,55 encontró que la proporción de dos números adyacentes es infinitamente cercana a 0.618 del valor de la sección áurea

principio

El principio de búsqueda de Fibonacci es similar a los dos anteriores, solo cambiando la posición del nodo medio (medio) , medio ya no está en el medio o interpolado, sino que se encuentra cerca del punto de la sección áurea , es decir, medio = bajo + F (k- 1) -1 (F significa secuencia de Fibonacci), como se muestra en la siguiente figura

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo anti-hotlinking. Se recomienda guardar la imagen y subirla directamente (img-dDgUzGoM-1611326895299) (C: \ Users \ 王庆华 \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210122180623693.png)]

Comprensión de F (K-1) -1

bajo: el índice frontal de la matriz

De las propiedades de la secuencia de Fibonacci F [k] = F [k-1] + F [K-2], podemos obtener (F [k] -1) = (F [k-1] -1) + ( F [k-2] -1) +1. Esta fórmula explica: Siempre que la longitud de la tabla de secuencia sea F [k] -1, la tabla se puede dividir en dos secciones con longitudes F [k-1] -1 y F [k-2] -1, como se muestra en la figura anterior Mostrar. Entonces la posición media es mid = low + F (k-1) -1

Pero la longitud de la tabla de secuencia n no es necesariamente igual a FK-1, por lo que la longitud de la tabla de secuencia original n debe aumentarse a F [k] -1. El valor de k aquí solo necesita hacer que F [k] -1 sea exactamente mayor o igual que n, y la posición recién agregada (de n + 1 a la posición F [k] -1) después de que se incremente la longitud de la tabla por el siguiente código, Todos se asignan al valor de la posición n.

tema

Realice la búsqueda de Fibonacci {1,8, 10, 89, 1000, 1234} en una matriz ordenada, ingrese un número para ver si este número existe en la matriz, busque el subíndice, si no, aparecerá "No Este número

Sigue siendo el ejemplo del maestro

Código

import java.util.Arrays;

//斐波那契算法
//author 王
//2021年1月22日18:17:16
public class FibonacciSearch {
    
    
	public static int maxSize = 20;
	public static void main(String[] args) {
    
    
		int[] arr = {
    
    1,8, 10, 89, 1000, 1234};
		System.out.println(fibSearch(arr, 89));
	}
	
	//因为后面我们mid = low+F(K-1) -1,需要使用到斐波那契数列,因此我们需要先获取到一个斐波那契数列
	//非递归方法得到一个斐波那契数列
	public static int[] fib(){
    
    
		int[] fib = new int[maxSize];
		fib[0] = 1;
		fib[1] = 1;
		for (int i = 2; i < maxSize; i++) {
    
    
			fib[i] = fib[i -1] + fib[i-2];
		}
		return fib;
	}
	
	//编写斐波那契查找算法
	/**
	 * 使用非递归的方式编写
	 * @param a			数组
	 * @param key		需要查找的关键数字
	 * @return			返回对应的下标,没有返回-1
	 */
	public static int fibSearch(int[] a,int key){
    
    
		int low = 0;
		int high = a.length - 1;
		int k = 0;//表示斐波那契分割数值的下标
		int mid = 0;//存放我们的mid
		
		int f [] = fib();//获取到我们的斐波那契数列
		//获取到斐波那契分割数值的下标
		while(high > f[k] - 1){
    
    
			k++;
		}
		// 因为f[k]值可能大于a的长度,因此需要我们使用Arrays类,构造一个新数组,并指向a
		//不足的部分会使用0填充的
		int[] temp = Arrays.copyOf(a, f[k]);
		//实际上需要使用a数组最后的数填充temp
		//{1,8, 10, 89, 1000, 1234,0,0,0,0}=>{1,8, 10, 89, 1000, 1234,1234,1234,1234}
		for (int i = high+1; i < temp.length; i++) {
    
    
			temp[i] = a[high];
		}
		//使用while来循环处理,找到我们的数key也就是以前代码中的findValue
		while(low <= high){
    
    
			mid = low + f[k-1] -1;
			if(key < temp[mid]){
    
    
				//说明我们应该继续向数组前面部分查找
				high = mid -1;
				//为什么k--
				//1.全部元素 = 前面元素 + 后面元素
				//2.f[k] = f[k-1] + f[k-2]
				//因为前面有f[k-1]个元素,所以我们可以继续拆分f[k-1] = f[k-2] + f[k-3]
				//即在f[k-1] 的前面继续查找
				//下次循环的mid = f[k-1-1]-1
				k--;
			}else if(key > temp[mid]){
    
    
				//说明我们应该继续向数组后面部分查找
				low = mid +1;
				//1.全部元素 = 前面元素 + 后面元素
				//2.f[k] = f[k-1] + f[k-2]
				//因为后面有f[k-2]个元素,所以我们可以继续拆分f[k-1] = f[k-3] + f[k-4]
				//即在f[k-2] 的前面继续查找
				//下次循环的mid = f[k-1-2]-1
				k-=2;
			}else{
    
    
				//确定返回的下标
				if(mid <= high){
    
    
					return mid;
				}else{
    
    
					return high;
				}
			}
		}
		return -1;
		
	}
}

Supongo que te gusta

Origin blog.csdn.net/qq_22155255/article/details/113006653
Recomendado
Clasificación