确定Java代码的Big-O
我的计算机科学教授今天开始教我们大O符号,我很难理解它。以下是他给我们的例子:确定Java代码的Big-O,java,big-o,Java,Big O,我的计算机科学教授今天开始教我们大O符号,我很难理解它。以下是他给我们的例子: 以下几项中最大的一项是什么: a。4n2+2是:O(n^2)? b。n2+14n+6是:O(n^2)? c。5n3+10n2–n–8是:O(n^3)? d。3n2+2n是:O(n^2)? 我知道这与程序根据输入运行所需的时间以及根据输入的变化而增加的量有关。我找到了一种确定上述问题的大O的方法,并把我认为它们是什么。但是当涉及到确定Java代码的大O时,我就不知所措了。有人能为我指出解决这些问题的正确方向吗 3. i
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
3。整数计数=0;
对于(int i=1;i,简单地说,你需要计算你的代码根据n执行了多少次操作,并且只保留n的函数的最高阶数,丢掉常数。因此,在你的例子中,多项式的阶数最高
例如,该代码:
for (int i = 0; i < n; ++i){
System.out.println(i*2);
}
for(int i=0;i
有n次迭代,每次迭代有一个操作,加上初始化i=0
,因此总共有n*a+b个操作,其中b=1(警告:不是真的,见下文)
现在,如果您对运行时感兴趣,您可以将其乘以单个操作的时间,但确切的数字未知,并且可能受到许多因素的影响,例如现金内存,所以我们只说它是另一个常量
然而,a和b实际上很难确定。比如说,++i
是一个操作,i*2
是另一个操作,println
是第三个操作,所以每个迭代3个操作。但是它正确吗?有多少个操作是这样的?如果我们用一个符号编写的一些操作导致了几个实际的操作呢什么
幸运的是,这些常数对于大O表示法并不重要:
- 形式a*f(n)的所有函数都属于同一类
- 函数s(n)=a*f(n)+b*g(n)属于f(n)和g(n)中的最高类
那么,是什么决定了f(n)的阶数是否高于g(n)?简单地说,这意味着f(n)总是比g(n)大,从一些n开始,即使你在快速计算机上运行f(n),在慢速计算机上运行g(n)
假设第一个算法有n^2个运算和第二个10*n个运算。从n>10开始,第一个算法较慢(假设每个运算需要相同的时间,例如=1)。因此,您需要一台计算机以100倍的速度运行n^2算法。现在它运行得更快:在n^2/100的时间内!但是,从n>1000开始,它会比n算法慢。无论您的计算机有多快,n^2算法在足够大的n时都会慢。这是算法本身的一个属性,而不管实际的速度如何它运行在一台机器上,这就是为什么它很重要