我正在尝试学习Big O符号,我对这个C ++代码感到困惑:
void enterElements(int *s1, int s1Size)
{
for(int x = 0;x < s1Size;++x)
{
retry:
cout<<"Element "<<x + 1<<": ";
cin>>s1[x];
int valid = validation();
if(valid == 1)
{
cout<<"The input must be numbers."<<endl;
goto retry;
}
}
}
因为我不知道该怎么做才能得到3个结果:
这些都是正确的吗?如果没有,你能帮我找到正确答案吗?
int validation()
{
int validation = 0;
if(cin.fail())
{
validation = 1;
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
else
validation = 0;
return validation;
}
答案 0 :(得分:4)
Big-Oh表示法在这里确实不太适用。你所拥有的只是一个下限,验证()绝对没有保证,因此唯一的Big-Oh指定是O(inf),但这是无益的。
您的代码(如果所有验证都正确),将是:
Ω(s1Size)
因为它将被执行s1Size
次,而不是更少。 Big-Oh符号不适用于下限。因为我们无法保证goto
语句的使用次数,因此没有上限,所以没有适用的Big-Oh推导。
您的运行时,简单来说:大于或等于s1Size迭代(除非导致循环退出的错误)。
因此,最好的情况是上述情况,最糟糕的情况是,永远是好的!
编辑:Ω在这里是正确的,而不是ω,因为Ω意味着运行时间大于或等于s1Size
答案 1 :(得分:0)
鉴于它可以接受用户输入,它可以是从O(n)到无穷大(以及超出:-))
答案 2 :(得分:0)
最糟糕的情况:永远不会结束(没有人告诉你如何验证一件事)
最佳条件:O(n)(如果您知道如何验证)