1、算法的复杂度
— 时间复杂度:算法运行后对时间需求量的定性描述
— 空间复杂度:算法运行后对空间需求量的定性描述
我们在讨论效率问题主要关注的是 算法的时间复杂度,但是方法也可以用于空间复杂度的判断。
2、大O表示法
— 操作数量的估算可以作为时间复杂度的估算
— 只关注操作数量的最高次项
- 常见的时间复杂度
— 线性时间复杂度:O(n)
— 对数时间复杂度:O(log n)
— 平方阶时间复杂度:O(n^2)
3、空间换时间的典型案例
问题:在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次,设计一个算法,找出出现次数最多的数字。
#include <iostream>
using namespace std;
void search(int a[], int len)
{
}
int main(int argc, char* argv[])
{
int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
search(a, sizeof(a)/sizeof(*a));
return 0;
}
#include <iostream>
using namespace std;
void search(int a[], int len) // O(n) + 2000 = O(n)
{
int sp[1000] = {0};
int max = 0;
for(int i = 0; i < len; i++)
{
sp[a[i] - 1]++;
}
for(int i = 0; i < 1000; i++) //sp[i] 意思为出现的次数
{
if(max < sp[i])
{
max = sp[i];
}
}
for(int i = 0; i < 1000; i++)
{
if(max == sp[i])
{
cout << i+1 << endl;
}
}
}
int main(int argc, char* argv[])
{
int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
search(a, sizeof(a)/sizeof(*a));
return 0;
}