Большая часть моего программирования до Python была в С++ или Matlab. У меня нет степени в CS (почти закончил аспирантуру по физике), но сделал несколько курсов и хорошее количество фактического программирования. Теперь я беру курс алгоритмов на Coursera (отличный курс, кстати, с профессором из Стэнфорда). Я решил выполнить домашние задания на Python. Тем не менее, иногда я нахожу, что хочу, чтобы язык не так легко поддерживал язык. Я очень привык создавать классы и объекты для вещей на С++ только для группировки данных (т.е. Когда методов нет). Однако в Python, где вы можете добавлять поля "на лету", то, что я в основном в конечном итоге желаю, - это структуры Matlab. Я думаю, что это, возможно, знак, что я не использую хороший стиль и не делаю вещи "путинским" способом.
Под моей реализацией структуры данных на основе объединения (для алгоритма Крускаля). Хотя реализация относительно короткая и работает хорошо (проверка ошибок невелика), есть несколько нечетных точек. Например, мой код предполагает, что данные, первоначально переданные в union-find, представляют собой список объектов. Однако, если вместо этого передается список явных фрагментов данных (т.е. Список целых чисел), код не работает. Есть ли еще более ясный, более путинский способ реализовать это? Я попытался это сделать Google, но большинство примеров очень просты и связаны скорее с процедурным кодом (т.е. "Правильным" способом сделать цикл for в python).
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)