Какая структура данных используется для неизменяемых карт?
Я знаю, как работают обычные изменчивые карты (используя хеш-таблицы), и я знаю, как работают неизменные списки (рекурсивные связанные списки) и их преимущество перед изменяемыми списками (постоянное добавление времени без испорчения оригинала), но как делают неизменяемые карты (например, Scala)?
Я знаю преимущество не возиться с исходной картой при создании новых карт, но как работает базовая структура данных и какие характеристики производительности они имеют, например, по сравнению с изменяемыми хеш-таблицами? Есть ли какая-либо стандартная структура данных, которую люди используют для их реализации, чтобы я мог искать в CLRS/wikipedia?
Ответы
Ответ 1
Карты Persistent Hash реализуются с использованием структуры, называемой Hash trie. Это было первоначально предложенное Филом Багвелл (кто входит в группу Scala в EPFL), но фактически реализован с помощью Clojure. Он ударил Scala, когда 2.8 вышел в 2010 году.
Существует замечательный рассказ о функциональных структурах данных Дэн Спивак, где механики хеш-три объясняются чрезвычайно ясно (наряду с другими вещами таких как очереди банкиров)! Он также очень хорошо объясняет асимптотические характеристики большого вывода.
В октябре прошлого года Фил дал еще один разговор в London Scala Lift Off, на этот раз на параллельных стойких структурах данных.
Персистентные сортированные карты реализуются с помощью Red-Black tree
Ответ 2
Это может быть дерево (красно-черное) или хэш-карта. Их характеристики доступа зависят от базовой реализации. Деревом является O (log n) для доступа для чтения; хеш-отображение есть O (1).