代码的时间复杂度如下?

时间:2011-04-18 14:29:43

标签: c++ algorithm time-complexity

有人可以告诉我以下代码的时间复杂度吗?

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[100]= "Gosh I am confused :D";
int i,count= -1,display_ToVal= strlen(a)-1, display_FromVal;

for( i=strlen(a)-1 ; i>=0 ; i=i+count)
{
        if ( (a[i] == ' ' || i == 0) && count == -1)
        {
         cout << " ";
         display_FromVal = i;
         count = 1;
         if ( i == 0 )
                cout << a[i];
         continue;
        }       

        else if( count == 1 && i == display_ToVal)
        {
         cout << a[i];
         display_ToVal = display_FromVal - 1;
         i = display_FromVal;
         count = -1;
         if(display_FromVal == 0)
                 break;
         else
                 continue;
        }

        else if (count == 1)
         cout << a[i];

        else
         continue;
}

return 1;
} 

我真的很困惑这是否可归类为 O(n)。请帮助,提前谢谢。

2 个答案:

答案 0 :(得分:8)

该算法可以在伪代码中进行汇总:

  1. 标记当前位置
  2. 一次向后移动一个字符,直到找到空格或达到输入结束
  3. 现在将每个字符复制到输出,然后返回1.,除非达到eoi
  4. 因此,输入一次反向遍历,再向前移动一次,但在步骤2或3中没有回到先前读取的位置。当从步骤3切换到1.它直接调整迭代器。 count变量用于跟踪算法的状态(实际上它是一个简单的状态机)。它也被重用来定义迭代的方向。

    因此,该算法实际上是O(n)


    为了更加清晰,可以在不改变复杂性的情况下重写它:

    void printStringWithWordReversed(const char* a) {
        int i,j,display_ToVal= strlen(a)-1, display_FromVal;
        for( i=display_ToVal; i>=0 ; i=i+-1)
        {
            if ( (a[i] == ' ' || i == 0))
            {
             // When entering this branch, we are switching from state 2 to
             // state 3 (this is the content of the first branch).
             cout << " ";
             display_FromVal = i;
             if ( i == 0 )
                    cout << a[i];
             // This loop correspond to the state 3, and is equivalent to the
             // previous code in the particular case when count == 1.
             for (j = display_FromVal+1; j <= display_ToVal; j=j+1)
             {
                 cout << a[j];
             }
             // This postlude correspond to the transition from state 3 to state 1
             // and correspond to the second branch in the original algorithm.
             display_ToVal = display_FromVal - 1;
             if ( i == 0 )
                break;
             continue;
            }       
        }
    }
    

    因此我们从结尾开始查找每个单词并以正确的顺序输出它们。如果我们假设O(n)的{​​{1}}插入运算符为cout,那么这两个实现(在时间和空间上都是char显然是O(1),因为添加固定数< / {>这里两个)O(n)算法仍为O(n)(常量被忽略)。

答案 1 :(得分:-2)

“{for(i = strlen(a)-1; i&gt; = 0; i = i + count)}”

代码中只有一个for循环,其索引i线性变化。 这就是为什么它的O(n)