c – 混淆大O符号(具体示例)

前端之家收集整理的这篇文章主要介绍了c – 混淆大O符号(具体示例)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们今天在课堂上做了一个关于大O表示法的练习.这是一个问题:
void modifyArray(int a[],int size)
{   
    int max = a[0];
    for (int i = 1; i < size / 2; ++i)
    {
        if (max < a[i])
        max = a[i];
    }
    for (int j = 1; j <= size * size; ++j)
    {
        ++max;
        cout << max;
    }
}

我的直觉告诉我,f(n)= n / 2 n2 = O(n2),但根据我的教授,答案只是O(n).有没有人可以向我解释为什么,当我们只是改变我们认为是输入大小的时候?

我明白这不是一个嵌套循环 – 这不是令我困惑的.我不明白为什么给定的输入大小,第二个循环只被认为是O(n).我可以理解这一点的唯一方法是如果我们隔离第二个循环,然后将输入大小重新定义为简单的n = size ^ 2.我在正确的轨道上吗?

解决方法

如果你所提供的代码正是您教授评论代码,那么他错了.如所写的,它输出每个数字从1到大小*大小,这绝对是O(n ^ 2),因为n =大小是理想的选择.

是的,你是对的,认为你可以说“O(n)”,其中n是数组大小的平方“,但这是没有目的的复杂性.

如其他人所说,如果cout < max被删除,编译器可以将循环优化为单个O(1)赋值,这意味着函数的其他O(n)操作决定了整体的大O效率,但可能不会 - 谁表示你甚至能够进行优化?因此,描述大O效率的最佳方法是说“如果优化踢在O(n)else O(n ^ 2)” - 这是无用的一个或另一个然后隐藏你的假设,而后果如果错了,在脚注中.

猜你在找的C&C++相关文章