【问题标题】:Time complexity of nested loops with if statement带有 if 语句的嵌套循环的时间复杂度
【发布时间】:2021-01-26 00:24:40
【问题描述】:

我正在学习高级 C++ 课程,但我很难找到锁定在 if 语句后面的嵌套 for 循环的 Big-Θ。不幸的是,我的教授(出于某种奇怪的原因)只是希望我们从 pre-req 课程中知道这一点(即使我在不​​同的大学学习了不同的课程内容)并且不会花时间教我。

我不想让任何人帮我解决我的作业,我真的很想学习这些概念,所以我在下面创建了自己独特的功能。鉴于第二个循环只运行了几次,我只是无法理解这种类型的函数是 Θ(n) 还是 Θ(n^2)。任何一般性的解释或关于我如何解决这些类型的问题的正确方向的指示将不胜感激:)

注意:假设变量n是任意大小的正整数。

int count = 20;
for (int i = 0; i < n; i ++) {
    if (i == count) {
        for (int j = 0; j < count; j++) {
            // Some O(1) code
            // Maybe a print to console or something
        }
        count *= 2;
    }
}

【问题讨论】:

  • 计算出最里面的语句总共执行了多少次。第一次运行 20 次 i == count,第二次运行 40 次,第三次运行 80 次,等等。 20 + 40 + 80 + 160 + ... = 20*(2^k - 1) 其中 k 是n 中小于 log_2 的最大整数。所以最里面的 O(1) 语句被执行了 ~N 次。
  • 我的理解是,大 O 表示法是算法的平均时间或最坏情况时间。此外,嵌套循环是 O 时间的乘积。

标签: c++ time-complexity runtime


【解决方案1】:

您需要问的第一个问题是,您在数什么?通常你可以找到一些体面的东西来计算,而不仅仅是“说明”,以获得一个好的猜测。获得 big-O 值后,您可以仔细检查该值是否正确。

int count = 20;
for (int i = 0; i < n; i ++) {

好的,这显然会运行 O(n) 次。

    if (i == count) {

在第一次通过时,输入 O(n/20) 次。这可能会改变。

        for (int j = 0; j < count; j++) {

这会运行 O(count) 次。

            // Some O(1) code
            // Maybe a print to console or something
        }

        count *= 2;

现在这变得有趣了。每次计数加倍。

所以第一个内部循环在 20 个外部循环之后运行,然后执行 20 个 O(1) 工作。

计数加倍。第二个内循环在 40 个外循环之后运行,并且完成了 40 O(1) 的工作。

计数加倍。第三个内循环在 80 个外循环之后运行,并且完成了 80 O(1) 的工作。

计数加倍。第四个内循环在160个外循环之后运行,在内循环中做了160 O(1)的工作。

现在你必须把它变成数学。你可以猜测,然后检查。但假设你猜不出来?

好吧,画出来!

 n   |    inner steps
------+----------------
  20  |    20
  40  |    20+40 = 60
  80  |    20+40+80 = 140
 160  |    20+40+80+160 = 300
 320  |    20+40+80+160+320 = 620

把它扔到一个绘图程序上。图表是什么样的?如果它是弯曲的,取对数可能会给你一个斜率,你可以从中找到多项式的指数。

记得使用散点图。你不在乎在 60、100 或 240 时会发生什么。你关心峰值,它发生在 20 和每翻一番。散点图将您的图形点向下放置。

还要计算外部循环步骤以及与 count 的比较,以确保它们不是很大。

一旦你有了一个假设,就想办法证明你的答案是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多