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

本文深入解析算法的时间和空间复杂度,包括常数阶、线性阶、对数阶、平方阶等,以及如何使用大O记法进行复杂度分析。通过实例说明不同复杂度级别的算法效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法定义

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

时间复杂度

时间复杂度定义

运行算法分析时,语句总执行次数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( 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) 都是噩梦般的执行时间,不去考虑。

最坏时间复杂度。

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

常见算法时间复杂度。

在这里插入图片描述

空间复杂度O(1);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值