2009-03-05 14 views
7

配列のユニークな値を数えるのに問題があります。配列要素を並べ替えることなくこれを行う必要があります。配列要素を並べ替えることなく、配列内の一意の数をどのように数えることができますか?

どうすればこの問題を解決できますか?

+1

boolean[] data = new boolean[maxValue]; for (int n : list) { if (data[n]) counter++ else data[n] = true; } 
ですか? –

+0

彼はちょっとP ... – jarus

+0

宿題には何も間違っていません...答えはそのままではありません。 (つまり、答えを取って*良い*にする)。 – Arafangion

答えて

15

は、.NET 3.5を使用している場合、あなたは簡単に介して、LINQでこれを達成することができます

int numberOfElements = myArray.Distinct().Count(); 

非LINQ:

List<int> uniqueValues = new List<int>(); 
for(int i = 0; i < myArray.Length; ++i) 
{ 
    if(!uniqueValues.Contains(myArray[i])) 
     uniqueValues.Add(myArray[i]); 
} 
int numberOfElements = uniqueValues.Count; 
+0

これは宿題に関する質問であれば、答えは彼に多くの点を与える可能性はありませんが、linqの点ではまだ良い答えです。 – andleer

+0

@Andrew非LINQの宿題を追加しました。 –

+0

非linqの例は本当に悪いですが、実際に宿題に関する質問であれば、Rich Bにはもっと良い解決策があります。 :) (ヒント:各アイテムの配列全体をどのように反復する必要はありませんか?) – Arafangion

6

これは、はるかに効率的な非LINQの実装です。

 var array = new int[] { 1, 2, 3, 3, 3, 4 }; 
     // .Net 3.0 - use Dictionary<int, bool> 
     // .Net 1.1 - use Hashtable 
     var set = new HashSet<int>(); 
     foreach (var item in array) { 
      if (!set.Contains(item)) set.Add(item); 
     } 
     Console.WriteLine("There are {0} distinct values. ", set.Count); 
+0

なぜの代わりに? – sharptooth

+0

パフォーマンスは賢明です。両方とも同一であるべきで、HashSetを使用してこのデモコードが醜く見えるようにしてください。 –

+0

辞書には、リストに含まれるものよりもはるかに高速でなければなりません。 –

0

個別の値のみをカウントするか、配列の各数値をカウントする必要がありますか?(例:「5回は3回」)

第2の要件は、カウントソートアルゴリズムの開始ステップで実行できます。
それはこのようなものになるだろう:インデックス/キー要素が

  • キーは、キーの出現箇所 の数を保持する変数に接続されているをカウントする あるセットを構築

    • 要素
    • は、キーの配列
      • 増分値(配列[インデックス])
    • を繰り返しますこの宿題は

    よろしく

  • 1

    O(n)の実行時間MAX_VALUEメモリ使用

    関連する問題