Узлы в древовидной структуре. Как лучше всего искать пути в Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Узлы в древовидной структуре. Как лучше всего искать пути в Python?

Сообщение Anonymous »

Код: Выделить всё

    MyDictionary: {int: Object}
class Object:
ObjectPointerA: int = -1
ObjectPointerB: int = -1
У меня есть набор объектов, упорядоченных в словаре, на каждый из которых имеется уникальное целое число. Любой конкретный объект в наборе может содержать внутри себя 0, 1 или 2 целых числа, ссылающихся на объекты в наборе (объект может ссылаться на самого себя). Любой корень (никакой другой объект, ссылающийся на него) в наборе может иметь возможность достичь множества листьев (0 ссылок на другие объекты) через другой объект; любой лист может принадлежать нескольким корням (т. е. несколько корней/объектов могут достигать одного и того же листа). По пути на ветках могут быть петли. Я хотел бы для каждого объекта хранить набор целых чисел, определяющих все пути к листу, где каждое посещение объекта учитывается только один раз. Есть ли простой способ сделать это в Python?

Моим первым подходом были рекурсивные методы. Я также пробовал использовать наборы — начиная с корней или листьев, а затем создавая наборы связей все более и более глубоких обходов. Но циклы и ссылки на себя продолжают так или иначе сбивать меня с толку. Любая помощь будет оценена по достоинству; включая указатели на другие темы, которые могут быть полезны.
Такая стратегия описывает мой текущий подход:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»