【发布时间】:2011-10-20 14:29:54
【问题描述】:
美好的一天!
我有一本字典 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 :更正示例。谢谢svick
【问题讨论】:
-
那么,如果你有
1 → { 3 }, 2 → { 3 }, 3 → { 4, 5, 6 },那么结果应该是{ 1, 3, 4, 5, 6 }和{ 1, 2, 4, 5, 6 }? -
不。只需 {1, 2, 3, 4, 5, 6 }。
-
那么您的示例不应该也只有一个结果集吗?这些集合有 12 个共同点。
-
这一行在 Foreach 语句中是否有效? hashSet.UnionWith(maybeNewGraph)
-
是的,为什么不呢?我没有改变枚举对象的状态。只是它的组件的状态。
标签: c# algorithm graph-algorithm