zoukankan      html  css  js  c++  java
  • 重新整理数据结构与算法—— 斐波那契二分查找法[十四]

    前言

    概念:

    https://baike.baidu.com/item/斐波那契数列/99145?fr=aladdin

    我的解释图:

    其实就是将我们的数组长度分为两个部门,前面一部分为:f[k-1] 后面一部分为f[k-2]

    推导过程:假设数组长度为:f[k]-1。

    那么f[k]-1=(f[k-1]-1)+(f[k-2]-1)+1

    其中这个1就是中间节点:

    那么中间节点就是:mid=low+f[k-1]-1;

    正文

    所以代码思路是这样子的:

    static void Main(string[] args)
    {
    	int[] arr = new int[]{1,1,1,1,2,5,10,11,16,18,20,100 };
    	int result=fibSearch(arr,5);
    	Console.WriteLine(result);
    	Console.ReadKey();
    }
    
    public static int[] fib()
    {
    	int[] f = new int[20];
    	f[0] = 1;
    	f[1] = 1;
    	for (int i=2;i<f.Length;i++)
    	{
    		f[i] = f[i - 1] + f[i - 2];
    	}
    	return f;
    }
    /// <summary>
    /// 斐波查找
    /// </summary>
    /// <param name="arr"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static int fibSearch(int[] arr, int key)
    {
    	int low=0;
    	int mid = 0;
    	int height = arr.Length-1;
    	int k = 0;
    	int[] f = fib();
    	while (height>f[k]-1)
    	{
    		k++;
    	}
    	int[] temp = new int[f[k]];
    	//让其符合斐波那契长度
    	Array.Copy(arr,temp,0);
    	for (int i=height+1;i<temp.Length;i++)
    	{
    		temp[i] = arr[height];
    	}
    	while (low<=height)
    	{
    		mid = low + f[k - 1] - 1;
    		if (key < arr[mid])
    		{
    			height = mid - 1;
    			//其中减一是前面有f[k-1]个元素
    			k--;
    		}
    		else if (key > arr[mid])
    		{
    			//其中减二是后面有f[k-2]个元素
    			low = mid + 1;
    			k-=2;
    		}
    		else {
    			return height >= mid ? mid : height;
    		}
    	}
    	return -1;
    }
    

    总结

    斐波那契其实就是一种特殊确定中点位置的过程。

  • 相关阅读:
    新词发现
    隐马尔可夫模型
    nodejs命令行解析工具之minimist
    react 生命周期
    react 中的 super super(props)
    object 常用方法总结
    前端安全 中间人攻击
    Postgresql的临时表的用法
    windows下postgresql数据库备份和还原
    PostgreSQL 数据库开发规范——命名规范 & 设计规范
  • 原文地址:https://www.cnblogs.com/aoximin/p/13210663.html
Copyright © 2011-2022 走看看