【问题标题】:Determining the time complexity of this code?确定这段代码的时间复杂度?
【发布时间】:2021-10-23 00:24:45
【问题描述】:

我认为这段代码的时间复杂度是 O(n^2),但我不确定,所以如果有人能解释这段代码的时间复杂度是多少,那真的很有帮助

int func2()
{
    int i, j, k = 0;
    scanf("%d", &n);
    for (i = 1; i < n; i++)
    {
        i -= 1;
        i *= 2;
        k = k + i;
        for (j = 1; j < n; j++);
    }
}

【问题讨论】:

  • n>1 的任何值都不会终止代码。
  • 代码有很多问题,很难回答你的问题。通常,渐近复杂度也与语言无关,因此使用伪代码中的算法描述将是比有缺陷的 C 代码更好的方法。作为这里的新用户,也请带上tour并阅读How to Ask
  • 呃,我昨天在测验中得到了这个问题,由于代码,我非常困惑,我之前说过,但看起来所有的 cmets 都因为某种原因消失了,我有一个非常糟糕的老师这样你就可以理解为什么这是一个超级有缺陷的 c 代码了。
  • 如果您对代码感到困惑,您可以提出类似“在昨天的测验中,我被问到此代码的复杂性,但我无法理解(您可以'不明白)。这段代码在哪些方面是错误的,我的理解在哪些方面是错误的”。您问了一个与您的实际问题不同的问题,因此没有得到最有用的回答。 (请注意,此类问题及其产生的答案可用于向您的老师提供有关他的测验问题的出色反馈)。
  • 好的,我以后会记住这一点

标签: c algorithm time-complexity big-o


【解决方案1】:

首先,这里没有声明'n',并且正在为其分配输入值。

其次,从技术上讲,这段代码是一个无限循环(以极其困难的方式完成),对于非终止、永远运行的算法,根据算法分析的原则,时间复杂度是“未定义的”,时间复杂度只是为执行确定终止任务的算法计算。

如果这将是一个终止循环,则此函数的时间复杂度为 O(n^2),由于将 for(;;) 嵌套在另一个 for(;;) 中而本质上是二次的O(1) 的封闭语句 - 线性时间复杂度。高阶复杂度 ( O(n^2) ) 被取代。

【讨论】:

  • 如果代码终止(例如,如果 for 循环从 i=2 而不是 i=1 开始),运行时间将为 Theta(n log n),因为 i 每次迭代大约加倍。嵌套 for 循环并不意味着 O(n^2),除非在简单的情况下,使用这个“规则”是一个常见的错误。
  • 是的!这是一个正确的理解。时间复杂度规则不适用于同上。您必须解释代码实际在做什么。就像这里的例子一样,它通过扭曲代码来实现一个无限循环,否则,这可以通过一个简单的 while(1) 来完成。
【解决方案2】:

我是时间复杂度的初学者,但以下是我的观点:- 外部 for 循环处于无限循环的状态,与外部循环的第一次迭代一样,执行从i=1 开始。 在执行i -= 1 时,它将设置i=0。 执行i*=2i的值保持为0。 在递增阶段,i 递增,i=1。 所以会发生同样的过程。 因此i 的值保持不变,导致它无限期地运行。 现在,在外部 for 循环中出现的是一个嵌套的 for(在变量 j 中)循环,后面跟着一个分号。这导致它的时间复杂度为 O(1)。 所以最终的总时间复杂度可以预计为 O(infinity)。

【讨论】:

【解决方案3】:

对我来说它看起来像一个无限循环,所以时间复杂度是 O(infinity)。

在外循环的第一次迭代中,i -= 1 会将i 设置为0。乘以 2 仍为 0。

循环迭代i++ 然后将i 递增到1,并且下一次迭代将重复上述计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2020-07-24
    • 2021-06-23
    • 2018-03-19
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多