【问题标题】:Finding linked elements查找链接元素
【发布时间】: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


【解决方案1】:

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

这是c# implementation。我不能保证它的效率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2015-05-28
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多