这段代码正确的大0是什么?

What is the correct Big O of this code

本文关键字:是什么 段代码 代码      更新时间:2023-10-16

我正在学习大0符号,我对这段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个结果:

  1. 9n + 1 -> 0 (n)
  2. 7nm + 2m + 2n + 1 -> 0 (nm)
  3. 7n^2 + 4n + 1 -> 0 (n^2)

有正确的吗?如果不是,你能帮我找到正确的答案吗?

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;
}

Big-Oh符号在这里确实不太适用。您所拥有的只是一个下界,绝对不能保证验证(),因此唯一的Big-Oh指定将是O(inf),但这非常没有帮助。

您的代码(如果所有验证都正确)将是:

Ω(s1Size)

因为它将被执行s1Size次,而不是更少。大哦符号不适用于下界。因为我们不能保证goto语句将被使用多少次,因此没有上界,因此没有适用的Big-Oh推导。

您的运行时,简单来说:大于或等于s1Size迭代(除非出现导致循环退出的错误)。

因此,最好的情况是上述情况,而最坏的情况是永远!

EDIT: Ω在这里是正确的,而不是Ω,因为Ω意味着运行时大于或等于s1Size

如果它可以接受用户输入,那么它可以是0 (n)到无穷大(以及更大)之间的任何值

最糟糕的情况:永远不会结束(没有人告诉你如何验证一个东西)

最佳条件:0 (n)(如果你知道如何验证)