在接触Python之前,我主要使用C++或Matlab进行编程。我没有计算机科学学位(几乎完成了物理学博士学位),但我参加过一些课程并实际进行了大量编程。现在,我正在Coursera上学习算法课程(顺便说一句,这是一门非常好的课程,由斯坦福大学的教授讲授)。我决定用Python实现作业。然而,有时候我发现自己想要的东西语言并不容易支持。我很习惯于在C++中为事物创建类和对象,只是为了将数据分组在一起(即当没有方法时)。然而,在Python中,您可以随时添加字段,因此我基本上一直想要的是Matlab结构体。我认为这可能是我没有使用良好的风格并且没有按照“Pythonic”方式处理事情的迹象。
下面是我的并查集数据结构实现(用于Kruskal算法)。虽然实现相对简短且效果良好(没有太多错误检查),但还有一些奇怪的地方。例如,我的代码假定最初传递给并查集的数据是对象列表。但是,如果传递的是显式数据片段的列表(即整数列表),则代码会失败。是否有更清晰、更符合Python风格的实现方法?我尝试过搜索,但大多数示例都非常简单,与过程式代码相关(即在Python中执行for循环的“正确”方式)。
下面是我的并查集数据结构实现(用于Kruskal算法)。虽然实现相对简短且效果良好(没有太多错误检查),但还有一些奇怪的地方。例如,我的代码假定最初传递给并查集的数据是对象列表。但是,如果传递的是显式数据片段的列表(即整数列表),则代码会失败。是否有更清晰、更符合Python风格的实现方法?我尝试过搜索,但大多数示例都非常简单,与过程式代码相关(即在Python中执行for循环的“正确”方式)。
class UnionFind:
def __init__(self,data):
self.data = data
for d in self.data:
d.size = 1
d.leader = d
d.next = None
d.last = d
def find(self,element):
return element.leader
def union(self,leader1,leader2):
if leader1.size >= leader2.size:
newleader = leader1
oldleader = leader2
else:
newleader = leader2
oldleader = leader1
newleader.size = leader1.size + leader2.size
d = oldleader
while d != None:
d.leader = newleader
d = d.next
newleader.last.next = oldleader
newleader.last = oldleader.last
del(oldleader.size)
del(oldleader.last)
data
参数的定义。 - yurisich