算法的复杂度分析

设计算法有难也有易,有复杂,也有简单的。有的算法需要很多步骤的执行,有的算法执行非常简单,但是卓有成效。当我们面对两种不同的算法,我们就需要一种方法来分析算法的复杂度。这篇文章便是我关于算法的复杂的分析这节课的笔记

算法的时间复杂度

算法的时间复杂度比较法,即衡量算法运行所需要的时间,但并不直接参照算法的运行时长,时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的关系,即是算法运行时间随着数据量变大时的增长趋势。

要计算时间复杂度,我们需要知道以下的变量

n:数据的规模

T(n):算法执行的时间

f(n):表示每行代码执行总次数

O:这个就代表算法的时间复杂度

常见的关系有:

↓↓↓越靠近这里的算法越好↓↓↓

常数阶O(1)
线性阶O(n)
平方阶O(n^2)
立方阶O(n^3)
K次方阶O(n^k)
对数阶O(log(n))
线性对数阶O(nlog(n))
指数阶O(2^n)
阶乘阶O(n!)

看不懂?下方是我在网上找的一张图。原文地址点此访问

↑↑↑越靠近这里的算法越差 ↑↑↑

关于算法的时间的复杂度的计算,我们先来看下面的一串代码

int A(int n)
{
    printf("%d", 0);
    return 0;
}

int B(int n) 
{
    for (int i = 0; i < n; i++) 
     {
        printf("%d", i);
    }
    return 0;
}

int C(int n) 
{
    for (int i = 0; i < n; i++) 
     {
        printf("%d", i);
    }
    return 0;
}

上方有3个函数

函数A:算法运行时长不与输入的数据n成比例,其运行时长为一个常数,我们称之为常数阶

算法B:算法运行时长不与输入的数据n成正比,我们称之为线性阶段

算法B:算法运行时长不与输入的数据n成比例,虽然其运行时长比较长,但是其运行时长仍然为一个常数,仍然还是常数阶。

假如一个函数运行时长与输入数据的规模的函数差不多长这个样子:T = 66n^3 + 55n + 44,我们先将常数去掉,然后只保留最高的项数,最后把最高项的系数去掉,即该算法的O为立方阶。

假如想要更深的了解算法的时间复杂度,可以前往以下的两个链接了解更多

参考资料:hello算法,点此访问 io-wiki,点此访问

空间复杂度

时间复杂度与空间复杂度比较类似,只需要将相应的时间概念转化为储存空间即可,其用于衡量算法占用内存空间随着数据量变大时的增长趋势。与空间复杂度类比即可。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,记得载明出处,(期待)。内容有问题?点此反馈
上一篇
下一篇