我在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;
}
我的问题:如果没有进行密集的比较操作,有没有更好的方法来完成任务?
答案 0 :(得分:1)
解决问题的最佳方法是使用字典,键是五个集合中的数字,值是值在这些集合中出现的次数(假设每个数字在一组中最多出现一次)为5个)。
迭代字典的键,您可以轻松确定是否
<强>后来强>
只有几个指针。
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;
...
}