📣🥳🥳🥳📣
✨Hello! 如果这篇【文章】对你有帮助😄,希望可以给博主点个赞👍鼓励一下😘
📣🥳🥳🥳📣
![](https://i-blog.csdnimg.cn/blog_migrate/de934badd630712dece4cec8a5b9b3b1.jpeg)
🤔 时间复杂度
时间复杂度分最好时间复杂度、平均时间复杂度和最差时间复杂度。一般来讲我们关注最差时间复杂度,也就是循环次数最多的复杂度。若无特殊指明,时间复杂度代指最差时间复杂度。判断时间复杂度需关注好【条件表达式】。
🏷️ O(1)
1️⃣
int main() {
int a = 1; //时间复杂度O(1)
int b = 2; //时间复杂度O(1)
int c = 3; //时间复杂度O(1)
return 0;
}
时间复杂度O(3)=O(1)。
2️⃣
#include <iostream>
int main() {
for (int i = 0; i < 10; ++i) { //常数。时间复杂度O(10)=O(1)
std::cout << i << std::endl;
}
return 0;
}
时间复杂度O(1)。
🏷️ O(n)
1️⃣
int test(int n) {
int sum = 0; //O(1)
for (int i = 0; i < n; ++i) { //O(n)
sum += i;
}
return sum;
}
关注循环结构中的【条件表达式】i<n
👇
i
经第1次循环后值达到1(<n);
i
经第2次循环后值达到2(<n);
i
经第3次循环后值达到3(<n);
……
i
经第x次循环后值达到x(<n)。
令x = n,可得时间复杂度为O(x)=O(n)。
因此程序的时间复杂度为O(n+1),即【O(n)】。
🏷️ O(n*n)
1️⃣
#include <iostream>
int test(int n, int m) {
int sum = 0; //O(1)
for (int i = 0; i < n; ++i) { //O(n)
sum += i;
}
for (int i = 0; i < n; ++i) { //O(n^2)
for (int j = 0; j < m; ++j) {
std::cout << "1" << std::endl;
}
}
for (int i = 0; i < n; ++i) { //O(n^2)
for (int j = 0; j < m; ++j) {
std::cout << "2" << std::endl;
}
}
return sum;
}
对于新增的两层循环,先关注外层循环,易知时间复杂度O(n),再关注外层循环,同理O(n)。因此时间复杂度为O(n2)。该程序的时间复杂度O(2n2+n+1),取次数最高的哪项,即【O(n2)】。
🏷️ O(logn)
1️⃣
void test(int n) {
int i = 1;
while (i < n) {
i *= 2;
}
}
关注循环结构中的【条件表达式】i<n
👇
i
经第1次循环后值达到2^1(<n);
i
经第2次循环后值达到2^2(<n);
i
经第3次循环后值达到2^3(<n);
……
i
经第x次循环后值达到2^x(<n)。
令2^x = n,可得时间复杂度为O(x)=O(log2n)。
🏷️ O(n*logn)
在O(logn)的循环外再套一层O(n)的循环即可。
🤔 空间复杂度
#include <vector>
void test(int n) {
int i = 1; //空间复杂度O(1)
std::vector<int> ivec(10, 1); //空间复杂度O(10)
std::vector<int> ivec2(n, 1); //空间复杂度O(n)
}
✨如有问题欢迎在底下评论留言或私信!
如果这篇【文章】对你有帮助😄,希望可以给博主【点个赞👍】鼓励一下😘
❤️Thanks for your encouragement❤️