二分查找

  二分查找(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. System.Transactions介绍
  2. IDC对SIEM市场的估测
  3. Flask-RESTful 快速入门
  4. LeetCode198——house robber(不懂dp)
  5. java学习(33):巩固练习
  6. [剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue]
  7. windows下刻录U盘启动盘安装linux报错解决
  8. Java 设计模式 Factory Method 工厂方法 模式
  9. QT 快捷键 识别小写字母
  10. java 修改pdf文档的页面的大小
  11. QT Designer中编辑菜单栏技巧
  12. Si5395/94/92时钟芯片配置步骤
  13. php生成word并下载
  14. 北大邮箱客户端2018版配置方法(SMTP、POP3)
  15. 1008. 【SHOI2008】仙人图(II)
  16. c语言在打开文件时会使用到的函数,C语言打开文件操作
  17. 以大多数人的努力程度之低,根本轮不到拼智商
  18. jdbc入门到精通1.1访问数据库实战
  19. 计算机考研复试面试常问问题 编程语言篇
  20. ESRI技术认证考试大纲

热门文章

  1. 为什么要使用高彩模式
  2. Java爬虫爬取wallhaven的图片
  3. java第三次试验报告
  4. C++(第十三篇):二叉搜索树(二叉树进阶、二叉搜索树的结构、应用及模拟实现)
  5. 把sql转换为pdm
  6. VC苹果版:iPhone iOS下载安装《罪恶都市》侠盗飞车GTA的方法
  7. 多商户商城系统功能拆解13讲-平台端会员管理
  8. html:对于拼多多网页的简单制作
  9. Hero In Maze 简单版
  10. 微信小程序wxss公共样式