这个算法的时间复杂度是多少(uVa Online Judge 483 - Word Scramble)?

时间:2015-03-30 18:44:59

标签: c++ algorithm time-complexity

我正在努力提高对时间复杂度分析的理解。这是我解决的问题:

uva在线评委 483 - Word Scramble

编写一个程序,该程序将反转每个单词序列中的字母,同时保留单词本身的顺序。输入文件将由几行单行组成。单词是由白色空间分隔的连续的可打印字符。输出将包含与输入文件相同的行和单词。但是,每个单词中的字母必须颠倒。

示例输入

我爱你。 你爱我。 我们是一个幸福的家庭。

示例输出

我evol .uoy uoY evol .em 呃,一个yppah .ylimaf

这是我的代码:

#include <iostream>
#include <stack>
#include <string>
#include <cctype>
using namespace std;


int main(int argc, char *argv[]) {

 char  ch;
 stack<char> word;

  while (cin.get(ch)) {
    if (!isspace(ch)) {
      word.push(ch);
    } else {
      while (!word.empty()) {
        cout << word.top(); 
        word.pop();
      }
      cout << ch;
    }
  }

  return 0;
}

我认为它是Big O(n),其中n是字符总数。出于某种原因,当有嵌套循环时我会感到困惑。我的想法是查看输入大小,并计算正在对其执行的每个操作。所有操作的最坏情况是O(n)(堆栈的推送操作)。听起来不错吗?

由于

2 个答案:

答案 0 :(得分:1)

有两种情况 - 角色是空格,或者不是。如果角色是空格,则直接打印(因此一次操作)。否则,该字符将被添加到堆栈中,稍后将从该堆栈中弹出一次(当满足空格字符时)。因此,每个角色最多执行两次操作 - 推送和弹出。总的来说,您最多只执行2 * n次操作,这意味着O(n)

答案 1 :(得分:1)

是的,如果字符总数为n,则为O(n)。复杂性主要受forwhile等循环的影响,因为这是您的多次迭代所在。

您还可以用另一种方式解释时间复杂度。它可以被称为O(m * n),其中n是单词的数量,m是每个单词中的字符数。