这段代码的正确大O是什么

时间:2013-05-12 22:30:07

标签: c++ big-o

我正在尝试学习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个结果:

  1. 9n + 1 - &gt;为O(n)
  2. 7nm + 2m + 2n + 1 - &gt; O(nm)的
  3. 7n ^ 2 + 4n + 1 - &gt;为O(n ^ 2)
  4. 这些都是正确的吗?如果没有,你能帮我找到正确答案吗?

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

3 个答案:

答案 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)(如果您知道如何验证)