给出了几个集合,例如{1,2,3,4}
,{1,2}
,{1}
,{1,2,3,}
,...和数字k
,以便应该进行组合要形成的长度恰好是k
,如果我只能从每个集合中选择一个数字,那么如何生成长度k
的唯一组合?
正好有多少套可供选择。我正在寻找在c#中执行此操作的最有效方法。
直觉上我尝试(尽管我不确定它是否正确)为每个集合生成所有可能的组合,然后将每个集合中的每个第i个组合与后续集合中的相应第i个组合连接起来以形成{{1长期独特的组合,但我确信这类问题有一般情况。
任何人都可以提供一些提示或建议吗?具体是哪个数学或计算机科学主题,以及这些问题通常如何解决?
在数组中字符串下方的片段中,例如“31” 这意味着k = 2(在集合中字符串的长度)并且有两组,其中一组是{1,2,3}和{1}。使用这些集合,生成所有唯一组合并提供计数
k
答案 0 :(得分:0)
您可以使用LINQ解决此问题:
private void CombineSets()
{
var mySets = new List<HashSet<int>>();
mySets.Add(new HashSet<int>() { 1, 2, 3, 4 });
mySets.Add(new HashSet<int>() { 1, 2 });
mySets.Add(new HashSet<int>() { 1 });
mySets.Add(new HashSet<int>() { 1, 2, 3 });
var result = new HashSet<int>();
while (mySets.Count > 0)
{
//get the smallest set
var set = mySets.OrderBy(x => x.Count).First();
//remove the set from the collection as we do not need it anymore (we got our value)
mySets.Remove(set);
//remove what is in the result from the set (as we only want unique values)
set.ExceptWith(result);
//then add the first value from the remaining values to our result set
result.Add(set.First());
}
}
为了提高效率,您还可以在while循环之前对列表进行排序。这至少解决了你问题的前几行。
希望这会有所帮助:)