联盟在python3中找到

时间:2016-02-23 02:27:27

标签: python-3.x data-structures union-find

我知道如何一般地实现union find,但我在考虑是否有办法在python中使用set结构来实现相同的结果。 例如,我们可以很容易地联合集合。但我不知道如何确定两个元素是否只使用集合在同一个集合中。 所以,我想知道python中是否有一个支持这种操作的数据结构,而不是通常的实现?

2 个答案:

答案 0 :(得分:1)

您可以通过将其可视化为树及其节点通过根目录相互连接来解决此问题,然后在想知道两个节点是否已连接时查找树。如果您要比较的两个节点具有相同的根(它们位于同一个树中),则它们是连接的。

要连接两个节点,只需转到它们所在的每棵树的根,然后让一个根成为另一个的父节点。

此视频将为您提供一个很好的直觉: https://www.youtube.com/watch?v=YIFWCpquoS8&list=PLUX6FBiUa2g4YWs6HkkCpXL6ru02i7y3Q&index=1

树节点之间的连接可以通过支持它的语言中的指针来实现,但是如果你的语言不是(python),那么你可以通过数组存储位置和链接来创建自己的指针。

数组的位置将代表您的节点,其中的值表示特定节点与其根的连接。在开始时,数组中的位置填充节点编号,因为节点最初没有父节点,但是当您连接节点时,根更改,并且数组必须表示此。实际上,存储在那里的值是根的标识符。

但是首先尝试直观地看待问题,而不是考虑数组和过多的数学艺术。在视觉上处理它会使解决方案听起来平庸,并且在编写代码时可以提供良好的指导。

我之所以这么说,是因为我观看了刚刚发布的Robert Sedgewick的视频,并对该解决方案进行了图形化模拟,并在不过多关注本书代码的情况下实现了自己。视频给我的直觉比任何数学都更有价值。

它将帮助您使用以下方法将节点封装到类中:

  1. climbTreeFromNodeUpToRoot
  2. setNewParentToThisNodeAndUpdateHeights
  3. 第一种方法,正如名称所示,从一个节点开始,然后上升到树,直到找到它的根,然后返回。

    如果你用这个方法比较两个节点(实际上是它返回的根),你可以通过比较它们的根来轻松地知道它们是否已连接。

    一旦你想连接它们,你就可以上到两个节点的树上,并让一个根取另一个根作为其父节点。

    树木的高度可以变得非常大(对不起,我不使用官方的命名法,但这是对我有意义的那个),所以当你不得不在以后爬树时这种简单的方法会变得很慢时间。

    为了防止树木变高,不​​要只将一个根设置为另一个没有标准的父根,而是将最小树(就高度而非元素数量)附加到最高之一。

    为此,您需要知道每棵树的高度,以及您可以存储在各自根目录中的这些信息(通过您的案例中的额外数组,或来自其他语言的每个节点的额外指针)。每当另一棵树连接到它时,应该更新此信息。

    一棵树不可能知道她刚刚附上了一棵新树,所以重要的是连接到第二棵树的每棵树都会通知第二棵树更新它的高度。

    此信息可以发送到第二棵树的根目录,然后用于判断(如前所述)哪棵树最小。请记住,将一棵小树连接到一棵大树而不是相反的树将为您节省大量的时间。

答案 1 :(得分:-1)

你想要这样的东西吗?

myset = ...
all(elt in myset for elt in (a,b))