您的位置:首页 > 其它

浅谈时间复杂度以及空间复杂度

2017-06-12 18:25 155 查看
研究意义:

时间复杂度和空间复杂度是衡量一个算法效率的重要标准。学会分析,才能更好的判断一个算法的好坏。

必备知识:

语句频度:是指一条语句在该算法中重复执行的次数。

数量级:是用来衡量和估计,在平时的生活中如果没有特殊标记都是指以10为底数。

T(n):表示算法中所有语句频度之和。n为问题规模。

主要内容:

算法的时间复杂度主要是研究T(n)的数量级,因为算法的基本运算(深层循环的语句)的数量级与T(n)的数量级相同,所以经常通过研究算法的基本运算的数量级来研究算法的时间复杂度f(n),表示为T(n)=Of(n).O的含义是T(n)的数量级。f(n)中取随n增长最快的一项将其系数置为1作为时间复杂度的度量,如f(n)=3n+3n^2其时间复杂度为n^2。

算法的规模不仅与n有关,也取决于输入数据的性质。

如:(简单的查找程序)

int  a
={…………};

   i=n-1;
while(i>=0&&(a[i]!=k))

i--;           -----------------------3

语句3为基本运算,而语句3的频度不仅与n的规模有关,还与输入的k值有关。

当输入的k值不在数组中时,语句频度为n。

当输入的k值是数组的最后一个元素时,语句频度为0。

最坏时间复杂度:是指在最坏情况下,算法的时间复杂度。(通常考虑)

平均时间复杂度:是指所有可能输入的所有实例在等概率出现的情况下,算法的期望运行时间。

最好时间复杂度:是指在最好情况下,算法的时间复杂度。

加法原则T(n)=T1(n)+T2(n)+T3(n)=O(f1(n))+O(f2(n))+O(f3(n))=max(O(f1(n)),O(f2(n)),O(f3(n)))

乘法原则T(n)=T1(n)*T2(n)=O(f1(n)*O(f2(n))=O(f1(n)*f2(n))

常见的渐进时间复杂度有:

O(1)<O(long2n)<O(n)<O(nlong2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

分析示例:

3n+2=O(n) 
3n+3=O(n)
100n+6=O(n)

10n2+4n+2=O(n2)
6*2n+n2=O(2n)

1.void mult(int a[], int b[], int& c[] ) {

  // 以二维数组存储矩阵元素,c 为 a 和 b 的乘积

   for (i=1; i<=n; ++i){

for (j=1; j<=n; ++j) {

       
  c[i,j] = 0;

        for (k=1; k<=n; ++k)

          c[i,j] += a[i,k]*b[k,j]; }



基本运算: c[i,j] += a[i,k]*b[k,j];时间复杂度为n*n*n即n^3

2.下列程常段的时间复杂度是

count=0;

for(k=1;k<=n;k*=2)  
for(j=1;j<=n;j+1)
count++;

基本运算:count++;时间复杂度为:nlong2n

分析:外层循环执行一次内层循环执行n次

外层循环每执行一次 k=k*2 设执行x次 则 循环结束条件为 2^x<=n 则 x<=long2n

内外层相乘则为 n*long2n

以上均为非递归程序,比较简单,可以直接累计次数。

3.int fact(int n)

{

if(n<=1) return 1;

return n*fact(n-1);

}

分析:T(n)=1+T(n-1)=1+1+T(n-2)=1+1+1+T(n-3)=……=n-1+T(1)所以时间复杂度为n

空间时间复杂度:是指所消耗的存储空间定义为S(n).若所需存储量依赖于特定的输入,

则通常按最坏情况考虑。

存储空间主要包括:输入数据所占空间,程序本身所占空间,辅助变量所占空间

算法原地工作是指算法所需辅助空间为常量。

如有错误请大家及时指出,本人感激不尽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sjfzd