Какова оптимальная структура данных для дерева карт - PullRequest
1 голос
/ 25 ноября 2010

Я ищу структуру данных, которая в основном представляет собой дерево карт, где карта в каждом узле содержит несколько новых элементов, а также элементы в карте своего родительского узла. Под картой здесь я подразумеваю карту программирования с ключами и значениями, например карту в 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 ]

0 голосов
/ 25 ноября 2010

Я понимаю, что вы ищете 'jet', и вы получите полный список child1.

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

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

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

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

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

alt text

0 голосов
/ 25 ноября 2010

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

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

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

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

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

...