Я работаю над библиотекой tree , и частью необходимой функциональности является возможность поиска узла для дочерних узлов, которые соответствуют шаблону.
'Шаблон' - это спецификация (или критерии), которая определяет структуру, а также атрибуты узлов в поддереве (ах), которые должны быть сопоставлены.
Например, предположим, что дерево представляет данные, касающиеся определенного вида птиц. Далее предположим, что узлы такого дерева имеют следующие атрибуты:
- место
- пол
- размах крыльев
- вес
- brood_size
Учитывая родительский узел, я хотел бы выполнить поиск на простом английском языке таким образом:
"Принеси мне всех самцов птиц, которые
потомки этой птицы и живут в
XXX города и имеют вес> 100 г. Любая такая найденная птица также должна иметь как минимум 2 брата и одну сестру и сама должна иметь хотя бы одного ребенка "
Просто чтобы уточнить, я не ожидаю, что смогу делать запросы, используя простой английский, как я делал выше. Я использовал только «простой английский запрос», чтобы проиллюстрировать тип соответствия, которое я хотел бы выполнить в дереве. Я полностью ожидаю использовать символы для сопоставления (в отличие от простого текста) на практике.
Я думаю о возможном использовании сопоставления с типом регулярных выражений для сопоставления деревьев. Одним из способов было бы иметь строковое представление каждого узла, поэтому я мог бы использовать обычное регулярное выражение - но это, вероятно, будет довольно неэффективно, так как будет много повторяющихся данных - то есть строковое представление дочерних узлов будет надмножеством их родительское представление, которое будет надмножеством репрезентативной строки их родителей и т. д., рекурсивно, вверх по дереву - это может очень легко стать громоздким для деревьев со скромными размерами событий - должен быть лучший путь.
Кто-нибудь знает алгоритм, который позволит мне выбирать узлы (поддеревья) в узле на основе шаблона?
Хотя я попросил общий алгоритм, я реализую его на Python. любые фрагменты, которые дополнительно иллюстрируют такой алгоритм (если он действительно может быть написан), были бы чрезвычайно полезны.