• <i id='xOacE'><tr id='xOacE'><dt id='xOacE'><q id='xOacE'><span id='xOacE'><b id='xOacE'><form id='xOacE'><ins id='xOacE'></ins><ul id='xOacE'></ul><sub id='xOacE'></sub></form><legend id='xOacE'></legend><bdo id='xOacE'><pre id='xOacE'><center id='xOacE'></center></pre></bdo></b><th id='xOacE'></th></span></q></dt></tr></i><div id='xOacE'><tfoot id='xOacE'></tfoot><dl id='xOacE'><fieldset id='xOacE'></fieldset></dl></div>
    • <bdo id='xOacE'></bdo><ul id='xOacE'></ul>

    <legend id='xOacE'><style id='xOacE'><dir id='xOacE'><q id='xOacE'></q></dir></style></legend>

    <small id='xOacE'></small><noframes id='xOacE'>

      <tfoot id='xOacE'></tfoot>

        如何合并具有交集的集合(连通分量算法)?

        时间:2023-07-24

              <legend id='s15KN'><style id='s15KN'><dir id='s15KN'><q id='s15KN'></q></dir></style></legend>
              <tfoot id='s15KN'></tfoot>
              • <bdo id='s15KN'></bdo><ul id='s15KN'></ul>
              • <small id='s15KN'></small><noframes id='s15KN'>

                  <tbody id='s15KN'></tbody>
                <i id='s15KN'><tr id='s15KN'><dt id='s15KN'><q id='s15KN'><span id='s15KN'><b id='s15KN'><form id='s15KN'><ins id='s15KN'></ins><ul id='s15KN'></ul><sub id='s15KN'></sub></form><legend id='s15KN'></legend><bdo id='s15KN'><pre id='s15KN'><center id='s15KN'></center></pre></bdo></b><th id='s15KN'></th></span></q></dt></tr></i><div id='s15KN'><tfoot id='s15KN'></tfoot><dl id='s15KN'><fieldset id='s15KN'></fieldset></dl></div>
                  本文介绍了如何合并具有交集的集合(连通分量算法)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  是否有任何有效的方法来合并具有交集的集合.例如:

                  Is there any effective way to merge sets which have intersections. For example:

                  l = [{1, 3}, {2, 3}, {4, 5}, {6, 5}, {7, 5}, {8, 9}]
                  

                  预期结果是:

                  r = [{1, 2, 3}, {4, 5, 6, 7}, {8, 9}]
                  

                  应该合并所有有交集(公共组件)的集合.例如:

                  All sets which have intersection (common components) should be merged. For example:

                  {1, 3} & {2, 3}
                  # {3}
                  

                  所以这两个集合应该合并:

                  So these two sets should be merged:

                  {1, 3} | {2, 3}
                  # {1, 2, 3}
                  

                  很遗憾,我没有任何可行的解决方案.

                  Unfortunately I don't have any working solution.

                  更新:结果中集合的顺序并不重要.

                  UPDATE: The order of sets in the result is not important.

                  推荐答案

                  实现 连接组件算法 是将集合列表转换为一组可散列的冻结集,以便在您遍历它并找到与当前集合相交的冻结集时,您可以轻松地将其从池中移除:

                  An efficient way to implement the connected components algorithm as mentioned by @mkrieger1 in the comments is to convert the list of sets to a set of hashable frozensets so that as you iterate through it and find a frozenset that intersects with the current one you can easily remove it from the pool:

                  pool = set(map(frozenset, l))
                  groups = []
                  while pool:
                      groups.append(set(pool.pop()))
                      while True:
                          for candidate in pool:
                              if groups[-1] & candidate:
                                  groups[-1] |= candidate
                                  pool.remove(candidate)
                                  break
                          else:
                              break
                  

                  给定 l = [{1, 3}, {2, 3}, {4, 5}, {6, 5}, {7, 5}, {8, 9}], groups 会变成:

                  [{1, 2, 3}, {4, 5, 6, 7}, {8, 9}]
                  

                  并且给定 l = [{1, 2}, {3, 4}, {2, 3}]groups 将变为:

                  And given l = [{1, 2}, {3, 4}, {2, 3}], groups will become:

                  [{1, 2, 3, 4}]
                  

                  并且给定 l = [{1}, {2}, {1, 2}]groups 将变为:

                  And given l = [{1}, {2}, {1, 2}], groups will become:

                  [{1, 2}]
                  

                  这篇关于如何合并具有交集的集合(连通分量算法)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:为什么将列表转换为集合比仅使用列表来计算列表差异更快? 下一篇:是什么让一个元素有资格在 Python 中进行集合成员资格测试?

                  相关文章

                  1. <small id='1ssMY'></small><noframes id='1ssMY'>

                    <tfoot id='1ssMY'></tfoot>
                    • <bdo id='1ssMY'></bdo><ul id='1ssMY'></ul>
                    <legend id='1ssMY'><style id='1ssMY'><dir id='1ssMY'><q id='1ssMY'></q></dir></style></legend>
                  2. <i id='1ssMY'><tr id='1ssMY'><dt id='1ssMY'><q id='1ssMY'><span id='1ssMY'><b id='1ssMY'><form id='1ssMY'><ins id='1ssMY'></ins><ul id='1ssMY'></ul><sub id='1ssMY'></sub></form><legend id='1ssMY'></legend><bdo id='1ssMY'><pre id='1ssMY'><center id='1ssMY'></center></pre></bdo></b><th id='1ssMY'></th></span></q></dt></tr></i><div id='1ssMY'><tfoot id='1ssMY'></tfoot><dl id='1ssMY'><fieldset id='1ssMY'></fieldset></dl></div>