目录
1.时间复杂度
- 概念
在ACM范围里,我们只需了解时间复杂度可以大致地通过一个算法运算的次数来描述程序运行的效率,常常用大写字母O来表示。在表示时间复杂度的时候,只保留数量级最大的一项,并忽略系数。
- 举个栗子
对于给定的常数N ,若某一个算法计算的次数是3N^3 + N^2 + 10^5则我们可以认为它的时间复杂度为0(N^3)。只考虑最高次。
2.空间复杂度
- 概念
顾名思义就是用来衡量内存的占有量的。除了计算复杂度,我们常常也需要直接算出来运行程序需要占用多少内存。
-
单位换算
1G=1024MB 1MB = 1024KB 1KB = 1024B 1B (byte,字节)=8b (bit, 比特).
- 常见数据类型
char/ bool. 1B short. 2B int/float/long. 4B long long/double. 8B
ps:在不同的系统占的字节不同。如果忘记数据类型占用的内存,可用sizeof函数测出占用多少字节。
3.常见的算法复杂度
1)常数阶:O(1) 2)对数阶:O(logN) 3)线性阶:O(N)
4)线性对数阶:O(N*logN) 5)平方阶:O(N^2) 6) 立方阶:O(N^3)
4.相关典型例题
(1) 求阶乘之和。
以下只列出求阶乘之和的代码。
- 常规解法:时间复杂度很大。
- 巧妙解法:时间复杂度小且简洁。利用的是:后一个数的阶乘等于前一个数的阶乘乘以后者的阶乘。
(2)
- 巧妙思路:
我们记录下每个地毯的信息,对于(x,y),我们在n个地毯中倒序查找,如果满足在某个地毯内,那,我们就找到它了。时间复杂度:O(n),空间复杂度:O(n) 。
#include<iostream>
using namespace std;
struct Node{
int a,b,w,h;
}node[100005];
int main()
{
int x,y,n,state=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>node[i].a>>node[i].b>>node[i].w>>node[i].h;
cin>>x>>y;
for(int i=n;i>=1;i--)
if(x>=node[i].a&&x<=node[i].a+node[i].w&&y>=node[i].b&&x<=node[i].b+node[i].h){
cout<<i<<endl;state=1;break;
}
if(state==0)cout<<-1<<endl;
return 0;
}
5.总结
- 时间复杂度
- 空间复杂度
- 复杂度的优化思路——时间换空间,空间换时间
- 计算机每秒运行的上限——一般10^8次
- 相关内存的换算