美好的一天!
我有一个字典Dictionary<long, List<long>>
,其中List的值可以是字典的键。
我想要做的是将此词典的键和值分开以设置表示链接元素。所以,如果我有
dict[1] = new List<long>() { 12, 4, 2 };
dict[2] = new List<long>() { 7 };
dict[3] = new List<long>() { 25, 19, 27 };
我希望得到两组{1,12,4,2,7}和{3,25,19 27}的输出;
我找到了一个解决方案,但它找我说它不够快。
List<HashSet<long>> graphs = new List<HashSet<long>>();
foreach (var kv in dict)
{
HashSet<long> maybeNewGraph = new HashSet<long>(kv.Value);
maybeNewGraph.Add(kv.Key);
bool success = false;
foreach (var hashSet in graphs)
{
if (hashSet.Overlaps(maybeNewGraph))
{
hashSet.UnionWith(maybeNewGraph);
success = true;
break;
}
}
if (!success)
{
graphs.Add(maybeNewGraph);
}
}
这样的问题有更好的解决方案吗? 谢谢。
UPD :更正了exmaple。谢谢svick
答案 0 :(得分:4)
在我看来,您正在尝试实施一种解决不相交集的算法。幸运的是,网上有现有技术。现在我已经给你正确的搜索词,Wikipedia是一个很好的起点。
这是一个c# implementation。我无法保证其效率。