大剑无锋之二分搜索、二分搜索时间复杂度、三分查找呢?
题目:搜索
(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始终成立。所以三分查找比二分查找的性能就是差。
当然对于二分查找的缺陷分析,优点:大大提高了查找的效率, 缺陷:只能查找单调递增的序列。
对于假若要查找一个抛物线的最值的时候,这里是二分法是不适用的,这里适用三分。
大剑无锋之二分搜索、二分搜索时间复杂度、三分查找呢?相关推荐
- 二分搜索的时间复杂度分析
先贴上二分查找的java代码实现 public static int binarySearch(int[] a,int n,int value){int low = 0;int high = n - ...
- C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划
C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...
- 大剑无锋之你了解HTTPS吗?那么它为什么安全?【面试推荐】
在面试中,我们经常遇到像HTTP方面的知识.比如: 大剑无锋之HTTP连接https://blog.csdn.net/qq_41946557/article/details/101155935 大剑无 ...
- C语言实现ternary search三分查找算法(附完整源码)
实现ternary search三分查找算法 实现ternary search三分查找算法的完整源码(定义,实现,main函数测试) 实现ternary search三分查找算法的完整源码(定义,实现 ...
- 二分检索用途及复杂性_二分查找和三分查找哪个快?算法复杂度与常数无关?复杂度分析的常见误区...
还记得两三年前,我初看一本算法书,看到二分查找算法的复杂度时,我发现了了不得的东西:二分查找每次查询范围减少一半,需要查询的次数是 ,它的复杂度是 . 我把它改成三分查找,每次查询两个数字与我的目标数 ...
- 快乐学算法之:三分查找树ternary search tree
文章目录 简介 三分查找树的结构 三分查找树的代码表示 三分查找树的应用 简介 之前我们介绍了tire字典树,tire字典树的优点就是插入和查找比较快速,但是它的缺点就是占用的空间比较大.假如我们要存 ...
- 42亿QQ,O(1)时间复杂度完成查找
一.问题描述: 1.在42亿个qq号码中,如何使用O(1)时间复杂度去查找一个QQ号是否存在. 2.qq号的位数小于13位,存储着42亿QQ号的内存不得超过600MB. 二.位图排序思想 由于待排序的 ...
- 折半查找和二叉排序树的时间性能_leecode刷题----二分搜索与二叉查找(排序)树...
预备知识:二分查找 已知一个排序数组A,如A=[-1,2,5,20,90,100,207,800],另外一个乱序数组B,如B=[50,90,3,-1,2-7,80],求B中任意某个元素是否在A中出现, ...
- 大剑无锋之Redis面试题【推荐】
1.Redis 是一个基于内存的高性能key-value数据库. 2.Redis相比memcached有哪些优势: memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数 ...
最新文章
- #pragma pack的作用
- 大文件分片上传,断点续传,秒传 实现
- Leetcode 226. 翻转二叉树 (每日一题 20210819)
- 微信小程序开发教程第七章:微信小程序编辑名片页面开发
- linux6.4 安装oracle11g 出现错误ORA-01078和LRM-00109错误
- js将字符串 YYMMDDHHmmss 转化为 date类型
- the process cannot access the file because it is being used by another process
- 基于python的在线考试系统-Python在线考试系统防作弊功能的思路和实现
- vs2019添加opencv目录和dlib目录
- 基于Java的体育场地预约系统
- 如何制作手机自适应网页
- python爬虫100例--微博评论(5)
- 2012意大利之行3:罗马的路和车_我是亲民_新浪博客
- udp ue4 通讯_UE4 UDP通信
- viewFlipper的基本实现
- Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
- 八种必备户外装备包你踏遍地球
- Linux下操作带空格的文件
- 知识、见识、胆识、突破、创新
- MFC或C/C++中如何判断目录存在,文件/文件夹存在,亦或是文件夹存在,文件存在
热门文章
- POJ - 1696 Space Ant(极角排序)
- 【算法】图论学习笔记与代码实现
- linux命令中提取某一列,怎么用Linux命令提取表格文本中的某列
- HDU2227(非降子序列的个数)
- POJ3130(还是判断多边形的内核是否存在)
- NOIP2018提高组比赛总结
- cocos2d-x游戏开发(十五)游戏加载动画loading界面
- STL 之find,find_if,find_end,find_first_of
- c++ template(4)基本技巧
- 如何替公司省下数千万勒索费用