算法的时间复杂度
时间复杂度:计算代码的大概执行次数。而不是表面理解的计算时间。
空间复杂度:计算代码大概定义的变量的个数。考虑临时占用内存空间的量度。
如今计算机的存储空间足够大,有些算法可以牺牲空间以换取时间效率。也就是通常所说的:“用空间换时间”的做法。只有在嵌入式开发的领域,比较在意存储的空间大小。
采用的方法:O(n) O(大写)的渐进表示法。
主要介绍时间复杂度
1.常数阶示例
//代码执行次数
int a ,b; //执行第一次
int sun ; // 执行第二次
sum=a+b; // 执行第三次
cout<<"sum = "<< sun <<endl; //执行第四次
以上代码一共执行了4次,F(n)=4, 就是累计执行次数是常数项次,故时间复杂度是O(1),而不是 O(3). 对计算机而言,不管是10次,100次,1000次都是常数项,常数项统统是O(1)。
2.线性阶
int i,sum;
int sum=0;
for(i=0;i<n;i++)
{
sum +=i; // n次
}
return sum;
F(n)=n+2; 则时间复杂度为:O(n)
思考??在fot 循环中,N的取值一般是一个确定的值,若N取一个很大的存在的数,那该复杂度还是这样的吗?
3.对数阶示例
int number=1;
int count=0;
while(number<n)
{
number *=2;
++count;
}
return count;
2的x次方是N,经过x次,number的大小大于等于N,x=log 以2为底的对数。时间复杂度O(logn)。
4.平方阶示例
int i,a;
for(i=0;i<n;i++)
{ // n次循环
for(a=0;a<n;a++)
{ // n次循环
}
}
i从0—n 递加n次,且每次递加中 a也递增n次。故F(n)=N^2 。
时间复杂度为O(N^2)
平方阶的延伸示例
int a,b;
int m,n;
for(a=0;a<m;a++)
{ // m次循环
for(b=0;b<n;b++)
{ //n次循环
}
}
上述例子的时间复杂度为:O(m*n).