2016-10-28 6 views
1

私は整数のベクトルを持っています。私はベクトル内の同じ整数を数えたいと思います。単純なアルゴリズムだけでは必要ですが、あまりにも多くのヘッダーや関数を組み込んだり単純なアルゴリズムでは使用しません。 おかげでそんなに 例は:ベクトル内の同じ整数の数を見つける

std::v={1,1,1,2,2,3} 1:3----2:2----3:1 
+0

非常に簡単で効率的なマップを使用してください。 –

+0

@HiteshVaghaniは、メモリが限られている場合は使用できません。インプレースの並べ替えは、より簡単で効率的です –

答えて

2

Sortそれらをし、その後は数字は次のすべての変更を数えます。

オプション:出力配列にカウントを保存します。後にソート

試してみてください。

int count = 1; 
for(int i = 1; i < v.size(); i++) 
{ 
    if(v[i-1] == v[i]) 
    { 
     count++; 
    } 
    else 
    { 
     std::cout << v[i-1] << count << std::endl; 
     count = 0; 
    } 
} 
std::cout << v[v.size()-1] << count << std::endl; 
0

別の解決策は、intにint型から追加の辞書を作成することです。そして、ベクトルから辞書に(キーとして)数字を挿入します。 numberが存在する場合、対応する指定されたキーの値を増やす必要があります。

注。この辞書(マップ)は、あなたからの整数の出現数をベクトルで保持します。

メソッドの欠点(あなたの視点から) - マップヘッダーを含める必要があります。

このアルゴリズムの全体的な複雑さはO(N log N)です。たぶんそのようなアルゴリズムは、ソートの使用より速くなります。 1回の追加トラバースは使用しません。そして、あなたは数字の出現に関する情報を持った構造を持っています

1

最も一般的な解決策はO(n log n)時間で実行され、配列をソートし、 @ yd1で説明されているように、最長の実行です。

もう1つの方法は、ハッシュテーブルを使用して頻度テーブルを生成することです。これはO(n)時間(O(1)ハッシュテーブル挿入とルックアップを想定)で実行されますが、ハッシュテーブルの設定とハッシュテーブルの再割り当て(および衝突など)のオーバーヘッドのために、

ハッシュテーブルを使用する場合は、#include <unordered_map>を使用する必要はありません。自分自身を実装することは学部練習です:)しかし、必要最小限の機能性を確保するためには、多くの手間をかけなければなりません。しかし

、あなたは、あなたがマップとして配列を使用することができ、ベクトルの値の範囲は、いくつかの適切な境界(例えば0 <= i < 256)の範囲内であることを保証することができた場合:

vector<int> values = ... 

int table[256] = {0}; 
for(auto i = values.begin(); i != values.end(); ++i) { 

    assert(0 <= i && i < 256); 

    table[*i]++; 
} 

次に取得するtableを反復値は同じです:

for(size_t i = 0; i < 256; ++i) { 

    if(table[i] > 1) cout << i << " appeared " << table[i] << " times." << endl; 
} 
関連する問題