查找链接元素

时间:2011-10-20 14:29:55

标签: c# algorithm graph-algorithm

美好的一天! 我有一个字典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

1 个答案:

答案 0 :(得分:4)

在我看来,您正在尝试实施一种解决不相交集的算法。幸运的是,网上有现有技术。现在我已经给你正确的搜索词,Wikipedia是一个很好的起点。

这是一个c# implementation。我无法保证其效率。