У меня есть большой набор данных деревьев, и я хотел бы найти его, указав древовидную структуру (связанный подграф). Запрос должен возвращать все вхождения дерева в наборе данных.
Существуют ли эффективные алгоритмы для этого?
Я думал о чем-то вроде суффиксных массивов, однако наивное кодирование деревьев как строк (с помощью фиксированного порядка обхода их узлов) не будет работать, так как дерево поиска может иметь любую произвольную форму.
ОБНОВИТЬ:
Некоторые подробности о типичных случаях, которые я ожидаю:
Набор данных будет состоять как минимум из десятков тысяч деревьев, каждое из которых будет содержать от двадцати до тридцати узлов. Деревья не будут не двоичными, но типичное число детей на узел будет небольшим (обычно не больше четырех или пяти, хотя в некоторых вырожденных случаях оно может достигать около тридцати). Количество этикеток составит десятки тысяч.
Мне это нужно для приложений НЛП: каждое дерево будет анализом зависимости предложения, каждый узел представляет слово вхождения, а каждая метка - словарное слово (с некоторым оформлением).
источник
Ответы:
Несмотря на то, что они не предназначены специально для (укоренившихся) деревьев, я думаю, что структура данных G-trie вполне может работать в ваших условиях. Это адаптация дерева (для поиска наборов строк) к графам.
источник
Некоторое время назад я написал алгоритм канонизации дерева Рональда Рида и поместил его в википедии .
Я бы сделал хеш-таблицу для каждой подписи внутреннего узла и пометил их списком указателей на поддеревья, из которых они пришли. Тем не менее, он будет работать только для деревьев с настоящими листьями.
источник