一、时间复杂度
时间复杂度的定义
时间复杂度是衡量算法运行时间随着输入规模增加而增长的度量标准。它描述了算法所需执行的基本操作数量和输入规模之间的关系。通俗来说,时间复杂度表示了算法执行所需的时间随着问题规模的增加而增长的速度。
结论:判断一个算法的效率时,操作数量中的常数项和其他次要项常常可以忽略,只需要关注最高阶次项就能得出结论。
时间复杂度的表示法
时间复杂度是:算法运行后对时间的需求量的定性描述。
此课程只讨论数据结构的时间复杂度的计算,对于数据结构的空间复杂度只做了解!!!
对于表示时间复杂度,我们可以使用O()
表示法来表示时间/空间复杂度
因为我们在上面已经说了:判断时,只关注最高次项.但他执行的数量不是不确定的都填1
我们可以举下面的例子:
- O(5) = O(1)
- O(2n+1) = O(n)
- O(n²+n+1) = O(n²)
- O(3n³+1) = O(n³)
注意:符号 O(5) 表示算法或函数具有恒定的时间复杂度,这意味着无论输入大小如何,它都需要固定的时间来执行。
常见的时间复杂度
1、O(1)
void printNum(int num) { cout << num << endl; //cout << num << endl; //cout << num << endl; //cout << num << endl; //cout << num << endl; //cout << num << endl; //cout << num << endl; }
不管里面有多少cout << num << endl;
他的时间复杂度都是O(1)
2、O(n)
for(int i = 0;i<N;i++) { //O(n) //O(1)的语句 } 循环次数:n
3、O(Logn)数阶时间复杂度
int i = 1; while(i < n) { i*=2; }
4、O(n²)指数时间复杂度
for(int i = 0;i<n;i++) { for(int j = 0;j<n;j++) { //O(1)的语句 } } 循环次数:n²
二、空间复杂度
空间复杂度的定义
当我们评估算法的空间复杂度时,我们关注的是算法执行所需的额外内存空间。它用来衡量算法在解决问题时占用的内存量。通常,我们关注的是随着输入规模增加,算法所使用的额外内存的增长趋势。
空间复杂度通常用大O符号表示,表示为O(f(n)),其中f(n)是输入规模n的函数。这个函数描述了算法所需的额外内存空间与输入规模的关系。常见的f(n)函数有常数、线性、对数和平方等。
例如,O(1)表示算法的空间复杂度是常量级的,即算法使用的额外内存空间是固定的,不随输入规模的增加而变化。而O(n)表示算法的空间复杂度是线性的,即算法所使用的额外内存空间随着输入规模的增加线性增长。
空间复杂度帮助我们评估算法在内存使用方面的效率,并选择适合实际需求的算法。当输入规模很大或者内存资源有限时,对算法的空间复杂度进行评估和优化是非常重要的。
常见的空间复杂度
1、O(1):常数空间复杂度,表示算法占用的内存空间是固定的,与输入规模无关。
void constantSpace() { int a = 5; // 使用常量空间,不随输入规模变化 }
2、O(n):线性空间复杂度,表示算法占用的内存空间与输入规模成正比。
void linearSpace(int n) { int* array = new int[n]; // 动态分配n个整数的内存空间 // 使用array做一些操作 delete[] array; // 释放内存空间 }
3、O(Logn):对数空间复杂度,表示算法占用的内存空间与输入规模的对数成正比。
void logarithmicSpace(int n) { int count = 0; while (n > 1) { n = n / 2; ++count; } // 使用count进行一些操作 }
4、O(n²):二次空间复杂度,表示算法占用的内存空间与输入规模的平方成正比。
void quadraticSpace(int n) { int** matrix = new int*[n]; // 动态分配n行的动态数组 for (int i = 0; i < n; ++i) { matrix[i] = new int[n]; // 每行动态分配n个整数 } // 使用matrix进行一些操作 for (int i = 0; i < n; ++i) { delete[] matrix[i]; // 释放每行的内存空间 } delete[] matrix; // 释放动态数组的内存空间 }
这些例子展示了不同空间复杂度级别的函数实现,但请注意,空间复杂度的具体评估通常还与具体的算法和数据结构使用方式有关。这里提供的只是一些常见的示例。
总结
- 时间复杂度是算法运行时
对于时间的需求量
- 大O表示法用于描述算法的
时间/空间复杂度
- 大O表示法只关心
操作数量的最高次项
- 常见的时间复杂度为:线性阶,平方阶和对数阶