时间复杂度:
时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。
常用方法:
(1) 多数情况下,求最深层循环内的简单语句的重复执行的次数;
(2)当难以精确计算原操作执行的次数时,只需求出它关于n的增长率或阶即可;
(3)当循环次数未知(与输入数据有关),求最坏情况下的简单语句的重复执行操作。
推导大O阶 :
推导大O阶,我们可以按照如下的规则来进行推导,得到的结果就是大O表示法:
(1) 用常数1来取代运行时间中所有加法常数。
(2) 修改后的运行次数函数中,只保留最高阶项
(3) 如果最高阶项存在且不是1,则去除与这个项相乘的常数
例子:
//将数组a从小到大排列
void bubble_sort(int a[],int n)
{
int tmp,change=1;
for(int i=n-1;i>0&&change==1;i++)
{
change=0;
for(int j=0;j<i;j++)
{
if(a[j]>a[j+1]
{
swap(a[j],a[j+1];
change=1;
}
}
}
}
时间复杂度考虑最坏情况执行得次数为 n*(n+1)/2 次,按照大O推到法则时间复杂度为O(n²)
常见时间复杂度比较:
O(1) 常数阶 < O(㏒ n) 对数阶 < O(n) 线性阶 < O(n㏒ n) < O(n²) 平方阶 < O(n³) < { O(2ⁿ) < O(n!) < O(nⁿ)