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

企业网站的价值体现是在站长工具亚洲高清

企业网站的价值体现是在,站长工具亚洲高清,给朋友做的相册网站没有了,给手机做网站的公司有单调性的数列一定可以使用二分,没有单调性的题目也可能可以使用二分; (一)整数二分 二分的本质: 在某个整数区间内,存在某种性质使得区间内左半边的数都不满足该性质;而右半边的数都满足该性…

有单调性的数列一定可以使用二分,没有单调性的题目也可能可以使用二分;

(一)整数二分

二分的本质:

        在某个整数区间内,存在某种性质使得区间内左半边的数都不满足该性质;而右半边的数都满足该性质;那么二分的作用就是找到左右这两个分界点;

1.找满足红色性质的边界点(如图上)

如果是让l等于mid(即找左半边的分界点)则要记得mid = (l+r+1)/2

2.找满足绿色性质的边界点(如图上)

如果是让r等于mid(即找右半边的分界点)则mid = (l+r)/2,不用另外加1;

情况1为什么额外加1? 答:因为在程序中,(l+r)/2是向下取整;当遇到遇到r=l+1(l和r只相差1,数组只有两个元素)的情况,(l+r)/2就等于l,这时候mid=(l+r)/2就是mid=l如下图所示:这次循环相当于没有变化,再次循环也不会有变化,进入死循环;

基本思想:不断缩小答案区间,当区间长度为一时,就是答案;

时间复杂度:平均O(logn) 

步骤:
  1. 先写出基本模板:mid = (l+r)/2

  2. 定义判断条件check()函数

  3. 看应该是让l=mid还是r=mid;如果应该l=mid则把前面的mid改为 mid=(l+r+1)/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就等于(r+l)/2;

  • while循环判定条件为r-l>1e-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;  
}

注意点:

  1. 使用二分一定可以找到一个满足条件的边界点(不会出现无解的情况);

  2. 整数二分中,l和r表示的是区间左右边界的数组下标;当遍历结束后l=r,arr[r] 就是所找的边界点;

  3. 浮点数二分中,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/2k=1n/2^k = 1,解得:

k=log⁡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.mmbaike.com/news/87774.html

相关文章:

  • 攸县网站定制品牌传播方案
  • 分享影视资源的网站怎么做网站推广哪家好
  • 网站的首页面设计3小时百度收录新站方法
  • 有没有做任务给钱的网站什么关键词能搜到资源
  • 广州专业网站改版方案网络营销seo是什么意思
  • 常州做网站公司优帮云排名优化
  • 深圳快速网站制作服务如何做好网络营销?
  • 中国建设银行网站结构网络营销策划步骤
  • 网站的切图是谁来做小红书推广方式
  • 菏泽做网站公司网络推广网站推广
  • 长沙疫情最新区域seo学堂
  • 严什么的烟 网站建设苏州整站优化
  • 网站建设朋友圈怎么写如何做好网络营销管理
  • oou淘宝客图片wordpress模板东莞优化怎么做seo
  • 无锡网站建设专家无锡网站制作吸引人的微信软文范例
  • 天河门户网站建设公司购物链接
  • 做品牌网站哪个好用软广告经典例子
  • 做网站美工的前途怎么样网站制作代码
  • b2c商城网站建设公司百度竞价有点击无转化
  • 公众号制作培训长春网站优化咨询
  • 中山网站推广重庆网站seo建设哪家好
  • 云南省网站开发公司怎么建立一个公司的网站
  • 个人网站网页首页百度关键词seo公司
  • 红酒网站建设方案范本长春关键词优化平台
  • 潍坊网站建设一品网络济南优化seo公司
  • 怎么做网站的教程百度热搜关键词排名
  • 企业网站关键词排名 s优化设计六年级下册数学答案
  • 广东网站建设便捷网络推广app
  • 日照东港城市建设投资有限公司网站龙岗网络公司
  • 棋牌游戏网站建设费用外贸谷歌seo