Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找到两个数字列表的良好匹配_C#_Algorithm - Fatal编程技术网

C# 找到两个数字列表的良好匹配

C# 找到两个数字列表的良好匹配,c#,algorithm,C#,Algorithm,我得到了两组数字,SET2中通常有更多的项目。保证SET2的计数等于或大于SET1的计数。 实际上,由于顺序很重要,所以输入是列表而不是集合 我的目标是对SET2中的数字进行组合(汇总)/重新排序,使其尽可能类似于SET1。我将相似性定义为每个位置的偏差之和。有关我计算相似性的方法,请参见。金额越小越好 我的第一个方法是尝试所有的组合,并选择最好的一个。这只适用于非常小的集合(特别是第二个集合)。请参阅和罗琳的答案。 有没有更聪明的方法来获得一个好的组合?我绝对不需要最好的。因此,一个好的就可以

我得到了两组数字,SET2中通常有更多的项目。保证SET2的计数等于或大于SET1的计数。 实际上,由于顺序很重要,所以输入是列表而不是集合

我的目标是对SET2中的数字进行组合(汇总)/重新排序,使其尽可能类似于SET1。我将相似性定义为每个位置的偏差之和。有关我计算相似性的方法,请参见。金额越小越好

我的第一个方法是尝试所有的组合,并选择最好的一个。这只适用于非常小的集合(特别是第二个集合)。请参阅和罗琳的答案。 有没有更聪明的方法来获得一个好的组合?我绝对不需要最好的。因此,一个好的就可以了。显然,具有空子集的集合是无意义的。极端不平衡的集合对我来说似乎不是很有前途。SET1通常有8个条目,但最多可以有18个条目。SET2的计数通常超过10(最多35)。 两组数字之和相等(舍入误差除外)

下面是一个有好结果和坏结果(并非所有可能结果)的示例:

如果我忘记描述premiss,或者我的描述不清楚,甚至有错误,请告诉我。我也很高兴提供另一个例子


提前谢谢

启发式,应该很有效:

1. list<int> set1, set2;
2. sort(set2) // decreasing, set2[0] would be the greatest value in set2
3. struct set1item = {set1index, value, list<int> chosen}
4. prepare list<set1item> set1items from set1 //(index = index in set1 list, value = set1[index] and chosen = null)
5. put set1items to some priorityqueue pq // ordered by value
6. for each set2item in set2{
7.     item = pq.first()
8.     item.chosen.add(set2item);
9.     item.value -= set2item;
10.    pq.updateFirst(item)
11.}
1。列表set1、set2;
2.排序(set2)//递减,set2[0]将是set2中的最大值
3.struct set1item={set1index,value,list selected}
4.从set1//(索引=set1列表中的索引,值=set1[index]和SELECTED=null)准备列表set1items
5.将set1items放入某些优先级队列pq//按值排序
6.对于集合2中的每个集合2项{
7.项目=pq.first()
8.项目。选择。添加(set2item);
9.item.value-=set2item;
10.pq.更新第一次(项目)
11.}
它的工作原理如下:从最高到最低遍历set2,从set1中获取实际的最高元素,通过从set2中获取的元素将其减少,并将这个元素从set2添加到set1结果中的元素

您必须记住检查set1中的所有元素是否没有空结果

例1:
Set1={20,9,7,3},Set2={7,6,6,4,2,2,2,2,2,2}

iter1:
fromSet2=7
Set1={20:{},9:{},7:{},3:{}
fromSet1=20
。 将20减少7,并将其结果增加7。更新:
Set1={13:{7},9:{},7:{},3:{}

iter2:
fromSet2=6
Set1={13:{7},9:{},7:{},3:{}}
fromSet1=13
。 将13减少6,并将其结果增加6。更新:
Set1={7:{7,6},9:{},7:{},3:{}

iter3:
fromSet2=6
Set1={7:{7,6},9:{},7:{},3:{}
fromSet1=9
。 将9减少6,并将其结果增加6。更新:
Set1={7:{7,6},3:{6},7:{},3:{}

iter4:
fromSet2=4
Set1={7:{7,6},3:{6},7:{},3:{}
fromSet1=7
。 将7减少4,并在其结果中添加4。更新:
Set1={3:{7,6,4},3:{6},7:{},3:{}

iter5:
fromSet2=2
Set1={3:{7,6,4},3:{6},7:{},3:{}
fromSet1=7
。 将7减少2,并在其结果中添加2。更新:
Set1={3:{7,6,4},3:{6},5:{2},3:{}


您是在寻找最佳答案还是快速启发式?快速启发式将是完美的。尤其是因为不可能进行详尽的计算。谢谢@Ari的评论。所以。。。总是把最大的免费盒子放进剩余空间最大的箱子里?你的解决方案解释得很好,而且很容易实现@Ari。对于另一个测试用例,它工作得非常好。我会进一步评估并给出反馈。这个算法运行得很好。实际上,垃圾箱经常是空的。谢谢你明确提到这可能发生。如果set2中的元素比空结果多,我只从set1中选择最高值,从而避免了这种情况。如果不是这样,我选择一个空集的最高值。
1. list<int> set1, set2;
2. sort(set2) // decreasing, set2[0] would be the greatest value in set2
3. struct set1item = {set1index, value, list<int> chosen}
4. prepare list<set1item> set1items from set1 //(index = index in set1 list, value = set1[index] and chosen = null)
5. put set1items to some priorityqueue pq // ordered by value
6. for each set2item in set2{
7.     item = pq.first()
8.     item.chosen.add(set2item);
9.     item.value -= set2item;
10.    pq.updateFirst(item)
11.}