Я написал простую программу в С# для генерации различных комбинаций чисел в наборе из пяти. Сгенерированные комбинации будут сохранены в массиве int. Он будет прочитан пять-пять.
int[] number = new int[no_of_combination];
Я хочу узнать, сколько чисел повторяется в этих комбинациях. например, {1 2 3 4 5} и {3 4 5 6 7} имеют три повторных номера, и они {3 4 5}
Мой подход заключается в том, что сравнивать каждую комбинацию со всеми другими комбинациями. Для n комбинаций будут проведены n (n-1)/2 сравнения. Результат (количество повторяющихся номеров и соответствующие им значения) будет храниться в массивах объектов. Если n велико, скажем, 100000, количество операций будет чрезвычайно велико. Для хранения результата используется большой объем памяти.
int[] init = new int[6]; // 6 for no repeat,1,2,3,4 and 5, init counting the number of combinations in each repeated number group
RepeatedSet[,] S = new RepeatedSet[6,number.Length*number.Length];
for(int i=0;i<number.Length-1;i++)
{
for(int j=i+1;j<number.Length;j++)
{
int no_of_repeated_number = 0;
int a = i, b = j;
for (int k = 0; k < 5; k++)
{
// counting number of repeated numbers
for (int l = 0; l < 5; l++)
{
if (n[a, k] == n[b, l])
{
no_of_repeated_number++;
}
}
int[] repeated_number_set = new int[no_of_repeated_number];
int count = 0;
// putting the repeated numbers value into array
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
if (n[a, k] == n[b, l])
{
repeated_number_set[count] = n[a,k];
count++;
}
}
}
// create objects to store the infomation
S[no_of_repeated_number, init[no_of_repeated_number]] = new RepeatedSet(a,b,repeated_number_set,repeated_number_set.Length);
init[no_of_repeated_number]++;
}
}
{
Класс Повторный набор:
class RepeatedSet
{
int combinationA = 0; // sequence no. of combination A
int combinationB = 0; // sequence no. of combination B
int[] repeat = new int[0];
public RepeatedSet(int a, int b, int[] r, int size)
{
combinationA = a;
combinationB = b;
repeat = new int[size];
repeat = r;
}
public int getcombinationA()
{
return this.combinationA;
}
public int getcombinationB()
{
return this.combinationB;
}
public int[] getRepeatedSet()
{
return this.repeat;
}
Мой вопрос: есть ли лучший способ выполнить задачу без интенсивных операций сравнения?
Лучший способ решить вашу проблему - использовать словарь, а ключи - это числа в ваших наборах из пяти, а значения - это времена, когда значения появляются в этих наборах (при условии, что каждый номер встречается не более одного раза в наборе из пяти).
Итерируя по клавишам Словаря, вы можете легко определить,
Позже
Только несколько указателей.
using System.Collections.Generic;
Dictionary<int, int> dictionary = new Dictionary<int, int>();
Для подсчета другого номера:
int count;
if (dictionary.TryGetValue(number, out count)){
dictionary[number] = count + 1;
} else {
dictionary[number] = 1;
}
Чтобы исследовать результат
foreach (KeyValuePair<int, int> pair in dictionary){
int number = pair.Key;
int count = pair.Value;
...
}
RepeatedSet
иnumber
и т. Д.