在 Python 之前,我的大部分编程都是用 C++ 或 Matlab 编写的。我没有计算机科学学位(几乎完成了物理学博士学位),但已经完成了一些课程和大量的实际编程。现在,我正在 Coursera 上学习算法课程(顺便说一句,与斯坦福大学的教授一起学习的课程非常好)。我决定用 Python 实现作业。然而,有时我发现自己想要一些语言不容易支持的东西。我非常习惯在 C++ 中为事物创建类和对象,只是为了将数据组合在一起(即当没有方法时)。然而,在 Python 中,您可以动态添加字段,而我基本上一直想要的是 Matlab 结构。我认为这可能表明我没有使用良好的风格并且没有以“Pythonic”的方式做事。
下面是我对联合查找数据结构的实现(用于 Kruskal 算法)。尽管实现相对较短且运行良好(没有太多错误检查),但还是有一些奇怪的地方。例如,我的代码假定最初传递给 union-find 的数据是一个对象列表。但是,如果传入的是显式数据片段列表(即整数列表),则代码将失败。有没有更清晰、更 Pythonic 的方式来实现它?我试图用谷歌搜索这个,但大多数示例都非常简单,并且更多地与程序代码相关(即在 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)