算法定义
算法是解决特定问题求解步骤的描述;
在计算机中为指令的有限序列,并且每条指令表示一个或者多个操作。
时间复杂度
时间复杂度定义
运行算法分析时,语句总执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况确定T(n)的数量级。
算法时间复杂度,也相当于算法的时间量度 【 T(n) = O(f(n)) 】;
用大写O()来体现算法时间复杂的记法伟大 O 记法;
大 O 记法推导
用常数 1 取代运行时间中的所有加法常数。
在修改后的运行次数函数中,只保留最高阶项。
如果最高阶项常数不是1,则去除相乘的常数。
时间复杂度实例
1,常数阶
int sum = 0, n = 100; /* 执行一次 */
sum = (1+n) * n /2; /* 执行一次 */
printf(sum);
算法运行函数次数是 f(n) = 3;
根据大O 推导法,把常数 3 改为 1,所以这个算法的时间复杂度为O(1)。
总:分支结构不会随着n的变化而发生变化,其时间复杂度是
2,线性阶
int i;
for( i =0 ; i< n; i++ ){
/** 时间复杂度为O(1)的程序步骤:【 printf(i) 】*/
}
时间复杂度 O(n);
3,对数阶
int count = 1;
while (count < n){
count = count*2;
}
由于每次count 乘以2以后,就距离n 更近。相当于有多少个2相乘大于2,退出循环。
由 2^x = n 得到 x = log2n。
所以循环的时间复杂度 O(logn)。
4,平方阶
int i ,j;
for(i =0 ; i< n; i++){
for(j = 0 ;j <n ; j++){
/**时间复杂度为O(1)的程序*/
}
}
由于是嵌套循环(内外循环次数都为n) 所以时间复杂度为O( nn ) = O( n^2) ;
如果外部循环次数变为m 时间复杂度则为 O( mn )
int i ,j;
for(i =0 ; i< n; i++){
for(j = i ;j < n ; j++){
/**时间复杂度为O(1)的程序*/
}
}
由于 i =0 时,内循环执行了n次数,i = n-1 则执行了1次 所以内部执行次数:
n + (n-1) + (n-2) + … + 1 = n(n+1) / 2 = n^2 / 2 + n / 2
用大O 阶推导
1,加法常数阶不考虑
2,只保留最高阶 n^2 / 2
3,去除最高阶段 得到时间复杂度 O( n^2 )
常见的时间复杂度
O(1) < O(logn) < O(n) < O(nlogn) < O (n^2) < O (n^3) < O(2^n) < O(n!) < O(n^n)
O(1)----------------------O(nlogn)------O(n ^ 2)-------------------------------O(n^n)
较好 一般 较差
时间复杂度大于O(n^3) 都是噩梦般的执行时间,不去考虑。
最坏时间复杂度。
通常我们指的时间复杂度都是最坏情况复杂度分析。
常见算法时间复杂度。
空间复杂度O(1);
算法空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记
S(n) = O(f(n)) n 为问题规模 f(n) 所占空间的函数。
很多时候以空间换时间,来提高程序的执行速度