C# 找到两个数字列表的良好匹配
我得到了两组数字,SET2中通常有更多的项目。保证SET2的计数等于或大于SET1的计数。 实际上,由于顺序很重要,所以输入是列表而不是集合 我的目标是对SET2中的数字进行组合(汇总)/重新排序,使其尽可能类似于SET1。我将相似性定义为每个位置的偏差之和。有关我计算相似性的方法,请参见。金额越小越好 我的第一个方法是尝试所有的组合,并选择最好的一个。这只适用于非常小的集合(特别是第二个集合)。请参阅和罗琳的答案。 有没有更聪明的方法来获得一个好的组合?我绝对不需要最好的。因此,一个好的就可以了。显然,具有空子集的集合是无意义的。极端不平衡的集合对我来说似乎不是很有前途。SET1通常有8个条目,但最多可以有18个条目。SET2的计数通常超过10(最多35)。 两组数字之和相等(舍入误差除外) 下面是一个有好结果和坏结果(并非所有可能结果)的示例: 如果我忘记描述premiss,或者我的描述不清楚,甚至有错误,请告诉我。我也很高兴提供另一个例子C# 找到两个数字列表的良好匹配,c#,algorithm,C#,Algorithm,我得到了两组数字,SET2中通常有更多的项目。保证SET2的计数等于或大于SET1的计数。 实际上,由于顺序很重要,所以输入是列表而不是集合 我的目标是对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.}
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.}