繁体   English   中英

带有 if 语句的嵌套循环的时间复杂度

[英]Time complexity of nested loops with if statement

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

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

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

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;
    }
}

你需要问的第一个问题是,你在数什么? 通常你可以找到一些体面的东西来计算,而不仅仅是“说明”,以获得一个好的猜测。 一旦你有了你的大 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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM