本课时有配套视频讲解,购买后即可观看(永久有效)
二分搜索
课上练习
知识总结
基本概念
二分搜索(Binary Search)是一种高效的搜索算法,用于在有序数组中查找特定元素。它通过逐步缩小查找范围来实现较低的时间复杂度。以下是二分搜索的基本概念、步骤、复杂度分析,以及实现示例。
前提条件:
二分搜索只能在有序的数组或列表中使用。
工作原理:
通过比较目标值与中间元素的大小关系,决定在数组的哪一半中继续搜索,逐步缩小查找范围,直到找到目标元素或范围为空。
效率高:
与线性搜索相比,二分搜索的查找速度更快,特别是在处理大型数据集时。
限制条件:
要求数组是有序的。如果数据无序,需要先排序,这可能会增加额外的时间开销。
算法步骤
1.初始化边界:设定两个指针,left 和 right,分别指向数组的起始位置和结束位置。
2.计算中点:计算中点索引 mid,通常使用公式 mid = left + (right - left) / 2 以避免潜在的整数溢出。
3.比较中点值:
如果 a[mid] 等于目标值 target,则返回中点索引。
如果 a[mid] 小于 target,则将 left 更新为 mid + 1,继续在右半部分查找。
如果 a[mid] 大于 target,则将 right 更新为 mid - 1,继续在左半部分查找。
4.循环终止:当 left 超过 right 时,表示未找到目标值。
时间复杂度
时间复杂度:O(logn)O(\log n)O(logn),每次操作都会将搜索范围缩小一半。
空间复杂度:O(1)O(1)O(1),只使用了常数级别的额外空间。
适用场景
查找有序数据中的特定值。
求解具有单调性问题(如最小化、最大化问题)。
实现高效的动态数据结构(如平衡二叉搜索树中的操作)。
🖥️代码模版(普通版)
1#include <iostream>
2#include <vector>
3using namespace std;
4
5int binarySearch(const vector<int>& nums, int target) {
6 int left = 0;
7 int right = nums.size() - 1;
8
9 while (left <= right) {
10 int mid = left + (right - left) / 2;
11
12 if (nums[mid] == target) {
13 return mid; // 找到目标值,返回索引
14 } else if (nums[mid] < target) {
15 left = mid + 1; // 目标值在右半部分
16 } else {
17 right = mid - 1; // 目标值在左半部分
18 }
19 }
20
21 return -1; // 未找到目标值,返回-1
22}
23
24int main() {
25 vector<int> nums = {1, 3, 5, 7, 9, 11};
26 int target = 7;
27
28 int result = binarySearch(nums, target);
29 if (result != -1) {
30 cout << "Element found at index " << result << endl;
31 } else {
32 cout << "Element not found" << endl;
33 }
34
35 return 0;
36}️课后作业
☝️总结作业
总结作业非常重要,请务必认真完成✔️
- 二分查找的核心思想是什么?
- 二分查找的时间复杂度是多少?
- 简单介绍二分查找的工作原理。
✌️编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️