您的位置:首页 > 编程语言 > C语言/C++

C++ 计算时间复杂度--斐波那契 --二分查找

2017-05-26 12:46 288 查看

时间复杂度&空间复杂度

时间复杂度:算法的时间复杂度是一个函数(数学里的函数—计算运算次数),描述算 法的运行时间,用O表示(—一般关注算法的最坏的运行时间)
延伸:递归算法的时间复杂度—递归总次数*每次递归次数
二叉树的时间复杂度—O(log2n)==O(lgN)—折半查找
空间复杂度:也用O表示,(对象的个数)
延伸: 递归算法—递归深度N*每次递归的空间大小,如果递归深度为常数,则 空间复杂度为O(N)
例:用斐波那契(Fibonacci)算法分析
递归:
//1 1 2 3 5 8
//递归
int Fib(int n)
{
//递归结束条件(子问题)
if(n == 1||n == 2)//前两项
{
return 1;
}
else
return Fib(n-1)+Fib(n-2);//最后一项就是前两项的和
//return n<2?n:Fib(n-1)+Fib(n-2);
}


用递归:其时间复杂度为O(2^n),空间复杂度O(n)
非递归:
//非递归
int Fib(int n)
{
int a1 = 0;
int a2 = 1;//1
int a3;
int i;
for(i = 2;i<=n;i++)//n最小为2
{
a3 = a2 +a1;
a1 = a2;
a2 = a3;
}
return a3;

}
int main()
{
int a;
int n = 6;
a = Fib(n);
printf("%d",a);
system("pause");
return 0;
}
非递归:时间复杂度为O(n),空间复杂度为O(1)
例:二分查找(BinarySearch)
递归:
//递归
int BinarySearch(int *p,int key,int left,int right)
{

if(left>right)
{
return -1;
}
int mid = left +(right - left)/2;
if(p[mid] == key)
{
return p[mid];//应返回mid坐标的值,而不是mid坐标
}
return p[mid]>key?BinarySearch(p,key,left,mid-1):BinarySearch( p,key,mid+1,right);//大于和小于两种情况
}
int main()
{
int a;
int arr[] = {1,2,3,4,5,6,7,8,9};
int left = 0;
int right = 8;
a = BinarySearch(arr,7,left,right);
printf("%d",a);
system("pause");
return 0;
}

用递归:时间复杂度为O(log2n)<以2为底,n的对数>
非递归:
//非递归
int BinarySearch(int *p,int key )
{

int left = 0;
int right = 8;
int mid = 0;
while(left<=right)
{
mid = left - (left-right)/2;
if(p[mid] == key)
{
return p[mid];
}
else if(p[mid]<key)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;

}
int main()
{
int a;
int arr[] = {1,2,3,4,5,6,7,8,9};
a = BinarySearch(arr,10);
printf("%d",a);
system("pause");
return 0;
}
时间复杂度:O(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: