二分查找

  二分查找(Binary Search)又称折半查找,是一种高效率的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找原理

  满足表中元素有序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成两个子表,根据中间关键字和查找关键字的关系在子表中查找,重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找分析

  优点: 比较次数少,查找速度快,平均性能好。
  缺点: 要求待查表为有序表,且插入删除困难。
  适用范围: 不经常变动而查找频繁的有序列表。
  时间复杂度: O( log ⁡ 2 N \log_2 N log2​N)

代码实现

// C++
int binarySearch(vector<int>& nums, int target) {int mid;  // 中间位置 int left = 0;  // 左边界 int right = nums.size() - 1;  // 右边界 while (left <= right) { // 折半查找 mid = left + (right - left) / 2;  // 计算中间位置 if (nums[mid] == target) {  // 与中间位置元素比较 return mid;  // 查找成功,返回位置信息 } else if (target < nums[mid]) {  // 小于中间位置元素 right = mid - 1;  // 改变右边界  } else {  // 大于中间位置元素 left = mid + 1;  // 改变左边界 }}return -1;  // 查找失败返回-1
}

三分查找

三分查找原理

  三分查找,类似于二分查找,区别在于利用两个中间位置记录,将表分为三个子表。

三分查找分析

  时间复杂度: O( log ⁡ 3 N \log_3 N log3​N)

代码实现

// C++
int trisectionSearch(vector<int>& nums, int target) {int midl;  // 靠左中间位置 int midr;  // 靠右中间位置int left = 0;  // 左边界int right = nums.size() - 1;  // 右边界 while (left <= right) {  // 三分查找 midl = left + (right - left) / 3;  // 计算靠左中间位置midr = right - (right - left) / 3;  // 计算靠右中间位置if (target < nums[midl]) {  // 小于靠左中间位置right = midl - 1;  // 改变右边界 } else if (target > nums[midr]) {  // 大于靠右中间位置  left = midr + 1;  // 改变左边界} else if (target != nums[midl] && target != nums[midr]) {  // 不等于左右中间位置left = midl + 1;  // 改变左边界right = midr - 1;  // 改变右边界 } else {  // 等于左或右中间位置 return nums[midl] == target ? midl : midr;  // 查找成功,返回位置信息 }}return -1;  // 查找失败返回-1
}

算法分析

由时间复杂度看,三分查找是不是优于二分查找呢?
  二分查找每次查询范围减少一半,需要查询的次数是 log ⁡ 2 N \log_2 N log2​N。三分查找每次查询两个数字与目标数字比较,可以把查询范围缩小成原先的 1 / 3。查询次数就只有 log ⁡ 3 N \log_3 N log3​N,一下子就优化了这么多,那如果是四分,五分,六分,七分,N分岂不是能无限优化。

  答案并非如此,因为二分法和三分法的渐进复杂度是一样的。

   log ⁡ 2 3 \log_2 3 log2​3是个常数,因此,两个函数是同阶无穷大。任意两个对数函数 log ⁡ a N \log_a N loga​N与 log ⁡ b N \log_b N logb​N,比较它们的无穷大阶数都会得到 log ⁡ a b \log_a b loga​b,是个常数。因此对数函数的底对于算法的复杂度分析是没有意义的。
  因此,无论是二分法,三分法,四分法,N分法······复杂度都是一样的,分的越多,代码反而越复杂,得不偿失。

二分查找 vs. N分查找相关推荐

  1. Python递归、反射、2分查找、冒泡排序

    一.冒泡排序:比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数.针对所有的元素重复以上的步骤,除了 ...

  2. K分查找时间复杂度推导

    K分查找时间复杂度推导 问题描述 类比二分搜索算法,设计k分搜索算法(k为大于2的整数)如下:首先检查n/k处(n为被搜索集合的元素个数)的元素是否等于要搜索的值,然后检查2n/k处的元素,--,这样 ...

  3. 查找算法--01 顺序查找和二分查找

    目      录 1. 顺序查找 1.1 顺序查找介绍 1.2 顺序查找适用范围 1.3 顺序查找代码实现 2.二分查找 2.1 二分查找介绍 2.2 二分查找适用范围 2.3 二分查找代码实现 2. ...

  4. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  5. PTA-习题11-2 查找星期 (15 分)-enum

    PTA-习题11-2 查找星期 (15 分)-enum 本题要求实现函数,可以根据下表查找到星期,返回对应的序号. 序号 星期 0 Sunday 1 Monday 2 Tuesday 3 Wednes ...

  6. 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)

    1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...

  7. 算法章节 递归、排序、⼆分查找

    递归 概念与特性 函数调⽤函数⾃身的编程⽅式叫做递归,调⽤为"递",返回为"归" 三个条件 1. ⼀个问题的解可以分解为多个⼦问题的解: 2. 分解之后的⼦问题 ...

  8. Ts_半分查找猜数字游戏(初始版),

    第一次使用半分查找,勉强可以看 封装函数体 int look(int arr[],int num,int r){int left = 0;int right = 0;right = r;while ( ...

  9. C#算法设计查找篇之02-二分查找

    二分查找(Binary Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/699 访问. 二分查找也称折半查 ...

最新文章

  1. Elasticsearch5.5.1(核心10)
  2. 网络营销——网络营销专员表明网站地图助力网站收录进一步提升
  3. 北大核心2020TP类
  4. css3整理--border-radius
  5. Apple Mac OS X每日一技巧026:Spotlight打开文件所在的文件夹
  6. 台式电脑计算机硬盘清理,台式电脑重装系统win7清理磁盘碎片的方法
  7. the blocks problem(uva 101 or poj 1208)
  8. 计算机硬件基础与linux发展史
  9. 进击的程序媛:毕业于斯坦福,Google 元老级员工,曾任雅虎 CEO | 人物志
  10. 转发: 安全百科 DNS欺骗
  11. 前缀、中缀、后缀(逆波兰)表达式以及逆波兰表达式实现简单计算器
  12. 华三虚拟机服务器型号,03-虚拟机配置
  13. C++11 std::mutex使用以及std::lock_guard自动解锁避免忘记解锁
  14. linux php zlib,Linux查询zlib版本
  15. 5、标尺-参考线-网格
  16. imagemagick安装问题
  17. luna lunatic
  18. C - Parity Shuffle Sorting
  19. oracle查询超过5000行报错,oracle系列教材 (十七)- 阶段性练习2
  20. 2021甘肃省卫生副高考试成绩查询,2021年甘肃卫生职业资格证网上查分步骤

热门文章

  1. 部门来了个卷王之王,真的让人奔溃
  2. Get请求,参数为@RequestBody的http请求
  3. 非接环境(PPSE)和接触环境(PSE)的FCI有什么区别
  4. 三次函数求近似解(牛顿迭代法/二分法)
  5. 使用howler做一个音频播放器到底有多简单
  6. “谷底”类题目及一些自己的思考
  7. IOException:Sharing Violation on Path
  8. Linux LCD设备驱动详解
  9. 未来老婆查询生成器微信小程序源码 流量主系列
  10. 1月10日前未完成《创业创新执行力》考试的补救措施