斐波拉契查找及二分查找

2024-06-20 09:18
文章标签 二分 查找 波拉

本文主要是介绍斐波拉契查找及二分查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

斐波拉契查找

代码

#include <stdio.h>
#include <stdlib.h>//求第n项的斐波拉契数
int fib(n) {int left = 0;int right = 1;while ( --n > 0 ) {right = left + right;left = right - left;} return right;
}//求n个斐波拉契数
int * fibList(n) {int *a = calloc(sizeof(int), n);for (int i = 0; i < n; i++) {a[i] = fib(i+1);}return a;
}int fibSearch(int *a, int size,int search) {int mid, low = 0, high = size-1;int *p = fibList(high-low);while(low < high) {int i = 0;while (high - low >= p[i]) { //查找符合的斐波拉契数i++;}mid = low + p[i-1] -1; //构造一个中点printf("low=%d,high=%d\n", low, high);printf("p[%d]=%d,mid=%d,a[mid]=%d\n", i-1, p[i-1], mid, a[mid]);if ( search < a[mid] ) {high = mid;} else if (a[mid] < search) {low = mid+1;} else {return mid;}}return -1;
}int main() {int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};printf("%d\n", fibSearch(a, 10, 7));
}

执行过程

low=0,high=9
p[5]=8,mid=7,a[mid]=8
low=0,high=7
p[4]=5,mid=4,a[mid]=5
low=5,high=7
p[2]=2,mid=6,a[mid]=7
6

二分查找

代码

int binSearch(int *a, int size, int search) {int mid, low = 0, high = size-1;while (low < high) {mid = (low + high) >> 1;if ( search < a[mid] ) {high = mid;} else if (a[mid] < search) {low = mid + 1;} else {return mid;}}return -1;
}

说明:斐波拉契查找要优于二分查找,如上代码每次二分查找的时候向左边查找的比较次数是1,向右边查找比较次数为2。故而我们期望查找区间多落在左侧区间,少落在右侧区间,为了找到那个合适的点,最终推论出了斐波拉契的那个点(即是黄金分割点)。故而有了斐波拉契查能性能优于二分查找。

资料:https://www.bilibili.com/video/BV1db411L71m?p=56

这篇关于斐波拉契查找及二分查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077718

相关文章

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl