数据结构和算法(01)--- 算法复杂度

文章目录

算法时间复杂度

要判断算法的好坏,可以从时间方面进行分析。算法运行的越快,所用的时间越短则算法越好。但是同一个算法在不同的平台上的运行时间不同。那么又该如何进行评判呢?我们采用时间复杂度进行衡量。

1.算法时间复杂度定义
  在进行算法分析时, 语句总的执行次数T(n)T(n)是关于问题规模nn的函数,进而分析T(n)T(n)随nn的变化情况并确定T(n)T(n)的数量。算法的时间复杂度。也就是算法的时间量度,记做:T(n)=O(f(n))T(n)=O(f(n))。它表示随问题规模nn的增大,算法执行时间的增长率和f(n)f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。 其中f(n)f(n)是问题规模nn的某个函数。

个人理解:由于不同的机器指令执行的速度不一样,而我们的代码又常常是跑在多台不同机器上的,为了找出与机器无关但又可以说明代码效率的量标,于是就选择时间复杂度只与代码的执行次数有关,即:T(N)。一般情况下,随着N不断增大,T(N)增长缓慢的算法时间复杂度越低,算法越好

2.如何分析一个算法的时间复杂度:

  • 顺序结构,时间复杂度等于每步相加;选择分支结构,时间复杂度等于最大时间复杂度的那个分支;循环结构,时间复杂度每个循环体相乘
  • 用常数1取代运行时间中的所有加法常数;只保留阶数最高的那一项;高阶项前面的系数可以直接用1替代。

时间复杂度为O(1)

int a = 1 , b = 3 , sum = 0;  //执行1次
sum = a + b;   //执行1次
cout<<"the sum is :"<<sum<<endl; //执行1次     // 1+1+1 = 3 --> O(1)

时间复杂度为O(N)

//执行N次   
for(i=0;i<=n;i++){
    printf("the data is %d\n",i)    
}    //  N * 1 = N   --->   O(N)

时间复杂度为O(N^2)

//执行N次   
for(j=0;j<=n;j++){    //执行N次
    for(i=0;i<=n;i++){   //执行N次
        printf("the data is %d\n",i)  
    }  
}                        //N * N = N^2  ----->   O(N^2)

时间复杂度为O(logN)

//执行N/2次   
while(i<n){
    count<<"the data is :<<i<<endl;
    i = i*2;   
}                     

常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

3.最坏情况:

  • 最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。一般在没有特殊说明的情况下,都是指最坏时间复杂度。

4.平均情况

  • 平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。

5.递归算法的时间复杂度的计算

  • 在算法的分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化成为一个递归方程的求解。而对递归方程的求解,方法多种多样,目前主流的方法:代入法,迭代法,公式法,母函数法,差分方程法。

猜你喜欢

转载自blog.csdn.net/wangzi11111111/article/details/88372827