2012-04-15 4 views
1

google codeJam資格取得の問題の1つは、2つの指定された整数の間に「リサイクルされたペア」がいくつあるかを調べることでした。ネストされたループよりも速いアルゴリズムですか?

これは私の解決策でしたが、大きなデータ入力セットでは十分に速くはありませんでした。 @ a = 10、@ b = 200000のようなものがあれば、それは遅くなり始める。

私の解決策はO(2^n)(私は大きなO分析をしっかりと把握していません)が恐ろしいと思います。私は高速なアルゴリズムでこのような2つのループを反復する標準的な方法があるのだろうかと思いましたか?

def getPairs 
    (@[email protected]).each do |n| 
     ([email protected]).each do |m| 
     if (containsSame(n,m)) && (isMatch(@a, n, m, @b)) 
      @recycledPairs += 1 
     end 
     end 
    end 
    end 

編集: Google CodeJam siteから:

あなたはn個の背面からいくつかの数字を移動してメートルを得ることができるかどうかは、明確な正の整数(n、m)とのペアが再利用されるとしましょう順序を変更することなく前面に表示されます。たとえば、(12345、34512)はリサイクルされたペアです.3445を3445を12345の最後から前面に移動することで取得できます。リサイクルされたペアになるには、nとmの桁数が同じでなければならないことに注意してください。 nもmも先行ゼロを持つことはできません。

+4

「リサイクルされたペア」とは何ですか? – Ryan

+3

ループとネストされたループは、アルゴリズムではなく実装成果物です。 – JRL

+1

google codeJamサイトから:nの後ろからいくつかの桁を順序を変えずに正面に移動してmを得ることができる場合は、別々の正の整数(n、m)のペアをリサイクルするとしましょう。たとえば、(12345、34512)はリサイクルされたペアです.3445を3445を12345の最後から前面に移動することで取得できます。リサイクルされたペアになるには、nとmの桁数が同じでなければならないことに注意してください。 nもmも先行ゼロを持つことはできません。 – AFraser

答えて

3

正しい解決方法はthe official analysis of this problemです。

基本的には、nより大きいすべての個別の回転を計算することですが、ではBより大きくはありません。

+0

素晴らしい感謝! – AFraser

1

「リサイクルされるためには、nとmの桁数が同じでなければなりません」と記載されています。

あなたの内部ループはそれを考慮しません。 @a = 2と@b = 20,000の場合、内部ループの全体を切り取ることができます。 nが2桁の場合は、mの2桁の数値をテストするだけです。内側のループの上限を注意深く見てください。

+0

実際の問題声明では、AとBも同じ桁数でなければならないとも言われています。 – svick

1

文から:max bは2 * 10^6以下です。すべてのコードジャムの問題と同様に、マルチテストがあります。

ステップ1:Precalc。各試験のために:[1..maxb各数に対してN =、全てを保存し、それから、次に厳密に小さい数値(これ以上の各7より)例えば

10 - 1 
321 - 132, 213 

ステップ2を循環しました。

時間の複雑さ:ステップ1は、各番号(O(ln n))の(桁数)で動作します。これは、AからBまでの各番号を調べ、AとBの間の " 。あなたはそれをb回する必要があります。すべてですべてO(b * ln b)。ステップ2も同じです。これは大きなテストケースでは1秒もかかりません。

関連する問題