题目:搜索

(1)请写出Java代码,实现二分搜索(给定一个按升序排列的数组和一个要查找的值,返回该值在数组中的index)

(2)说明该算法时间复杂度

(3)如果改成三分搜索,时间复杂度将会是多少?说明与二分搜索相比较是提升还是降低。

解答:

(1)

package ddd;
/*** @author George* @description   二分搜索* 算法要求:* 1.必须采用顺序存储结构。* 2.必须按关键字大小有序排列。**/
public class BinarySearch {public static void main(String[] args) {int[] nums = {1,2,3,4,5,6,7,8,9};System.out.println(search(nums, 2));}public static int search(int[] nums,int key){//定义初始最小、最大索引int start = 0;int end = nums.length - 1;//确保不会出现重复查找,越界while (start <= end) {//计算出中间索引值int middle = (end + start)>>>1 ;//防止溢出if (key == nums[middle]) {return middle;//判断下限} else if (key < nums[middle]) {end = middle - 1;//判断上限} else {start = middle + 1;}}//若没有,则返回-1return -1;}
}

(2)二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

时间复杂度无非就是while循环的次数!

总共有n个元素,

渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数

由于你n/2^k取整后>=1

即令n/2^k=1

可得k=log2n,(是以2为底,n的对数)

所以时间复杂度可以表示O(h)=O(log2n)

(3)

首先二分查找的时间复杂度:因为每次都是折半,可以构造一颗递归树,共log2(n)层,每层只需O(1)的时间。所以共花费O(1)*log2(n)=O(log2(n))时间。

其次三分查找,也可类似构造一个递归树,共log3(n)层,而每层需要比较的次数为2,所以时间复杂度为O(2log3(n))。

最后求得使 2log3(n)>log2(n) 对n>0始终成立。所以三分查找比二分查找的性能就是差。

当然对于二分查找的缺陷分析,优点:大大提高了查找的效率, 缺陷:只能查找单调递增的序列。

对于假若要查找一个抛物线的最值的时候,这里是二分法是不适用的,这里适用三分。

大剑无锋之二分搜索、二分搜索时间复杂度、三分查找呢?相关推荐

  1. 二分搜索的时间复杂度分析

    先贴上二分查找的java代码实现 public static int binarySearch(int[] a,int n,int value){int low = 0;int high = n - ...

  2. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  3. 大剑无锋之你了解HTTPS吗?那么它为什么安全?【面试推荐】

    在面试中,我们经常遇到像HTTP方面的知识.比如: 大剑无锋之HTTP连接https://blog.csdn.net/qq_41946557/article/details/101155935 大剑无 ...

  4. C语言实现ternary search三分查找算法(附完整源码)

    实现ternary search三分查找算法 实现ternary search三分查找算法的完整源码(定义,实现,main函数测试) 实现ternary search三分查找算法的完整源码(定义,实现 ...

  5. 二分检索用途及复杂性_二分查找和三分查找哪个快?算法复杂度与常数无关?复杂度分析的常见误区...

    还记得两三年前,我初看一本算法书,看到二分查找算法的复杂度时,我发现了了不得的东西:二分查找每次查询范围减少一半,需要查询的次数是 ,它的复杂度是 . 我把它改成三分查找,每次查询两个数字与我的目标数 ...

  6. 快乐学算法之:三分查找树ternary search tree

    文章目录 简介 三分查找树的结构 三分查找树的代码表示 三分查找树的应用 简介 之前我们介绍了tire字典树,tire字典树的优点就是插入和查找比较快速,但是它的缺点就是占用的空间比较大.假如我们要存 ...

  7. 42亿QQ,O(1)时间复杂度完成查找

    一.问题描述: 1.在42亿个qq号码中,如何使用O(1)时间复杂度去查找一个QQ号是否存在. 2.qq号的位数小于13位,存储着42亿QQ号的内存不得超过600MB. 二.位图排序思想 由于待排序的 ...

  8. 折半查找和二叉排序树的时间性能_leecode刷题----二分搜索与二叉查找(排序)树...

    预备知识:二分查找 已知一个排序数组A,如A=[-1,2,5,20,90,100,207,800],另外一个乱序数组B,如B=[50,90,3,-1,2-7,80],求B中任意某个元素是否在A中出现, ...

  9. 大剑无锋之Redis面试题【推荐】

    1.Redis 是一个基于内存的高性能key-value数据库. 2.Redis相比memcached有哪些优势: memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数 ...

最新文章

  1. #pragma pack的作用
  2. 大文件分片上传,断点续传,秒传 实现
  3. Leetcode 226. 翻转二叉树 (每日一题 20210819)
  4. 微信小程序开发教程第七章:微信小程序编辑名片页面开发
  5. linux6.4 安装oracle11g 出现错误ORA-01078和LRM-00109错误
  6. js将字符串 YYMMDDHHmmss 转化为 date类型
  7. the process cannot access the file because it is being used by another process
  8. 基于python的在线考试系统-Python在线考试系统防作弊功能的思路和实现
  9. vs2019添加opencv目录和dlib目录
  10. 基于Java的体育场地预约系统
  11. 如何制作手机自适应网页
  12. python爬虫100例--微博评论(5)
  13. 2012意大利之行3:罗马的路和车_我是亲民_新浪博客
  14. udp ue4 通讯_UE4 UDP通信
  15. viewFlipper的基本实现
  16. Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
  17. 八种必备户外装备包你踏遍地球
  18. Linux下操作带空格的文件
  19. 知识、见识、胆识、突破、创新
  20. MFC或C/C++中如何判断目录存在,文件/文件夹存在,亦或是文件夹存在,文件存在

热门文章

  1. POJ - 1696 Space Ant(极角排序)
  2. 【算法】图论学习笔记与代码实现
  3. linux命令中提取某一列,怎么用Linux命令提取表格文本中的某列
  4. HDU2227(非降子序列的个数)
  5. POJ3130(还是判断多边形的内核是否存在)
  6. NOIP2018提高组比赛总结
  7. cocos2d-x游戏开发(十五)游戏加载动画loading界面
  8. STL 之find,find_if,find_end,find_first_of
  9. c++ template(4)基本技巧
  10. 如何替公司省下数千万勒索费用