在计算机科学和算法中,搜索是一项常见的任务。当数据集较大时,线性搜索可能会变得低效,因此我们需要一种更高效的搜索算法。二分搜索算法是一种强大的工具,它利用有序数据集的特性,在每次比较中将搜索空间缩小一半。本篇博客基于代码随想录第三章编写。
什么是二分搜索算法? 二分搜索算法,也称为折半搜索算法,是一种高效的查找算法。它基于以下两个前提条件:
- 数据集必须有序:二分搜索算法要求数据集按照某种顺序排列,通常是升序或降序排列。
- 数据集必须是随机访问的:二分搜索算法需要能够通过索引访问数据集中的元素,因此它通常与数组或类似结构一起使用。
工作步骤:
- 确定搜索空间的上界和下界。(left and right)
- 计算中间元素的索引。(middle)
- 将中间元素与目标元素进行比较。
- 如果中间元素等于目标元素,则搜索完成。
- 如果中间元素大于目标元素,则在左侧子数组中继续搜索。
- 如果中间元素小于目标元素,则在右侧子数组中继续搜索。
- 重复以上步骤,直到找到目标元素或搜索空间为空
优势和局限性:
- 二分搜索算法的主要优势在于它的时间复杂度为O(log n),其中n是数据集的大小。相比于线性搜索算法的O(n)时间复杂度,二分搜索算法具有更高的效率。然而,二分搜索算法也有一些局限性,比如它只能应用于有序数据集,并且对随机访问的数据结构有要求。
#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
int ret = -1;
int left = 0;
int right = nums.size() - 1;
while (left < right)
{
int middle = left + (right - left)/2 ;
if (nums[middle] == target)
{
ret = middle;
return ret;
}
else if(nums[middle] > target)
{
right = middle - 1;
}
else
{
left = middle + 1;
}
}
return ret;
}
int search2(vector<int>& nums,int left,int right, int target)
{
int ret = -1;
while(left < right)
{
int middle = (right - left) / 2;
if (nums[middle] == target)
{
ret = middle;
return ret;
}
else if (nums[middle] < target)
{
search2(nums,middle+1,right,target);
}
else
{
search2(nums,left,middle-1,target);
}
}
return ret;
}
};
int main()
{
int n = 10;
std::vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
values.push_back(5);
values.push_back(5);
values.push_back(5);
values.push_back(5);
values.push_back(5);
int middle = values.size() / 2;
Solution s = Solution();
auto startTime = chrono::high_resolution_clock::now();
int ret = s.search2(values,0,values.size()-1,3);
auto endTime = chrono::high_resolution_clock::now();
chrono::duration<double, std::nano> fp_ms = endTime - startTime;
cout << "my answer is " << ret << "\n" << "my time is:" << fp_ms.count() << "ms" << endl;
// for(int i = 0;i < n; i++)
// {
// int x = 0;
// std::cin >> x;
// values.push_back(x);
// }
}