【发布时间】:2020-11-05 16:34:26
【问题描述】:
为清晰起见编辑:我正在寻找 C# 中最有效(最好是优雅)的方法来查找同一集合的各个细分的 n 向交集。详情如下。
- 我有一个元素列表。为简单起见,假设它是整数 1-100。
- 此列表已分为多个组,因此所有元素都存在于一个组中。例如。 第 1 区
- 第 1 组: 1,5-8,52-73
- 第 2 组: 2-4,38-51
- 第 3 组: 9-37,84-100
- 第 4 组: 74-83
- 步骤 #2 已重复多次(即此列表有许多不同的部分)。例如。 第 2 区
- 第 1 组: 1-27,59-80,99-100
- 第 2 组: 28-31,81-98
- 第 3 组: 32-58li>
- 我想“合并”(这可能是一个更好的术语)这些划分,这样如果任何两个元素在任何划分中是分开的,它们在最终结果中就会分开。换个说法:只有那些在所有部门中都在一起的元素才会在最终结果中一起出现。例如。对于上述两个部门(D =部门,G =组):
- 第 1 组 (D1G1 x D2G2):1,5-8,59-73
- 第 2 组 (D1G1 x D2G3):52-58li>
- 第 3 组 (D1G2 x D2G1):2-4
- 第 4 组 (D1G2 x D2G3):38-51
- 第 5 组 (D1G3 x D2G1):9-27,99-100
- 第 6 组 (D1G3 x D2G2):28-31,84-98
- 第 7 组 (D1G3 x D2G3):32-37
- 第 8 组 (D1G4 x D2G1):74-80
- 第 9 组 (D1G4 x D2G2):81-83
我不关心最终结果中组的顺序。我只是在寻找最有效和最干净的解决方案。
目前我能想到的唯一方法是:
public IEnumerable<IEnumerable<int>> MergeDivisions(IEnumerable<IEnumerable<IEnumerable<int>>> divisions)
{
var currentMerge = divisions.First();
foreach (var division in divisions.Skip(1))
{
var nextMerge = new List<List<int>>();
foreach (var currentMergeGroup in currentMerge)
{
foreach (var group in division)
{
var nextMergeGroup = currentMergeGroup.Intersect(group);
if (nextMergeGroup.Any())
nextMerge.Add(nextMergeGroup.ToList());
}
}
currentMerge = nextMerge;
}
return currentMerge;
}
【问题讨论】:
-
我不太了解您的需求,但是通过查看您的代码,您似乎有某种树,也许您可以使用树结构并遍历它并采取相应的行动,即每个节点都可以专门化。
标签: c# algorithm optimization set