Персистентный стек — различия между версиями
Yurik (обсуждение | вклад) |
Yurik (обсуждение | вклад) |
||
Строка 21: | Строка 21: | ||
Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека: | Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека: | ||
− | [[Файл:B5bb212f3702e565498c4412e13242a7.jpg| | + | [[Файл:B5bb212f3702e565498c4412e13242a7.jpg|left|width:100px|nothumb]]<br> |
+ | <br> | ||
+ | Далее выполним push(1, 5). Создается новая вершина со значением 5, ссылающаяся на 1-ую: | ||
+ | [[Файл:612b6fe1562242b3a455b2abb698dfc9.jpg|left|100px|nothumb]]<br> | ||
+ | <br> | ||
+ | Аналогично выполним push(2, 10) и push(1, 6): | ||
+ | |||
+ | [[Файл:B5bb212f3702e565498c4412e13242a7.jpg|left|100px|nothumb]]<br> | ||
+ | <br> | ||
+ | Очевидно, что все 4 стека сейчас верно построены и легко восстанавливаются. Давайте теперь попробуем выполнить последовательно операции pop(2) и pop(3): | ||
+ | |||
+ | pop(2) возвращает 5 и копирует 1-ую вершину. Результирующий пятый стек — пустой. | ||
+ | [[Файл:B5bb212f3702e565498c4412e13242a7.jpg|left|100px|nothumb]]<br> | ||
+ | <br> | ||
+ | pop(3) возвращает 10 и копирует 2-ую вершину: получаем шестой стек. | ||
+ | [[Файл:B5bb212f3702e565498c4412e13242a7.jpg|left|100px|nothumb]]<br> | ||
+ | <br> | ||
== См. также== | == См. также== |
Версия 16:59, 29 февраля 2012
!!не дописано!!
Определение: |
Персистентными структурами данных мы будем называть такие структуры, что при всяком их изменении остается доступ ко всем предыдущим версиям этой структуры. |
Рассмотрим такую структуру на примере стека.
Наивная реализация
Самое простое и очевидное решение этой задачи — симуляция описанного процесса, т.е. честное копирование стека при каждой операции.
Очевидно, что это не самое эффективное решение. Сложность одной операции составляет и количество требуемой памяти — .
Нормальная реализация
Попробуем решить задачу эффективнее. Вместо n копий стека будем хранить n первых элементов. Тогда операции push и pop будут иметь следующий вид:
- - создает новый элемент со значением x, который ссылается на элемент с номером i как на предыдущий элемент в стеке.
- - возвращает значение, хранящееся в элементе с номером i и копирует элемент, предыдущий для него.
Пример:
Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека:
Далее выполним push(1, 5). Создается новая вершина со значением 5, ссылающаяся на 1-ую:
Аналогично выполним push(2, 10) и push(1, 6):
Очевидно, что все 4 стека сейчас верно построены и легко восстанавливаются. Давайте теперь попробуем выполнить последовательно операции pop(2) и pop(3):
pop(2) возвращает 5 и копирует 1-ую вершину. Результирующий пятый стек — пустой.
pop(3) возвращает 10 и копирует 2-ую вершину: получаем шестой стек.