程序或算法的时间复杂度
- 一个程序或算法的时间效率,也称“时间复杂度”,有时简称“复杂度”
- 复杂度常用大的字母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;
}
寻找指定和的整数对