2017-08-08 18 views
-4

配列内で奇数回発生する要素を選択したいと考えています。私はヒープからINT_MAXサイズの配列を宣言し、セグメンテーション違反でそれをやめましたが、今はそれがトールを与えています。同じアルゴリズムを使って何ができますか?このコードは時間制限を超えていますか?

/* C++ code to find out the element that occurs odd number of times, given there is only one such element in the array */ 

#include <bits/stdc++.h> 

using namespace std; 

int main(){ 
    int n, i; 
    cin >> n; 
    int arr[n]; 
    for (i = 0; i < n; i++) 
     cin >> arr[i]; 
    int* a = new int[INT_MAX]; // declared a dynamic array 
    fill_n(a, INT_MAX, 0); //initialised to 0 
    for (i = 0; i < n; i++) { 
     a[arr[i]]++; // for every particular value, that corresponding index value increases 
    } 

    for (i = 0; i < n; i++) { 
     if(a[arr[i]] % 2 == 1) { //if that corresponding index value is odd, that's the answer 
      cout << arr[i]; 
      break; 
     } 
    } 
     delete[] a; 
return 0;  
} 
+0

OSとコンパイラとは何ですか? –

+0

あなたは別のアプローチを見つける必要があります。ヒント:あなたが自分自身の数字をxorするとどうなりますか? – NathanOliver

+0

ここではより良い質問があります:なぜあなたは 'INT_MAX'要素を割り当てたいと思いますか? –

答えて

3

この:

int* a = new int[INT_MAX]; // declared a dynamic array 

は20億の整数、ストレージのすなわち、8ギガバイトを割り当てる予定です。次にあなたはランダムにアクセスします。あなたのシステムは、そのような多くのストレージを割り当てるのに苦労するかもしれませんし、できるだけ多くのメモリを実際に読み書きすることは不可能かもしれません。

あなたは同じアルゴリズムを使用して行うことができますどのような

を尋ねましたか?

何もありません。このアルゴリズムは不十分であり、実用的な方法で使用することはできません。別のアルゴリズムが必要になります。

+0

_ "時間制限が許されても、実際に多くのメモリに読み書きすることは不可能です。" _これはどういう意味ですか?コンピュータプログラムは定期的に8GB以上の読み書きをしないでください。時間制限を設定するのは誰ですか?コンパイル時か実行時ですか? –

+1

@AGNGazer:単純なクイズ形式のプログラムで「時間制限を超えた」と言うと、クイズプラットフォーム、おそらくオンラインコーディングテストなどで実行していることを示唆しています。これらのテストは、多くの場合、「小さな」マシン(おそらくVM)で実行されます。 8 GB以上のメモリを使用するプログラムがありますが、その多くのメモリに役立つものを実行するにはかなりの時間(おそらく1分以上)がかかります。現代のCPUの生のメモリ帯域幅は約20GB/sですが、これは理想的な条件を前提としています。 OPのコードは、キャッシュの利用率、TLBなどに関しては悲観的です。 –

+0

これを明確にしてくれてありがとう! –

関連する問題