算法题目的时间复杂度和空间复杂度
一、如何判断时间复杂度?
利用--大O记法:
1、只保留最高次项;
2、最高次项的系数默认是1;
3、常数次一律记为O(1)。
例题1:
void test1()
{
int n, m;
cin >> n >> m ;
int sum = 0;
for(int i = 0; i < n; i ++)
{
for(int i = 0; i < m; i ++)
{
sum ++;
}
}
}
这时候其实只看两个for循环,其他的不管,并且知道内层for循环循环了m次,外层for循环循环了n次,可以知道它的时间复杂度大约是 O(n*m)。
例题2:
void test2()
{
for (int i = 0; i < 10000; i ++)
{
cout << "aa" << endl;
}
}
根据前面的大O记法,常数次默认是O(1)。
例题3:
void test3()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i ++)
{
cout << 1 << endl ;
}
for(int i = o; i < m; i ++)
{
cout << 2 << endl ;
}
}
这里不是嵌套关系,所以是O(n+m)。
例题4:
void test4()
{
int n;
cin >> n;
int cnt = 0;
int l = 1;
while(l < n)
{
cnt ++;
l *= 2;
}
cout << cnt << endl;
}
因为这里 L 是乘了2,会比预期更快达到 L > n,按照数学表达式-> 2^L = n --> L = logn,所以时间复杂度为O(logn)。
二、空间限制(题目内存要求不能超过多少mb)
数组基本上最大能开到10的7次方大小。