算法的时间复杂度和空间复杂度,这个问题是我从上学时就没有搞懂的问题,记得考试的时候都是找几个经典的算法,强行记下他们的时间复杂度和空间复杂度的,现在早忘得干净了。
时间复杂度:
时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。
常见的时间复杂度有: 常数阶O(1), 对数阶O(log2 n), 线性阶O(n), 线性对数阶O(n log2 n), 平方阶O(n^2), 立方阶O(n^3) k次方阶O(n^K), 指数阶O(2^n)。 随着n的不断增大,时间复杂度不断增大,算法花费时间越多。
时间复杂度的计算规则(大O记法):
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
(1) 如果算法的执行时间不随着问题的规模n的增长而增长,即使算法中有上千条语句,执行时间也只是一个比较大的常数。此类算法的时间复杂度为O(1);->常数阶
(2) 当有多个循环嵌套时,算法的时间复杂度是由嵌套层数最多的循环语句的语句频度决定的;
(3) 通常我们计算时间复杂度都是计算最坏情况 ;
*********************较好********************
常数阶O(1):
int sum = 0, n = 100; /*执行一次*/
sum = (1 + n) * n / 2; /*执行一次*/
printf("%d",sum); /*执行一次*/
对数阶O(log2 n):
int count = 1;
while (count < n){
count = count * 2;
/*时间复杂度为O(1)的程序步骤序列*/
}
线性阶O(n):
int i;
for(i = 0; i < n; i++){
/*时间复杂度为O(1)的程序步骤序列*/
}
线性对数阶O(n log2 n):
*********************一般*********************
平方阶O(n^2):
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
/*时间复杂度为O(1)的程序步骤序列*/
}
}
*********************较差********************
立方阶O(n^3):
int i, j;
for(i = 1; i < n; i++)
for(j = 1; j < n; j++)
for(j = 1; j < n; j++){
/*时间复杂度为O(1)的程序步骤序列*/
}
k次方阶O(n^K),
指数阶O(2^n)。