算法分析(算法的时间复杂度和空间复杂度)

算法定义

算法是解决特定问题求解步骤的描述;
在计算机中为指令的有限序列,并且每条指令表示一个或者多个操作。

时间复杂度

时间复杂度定义

运行算法分析时,语句总执行次数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) 所以时间复杂度为O( nn ) = O( n^2) ;
如果外部循环次数变为m 时间复杂度则为 O( m
n )

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) 都是噩梦般的执行时间,不去考虑。

最坏时间复杂度。

通常我们指的时间复杂度都是最坏情况复杂度分析。

常见算法时间复杂度。

算法分析(算法的时间复杂度和空间复杂度)_第1张图片

空间复杂度O(1);

算法空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记
S(n) = O(f(n)) n 为问题规模 f(n) 所占空间的函数。
很多时候以空间换时间,来提高程序的执行速度

你可能感兴趣的:(数据结构)