Персистентный стек — различия между версиями
Yurik (обсуждение | вклад) |
|||
Строка 12: | Строка 12: | ||
== Нормальная реализация == | == Нормальная реализация == | ||
− | + | ||
+ | Попробуем решить задачу эффективнее. Вместо n копий стека будем хранить n первых элементов. Тогда операции push и pop будут иметь следующий вид:<br> | ||
+ | * <tex>push(x, i)</tex> - создает новый элемент со значением x, который ссылается на элемент с номером i как на предыдущий элемент в стеке. | ||
+ | * <tex>pop(i)</tex> - возвращает значение, хранящееся в элементе с номером i и копирует элемент, предыдущий для него. | ||
+ | |||
== См. также== | == См. также== |
Версия 21:27, 28 февраля 2012
Определение: |
Персистентными структурами данных мы будем называть такие структуры, что при всяком их изменении остается доступ ко всем предыдущим версиям этой структуры. |
Рассмотрим такую структуру на примере стека.
Наивная реализация
Самое простое и очевидное решение этой задачи — симуляция описанного процесса, т.е. честное копирование стека при каждой операции.
Очевидно, что это не самое эффективное решение. Сложность одной операции составляет и количество требуемой памяти — .
Нормальная реализация
Попробуем решить задачу эффективнее. Вместо n копий стека будем хранить n первых элементов. Тогда операции push и pop будут иметь следующий вид:
- - создает новый элемент со значением x, который ссылается на элемент с номером i как на предыдущий элемент в стеке.
- - возвращает значение, хранящееся в элементе с номером i и копирует элемент, предыдущий для него.