This class is used to create sets out of nodes to from a graph-like structure (or grouping since I remove most of the normal graph structure and all child nodes have the same parent).
Is there anything I can do to improve the design of this class? Is the use of static methods here appropriate?
class UnionFind(object):
'''
Used to initialize the set and then holds the required functions
to operate on them
'''
def __init__(self, vertex):
self.rank = 0
self.parent = self
self.vertex = vertex
@staticmethod
def find(x):
if x != x.parent:
x.parent = UnionFind.find(x.parent)
return x
@staticmethod
def union(x,y):
xroot = UnionFind.find(x)
yroot = UnionFind.find(y)
if xroot == yroot:
return
if xroot.rank > yroot.rank:
yroot.parent = xroot
else:
xroot.parent = yroot
if xroot.rank == yroot.rank:
yroot.rank += 1
1 Answer 1
find
is not a right name. A methodfind(x)
is expected to find objects matchingx
.find_root
seems more appropriate.I know that Sedgewick & Wayne use
find
, and they are wrong.find
(orfind_root
) has no reason to be static.x.find_root()
is way more natural thanUnionFind.find_root(x)
.Python does not eliminate tail recursion. I recommend to rewrite
find
asdef find(x): while x != x.parent: x = x.parent return x
-
1\$\begingroup\$ As you suggested dropping the
@staticmethod
decorator, you could writeself
instead ofx
. \$\endgroup\$301_Moved_Permanently– 301_Moved_Permanently2016年09月22日 08:10:30 +00:00Commented Sep 22, 2016 at 8:10 -
\$\begingroup\$ @MathiasEttinger Thanks for the suggestion. It is a lot more natural to not have to call find with an argument \$\endgroup\$MattTheSnake– MattTheSnake2016年09月22日 16:04:13 +00:00Commented Sep 22, 2016 at 16:04
-
\$\begingroup\$ @vnp Thanks! The rewrite of find is much better. \$\endgroup\$MattTheSnake– MattTheSnake2016年09月22日 16:05:01 +00:00Commented Sep 22, 2016 at 16:05
Explore related questions
See similar questions with these tags.