【问题标题】:Understanding Big O complexity了解大 O 复杂性
【发布时间】:2020-08-17 18:20:06
【问题描述】:

我很难理解大 O 时间复杂度。

Big O 的正式定义:

f(n) = O(g(n)) 表示存在正常数ck,因此0 ≤ f(n) ≤ cg(n) 代表所有n ≥ kck 的值对于函数 f 必须是固定的,并且不能依赖于 n

插入排序的最差时间复杂度是O(n^2)

在插入排序的情况下,我想在这里了解f(n)g(n)ck 是什么。

【问题讨论】:

    标签: algorithm sorting time-complexity big-o complexity-theory


    【解决方案1】:

    说明

    要形式化一个算法来正式应用 Big-O 并不容易,它是一个数学概念,不容易转化为算法。通常,您会根据输入的大小测量执行操作所需的“计算步骤”数量。

    • 所以f 是衡量算法执行多少计算步骤的函数。
    • n 是输入的大小,例如5 表示[4, 2, 9, 8, 2] 之类的列表。
    • g 是您衡量的函数,因此如果您检查 O(n^2),则为 g = n^2
    • ck 在很大程度上取决于具体的算法以及 f 的样子。

    示例

    将算法形式化的最大问题是您无法真正准确地知道执行了多少计算步骤。假设我们有以下 Java 代码:

    public static void printAllEven(int n) {
        for (int i = 0; i < n; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
            }
        }
    }
    

    它执行多少步?我们应该走多深? for (int i = 0; i &lt; count; i++) 呢?这些是在循环期间执行的多个语句。 i % 2 呢?我们可以假设这是一个“单一操作”吗?在哪个级别,一个 CPU 周期?一条装配线? println(i) 呢,它需要多少计算步骤,1 或 5 或 200?

    这是不切实际的。我们不知道确切的数量,我们必须抽象并说它是一个常数ABC的步数,这没关系,因为它运行在常数时间。


    在简化分析之后,我们可以说我们实际上只关心println(i) 被调用的频率。

    这导致我们将其精确称为n / 2 次的观察结果(因为在0n 之间有很多偶数。

    f 使用上述常量的精确公式会产生类似

    n * A + n * B + n/2 * C
    

    但由于常量并没有真正发挥任何作用(它们在 c 中消失了),我们也可以忽略这一点并简化。


    例如,现在您需要证明n / 2O(n^2) 中。通过这样做,您还将获得ck 的具体数字。示例:

    n / 2 <= n <= 1 * n^2 // for all n >= 0
    

    因此,通过选择 c = 1k = 0,您已经证明了该声明。 ck 的其他值也可以,例如:

    n / 2 <= 100 * n <= 5 * n^2 // for all n >= 20
    

    这里我们选择了c = 5k = 20


    你也可以用完整的公式玩同样的游戏,得到类似的东西

    n * A + n * B + n/2 * C
        <= n * (A + B + C)
        = D * n
        <= D * n^2 // for all n > 0
    

    c = Dk = 0

    如您所见,它实际上并没有起到任何作用,常量只是在 c 中消失。

    【讨论】:

      【解决方案2】:

      在插入排序的情况下,f(n) 是您的处理器将执行排序的实际操作数。 g(n)=n2。 c 和 k 的最小值将由实现定义,但它们并不那么重要。这个 Big-O 表示法给出的主要思想是,如果将数组大小加倍,插入排序工作所需的时间将增长大约 4 倍 (22)。 (对于插入排序,它可以更小,但 Big-O 只给出上限)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多