Если вы используете OO решение, легко обеспечить способ для хранения только тяжелый путь. Этого решения, которое я придумал - используя вызываемый класс
In [111]: class Heaviest(object):
...: def __init__(self, job):
...: self.path = ''
...: self.weight = 0
...: self.job = job
...: def _find_heaviest(self, job, path='', weight=0):
...: path += job.name
...: weight += job.weight
...: if not job.depends:
...: if weight > self.weight:
...: self.weight = weight
...: self.path = path
...: else:
...: for job in job.depends:
...: self._find_heaviest(job, path, weight)
...: def __call__(self):
...: self._find_heaviest(self.job)
...: return '->'.join(list(self.path)), self.weight
...:
In [112]: Heaviest(jobA)()
Out[112]: ('A->B->D->F', 25)
второстепенный:
Это произошло со мной прошлой ночью, что в случае циклической зависимости (см моего комментария), то решением выше воль не дают ответа, останавливаясь с исключением, когда достигается максимальная глубина рекурсии. Просто добавление строки ниже приведет к удалению любого алгоритма пересечения деревьев, а не только этого.
In [226]: jobF.add_dependent(jobA)
In [227]: Heaviest(jobA)()
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-227-94e994624b4e> in <module>()
----> 1 Heaviest(jobA)()
<ipython-input-111-1ff9f69480a9> in __call__(self)
15 self._find_heaviest(job, path, weight)
16 def __call__(self):
---> 17 self._find_heaviest(self.job)
18 return '->'.join(list(self.path)), self.weight
19
<ipython-input-111-1ff9f69480a9> in _find_heaviest(self, job, path, weight)
13 else:
14 for job in job.depends:
---> 15 self._find_heaviest(job, path, weight)
16 def __call__(self):
17 self._find_heaviest(self.job)
... last 1 frames repeated, from the frame below ...
<ipython-input-111-1ff9f69480a9> in _find_heaviest(self, job, path, weight)
13 else:
14 for job in job.depends:
---> 15 self._find_heaviest(job, path, weight)
16 def __call__(self):
17 self._find_heaviest(self.job)
RuntimeError: maximum recursion depth exceeded
Пока я оставляю попытки исправиться реализации к вам - если вы хотите - просто гарантия может исправить
def _find_heaviest(self, job, path='', weight=0):
if not job.name in path:
path += job.name
weight += job.weight
stop_search = not job.depends
else:
stop_search = True
if stop_search:
if weight > self.weight:
.....
Проблема решена
In [230]: Heaviest(jobA)()
Out[230]: ('A->B->D->F', 25)
Что вы подразумеваете под «простым способом»? Используя некоторую стороннюю библиотеку python? – Nurjan
'item .__ sizeof __()' возвращаемый размер байта, добавьте параметр размера в ваш класс и проверьте каждый новый элемент, вставленный для сохранения, который длинный! – dsgdfg
@dsgdfg: Поддерживаемый аксессуар есть 'sys.getsizeof' (который использует' __sizeof__' внутри). Но я не знаю, как это относится к вопросу ОП. И вы определенно не должны делать ужасные вещи, такие как определение '__sizeof__' вручную в классах уровня Python (единственное место' __sizeof__' должно быть явно определено для классов уровня C, которые должны включать дополнительные динамические распределения накладных расходов в их общем размере) , – ShadowRanger