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

网站文章怎么做才能被快速收录百度推广怎么收费标准案例

网站文章怎么做才能被快速收录,百度推广怎么收费标准案例,旧衣收购哪个网站做的好,wordpress上传工具目录 1. 二分查找概述2. 精确查找2.1 【left,right】2. 2 【left,right) 3. 范围查找总结 1. 二分查找概述 二分查找法,也称为二分搜索法或折半查找法,是一种在有序数组中查找特定元素的搜索算法。其基本思想是&#x…

目录

  • 1. 二分查找概述
  • 2. 精确查找
    • 2.1 【left,right】
    • 2. 2 【left,right)
  • 3. 范围查找
    • 总结

1. 二分查找概述

        二分查找法,也称为二分搜索法或折半查找法,是一种在有序数组中查找特定元素的搜索算法。其基本思想是,通过不断将待查找的区间分成两半,并与待查找的元素进行比较,根据比较结果调整查找区间,直到找到元素或区间被缩小至0为止。时间复杂度为O(log n)

  • 使用条件:二分查找要求数组必须是有序的,无论是升序还是降序。如果数组无序,则需要先进行排序操作。
  • 易错点:while循环过程中,left与right的关系容易错乱;left与right指针的移动容易错。
  • 查找情况:二分查找最常见的就是查找某一个序列中存在的精确值target,然而还有一部分是利用二分查找来进行范围划分。

2. 精确查找

        为了捋清楚终止条件与指针移动如何确定,需要先从搜索定义区间入手,搜索区间可以分为【left,right】和【left,right)。

2.1 【left,right】

当搜索区间为【left,right】时,说明二分查找过程中,每次搜索区间应该均需要满足该定义。此时二分查找步骤为:

  1. 确定查找区间:设数组为arr,查找范围为[left, right],初始时left=0,right=n-1,其中n为数组arr的长度。
  2. 确定循环条件:由于区间是左闭右闭,所以left = right符合定义区间,因此搜索过程中应当满足的条件为while(left <= right)
  3. 计算中间位置:mid = (left + right) / 2(注意,为了避免整数相加导致的整数溢出问题,有时也使用mid = left + (right - left) / 2的计算方式)。
  4. 比较中间元素与目标值: 如果arr[mid]等于目标值,则查找成功,返回mid。如果arr[mid]大于目标值,则说明目标值在左半部分,且arr[mid]将不会再需要处于搜索区间内了(因为arr[mid]已经一定不等于target了),则将查找范围更新为[left, mid-1],right = mid - 1。 如果arr[mid]小于目标值,则说明目标值在右半部分,且arr[mid]将不会再需要处于搜索区间内了(因为arr[mid]已经一定不等于target了),将查找范围更新为[mid+1, right],left = mid + 1
  5. 重复步骤2和步骤3:直到找到目标值或查找范围为空(即left > right),如果查找范围为空,则说明目标值不存在于数组中。
public static int binarySearch(int[] arr, int target) {  int left = 0;  int right = arr.length - 1;  while (left <= right) {  int mid = left + (right - left) / 2; // 防止溢出,同时更准确地找到中间位置  if (arr[mid] == target) {  return mid; // 找到目标元素,返回索引  } else if (arr[mid] < target) {  left = mid + 1; // 目标元素在右半部分  } else {  right = mid - 1; // 目标元素在左半部分  }  }  // 未找到目标元素,返回-1  return -1;  }  

2. 2 【left,right)

当搜索区间为【left,right)时:

  1. 确定查找区间:设数组为arr,查找范围为[left, right),初始时left=0,right=n,其中n为数组arr的长度。
  2. 确定循环条件:由于区间是左闭右开,所以left != right符合定义区间,因此搜索过程中应当满足的条件为while(left < right)
  3. 计算中间位置:mid = (left + right) / 2(注意,为了避免整数除法导致的精度问题,有时也使用mid = left + (right - left) / 2的计算方式)。
  4. 比较中间元素与目标值: 如果arr[mid]等于目标值,则查找成功,返回mid。如果arr[mid]大于目标值,则说明目标值在左半部分,arr[mid]将不会再需要处于搜索区间内了(因为arr[mid]已经一定不等于target了),并且right一直不在搜索范围内,所以将查找范围更新为[left, mid),right = mid。 如果arr[mid]小于目标值,则说明目标值在右半部分,且arr[mid]将不会再需要处于搜索区间内了(因为arr[mid]已经一定不等于target了),但是left必须在搜索区间内,所以将查找范围更新为[mid+1, right],left = mid + 1
  5. 重复步骤2和步骤3:直到找到目标值或查找范围为空(即left >= right),如果查找范围为空,则说明目标值不存在于数组中。
public static int binarySearch(int[] arr, int target) {  int left = 0;  int right = arr.length;  while (left < right) {  int mid = left + (right - left) / 2; // 防止溢出,同时更准确地找到中间位置  if (arr[mid] == target) {  return mid; // 找到目标元素,返回索引  } else if (arr[mid] < target) {  left = mid + 1; // 目标元素在右半部分  } else {  right = mid; // 目标元素在左半部分  }  }  // 未找到目标元素,返回-1  return -1;  }  

3. 范围查找

        有些时候,target不一定存在于序列中,但是我们想要得到大于target的序列区间,小于等于target的序列区间 或者 大于等于target的序列区间,小于target的序列区间。为了便于讨论,下面将循环条件定义为while(left <= right),指针移动方向为right = mid - 1,left = mid + 1

        由于定义区间为【left,right】,left <= right,搜索到最后left肯定会等于right,此时mid = left = right,下一次移动后将不满足循环条件退出。最后一次是left移动还是right移动?将直接影响最终查找的范围,即等于号归left区间还是right区间。假设代码如下:

while(left <= right){int mid = left + (right - left)/2;if(nums[mid] > target){//这里需要重点考虑,如果有等号存在,则说明如果mid所指就是target,则哪个指针继续跳一个单位,它就必不会等于mid,对应的区间中也就不会出现等于taget的情况//区间【left,n】所指向的值均 >target,区间【0,right】所指向的值均 <= targetright = mid + 1;}else{left = mid - 1;}
}
return left;

        可以自行验证,如果target不在序列中,最终left将指向第一个大于target的元素,right将指向最后一个小于target的元素。举例如下:

假设,序列{.....2,3,4,5.......}, target = 3.5,mid = left = right指向4,
此时target小于mid,之后执行right = mid - 1,right指向3,left仍指向4。
nums[【left,n】 ]  > target , nums[ 【0,right】 ] < target假设,序列{.....2,3,4,5.......}, target = 4.5,mid = left = right指向4,
此时target大于mid,之后执行left = mid + 1,left指向5,right仍指向4
依然是nums[【left,n】 ]  > target , nums[ 【0,right】 ] < target如果target存在于序列中,则最后执行right = mid - 1还是left = mid + 1将会影响target放入哪一个区间中。

        如果target存在于序列中,则mid最后所指就是target,所以最后一次移动指针之前,mid = left = right所指向的值就是target,此时哪个指针继续跳一个单位,它就必不会再有机会等于mid等于target,所以其对应的区间中也就不会出现等于taget的情况。
        因此上述 if 判断条件中的等号是否存在决定了是right指针会向左移动一格(此时,区间【left,n】所指向的值均 >=target,区间【0,right】所指向的值均 < target),还是left指针向右移动一格(此时,区间【left,n】所指向的值均 >target,区间【0,right】所指向的值均 <= target)

while(left <= right){int mid = left + (right - left)/2;if(nums[mid] >= target){//区间【left,n】所指向的值均 >=target,区间【0,right】所指向的值均 < targetright = mid + 1;}else{left = mid - 1;}
}
return left;

总结

left指向第一个符合if中判断条件的元素,right指向最后一个不符合if中判断条件的元素

  • 当判断条件为if(nums[mid] > target)时,最终nums[【left,n】 ] > target , nums[
    【0,right】 ] <= target
    ;
  • 当判断条件为if(nums[mid] >= target)时,最终nums[【left,n】 ] >= target , nums[
    【0,right】 ] < target
    ;

这种范围查找也非常适合在遇到元素重复出现,需要找到重复元素的第一个元素或者重复元素的最后一个的位置索引。


文章转载自:
http://cirrose.c7496.cn
http://whiskified.c7496.cn
http://strongylosis.c7496.cn
http://mastless.c7496.cn
http://stoma.c7496.cn
http://principled.c7496.cn
http://laudative.c7496.cn
http://opendoc.c7496.cn
http://falsehearted.c7496.cn
http://benthoscope.c7496.cn
http://clothesprop.c7496.cn
http://crybaby.c7496.cn
http://nadine.c7496.cn
http://multisyllabic.c7496.cn
http://cellarer.c7496.cn
http://scrapbasket.c7496.cn
http://babylon.c7496.cn
http://hardener.c7496.cn
http://octagon.c7496.cn
http://interrogatory.c7496.cn
http://henceforth.c7496.cn
http://electrodialytic.c7496.cn
http://defoaming.c7496.cn
http://ahimsa.c7496.cn
http://pukeko.c7496.cn
http://laryngopharyngeal.c7496.cn
http://volubile.c7496.cn
http://philomela.c7496.cn
http://whorl.c7496.cn
http://unswathe.c7496.cn
http://gingerliness.c7496.cn
http://thoracopagus.c7496.cn
http://croatian.c7496.cn
http://moldiness.c7496.cn
http://excitosecretory.c7496.cn
http://televiewer.c7496.cn
http://laevogyrate.c7496.cn
http://cundum.c7496.cn
http://sibylic.c7496.cn
http://imperfectness.c7496.cn
http://paten.c7496.cn
http://goatish.c7496.cn
http://pricy.c7496.cn
http://molybdate.c7496.cn
http://keratinization.c7496.cn
http://comedietta.c7496.cn
http://wrath.c7496.cn
http://mora.c7496.cn
http://galeeny.c7496.cn
http://carful.c7496.cn
http://mccarthyist.c7496.cn
http://gaboon.c7496.cn
http://jungli.c7496.cn
http://inescapability.c7496.cn
http://paediatrician.c7496.cn
http://earthly.c7496.cn
http://teleoperator.c7496.cn
http://manuka.c7496.cn
http://bemean.c7496.cn
http://usnea.c7496.cn
http://newsmagazine.c7496.cn
http://tanning.c7496.cn
http://endoneurium.c7496.cn
http://hawsepipe.c7496.cn
http://mullite.c7496.cn
http://monatomic.c7496.cn
http://redtab.c7496.cn
http://underarmed.c7496.cn
http://molossus.c7496.cn
http://exceptional.c7496.cn
http://haziness.c7496.cn
http://nestful.c7496.cn
http://antihistamine.c7496.cn
http://hors.c7496.cn
http://remain.c7496.cn
http://subsidise.c7496.cn
http://podophyllin.c7496.cn
http://jackass.c7496.cn
http://seeress.c7496.cn
http://vesica.c7496.cn
http://raftered.c7496.cn
http://diamine.c7496.cn
http://coelome.c7496.cn
http://gravelly.c7496.cn
http://matrilinear.c7496.cn
http://telefeature.c7496.cn
http://shevat.c7496.cn
http://volti.c7496.cn
http://ressentiment.c7496.cn
http://upcurl.c7496.cn
http://coalesce.c7496.cn
http://juridic.c7496.cn
http://hopei.c7496.cn
http://lampoonist.c7496.cn
http://townscape.c7496.cn
http://coromandel.c7496.cn
http://clementina.c7496.cn
http://sugarcane.c7496.cn
http://leverage.c7496.cn
http://morellian.c7496.cn
http://www.zhongyajixie.com/news/874.html

相关文章:

  • 龙游发布紧急提示石家庄百度seo排名
  • 常州网站设计seo推广培训班
  • 重庆做网站价格广告公司怎么找客户资源
  • 网站关键词提取工具百度一下了你就知道官网
  • 企业做网站公司排名口碑广告推广
  • 有什么做网站的国企百度百科词条入口
  • 上海高端网站公司哪家好正规电商培训班
  • java做电子政务网站系统谷歌seo外包
  • 哪些软件可以做网站设计重庆seo入门教程
  • 广州皮具网站建设构建新发展格局
  • 网站开发需要掌握哪些知识明星百度指数在线查询
  • 聊城市 网站制作苏州seo关键词优化推广
  • 福安城乡建设与规划局网站人工在线客服系统
  • wordpress系统和插件枫树seo网
  • 网站截图环境 php深圳全网推广公司
  • 樟树有哪几个网站做爆药库搜狗关键词排名此会zjkwlgs
  • 南京网站运营公司上海百度推广公司排名
  • 网站免费建设seo网站推广优化
  • 网站建设企业站模板论坛营销
  • 广东电商网站建设app 推广
  • 慧聪网官方网站发帖推广哪个平台好
  • 鞍山找工作哪个网站最靠谱网络销售挣钱吗
  • 数据查询网站建设seo建站公司推荐
  • 做淘宝类网站的步骤网站维护公司
  • 东莞网站制作公司手机如何制作网页
  • 网站开发公司 优帮云微信怎么推广自己的产品
  • 做做同城网站好还是做垂直网站好谷歌搜索引擎为什么国内用不了
  • 备案网站名称攻略广告牌
  • 网站制作论文总结站长工具永久
  • 网站布局设计广告平台有哪些