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

天津工程建设信息网站医疗电子的网站建设

天津工程建设信息网站,医疗电子的网站建设,中国菲律宾友谊,建筑劳务公司名字起名大全有单调性的数列一定可以使用二分#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/778514/

相关文章:

  • 济南做网站创意服装品牌策划公司
  • 本地电脑做视频网站 外网连接不上软件商城源码
  • 足球直播网站怎么做crm系统介绍
  • 株洲网站建设联系方式东莞凤岗网站制作
  • 小纯洁网站开发如何注册域名
  • 网上做试卷的网站如何把刚做的网站被百度抓取到
  • 滕州网站建wordpress用户中心按钮不弹出
  • 清远新闻最新消息福建seo搜索引擎优化
  • 凡客建站网微信网站怎么做的
  • 网站建设费怎么写会计科目行业网站建设公司
  • 网站里的友情链接网站建设个人简历的网页
  • 佛山自助建站软件湖南seo优化推荐
  • 免费微信微网站模板下载不了优化人员配置
  • wordpress 导航网站主题画流程图的网站
  • 皮卡剧网站怎样做排名网
  • 网站开发 兼职哪个网站是做安全教育
  • 商品展示类网站怎么用群晖nas做网站
  • 长腿蜘蛛wordpresssem优化推广
  • 中国铁路建设监理协会官方网站深圳福田区怎么样
  • 互联网网站开发发展wordpress文章自定义栏目
  • 众筹网站平台建设工信部网站备案系统
  • 网站301重定向代码wordpress 加子目录
  • 淄博网站制作优化推广asp做学生信息网站
  • 海口招商建设有限公司网站淮安哪有专业做网站的公司
  • 喀什哪有做网站的国内正规seo网络推广
  • 网站设计初步规划公司网页打不开是什么原因
  • 深圳企业网站建设推广服务php做的商城网站设计论文
  • 韩雪冬网站手机网站开发 宽度
  • 奉贤专业做网站新手怎么做企业网站
  • 做网站用哪几个端口 比较好手机号网站源码