文章目录
- 算法时间复杂度
算法时间复杂度
要判断算法的好坏,可以从时间方面进行分析。算法运行的越快,所用的时间越短则算法越好。但是同一个算法在不同的平台上的运行时间不同。那么又该如何进行评判呢?我们采用时间复杂度进行衡量。
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.递归算法的时间复杂度的计算
- 在算法的分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化成为一个递归方程的求解。而对递归方程的求解,方法多种多样,目前主流的方法:代入法,迭代法,公式法,母函数法,差分方程法。