时间复杂度的学习记录

算法的时间复杂度和空间复杂度,这个问题是我从上学时就没有搞懂的问题,记得考试的时候都是找几个经典的算法,强行记下他们的时间复杂度和空间复杂度的,现在早忘得干净了。

时间复杂度:
时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。
常见的时间复杂度有: 常数阶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)。

你可能感兴趣的:(时间复杂度的学习记录)