Какова оптимальная структура данных для дерева карт

Я ищу структуру данных, которая в основном представляет собой дерево карт, где карта в каждом узле содержит несколько новых элементов, а также элементы в карте своего родительского узла. Под картой здесь я подразумеваю карту программирования с ключами и значениями, например карту в STL или dict в python.

Например, может быть корневой узел:

root = {'car':1, 'boat':2}

и 2 ребенка, каждый из которых добавляет элемент на родительскую карту

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

Мой поиск будет выполняться на узлах. Так, например, child1['jet'] возвращает 35, но root['jet'] возвращает ошибку not found.

Мне бы хотелось, чтобы это было как можно более эффективным с точки зрения пространства, т.е. я не хочу хранить полную копию полученной карты на каждом узле, но в идеале поиск будет по-прежнему иметь O(log N), где N - общее число элементы в узле, а не все дерево.

Я думал, что, возможно, есть умная хэш-функция, которую я мог бы использовать для этого, но ничего не смог придумать.

Наивным подходом будет сохранение вновь добавленных записей на карте в каждом узле, а затем перемещение вверх по дереву, если ничего не найдено. Мне это не нравится, потому что это зависит от глубины дерева.

2 ответа

Я понимаю, что вы ищете 'jet' и это даст вам весь список child1,

Ваши первичные данные будут в виде дерева. Вы будете хранить ссылку на все данные на этом уровне (например, 'jet':35, а также указатель на родителя.

Ссылка будет через другую хеш-структуру. Это сопоставит ключ ('jet') указатель на дерево.

map['jet']  =>  {'jet':35, parent:root}

Который затем может быть расширен до

map['jet']  =>  {'car':1, 'boat':2, 'jet':35}

альтернативный текст

Как насчет создания функции, которая будет сравнивать хеш-карты, она будет возвращать true или false, если они совпадают, это может быть немного сложной причиной упорядочения пар ключ и значение.

Затем используйте эту функцию всякий раз, когда вы добавляете новый узел (карту) в дерево. Проверьте все существующие узлы в дереве и, если хеш-карта уже существует, просто укажите на нее.

Это может потребовать большой обработки для сравнения хэш-карт, но это сэкономит большую часть пространства.

Надеюсь это поможет.

редактировать: вы можете сделать объединение на картах и ​​посмотреть, если результат будет одинаковой длины для сравнения.

Другие вопросы по тегам