一、时间复杂度
时间复杂度往往只是定性描述,即不需要算出来具体数值。仅需要有大体的估算结果(有点像高数中的极限,仅考虑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