2016-08-15 4 views
6

整数をとり、元の数に等しい小さな整数を乗算するすべての方法を出力します。言い換えれば、出力に4 * 3が含まれている場合、繰り返しセットとなる3 * 4を再度印刷しないでください。これは素因数分解のみを求めているわけではないことに注意してください。また、入力整数は妥当であると仮定できます。正しさは効率よりも重要です。 PrintFactors(12)12 * 1 6 * 2 4 * 3,3 * 2 * 2このアルゴリズムの時間の複雑さは何ですか

public void printFactors(int number) { 
    printFactors("", number, number); 
} 

public void printFactors(String expression, int dividend, int previous) { 
    if(expression == "") 
     System.out.println(previous + " * 1"); 

    for (int factor = dividend - 1; factor >= 2; --factor) { 
     if (dividend % factor == 0 && factor <= previous) { 
      int next = dividend/factor; 
      if (next <= factor) 
       if (next <= previous) 
        System.out.println(expression + factor + " * " + next); 

      printFactors(expression + factor + " * ", next, factor); 
     } 
    } 
} 

私は、それが

所定数はN及びN = Dの素因数の数である場合

だと思います時間複雑度はO(N^d)である。これは、再帰の深さが素因数の数に達するためです。しかし、縛られていない。助言がありますか?

+0

私はコードが動作しないと思う。例えば、 'nextnext'は定義されていません。 –

+0

@PaulHankin。申し訳ありません、それはタイプミスでした。これを修正した – user12331

+0

http://stackoverflow.com/questions/38949619/confusion-related-to-the-time-complexity-for-this-algorithm –

答えて

3

2つのアイデア:

アルゴリズムは出力に影響されます。因数分解を出力するので、全体的に、我々はO(N * number_of_factorizations)が、ループのほとんどO(N)回の反復で、最大使用

また、マスターの定理を経由して、式は次のとおりです。F(N) = d * F(N/2) + O(N)ので、全体的に我々はO(N^log_2(d))

+0

なぜd * F(N/2)なのですか?最悪の場合因子は元の数を半分に分けることができ、d個の素因数が存在する。また、マスター定理によると、dは2より大きくはない。また、O(N)はどこから来るのだろうか?最悪の場合、それはNの倍数になる可能性がありますか? – user12331

+0

@ user12331 d * F(N/2)の理由は正しいですか。 [ケース1](https://en.wikipedia.org/wiki/Master_theorem#Case_1)の例では、「a」は8である可能性があるため、2を超えることはできません.O(N)はforループはN回前後に反復されるからです。 – maniek

+0

BTWでは、分解の数がO(N)(証明?)よりも速く成長しないので、最初の境界はより厳密です。したがって全体的にO(N^2)よりも悪くありません。また、最悪の場合、実際にはO(N log N)だと感じますが、今はそれを証明できません。 – maniek

1
を持っています

時間複雑さがなければならない:

number of iterations * number of sub calls^depth

ありthe number of divisors of N is O(log N)

Tので、O(Nログ)の代わりにO(N)のサブコール、再帰呼び出しの深さはO(log N)であり、すべての再帰呼び出しの反復回数はN /(2 ^深さ)よりも小さいため、全体の時間複雑度はO(N((log N)/ 2) N))

0
The time complexity is calculated as : Total number of iterations multiplied 
by no of sub iterations^depth.So over all complexity id Y(n)=O(no of 
dividends)*O(number of factorization)+O(no of (factors-2) in loop); 

Example PrintFactors(12) 12 * 1 ,6 * 2, 4 * 3, 3 * 2 * 2 
O(no of dividends)=12 
O(number of factorization)=3 
O(no of factors-2){ in case of 3 * 2 * 2)=1 extra 

Over all: O(N^logbase2(dividends)) 
関連する問題