【问题标题】:What would be the time complexity of this code?这段代码的时间复杂度是多少?
【发布时间】:2020-03-07 01:39:06
【问题描述】:

这段代码的时间复杂度是多少?

i = n;
  while(i > 1) {
    j = i;
    while (j < n) {
      k = 0;
      while (k < n) {
        k = k + 2;
      }
      j = j * 2;
    }
    i = i / 2;
  }

我尝试分析这段代码,得到了Log^2n * n 的复杂性,我以 for 循环格式重写了代码,以便更容易看出是这样的。

for (i = n; i > 1; i = i / 2) // log2n + 1
  {
    for(j = i; j < n; j = j * 2) // log2n + 1
    {
      for (k = 0; k < n; k = k + 2)  // n + 1 times
      {
          cout << "I = " << i << " J = " << j << " and K = " << k << endl;
      }
      cout << endl;
    }
  }

正确吗?如果不是,为什么?我是算法的新手,试图理解但不知道还能问哪里,抱歉。

【问题讨论】:

  • 教师的工作不是决定你的作业是否正确吗?
  • 是的,但我想在课堂之外理解。如果我已经尽我所能并理解代码的复杂性,因为这不是一个简单的主题,那么在课堂外获得帮助有什么害处吗?
  • 如果我们告诉您您的解决方案不正确以及如何解决它,并且您使用它来获得比您在作业中获得的更好的成绩,这是一个问题。首先,你作弊是为了获得更好的成绩。其次,你没有从课堂上学到你应该学到的东西,你的老师也没有得到家庭作业应该提供的反馈。
  • 这是考试练习,我没有得到评分。在向某人寻求帮助之前,我在 Youtube 上观看了多个关于该主题的优秀讲师的课外视频,因为我不确定。我知道您可以(并且很可能)成为一名出色的程序员,但每个人都必须从某个地方开始。我敢肯定,您在生活中并非处处都了解编程。我向比我更了解该主题的人寻求帮助,我不能一直与我的导师联系。
  • @Ken 如果他努力理解答案,这不是作弊;至于反馈是教授的问题,而不是他的

标签: algorithm big-o


【解决方案1】:

是的,你的答案是正确的。变量i在每一步都减半,使得外循环O(log n)j 每一步都加倍,使循环O(log n),最里面的k循环线性增加,使循环 O(n)。相乘得到 O(n log² n)

【讨论】:

  • 再次感谢您!这是我最初的想法。我再次感谢您的帮助。很抱歉提出愚蠢的问题。
  • @ThatOne 不客气。这不是一个愚蠢的问题。像这样的问题将有助于将来对这个主题不熟悉的人。
猜你喜欢
  • 2023-02-26
  • 2022-11-14
  • 2022-01-13
  • 2015-03-31
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多