- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们今天在类里面做了一个关于大 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).谁能向我解释为什么以及何时我们只更改我们认为是输入大小的内容?
我知道这不是嵌套循环——这不是让我感到困惑的地方。我不明白为什么对于给定的输入 size
,第二个循环只被认为是 O(n)。我能理解这一点的唯一方法是,如果我们隔离第二个循环,然后将输入大小重新定义为简单的 n = size^2。我在正确的轨道上吗?
最佳答案
如果您提供的代码正是您的教授正在评论的代码,那么他错了。如所写,它输出从 1 到 size * size
的每个数字。 ,这绝对是 O(n^2),因为 n = size 是明智的选择。
是的,您认为您可以说“O(n),其中 n 是数组大小的平方”之类的话是正确的,但这是没有目的的复杂化。
正如其他人所说,如果 cout << max
被删除后,编译器可能将循环优化为单个 O(1) 赋值,这意味着该函数的其他 O(n) 操作决定了整体大 O 效率,但它可能不会 - 谁说您甚至启用了优化?因此,描述大 O 效率的最佳方式是说“如果优化开始,则 O(n) 否则 O(n^2)”——断言一个或另一个然后隐藏你的假设是没有用的,并且如果他们错了,后果在脚注中。
关于c++ - 对big-O表示法感到困惑(具体示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19805103/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!