Комбинации разных чисел и их отношения

1

Я написал простую программу в С# для генерации различных комбинаций чисел в наборе из пяти. Сгенерированные комбинации будут сохранены в массиве 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;
        }

Мой вопрос: есть ли лучший способ выполнить задачу без интенсивных операций сравнения?

  • 0
    Вы должны опубликовать весь свой код. Т.е. что такое RepeatedSet и number и т. Д.
  • 0
    Добавлен класс RepeatedSet
Теги:
algorithm
search

1 ответ

1
Лучший ответ

Лучший способ решить вашу проблему - использовать словарь, а ключи - это числа в ваших наборах из пяти, а значения - это времена, когда значения появляются в этих наборах (при условии, что каждый номер встречается не более одного раза в наборе из пяти).

Итерируя по клавишам Словаря, вы можете легко определить,

  • число уникально по всем наборам из пяти: количество повторений равно 1
  • число встречается во всех наборах из пяти: количество повторений равно числу множеств
  • число происходит более одного раза, но не во всех наборах

Позже

Только несколько указателей.

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;
  ...
}
  • 0
    Как создать такой словарь, который будет включать в себя все возможности числовых комбинаций?
  • 0
    Смотрите фрагменты, которые я добавил. Узнайте больше на dotnetperls.com/dictionary

Ещё вопросы

Сообщество Overcoder
Наверх
Меню