【C++】时间复杂度与空间复杂度

📣🥳🥳🥳📣

✨Hello! 如果这篇【文章】对你有帮助😄,希望可以给博主点个赞👍鼓励一下😘

📣🥳🥳🥳📣



🤔 时间复杂度

时间复杂度分最好时间复杂度、平均时间复杂度和最差时间复杂度。一般来讲我们关注最差时间复杂度,也就是循环次数最多的复杂度。若无特殊指明,时间复杂度代指最差时间复杂度。判断时间复杂度需关注好【条件表达式】

🏷️ 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❤️

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

John Chen1223

点赞是美意!打赏是鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值