Код: Выделить всё
MyDictionary: {int: Object}
class Object:
ObjectPointerA: int = -1
ObjectPointerB: int = -1
Моим первым подходом были рекурсивные методы. Я также пробовал использовать наборы — начиная с корней или листьев, а затем создавая наборы связей все более и более глубоких обходов. Но циклы и ссылки на себя продолжают так или иначе сбивать меня с толку. Любая помощь будет оценена по достоинству; включая указатели на другие темы, которые могут быть полезны.
Такая стратегия описывает мой текущий подход:
Код: Выделить всё
s_leaves = {dictionary of all leaves}
s_next = {dictionary of all objects referring to an object in s_leaves}
while len(s_next) != 0:
s_next = {dictionary of all objects referring to an object in s_next}
Код: Выделить всё
s_roots = {dictionary of all roots}
for s in s_roots:
self._find_path(, s.unique_key)
def _find_path(, key: int):
recursively track in some form, like
if .keyitem has ObjectPointerA:
self._find_path(, ObjectPointerA)
if .keyitem has ObjectPointerB:
self._find_path(, ObjectPointerB)
Кстати. мои наборы довольно малы (в большинстве случаев < 2000 записей), поэтому эффективность не является серьезной проблемой. Я бы предпочел код, который легко читать/понимать.
Если вам нужна помощь в визуализации того, какие наборы данных я изучаю, попробуйте представить себе набор инструкций в очень простом виде. язык кодирования выполняется сверху -> снизу и каждая инструкция имеет адрес. Некоторые инструкции переходят в другое место (с возможным возвратом), некоторые являются условными операторами с несколькими путями, некоторые просто проходятся, а некоторые завершают текущую строку кода.
Том
Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-python