不同数字的组合及其关系

时间:2014-06-11 04:48:10

标签: c# algorithm search

我在c#中编写了一个简单的程序,以便在一组五个中生成不同的数字组合。 生成的组合将存储在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:

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;
        }

我的问题:如果没有进行密集的比较操作,有没有更好的方法来完成任务?

1 个答案:

答案 0 :(得分:1)

解决问题的最佳方法是使用字典,键是五个集合中的数字,值是值在这些集合中出现的次数(假设每个数字在一组中最多出现一次)为5个)。

迭代字典的键,您可以轻松确定是否

  • 一个数字在所有五个数组中都是唯一的:重复计数等于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;
  ...
}