问题描述
到目前为止,我所掌握的内容主要基于 Cormen 等人的算法简介"第 571 页.
What I have so far is largely based off page 571 of "Introduction To Algorithms" by Cormen et al.
我在 python 中有一个 Node 类,它代表一个集合:
I have a Node class in python that represents a set:
此实现将使用节点的 List
作为森林(我愿意接受更好的方法来存储集合).
This implementation is going to use a List
of Nodes as the forest (I am open to better ways to store the sets).
Initialize()
返回一个节点列表,我将其存储在变量 set
中并传递给其他函数.
Initialize()
returns a list of Nodes, that I will store in variable set
and pass into the other functions.
Find
在森林中搜索值并返回它出现的集合.我选择使用 for s in range(len(set)):
所以在递归中,我可以缩小 set[s:]
传入的集合列表.
Find
searches through the forest for the value and returns the set that it appears in. I chose to use for s in range(len(set)):
so that in the recursion I could shrink the list of sets being passed in by set[s:]
.
Merge
通过找到它们并提升排名较高的集合来合并森林中的集合.
Merge
merges sets in the forest by finding them and promoting the higher ranked set.
我在执行 Find
s 和 Merge
s 时遇到了一些错误,即 Find
没有返回正确的集合,所以我我不确定 Merge
是否也能正常工作.我会很感激一些帮助,以确保正确实现这些功能.
I am getting some errors when I do Find
s and Merge
s, namely Find
is not returning the proper set, and so I am not sure if Merge
is working properly as well. I would appreciate some help to make sure the functions are implemented properly.
推荐答案
我没有这本书的最新版本,但这看起来不像是不相交的森林.
I don't have the latest edition of the book, but this doesn't look quite like a disjoint-set forest.
我认为您的错误是认为必须将森林存储在集合中,并且您必须遍历该集合才能对节点进行操作.从 Merge()
和 Find()
中移除 set
并实现 Find()
as
I think your mistake is to think that the forest has to be stored in a collection and that you have to traverse this collection to do the operations on the nodes. Remove set
from Merge()
and Find()
and implement Find()
as
就像书中一样.然后添加一个返回单个正确初始化节点的 MakeSet()
,也许还有一个 SameSet()
函数:
just like in the book. Then add a MakeSet()
that returns a single correctly initialized node, and maybe a SameSet()
function too:
你现在有一个工作的不相交集实现.
You now have a working disjoint set implementation.
这篇关于在 Python 中实现不相交集系统的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!