部分复杂度问题

来源:互联网 发布:验证dss算法的有效性 编辑:程序博客网 时间:2024/06/08 18:46

算法的时间复杂度:

算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O表示法,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。

下面是部分时间复杂度对比:


算法的空间复杂度:

空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序时间复杂度是O(n^2),空间复杂度是O(1)。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

分析一个算法所占用的 存储空间要从各方面综合考虑。如对于 递归算法来说,一般都比较简短,算法本身所占用的 存储空间较少,但运行时需要一个附加 堆栈,从而占用较多的临时工作单元;若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。

我们来看几个简单的实例:

(斐波那契数列的非递归)

//#include<iostream>//#include<cassert>//using namespace std;//unsigned long long Fib_NonR(long long n)//{//assert(n>=0);//if(n==0||n==1)//return n;//else//{//long long frist,second;//long long ret=0;//for(int i=2;i<=n;i++)//{//frist=i-1;//second=i-2;//ret=frist+second;//frist=second;//second=ret;//}//return ret;//}//}//int main()//{//int ret=Fib(4);//cout<<ret<<endl;//system("pause");//return 0;//}//
时间复杂度:O(n)
空间复杂度:O(1)

斐波那契数列的递归

#include<iostream>using namespace std;long long FibArray(long long n){if(n==0||n==1)return n;else return FibArray(n-1)+FibArray(n-2);}int main(){cout<<FibArray(100)<<endl;system("pause");return 0;
时间复杂度:O(2^N)

空间复杂度:O(N)

二分法查找一个数(递归):

#include<iostream>//using namespace std;//int bin_search(int *arr,int left,int right,int key)//{//while(left<=right)//{//int equal=(left+right)/2;//if(key>equal)//{//return bin_search(arr,equal+1,right, key);//}//else if(key<equal)//{//return bin_search(arr,equal,equal-1,key);//}//else//return arr[equal];//}//return -1;//}//int main()//{//int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12};//int key=15;//int ret=bin_search(arr,0,sizeof(arr)/sizeof(arr[0]),key);//cout<<ret<<endl;//system("pause");//return 0;//}
时间复杂度:O(log2 N)
空间复杂度:O(N)

因此,递归并不一定是最好的,在写程序之前应该比较不同方法的时间和空间复杂度,再进行选择。

未完待续!!!!!!!!!!!!

1 0