«Как экономичный по площади, как обычный хеш-стол», является довольно неопределенной спецификацией, поскольку «обычная» может означать связь или зондирование в зависимости от того, кого вы спрашиваете. Я не думаю, что кто-либо разработал простые для понимания постоянные хеш-таблицы.
Самый простой способ получить постоянную карту значений ключа со сложностью, которую вы хотите, - использовать постоянное двоичное дерево поиска. Поиск - это знакомый алгоритм из эфемерных (непостоянных) BST. Вставьте изменения, однако, и становится чем-то вроде (псевдо-Java):
// overwrites the value for k if it's already in the tree
Node insert(Node node, Key k, Value v)
{
if (k < node.key)
return new Node(node.key, node.val, insert(node.left, k, v), node.right);
else if (k > node.key)
return new Node(node.key, node.val, node.left, insert(node.right, k, v));
else
return new Node(k, v, node.left, node.right);
}
Обратите внимание, что процедура вставки возвращает новое дерево, которое может показаться неэффективным, но он изменяет только те узлы, он проходит. Это в среднем O (lg n), поэтому O (lg n) выделяет в среднем. Это примерно так же эффективно, как и пространство.
Чтобы получить худшее значение O (lg n), используйте красно-черное дерево. См. Также литературу по структурам данных в функциональном программировании, например. работы Окасаки.
В этой статье в Википедии есть по крайней мере 5 различных видов постоянных, какое упорство вы ищете? –
Полное сохранение, только что обновленное исходное сообщение – ManRow
Если я правильно понял вашу проблему, если вы хотите, чтобы каждый ребенок наследовал хеш-таблицу от своего родителя, вы могли бы просто сделать глубокую копию хеш-таблицы каждый раз, когда ребенок будет создан/добавлен , – Muggen