查找链接元素

发布于 2024-12-10 17:57:29 字数 1012 浏览 2 评论 0 原文

再会! 我有一个字典 Dictionary> 其中 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:更正示例。谢谢斯维克

Good day!
I have a dictionary Dictionary<long, List<long>> where values of List can be keys of dictionary.

What I want to do is to separate keys and values of this dictionary to set that represent linked elements. So if i have

dict[1] = new List<long>() { 12, 4, 2 };
dict[2] = new List<long>() { 7 };
dict[3] = new List<long>() { 25, 19, 27 };

I want to get as output tow sets { 1, 12, 4, 2, 7 } and { 3, 25, 19 27 };

I found a solution but it looks for me that it is not fast enough.

 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);
     }
 }

Are there better solutions for such a problem?
Thank you.

UPD : corrected exmaple. Thanks svick

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

十年不长 2024-12-17 17:57:29

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

这是一个 c# 实现。我不能保证它的效率。

Looks to me like you're trying to implement an algorithm for solving disjoint sets. Luckily for you, there's prior art on the web. Now I've handed you the correct search term, Wikipedia is a good place to start.

Here's a c# implementation. I can't vouch for its efficiency.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文