二分查找 Binary Search

相對於普通的順序查找,二分查找具備極好的效率。c++

使用條件:要求線性表必須採用 順序存儲結構 ,並且表中元素按關鍵字 有序排列指針

二分查找的時間複雜度:O(logn)code

手寫二分查找blog

#include <bits/stdc++.h>
#define MAXN 1000005
int a[MAXN];
int main()
{
	int n,m;	std::scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)	std::scanf("%d",&a[i]);
	for(int i=1;i<=m;++i)
	{
		int l=1,r=n,x;	std::scanf("%d",&x);
		//二分部分 
		while(r>=l)//=
		{
			int mid=l+r>>1;
			if(a[mid]<x)l=mid+1; 
			//+-對稱 
			else r=mid-1;
		}
		if(a[l]==x)	std::printf("%d ",l);
		//l或r均可以 
		else std::printf("-1 ");
	}
	return 0;
}

STL lower_bound模板it

lower_bound:二分查找,找出第一個大於等於指定數的位置(迭代器)。若是沒有找到,返回最後一個數據的後一個位置。模板

#include <bits/stdc++.h>
#define MAXN 1000005
int a[MAXN];
int main()
{
	int n,m;	std::scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)	std::scanf("%d",&a[i]);
	for(int i=1;i<=m;++i)
	{
		int x;	std::scanf("%d",&x);
		int j=std::lower_bound(a+1,a+n+1,x)-a;
		//指針減,獲得下標 
		if(a[j]!=x)	std::printf("-1 ");
		else std::printf("%d ",j);
	}
	return 0;
}

手寫二分的測評結果:
awHsSK.png
lower_bound的測評結果:
awHDW6.pngclass

對比能夠看出,手寫二分的時間是略快於lower_bound的。說明lower_bound的時間複雜度常數較大。效率

但lower_bound的代碼相對於手寫二分簡單。二者各有利弊。迭代器

作題感悟:im

  • 題目中經常出現的是運用二分查找的思想,靈活變通的運用二分,並非簡簡單單的查找數值,因此要熟練的掌握手寫二分。
相關文章
相關標籤/搜索