当前位置: 首页 > news >正文

揭阳网站制作平台沈阳招标投标信息网

揭阳网站制作平台,沈阳招标投标信息网,陕西建设厅特种作业报名入口,精美word模板免费下载有单调性的数列一定可以使用二分#xff0c;没有单调性的题目也可能可以使用二分#xff1b; #xff08;一#xff09;整数二分 二分的本质#xff1a; 在某个整数区间内#xff0c;存在某种性质使得区间内左半边的数都不满足该性质#xff1b;而右半边的数都满足该性… 有单调性的数列一定可以使用二分没有单调性的题目也可能可以使用二分 一整数二分 二分的本质 在某个整数区间内存在某种性质使得区间内左半边的数都不满足该性质而右半边的数都满足该性质那么二分的作用就是找到左右这两个分界点 1.找满足红色性质的边界点如图上 如果是让l等于mid即找左半边的分界点则要记得mid (lr1)/2 2.找满足绿色性质的边界点如图上 如果是让r等于mid即找右半边的分界点则mid (lr)/2不用另外加1 情况1为什么额外加1 答因为在程序中(lr)/2是向下取整当遇到遇到rl1l和r只相差1数组只有两个元素的情况(lr)/2就等于l这时候mid(lr)/2就是midl如下图所示这次循环相当于没有变化再次循环也不会有变化进入死循环 基本思想不断缩小答案区间当区间长度为一时就是答案 时间复杂度平均O(logn)  步骤 先写出基本模板:mid (lr)/2 定义判断条件check()函数 看应该是让lmid还是rmid如果应该lmid则把前面的mid改为 mid(lr1)/2 模板 // 检查x是否满足某种性质 private static boolean check(int x) { /* ... */ } // 区间[left, right]被划分成[left, mid]和[mid 1, right]时使用 // 或者称之为左二分查询查找左侧第一个满足条件的数 private static int leftBinarySearch(int[] arr, int left, int right) { while (left right) { int mid arr[left right 1]; if (check(mid)) { right mid; // check()判断mid是否满足性质 } else { left mid 1; } } return left; } // 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用 // 或者称之为右二分查询查找右侧最后一个满足条件的数 private static int rightBinarySearch(int[] arr, int left, int right) { while (left right) { int mid arr[left right 1 1]; if (check(mid)) { left mid; // check()判断mid是否满足性质 } else { right mid - 1; // 有加必有减} } return left; } 二浮点数二分 典型问题求一个数的平方根 基本思想不断缩小答案区间当区间长度足够小时即左右边界之差足够小边界的值就约等于答案 时间复杂度平均O(logn)  步骤 mid就等于(rl)/2; while循环判定条件为r-l1e-8左右边界之差足够小时结束循环 模板 // 检查x是否满足某种性质 private static boolean check(int x) { /* ... */ } // 区间[left, right]被划分成[left, mid]和[mid 1, right]时使用 // 或者称之为左二分查询查找左侧第一个满足条件的数 private static int leftBinarySearch(int[] arr, int left, int right) { while (left right) { int mid arr[left right 1]; if (check(mid)) { right mid; // check()判断mid是否满足性质 } else { left mid 1; } } return left; } // 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用 // 或者称之为右二分查询查找右侧最后一个满足条件的数 private static int rightBinarySearch(int[] arr, int left, int right) { while (left right) { int mid arr[left right 1 1]; if (check(mid)) { left mid; // check()判断mid是否满足性质 } else { right mid - 1; // 有加必有减} } return left; }注意点 使用二分一定可以找到一个满足条件的边界点不会出现无解的情况 整数二分中l和r表示的是区间左右边界的数组下标当遍历结束后lrarr[r] 就是所找的边界点 浮点数二分中l和r表示的不是数组下标而是左右边界本身 时间复杂度分析 二分查找Binary Search的时间复杂度分析如下 1. 最好情况Best Case 如果目标元素正好是数组的中间元素那么只需一次比较就能找到时间复杂度为 O(1)O(1) 2. 最坏情况Worst Case 每次查找都会将搜索范围缩小一半假设数组长度为 nn那么最多需要查找的次数是 T(n)T(n/2)O(1)T(n) T(n/2) O(1) 展开递归 T(n)T(n/4)O(1)O(1)T(n/8)O(1)O(1)O(1)…T(n) T(n/4) O(1) O(1) T(n/8) O(1) O(1) O(1) \dots 直到搜索范围缩小到 1即 n/2k1n/2^k 1解得 klog⁡2nk \log_2 n 因此最坏情况下的时间复杂度是 O(log⁡n)O(\log n) 3. 平均情况Average Case 在没有额外信息的情况下平均情况下也需要进行大约 O(log⁡n) 级别的比较因此平均时间复杂度也是 O(log⁡n) 总结 情况时间复杂度最好情况O(1)O(1)最坏情况O(log⁡n)O(\log n)平均情况O(log⁡n)O(\log n) 二分查找的时间复杂度远优于线性查找O(n)但前提是数据必须是有序的否则需要先进行排序如快速排序 O(nlog⁡n)这会影响整体效率。
http://www.w-s-a.com/news/872117/

相关文章:

  • wordpress 版权声明网站优化排名哪家性价比高
  • dedecms网站关键词外包做网站平台 一分钟
  • 酒网站建设游戏分类网站怎么做
  • 仿牌网站安全北京大良网站建设
  • ps中怎样做网站轮播图片吉林省网站建设公司
  • 广西网站建设-好发信息网温江做网站哪家好
  • 网站建设属于什么职位类别南京哪个网站建设比较好
  • wdcp 网站备份东莞网站建设五金建材
  • 天津制作网站的公司电话wordpress架设进出销
  • tomcat做静态网站prestashop和wordpress
  • 上海响应式建站wap网站微信分享代码
  • 四川建筑人才招聘网南昌网站优化
  • 南充网站建设制作重庆有的设计网站大全
  • 深圳沙井做网站公司网站搭建谷歌seo
  • 学校资源网站的建设方案山西省住房城乡建设厅网站
  • 医疗行业网站建设深圳网络科技公司排名
  • 企业形象型网站建设wordpress chess
  • 网站的域名起什么好处罗湖网站建设公司乐云seo
  • 网站的服务器在哪里sem推广软件选哪家
  • 科技网站欣赏婚庆公司经营范围
  • 网站后台管理系统php校园网站建设意见表填写
  • 网站建设问题调查常州百度推广代理公司
  • net网站开发学习谷歌优化培训
  • 企业网站公众号广东网站建设方便
  • 2008r2网站建设张店网站建设方案
  • 企业网站首页学生做的网站成品
  • 网站开发 架构设计企业信息管理系统的组成不包括
  • 网站维护模式网页传奇游戏平台排行
  • 企业网站改自适应蛋糕方案网站建设
  • 网站开发技术职责网站升级中html