我正在努力提高对时间复杂度分析的理解。这是我解决的问题:
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)(堆栈的推送操作)。听起来不错吗?
由于
答案 0 :(得分:1)
有两种情况 - 角色是空格,或者不是。如果角色是空格,则直接打印(因此一次操作)。否则,该字符将被添加到堆栈中,稍后将从该堆栈中弹出一次(当满足空格字符时)。因此,每个角色最多执行两次操作 - 推送和弹出。总的来说,您最多只执行2 * n
次操作,这意味着O(n)
。
答案 1 :(得分:1)
是的,如果字符总数为n
,则为O(n)。复杂性主要受for
和while
等循环的影响,因为这是您的多次迭代所在。
您还可以用另一种方式解释时间复杂度。它可以被称为O(m * n),其中n
是单词的数量,m
是每个单词中的字符数。