C++基础-第11周

本文介绍了程序或算法的时间复杂度,重点关注了二分查找的应用,如寻找数字、求方程的根以及解决找一对数和农夫与奶牛问题的高效解法。讲解了不同解法的时间复杂度,强调了二分查找在降低复杂度方面的优势。
摘要由CSDN通过智能技术生成

程序或算法的时间复杂度

一个程序或算法的时间效率,称为“时间复杂度”
复杂度分为:平均复杂度和最坏复杂度,两者可能一致,也可能不一致
程序或算法的时间复杂度:
在无序数列中查找某个数(顺序查找): O ( n ) O(n) O(n)
平面上有n个点,要求出任意两点间的距离: O ( n 2 ) O(n^2) O(n2)
插入排序、选择排序、冒泡排序: O ( n 2 ) O(n^2) O(n2)
快速排序: O ( n ∗ l o g ( n ) ) O(n*log(n)) O(nlog(n))
二分查找: O ( l o g ( n ) ) O(log(n)) O(log(n))

二分查找

小明在心里想一个1-1000之间的数,小刚来猜,可以问问题,小明只能回答是或否。怎么猜才能问的问题次数最少?
1)是1吗?是2吗?…是999吗? 平均要问500次
2)大于500吗?大于750吗?大于625吗?…每次缩小猜测范围到上次的一半,只需要10次(前提条件,查找的东西是有序的)

//one:最简单的二分查找 
int BinarySearch(int a[],int size,int p){
   
	int L=0;
	int R=size-1;
	while(L<=R){
   
		int mid=L+(R-L)/2;
		if (p==a[mid]) return mid;
		else if (p>a[mid]) L=mid+1;
		else R=mid-1; 
	}
	return -1;
}

//two: 查找比整数p小的,下标最大的元素,找到返回下标,找不到返回-1
int LowerBound(int a[],int size,int p){
   
	int L=0;
	int R=size-1;
	int lastPos=-1;
	while(L<=R){
   
		int mid=L+(R-L)/2;
		if (p>a[mid]){
   
			L=mid+1;
			lastPos=mid;
		}
		else{
   
			R=mid-1;
		}
	}
	return lastPos;
} 

注意:
为了防止 L + R L+R L+R过大溢出,所以不用 m i d = ( L + R ) / 2 mid=(L+R)/2 mid=(L+R)/2,用 m i d = L + ( R − L ) / 2 mid=L+(R-L)/2 mid=L+(R</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值