例えば...
- 1から1000までのランダムな値で初期化される整数の配列があります
- 配列には1Mの要素があります(おそらくもっと多くの要素がありますが、これは単なる例です)
- 各要素の出現回数は10から1010の間でなければなりません
上記の基準を満たすようにこの配列の要素を調整する最も速い方法は何ですか?
発生の最大数がarray.Length(1M)/ valuesSpan(1000)に近い場合、私の最初の解決策は単純に遅すぎます
私は次のようなことを試みました(これは発生の最大数を調整するためだけのものであり、下限の解決策はほとんど同じです):
Int64[] DistinctArrayElements = distinctArrayElements;
Dictionary<Int64, Int32> occurrences = new Dictionary<Int64, Int32>();
foreach (Int64 DistinctElement in DistinctArrayElements)
{
occurrences.Add(DistinctElement, 0);
}
foreach (Int64 ArrayElement in Arr)
{
occurrences[ArrayElement] += 1;
}
//I know this initialization can be done more nicely, so don't bother with this.
for (int j = 0; j < Arr.Length; j++)
{
if (occurrences[Arr[j]] > upperNoOfOccurrences)
{
for (int i = 0; i < Arr.Length; i++)
{
if (occurrences[Arr[i]] < upperNoOfOccurrences)
{
Arr[j] = Arr[i];
occurrences[Arr[i]] += 1;
occurrences[Arr[j]] -= 1;
}
}
}
}