2016-10-06 15 views
-2

私は競争の激しいコーディング(C++)に慣れていませんし、実装に基づいてhackerEarthの問題を練習していました。私は3 diffの配列の集計を見つけるために問題を提出しました。部品。 はここに私のコードですそれが実行に1.010039sを取っ:なぜ、このコードは私のものよりも速いのですか?

int main() 
{ 
    long unsigned int n, a[100000], s1 = 0, s2 = 0, s3 = 0; 
    cin >> n; 

    for (int i = 1; i <= n; i++) { 

     cin >> a[i]; 

     if (i % 3 == 0) 
      s3 = s3 + a[i]; 

     else if ((i - 2) % 3 == 0) 
      s2 = s2 + a[i]; 

     else 
      s1 = s1 + a[i]; 
    } 

    cout << s1 << " " << s2 << " " << s3; 

    return 0; 
} 

はここで最小タイムコードです:

int main() 
{ 
    int n; 
    long unsigned int a[100000]; 
    long unsigned int s1 = 0, s2 = 0, s3 = 0; 
    int i; 
    cin >> n; 
    for (i = 0; i < n; i++) { 
     cin >> a[i]; 
    } 
    for (i = 0; i < n; i = i + 3) { 
     s1 = s1 + a[i]; 
    } 
    for (i = 1; i < n; i = i + 3) { 
     s2 = s2 + a[i]; 
    } 
    for (i = 2; i < n; i = i + 3) { 
     s3 = s3 + a[i]; 
    } 
    cout << s1 << " " << s2 << " " << s3 << endl; 
    return 0; 
} 

我々はそれを見ることができ、それはまだそこに第2のケースでのループのためにはるかにあり、なぜ高速ですか?

+0

オンラインのコードジャッジエンジンに関する質問はここでは控えてください。テストケースからどこに失敗したのかは誰にも分かりませんが、これは通常は公開されていないためです。テストしたものがあなたのローカル環境で実行されていたとしても、オンラインチャレンジに適用されるいくつかのエッジケースをテストすることができなかったかもしれません。創造的で見つけよう。さらに、オンラインコンテストを不正行為すること以外にも、長期的にそのような質問の価値はないと考えられ、何も学ばれていません。 –

+0

キャッシュのローカリティが原因です。 – SLaks

+3

これは、すべての 'if'が分岐予測子を混同している可能性もあります。 http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-arrayを見てください。 – mindriot

答えて

0

重複しない限り、書き込むループの数は関係ありません。
第2のアルゴリズムをより速くする実際の要因は、各時間インデックスiが最初のアルゴリズム(ステップバイステップ)と違って3回動いていることです。巨大なデータ入力に少し変更を加えることも考えられますミリ秒ごとに競争力のあるプログラミングで知っているように。
私はそれが私のためにしたようにあなたの競争の情熱を助けるComplexityを勉強することをお勧めします。

関連する問題