码迷,mamicode.com
首页 > 编程语言 > 详细

算法的时间复杂度

时间:2016-03-20 13:10:02      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

        衡量一个算法的好坏,需要从时间复杂度和空间复杂度去考虑。时间复杂度就是这个算法需要执行的基本指令的次数,空间复杂度就是这个算法需要占用的内存空间的大小。很明显,在完成同样工作的前提下,执行的指令次数越少,占用的内存空间越少,这个算法就越好。

 

时间复杂度

怎么算时间复杂度?

      算法复杂度由2个函数复合而来。第一个是关于问题规模n的函数f(n),f(n)求得的就是这个算法执行的基本指令的次数。

      问题规模:比如,一个算法第一次要计算1+2+3+......+10的和,第二次要计算1+2+3........+100的和,那么,这里的10和100就是问题规模。

      int total = 0;      //1次
      int n = 100;     //1次
      for(int i=1;i<=n;++i)     //n=100次
      {

           total+=i;

      }

如上的例子,在问题规模n=100的情况下,f(n) =102,那么,通用表达式就是:f(n)  = n+2

 

第二个函数就是n关于就O(f(n))的函数(又叫大O阶),所以,总体的公式就是 :  O(f(n))

O(f(n))的推导过程:

      1、先得出f(n)的通用表达式

      2、去掉f(n)中的常数项和低次项,只保留最高次项。

      3、去掉最高次项的系数, 得到的表达式就是O(f(n))的表达式

 

热身练习:

分别求出下面2个算法的时间复杂度

#include<stdio.h>

/*
   T(n) = O(f(n)) = O(n)
*/

int main(void)
{
    
    int total = 0;       
    int n;
    scanf("%d",&n);
    
    for(int i=1;i<=n;++i)
       total+=i;
       
    printf("total = %d\n",total);
    
    return 0;
    
} 

 

 

#include<stdio.h>

/*
   T(n) = O(f(n))  =O(1)
*/

int main(void)
{
    
    int total = 0;       
    int n;
    scanf("%d",&n);
    
    total = ((1+n)*(n)) / 2;   //著名数学王子高斯的求和公式 

    printf("total = %d\n",total);
    
    return 0;
    
} 

 

 

 

附表1:常见的排序算法的时间复杂度

 

排序法

最差时间分析 平均时间复杂度 稳定度 空间复杂度
冒泡排序 O(n2) O(n2) 稳定 O(1)
快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n)
选择排序 O(n2) O(n2) 稳定 O(1)
二叉树排序 O(n2) O(n*log2n) 不一顶 O(n)

插入排序

O(n2) O(n2) 稳定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)
希尔排序 O O 不稳定 O(1)

 

 

 

附表2:时间复杂度大小顺序

 Ο(1) <  Ο(log2n) < Ο(n)  <    Ο(nlog2n)    <    Ο(n 2)    <   Ο(n3)    <  …<Ο(2n)   <  Ο(n!)

 

 

总结:算法的时间复杂度反应了一个算法,随着问题规模的变化,计算机需要执行的指令的次数的变化情况。

 

算法的时间复杂度

标签:

原文地址:http://www.cnblogs.com/lulipro/p/5297456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!