美文网首页iOS开发
时间和空间复杂度

时间和空间复杂度

作者: Jabir_Zhang | 来源:发表于2021-10-13 14:04 被阅读0次

    算法复杂度

    算法复杂度分为\color{red}{时间复杂度}\color{red}{空间复杂度}

    • 时间复杂度是指执行算法所需要的计算工作量。
    • 空间复杂度是指执行这个算法所需要的内存空间。

    时间复杂度代表「时效(运行时间)」和空间复杂度代表「存储(占用空间)」

    我们都是用“时间复杂度”来指运行时间的需求,是用“空间复杂度”指空间需求。一般说的“复杂度” ,通常指的是时间复杂度

    事例场景:

    • 场景1:给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天?
      • 答案: 3 * 10 = 30天。
        如果面包的长度是 N 寸呢?
        此时吃掉整个面包,需要 3 X n = 3n 天。
        如果用一个函数来表达这个相对时间,可以记作 T(n) = 3n
    • 场景2:给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢?
      • 答案是 5 X log_2{16} = 5 X 4 = 20 天。
        如果面包的长度是 N 寸呢?
        需要 5 Xlog_2{n} = 5log_2{n}天,记作 T(n) = 5log_2{n}
    • 场景3:给小灰一条长10寸的面包和一个鸡腿,小灰每2天吃掉一个鸡腿。那么小灰吃掉整个鸡腿需要多少天呢?
      • 答案是2天。因为只说是吃掉鸡腿,和10寸的面包没有关系 。
        如果面包的长度是 N 寸呢?
        无论面包有多长,吃掉鸡腿的时间仍然是2天,记作 T(n) = 2
    • 场景4:给小灰一条长10寸的面包,小灰吃掉第一个一寸需要1天时间,吃掉第二个一寸需要2天时间,吃掉第三个一寸需要3天时间.....每多吃一寸,所花的时间也多一天。那么小灰吃掉整个面包需要多少天呢?
      • 答案是从1累加到10的总和,也就是55天
        如果面包的长度是 N 寸呢?
        此时吃掉整个面包,需要 1+2+3+......+ n-1 + n = (1+n)*n/2 = 0.5n^2 + 0.5n。
        记作 T(n) = 0.5n^2 + 0.5n

    总结

    计算公式坐标轴.png

    这四种时间复杂度究竟谁用时更长,谁节省时间呢?
    根据斜率,得出结论:
    O(1) < O(log_2{n}) < O(n) < O(n^2)
    常用的时间复杂度所耗费的时间从小到大依次是:�
    O(1) < O(log{n}) < (n) < O(nlog{n}) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

    复杂度与效率挂钩

    我们来举一个栗子:

    算法A的相对时间规模是T(n) = 100n,时间复杂度是O(n)
    算法B的相对时间规模是T(n) = 5n^2,时间复杂度是O(n^2)
    算法A运行在小灰家里的老旧电脑上,算法B运行在某台超级计算机上,运行速度是老旧电脑的100倍。
    那么,随着输入规模 n 的增长,两种算法谁运行更快?

    运算次数.png

    推导时间复杂度

    如何推导出时间复杂度呢?有如下几个原则:

    • 如果运行时间是常数量级,用常数1表示;
    • 只保留时间函数中的最高阶项;
    • 如果最高阶项存在,则省去最高阶项前面的系数。

    Ο(log_2{n})、Ο(n)、 Ο(nlog_2{n})、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2^n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial, 非确定多项式)问题。

    相关文章

      网友评论

        本文标题:时间和空间复杂度

        本文链接:https://www.haomeiwen.com/subject/zfnsoltx.html