微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)” - 这是无用的一个或另一个然后隐藏你的假设,而后果如果错了,在脚注中.

原文地址:https://www.jb51.cc/c/115864.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐