算法的时空复杂度分析

一、时间复杂度

        时间复杂度往往只是定性描述,即不需要算出来具体数值。仅需要有大体的估算结果(有点像高数中的极限,仅考虑n趋近于正无穷时的情况)。下面给出几种常见时间复杂度的代码。

#include<iostream>
using namespace std;
int n,ans;
int main(){
	cin>>n;
	//O(1)和数据输入规模无关
	for(int i=0;i<9;++i)
		ans+=n;
	
	//O(logn)一般默认底数是2(就算不是也可以用指数换底公式换成2)
	for(int i=n;i;i/=2)
		ans+=n;
	
	//O(√n)
	for(int i=1;i*i<n;++i)
		ans+=n;
	
	//O(n)线性时间复杂度
	for(int i=0;i<n;++i)
		ans+=n;
	
	//O(n^2)
	for(int i=1;i<n;++i)
		for(int j=i+1;j<n;++j)
			ans+=n;
	
	return 0; 
}

        此外,还有O(n!)(阶乘级)、O(C^n)(指数级)等时间复杂度。很显然,在大规模数据下这种复杂度的算法是不可行的,因此应注意规避此类算法。

        由以上,计算出的时间复杂度为10^8级别以下,则在可接受范围之内。

二、空间复杂度

        可用sizeof(类型名或该类型的变量名)查看占用字节数。常用类型包括:

        int:32位二进制,2^31-1=2147483647(约10^9)可用于判断是否需要使用更大类型(如long long类型)的变量存储数据。

        long long:64位二进制,2^63-1(约10^18) 

        double:64位二进制,需要注意的是,当将一个十进制小数转化为二进制小数时,可能会转化为一个无限循环小数。如:0.5、 0.25、 0.125转化为二进制分别为0.1、 0.01、 0.001,但十进制的0.3很明显不能由二进制拼出。可运行如下代码进行测试:

#include<iostream>
using namespace std;
double n,ans;
int main(){
	
	cout<<(0.1+0.2==0.3);//结果为0,说明等式不成立
    //因此若想判断两小数运算相等,最好用 0.1+0.2-0.3<=1e-7 的方式
	
	return 0;
}

        char:8位二进制

        bool:8位二进制,但仅有0和1 

         以下给出计算变量所占空间方式:

        8位二进制=1个字节

        1024字节=1KB

        1024KB=1MB

        1024MB=1GB

        ……              

        给个题练手:

        题目的空间限制位512MB,在没有递归等其他消耗下,且只开一个int数组则该数组最大可开到什么数量级?

        512*1024(得到KB数)*1024(得到字节数)*8(得到位数)/32(int位数)≈10^8

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值