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

代做论文网站什么平台推广效果最好

代做论文网站,什么平台推广效果最好,昆明网站设计方案,网站建设单元格边距二分查找中未找到元素时的结果分析 在二分查找算法中,如果没有找到目标元素,最终 i 的位置将会是:目标元素应该插入的位置。 具体来说: 如果目标元素比数组中所有元素都小,i 会等于 0(表示应该插入到数组…

二分查找中未找到元素时的结果分析

在二分查找算法中,如果没有找到目标元素,最终 i 的位置将会是:目标元素应该插入的位置
具体来说:

  1. 如果目标元素比数组中所有元素都小,i 会等于 0(表示应该插入到数组最前面)
  2. 如果目标元素比数组中所有元素都大,i 会等于数组长度(表示应该插入到数组最后面)
  3. 如果目标元素的值在数组中的两个元素之间,i 会指向第一个大于目标元素的位置

代码示例展示了这三种情况:

int binarySearch(const vector<int>& arr, int target) {int left = 0;int right = arr.size() - 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;}}return left;
}

在这里插入图片描述

循环不变量理解

循环不变量定义

对于二分查找而言,循环不变量如下:

在每次循环开始时,如果目标值 target 在数组中存在,则它必定在区间 [left, right] 内;如果不存在,则 target 应该插入的位置要么在 [left, right] 内,要么就是 left(即 right+1)。

循环不变量分析

初始化
  • 初始时,left = 0right = arr.size() - 1,搜索范围覆盖整个数组
  • 循环不变量成立:如果 target 存在,它必在区间内;如果不存在,插入位置也必在此区间内或紧接其后
    在这里插入图片描述
循环过程中的维护

在每次迭代中:

  1. 查找中间元素 mid = left + (right - left) / 2
  2. 比较 arr[mid]target
    • arr[mid] == target:找到目标,返回 mid
    • arr[mid] < target:更新 left = mid + 1,缩小搜索区间
    • arr[mid] > target:更新 right = mid - 1,缩小搜索区间
  3. 每次更新后,循环不变量仍然成立
循环终止条件
  • 循环在 left > right 时终止
  • 此时 left = right + 1
  • left 指向的位置即为 target 应插入的位置

三种特殊情况分析

1. 目标元素比所有元素都小
  • 循环中不断执行 right = mid - 1
  • 最终 right = -1left = 0
  • left 指向数组首位,正是插入位置
2. 目标元素比所有元素都大
  • 循环中不断执行 left = mid + 1
  • 最终 left = arr.size()right = arr.size() - 1
  • left 指向数组末尾后一位,正是插入位置
3. 目标元素在两个元素之间
  • 假设存在 i 使得 arr[i] < target < arr[i+1]
  • 循环结束时 left = i+1right = i
  • left 指向第一个大于 target 的位置,正是插入位置

二分查找中的边界处理技巧

1. 搜索区间的定义方式

二分查找有两种常见的搜索区间定义:

闭区间 [left, right]
while (left <= right) { // 使用 <= // ...if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}
}
左闭右开区间 [left, right)
while (left < right) { // 使用 <// ...if (nums[mid] < target) {left = mid + 1;} else {right = mid; // 注意这里是 mid}
}

2. 中间位置的安全计算

避免整数溢出:

// 推荐方式:
int mid = left + (right - left) / 2;// 不推荐:可能溢出
// int mid = (left + right) / 2;

3. 查找目标值的边界

查找第一个等于目标值的元素
int findFirstEqual(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1, result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {result = mid;      // 记录当前位置right = mid - 1;   // 继续向左寻找} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return result;
}
查找最后一个等于目标值的元素
int findLastEqual(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1, result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {result = mid;      // 记录当前位置left = mid + 1;    // 继续向右寻找} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return result;
}

4. 下界与上界查找

下界(第一个大于等于目标值的元素)
int lowerBound(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1;} else {left = mid + 1;}}return left;
}
上界(第一个大于目标值的元素)
int upperBound(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid - 1;} else {left = mid + 1;}}return left;
}

5. 常见错误与边界测试

  1. 循环条件与区间定义匹配

    • 闭区间 [left, right] 使用 left <= right
    • 左闭右开区间 [left, right) 使用 left < right
  2. 边界更新的一致性

    • 闭区间:left = mid + 1right = mid - 1
    • 左闭右开:left = mid + 1right = mid
  3. 边界测试用例

    • 空数组
    • 目标值小于所有元素
    • 目标值大于所有元素
    • 目标值等于某些元素(包括首尾元素)
    • 目标值在元素之间
    • 数组只有一个元素的情况
  4. 循环终止条件理解

    • 闭区间方式终止时:left = right + 1
    • 左闭右开方式终止时:left = right

应用场景

  • 在有序数组中查找特定元素
  • 查找插入位置(如 C++ 的 lower_bound/upper_bound)
  • 解决"猜数字"类问题(在某个范围内猜测一个符合条件的数)
  • 在旋转排序数组中查找元素
  • 查找峰值元素
  • 矩阵中的二分查找
http://www.dtcms.com/wzjs/839768.html

相关文章:

  • 汕头潮南网站建设p2p
  • 建筑设计网站免费如何给自己的公司网站做优化
  • 邢台网站建设公司哪家好一点网络设计报告书
  • 如何与网站建立私密关系优化网站推广排名
  • 网站建设综合实践 教材凡科建站小程序制作
  • 国外网站推广平台有哪些?关键词排名点击软件网站
  • 广州制作外贸网站公司南山做网站的公司
  • 网上开店网站网络服务费
  • 住房和城乡建设部网站买卖合同网站开发行业标准
  • 赣州做网站优化wordpress 地区联动
  • 怎么做领券网站百度一下首页登录
  • 兰州网站网站建设广东省建设项目安全标准自评网站
  • 国内著名平面设计师的个人网站桂林北站到两江机场有多远
  • 义乌 网站建设推广营销wordpress填写数据库
  • 怎么恢复网站数据库帮人家做网站维护
  • 电子商务网站建设林锋课本答案视频网站要多大虚拟主机
  • 用php做的网站必备那些文件wordpress插件扫描
  • 以应用为导向的高职高专数学课程改革与建设 教学成果奖申报网站天津百度推广公司
  • 华为电子商务网站建设shopify建站流程
  • 大连响应式网站建设无锡谷歌优化
  • 宁波市高新区建设局网站建设信用卡中心网站
  • 做网站建设的公司有哪些建行网站会员
  • 网站调用优酷视频去广告dz网站开发
  • 企业做网站做什么科目有用模板网在线制作免费网站
  • 管理一个网站的后台怎么做怎样做网站公司
  • 查网站权重外贸创业
  • 怎么做网站赚大钱有哪些网站是提供设计图片的
  • 南通网站推广江苏省建集团领导名单
  • 湖南省住建厅官方网站建设干校wordpress游客发言
  • 惠济免费网站建设织梦模板修改网站颜色