以下循环的最佳案例/最差案例分析是什么?

时间:2014-07-30 15:19:18

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

没有从外循环和第二循环跳过任何步骤,这将给我们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++;
}

2 个答案:

答案 0 :(得分:-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)/12O(n^3)或更精确Theta(n^3)

另外两个案例没有太大区别,它们只会改变常数。

总而言之,在悲观和乐观的情况下,此代码必须执行与n^3成比例的多次迭代。

答案 1 :(得分:-3)

两个提示

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

分析:

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

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

您可能认为不完全正确 - 第一个最内层循环是O(n / 2),但是是Big-O计算,常量被消除,因此O(n / 2)与O(n)相同)。

(更新 - 我忘记了最外面的循环)