时间复杂度和空间复杂度

文章详细阐述了时间复杂度的概念,包括算法执行时间与问题规模的关系,以及如何通过基本语句的执行次数来确定时间复杂度,给出了不同示例如O(1),O(n^2)的计算。同时,简要介绍了空间复杂度,关注点在于算法执行时的存储需求,指出原地工作的算法特征。

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


时间复杂度(详细)

概念

时间复杂度Time complexity
• 根据算法写成的程序在执行时耗费时间的长度。
• 时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。
• 算法中基本语句重复的执行次数是问题规模n的函数,记为f(n)。
• 随问题规模n的增大,算法执行时间的增长率和函数f(n)的增长率
相同,即T(n)与f(n)数量级 (Order of Magnitude)相同T(n)=O(f(n)),
T(n) 为算法的渐近时间复杂度,简称时间复杂度。

公式

语句执行时间=语句重复执行次数*执行一次所需时间(单位时间)
时间复杂度T(n)按数量级递增顺序为:

步骤

• 1.找出语句频度最大的语句作为基本语句
• 2.计算基本语句的频度得到问题规模n 的某个函数f(n),即执行次数
• 3.取其数量级用符号“O”表示

示例

        int a=0,b;
        a++;
        b=9;
        System.out.println(a+b);

语句频度为1, T(n)= O(1);

        for (int a=0;a<n;a++){   //单层循环语句频度为n
            for (int b=0;b<n;b++){  //嵌套循环语句频度为单层循环语句频度之积
                count++;
            }
        }

语句频度为n*n,T(n)=O(n^2);

		for (int a=0;a<n;a++){
            for (int b=0;b<a;b++){  //注意与上一个示例的区别,这里b<a
                count++;
            }
        }

推导:
b < a = 1, 2, 3, … ,n
f(n) = 1+2+3+…+n=n*(n+1)/2,即 T(n) = O(f(n)) = O(n^2)。
所以,语句频度为近似于 n^2,T(n)= O(n^2)。

        int s=0,i=0;
        while(s <( 5*n*n + 2)) {
            i++;
            s+=i;
        }

推导:
设循环体内语句频度 f(n)=x ,则 0+1+2+ … +x = x*(x+1)/2 < 5n^2+2 ,可解得
T(n) = O(f(n)) = n,语句频度近似于n。

        for (int i=1;i<=n;i*=2){
            s++;
        }

推导:
设循环体内语句频度为 f(n),2^f(n) <= n,可得
在这里插入图片描述

        for (int i=1;i<=n;i*=2){   //外层循环语句频度为log2(n)
            for (int j=0;j<n;j++){  //内层循环语句频度为n
                s++;
            }
        }

语句频度为
在这里插入图片描述

空间复杂度(简略)

• 算法的空间复杂度是指解决问题的算法在执行时所占用的存储空
间,记作S(n)。
• 即存储空间、变量占用空间、系统堆栈的使用空间等等。通常空
间复杂度的度量分为两个部分:固定部分和可变部分。
• 若所用额外存储空间相对于问题规模n来说是常数,则称此算法
为原地(就地)工作。

详细博客(他人)链接

http://t.csdn.cn/V28cU(个人认为非常好的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值