2

2 つの数値 x と y の最大公約数を決定する次のアルゴリズムがあります。このアルゴリズムを説明する大きな o 表記を見つけて、その理由を説明する必要がありますが、これを行う方法がわかりません。

誰かが私のコードを見て、それがどのタイプの大きなああ表記になるか説明してもらえますか?

     public void question1(int x, int y){
            ArrayList divisorx = new ArrayList(); //the list of divisors of number x
            ArrayList divisory = new ArrayList();//divisors of number y
            ArrayList answerSet = new ArrayList();//the common divisors from both   
            //divisorx and divisory

            for(int i=1; i<=x; i++){//this loop finds the divisors of number x and 
                                    //adds them to divisorx
                    double remainder = x%i;
                    if(remainder==0){
                        //i is a divisor
                        divisorx.add(i);
                    }
            }
            for(int i2=1; i2<=y; i2++){//this loop finds the divisors of number y 
                                       //and adds them to divisory
                    double remainder2 = y%i2;
                    if(remainder2==0){
                        //i2 is a divisor
                        divisory.add(i2);
                    }
            }
      int xsize = divisorx.size();
      int ysize = divisory.size();

            for(int i=0; i<xsize; i++){//this massive loop compares each element of 
        //divisorx to those of divisory to find common divisors. It adds those common
        //divisors to the arraylist answerSet
               for(int j=0; j<ysize; j++){
                   if(divisorx.get(i)==divisory.get(j)){
                       //common divisor has been found
                       //add it to an answer array

                       answerSet.add(divisorx.get(i));

                   }
                }
            }
    Collections.sort(answerSet);//sorts the answerSet from smallest to greatest

    Object gcd = answerSet.get(answerSet.size()-1);//get the last element of the
                                                   //arraylist, which is the gcd       
    System.out.print("Your Answer: "+gcd);//print out the greatest common divisor
 }
4

3 に答える 3

2

最初の 2 つのループのコストは、それぞれO(X)O(Y)です。

N の約数は O(sqrt(N)) (コメントを参照) であるため、xsize と ysize は O(sqrt(X)) と O(sqrt(Y)) です。

したがって、最後のループのコストはO(sqrt(X).sqrt(Y))です。

answerSetdivisorxとの交点であるため、サイズは O(min(sqrt(X),sqrt(Y)))divisoryです。

O(min(sqrt(X),sqrt(Y)) log(min(sqrt(X),sqrt(Y)))であるanswerSetでソートを実行します

それらはすべて O(X+Y) であるため、合計の複雑さはO(X+Y)です。

于 2013-01-10T21:28:57.187 に答える
1

最大の複雑さは、ネストされた 2 つの for ループです。Big O順序であり、入力サイズに対する複雑さを意味します。ここで、入力サイズは、線形時間 (for ループごとに 1 つ) で見つけた除数の数n + nですO(n)。あなたの例の並べ替えは、通常、平均的な複雑さですn*log(n)。ネストされた for ループは正方形の意味O(n^2)です。O(n^2)これは計算の最大の複雑さであるため、注文はです。すべての複雑さを加算して得られる多項式式で最大の次数を取るので、O(n^2 + n*log(n) + 2n)これは 2 次多項式であり、したがって ~O(n^2)です。

順序は、空間と時間の複雑さが大きいことに注意してください。したがって、メモリ使用の複雑さが計算の複雑さよりも大きい場合は、それが引き継がれます。

于 2013-01-10T21:31:05.133 に答える
0

最初のループは正確にX回数実行されます。
2 番目のループY時間。
3 番目のループは、確かに 回より少ないです(X/2 + 1) * (Y/2 + 1)(数値Nは最大でもN/2 + 1約数しか持てないため)。したがって、最悪のケースはO(XY/4) = O(XY).
list のサイズについても同じで、answerSet多くてもXY/4要素を持つことができます。最後に、O(nlogn)(javadoc に従って) で並べ替えが行われます。つまり、あなたの場合はO(XYlog(XY)).
したがって、最終的な複雑さはO(X + Y + XY + XYlog(XY)) = O(XYlog(XY))です。
ジェネリックのみで複雑さを表現したい場合NO((N^2)logN)、 、 where N = max(X, Y).

于 2013-01-10T21:33:39.347 に答える