二分算法

程序或算法的时间复杂度

 

  • 一个程序或算法的时间效率,也称“时间复杂度”,有时简称“复杂度”
  • 复杂度常用大的字母O和小写字母n来表示,比如O(n),O(n2)等。n代表问题 的规模
  • 时间复杂度是用算法运行过程中,某种时间固定的操作需要被执行的次数和n 的关系来度量的。在无序数列中查找某个数,复杂度是O(n)
  • 计算复杂度的时候,只统计执行次数最多的(n足够大时)那种固定操作的次数 。比如某个算法需要执行加法n2次,除法n次,那么就记其复杂度是O(n2)的。
  • 如果复杂度是多个n的函数之和,则只关心随n的增长增长得最快的那个函 数
  • O(n3+n2)    =>  O(n3)
  • O(2n+n3)    =>  O(2n)
  • O(n! + 3n)   =>  O(n!) 

二分查找函数

#include <iostream>
#include <cstdio>
using namespace std;
int BinarySearch(int a[],int size,int p){
	int L=0;//定义左端点
	int R=size-1;//定义右端点
	while(L<=R){//如果查找区间不为空,就继续查找 
        //int mid = (L+R)/2; 取查找区间正中元素的下标为了防止(L+R)过大溢出: int mid = L+(R-L)/2;
		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; 
}
int main(){
	int a[1000];
	int num=0;
	for(int i=0;i<1000;i++){
		a[i]=num;
		num+=2;
	}
	cout<<BinarySearch(a,1000,520);
}

#include <iostream>
#include <cstdio>
using namespace std;
int BinarySearch(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(a[mid]>=p){//想要的元素在中点左边 
			R=mid-1;
		}else{
			lastPos = mid; //找到了比p小的,但要在右边区间找比该数还要大的更优解 
			L=mid+1;
		}
	} 
	return lastPos;
}
int main(){
	int a[1000];
	int num=0;
	for(int i=0;i<1000;i++){
		a[i]=num;
		num+=2;
	}
	cout<<BinarySearch(a,1000,520);
} 

求方程的根
 


 

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double EPS=1e-6;
double f(double x){return x*x*x - 5*x*x + 10*x - 80; } 
int main(){
	double x1=0,x2=100,root,result;
	root = x1+(x2-x1)/2;//根,即为中间点 
	result = f(root); 
	int trytimes=1;//记录查找的次数 
	while(fabs(result)>EPS){//精度未达到,即没有找到根的时候一直找 
		if(result>0)x2=root;
		else{x1=root;}
		root = x1+(x2-x1)/2;
		result=f(root);
		trytimes++;
	}
	printf("%.8f\n",root); 
	printf("%d",trytimes); 
	return 0;
}

寻找指定和的整数对 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值