我的计算机科学教授今天开始教我们关于大O符号,我很难理解它。以下是他给我们的例子:
以下的大O是什么:
一个。 4n2 + 2是: O(n ^ 2)?
湾n2 + 14n + 6是: O(n ^ 2)?
℃。 5n3 + 10n2 - n - 8是: O(n ^ 3)?
d。 3n2 + 2n是: O(n ^ 2)?
我知道它与程序根据输入运行需要多长时间以及根据输入变化会增加多少有关。我查找了一种方法来确定上述问题中的大O并将我认为它们放在一起。但是当确定Java代码的大O时,我迷失了。有人能指出我正确的方向来解决这些问题。
3. int count = 0;
for (int i = 1; i <= n; i++) {
i = n;
count += 1;
}
// end for
4. int total = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
for (int k = 1; three < j; j++) {
total += 1;
} //end for } // end for } // end for
5. int total = 0;
for (int one = 1; one <= n; one++) {
for (int two = 1; two < n; two++) {
for (int three = 1; three < 10; three++) {
total += 1;
} //end for } // end for } // end for
6. int total = 0;
for (int pass = 1; pass <= n; pass*=2) {
total += 1;
}
// end for
7. p = n;
while (n>1) {
n = n/2;
while (p>0) {
p = p - 1;
}
// end while } // end while
8. for (int i = 1; i <= n; i+=2) {
j=1;
while(j < n) {
j = j + 2;
x = x + 2;
} // end while } // end for
答案 0 :(得分:0)
简单地说,您需要根据 n 计算代码执行的操作次数,并且只保留 n 的功能,其中顺序 大规模,抛弃常数。所以在你的情况下,具有最高度的多项式。
E.g。这段代码:
for (int i = 0; i < n; ++i){
System.out.println(i*2);
}
每次迭代都有 n 次迭代和 a 操作,加上初始化i = 0
,所以 n * a + b 操作总计,其中 b = 1 (警告:不是真的,见下文)。
现在,如果您对运行时感兴趣,您可以按时间对个别操作进行多次操作,但确切的数字是未知的,并且可能会受到许多因素的影响,例如现金存储器,所以我们只是说这是另一个常数。
但是, a 和 b 实际上很难确定。假设++i
是一个操作,i*2
是另一个操作,println
是第三个操作,因此每次迭代需要3个操作。但这是对的吗? println
有多少次操作?如果我们用一个符号写的一些操作会导致几个实际操作怎么办?
幸运的是,这些常数对于大O符号并不重要:
现在判断 f(n)的顺序是否高于g(n)?说起来容易,这意味着 f(n)总是更大而 g(n) 从某些 n < / em> ,即使您在快速计算机上运行 f(n)而在慢速计算机上运行g(n)。
假设第一个算法具有 n ^ 2 操作和第二个 10 * n 操作。从 n&gt;开始10 第一算法较慢(假设每个操作花费相同的时间,例如= 1)。因此,您使用计算机的速度要快100倍才能运行n ^ 2算法。现在它运行得更快:在n ^ 2/100时间!但是,从n>开始; 1000它变得慢于 n - 算法。无论您的计算机有多快,对于足够大的 n ,n ^ 2算法总是会慢一些。这是算法本身的一个属性,无论它运行的是哪台实际机器,这都是重要的原因。