二分算法小结mooc

本文介绍了如何利用二分查找算法分别解决在一个有序数组中查找元素和在方程解的搜索中减小计算量的问题。通过实例演示了二分法的高效性和精度控制,并探讨了在信息技术中的实际应用。

二分查找找函数

题目详情

写一个函数,在包含size个元素的,从小到大排序的int数组a里查找元素p,如果找到,则返回元素下标,如果找不到,则返回-1.要求复杂度(log(N))

代码

#include<iostream>
using namespace std;
int BinarySeach(int a[1000], 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;
}
int main()
{
	int c[1000];
	int n,b;
	cin>>n>>b;
	for(int a=0;a<n;a++)
	{
		cin>>c[a];
	}
	cout<<BinarySeach(c,n,b);
}

思路

取中间值,然后和要查找的数进行对比,小了则把左边最小的范围值改为中间值加一(mid+1),大了则把右边的最大范围值改为中间值加一(mid+1),要注意 mid=L+(R-L)/2,因为mid=L+R可能超出double的最大值;

二分法求方程根

题目详情

求下面方程的一个根:f(x)=xxx-5xx+10x-80=0
若求出的根是a,则要求|f(a)|<=10^-6

思路

由于计算机精度受限,当方程值小于1e-6时,默认方程成立。这题为了减少计算时间,采用二分查找的方式。可以借鉴上面的方程。

代码

#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 root,x1=0,x2=100,y;
	root=x1+(x2-x1)/2;
	int triedTimes=1;//记录尝试次数
	y=f(root);
	while(fabs(y)>EPS)
	{
		if(y>0) x2=root;
		else   x1=root;
		root=x1+(x2-x1)/2;
		y=f(root);
		triedTimes++;
	 } 
	 printf("%.8f\n",root);
	 printf("%d",triedTimes);
	 return 0;
}

计算机201 钱yj

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值