【问题标题】:what is the best-case / worst-case analysis for the following loop? [closed]以下循环的最佳/最坏情况分析是什么? [关闭]
【发布时间】:2014-07-30 15:19:17
【问题描述】:

外部循环和第二个循环没有跳过任何步骤,这会给我们 n(n+1)/2 次迭代,但我不知道如何计算最里面的循环。

int n = int.Parse(Console.ReadLine());
int i =1,j,k;
while(i<=n)
{
    for(j=1;j<=i;j++)
    {
        if(j%3==0)
        {
            for(k=1;k<=(n/2);k++)
            {
                Console.Write("*");
            }
        }
        else if(j%3==1)
        {
            k=j;
            while(k>=1)
            {
                Console.Write("@");
                k--;
            }
        }
        else
        {
            for(k=1;k<=(j%3);k++)
            {
                Console.Write("$");
            }
        }
    }
    i++;
}

【问题讨论】:

标签: c# algorithm big-o complexity-theory analysis


【解决方案1】:

第一个循环将有精确的n 迭代。

第二个循环将有精确的n(n+1)/2 迭代。

在第二个循环内部,大约有 1/3n/2 长循环、1/3j 长循环和 1/32 长循环。

如果我们只查看三种可能情况中的第一种,那么我们会得到(n(n+1)/2) * 1/3 * n/2,即n*n*(n+1)/12,即O(n^3),或者更准确地说是Theta(n^3)

另外两种情况没有太大区别,它们只是改变常量。

总之,无论是悲观还是乐观,这段代码都必须执行与n^3成比例的迭代次数。

【讨论】:

  • 我不知道为什么每个人都认为我在暑假问我的作业!并避免回答我。非常感谢您的回答,这真的很有帮助,谢谢
  • 投反对票的人能解释一下这个答案有什么问题吗?
【解决方案2】:

两个提示

  • 不输出单个字符,而是将它们收集到字符串构建器中并在最后打印一次。
  • 可以使用new string(char, int) ctor 创建重复的字符字符串。

分析:

  • outer-outer loop:基于n的线性循环:O(n)
  • 外循环:基于 n 的线性循环:O(n)
  • 内循环:其中之一

    • 基于 n/2 的线性循环:O(n)
    • 基于 j 的线性循环,基于 i,基于 n:O(n)
    • 基于 j 的线性循环,基于 i,基于 n:O(n)
  • O(n) * O(n) * O(n) = O(N^3)。

你可能会认为这并不完全正确——第一个最里面的循环是 O(n/2),但是是 Big-O 计算,常数被消除,所以 O(n/2) 与 O(n )。

(已更新——我忘记了最外层的循环)

【讨论】:

  • 这如何回答这个问题?
  • new string(char, int) 仍然是 O(n),而不是 O(1)
猜你喜欢
  • 2014-06-12
  • 2014-06-05
  • 2017-05-08
  • 2019-07-06
  • 1970-01-01
  • 2022-09-23
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多