时间复杂度及空间复杂度

程序的时间复杂度指的是程序在执行过程中的运算次数,并为最坏情况下的运算次数
程序的空间复杂度指的是程序在运行过程中需要系统为其变量辅助开辟内存的多少
斐波那契序列用递归实现

#include<stdio.h>
int fib(int n)
{
if(n<=2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret=fib(n);
printf("ret=%d",ret);
return 0;
}

图示为
这里写图片描述

从图中可以看出斐波那契递归算法中求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),又必须先计算F(n-3)和F(n-4)。。。。。。以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,从而得到F(n)要计算很多重复的值,在时间上造成了很大的浪费,算法的时间复杂度随着N的增大呈现指数增长,时间的复杂度为O(2^n),即2的n次方,其递归循环的基本操作次数是n-1,辅助空间是n+1,所以:空间复杂度O(n)

折半查找迭代实现

#include<stdio.h>
int find(const int* a,int x,int line)
{
int* left=a;
int* right=a+line-1;
int* mid=(left+right)/2;
while(left<=right)
{
if(*mid==x)
return x;
else if(*mid<x)
{
left=mid;
mid=(left+right)/2;
}else if(*mid>x)
{right=mid;
mid=(left+right)/2;
}
}
return 0;
}
int main()
{
int arr[]={1,2,3,4,5,9,10,6,8,12};
int l=sizeof(arr)/sizeof(arr[0]);
int n=0;
int ret=0;
scanf("%d",&n);
ret=find(arr,n,l);
if(ret)
printf("有");
else
printf("没有");
return 0;
}

图示如下
这里写图片描述

循环的基本次数是log2 n,所以:时间复杂度是O(log2 n);
由于辅助空间是常数级别的所以:空间复杂度是O(1);

猜你喜欢

转载自blog.csdn.net/eewwwz/article/details/80436630