二分查找

首先来看二分查找的基础版本 (三分支版本):

template <typename T>
static int fibSearch(T *A, int lo, int hi, T const& e){while (lo < hi){int mi = (lo + hi)/2;if (A[mi] < e) lo = mi + 1;else if (A[mi] > e) hi = mi;else return mi;}return -1;
}

黄金分割

事实上,分治策略并未要求子向量切分点 mi 必须居中,调整前、后区域的长度,适当地加长(缩短)前(后)子向量,一个自然的方案就是按黄金分割比来确定 mi,为简化起见,不妨设向量长度为 n = fib(k)-1。对于 [0, n) 区间内的搜索而言,可以以 mi = fib(k-1) - 1 作为前后向量的切分点。如此,前后子向量的长度分别为:

  • 前(左)子向量:fib(k-1)-1
  • 后(右)子向量:fib(k)-1-(fib(k-1) - 1) - 1 = fib(k-2) - 1

于是无论朝哪个方向深入,新向量的长度形式上仍然是某个 Fibonacci 数减一,故这一处理手法可以反复套用。直至命中或区间搜索至零而终止。

template <typename T>
static int fibSearch(T *A, int lo, int hi, T const& e){Fib f(hi - lo);while (lo < hi){while (hi - lo < f.get()) f.prev();// 只比当前区间长度之前的 fib 数, 5 ⇒ 3, 8 ⇒ 5 int mi = lo + f.get() - 1; // fib(k-1) - 1if (A[mi] > e) hi = mi;else if (A[mi] < e) lo = mi + 1;else return mi;}return -1;
}

Fib 类的实现请见 斐波那契数列(面向对象版)

二分查找的变体 —— Fibnaccian Search相关推荐

  1. 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式...

    序言 本文以经典的二分查找为例,介绍如何使用循环不变式来理解算法并利用循环不变式在原始算法的基础上根据需要产生算法的变体.谨以本文献给在理解算法思路时没有头绪而又不甘心于死记硬背的人. 二分查找究竟有 ...

  2. STL之lower_bound,upper_bound二分查找函数 结构体

    codeforces上的代码是开放的,常常就能看到本渣与大神们的差距 比如二分查找... 1.在数组中,找出第一个4所在位置 输入: 14 4 1 2 2 3 4 4 4 4 5 6 7 9 9 10 ...

  3. list 查找_五千字长文带你学习 二分查找算法

    点击上方"与你一起学算法",选择"星标"公众号 重磅干货,第一时间送达 二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使 ...

  4. 数据结构与算法——二分查找与二叉查找树汇总整理

    目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...

  5. 【查找】- 二分查找

    懒猫老师-二分查找基础知识 代码随想录-二分查找基础知识 1 完全有序 1.1 二分查找 二分查找-力扣题目链接 1.1.1 二分查找 (左闭右闭区间) 1.循环退出条件 注意是 low<=hi ...

  6. 再也不怕女朋友问我二分查找了!【手绘漫画】图解二分查找(修订版)(LeetCode 704题)

    文章目录 图解算法与数据结构 1.前言 2.代码 3.实例(LeetCode 704题) 图解算法与数据结构 1.前言 上次讲到的更的二分查找模板在很多地方让我使用起来不是特别的舒服,感谢B站上的y大 ...

  7. 17道题带你理解二分查找

    不太会的可以先看看二分查找的模板 点这里 最需要注意的是二分查找的分界线并不止局限于大于等于小于,而是对某种性质的一种分界 1.Leetcode704. 二分查找 class Solution {pu ...

  8. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

  9. 如何快速定位出一个IP地址的归属地?——二分查找变体

    如何快速定位出一个IP地址的归属地?--二分查找变体 查找第一个值等于给定值的元素 查找最后一个值等于给定值的元素 查找第一个大于等于给定值的元素 查找最后一个小于等于给定值的元素 查找循环有序数组中 ...

最新文章

  1. fire.php,Fire PHP
  2. android 获取手机SD卡和手机的内部存储
  3. JavaScript中十个一步拷贝数组的方法
  4. 数字图像处理之空间域图像增强
  5. (转)Linux下apache限速和限制同一IP连接数的实现
  6. 揭秘继承技术之虚函数
  7. 定时任务调度框架实现总结
  8. day21 java的日期类
  9. C#音视频处理开源项目收录
  10. 19_完成“我的订单”
  11. QQ2013的PC版协议,0825包和0826的数据分析
  12. MySQL的需求分析怎么写_MySQL 数据库设计 笔记与总结(1)需求分析
  13. 数据库导出换行mysql_数据库导出excel 换行
  14. 搭建一个个人网站需要多少钱预算?
  15. C# http请求挂代理
  16. 滴滴裁员2000人,员工竟然被裁出幸福感,获得员工的一致好评?
  17. http/https接口调用
  18. 暴力破解键盘上所有组合的密码需要多久?
  19. 静态手势识别控制游戏方向
  20. 数字孪生管理产品在智慧医院方面的整体解决方案

热门文章

  1. 泛型使用思想,记一次java泛型使用经历
  2. 光伏储能容量优化MATLAB论坛,【推荐】基于需求响应的光伏微网储能系统多目标容量优化配置!...
  3. linux安装mysql5.6rpm_centos6.5 下安装mysql5.6,rpm方式
  4. Tensorflow——Tensorflow的用途、安装、数据流图
  5. 本地连接远程代码库——生成公钥SSH Key(Linux版)
  6. 深度学习中端到端的理解
  7. SQL Server 中系统表的作用
  8. 未初始化的类,通过指针调用其非静态函数
  9. 使用JWT来实现单点登录功能
  10. python中matplotlib 的简单使用