Персистентный стек — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 21: Строка 21:
  
 
Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека:
 
Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека:
[[Файл:B5bb212f3702e565498c4412e13242a7.jpg|center|100px|nothumb]]<br>
+
[[Файл: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

!!не дописано!!

Определение:
Персистентными структурами данных мы будем называть такие структуры, что при всяком их изменении остается доступ ко всем предыдущим версиям этой структуры.


Рассмотрим такую структуру на примере стека.


Наивная реализация

Самое простое и очевидное решение этой задачи — симуляция описанного процесса, т.е. честное копирование стека при каждой операции.
Очевидно, что это не самое эффективное решение. Сложность одной операции составляет [math]O(n)[/math] и количество требуемой памяти — [math]O(n * n)[/math].

Нормальная реализация

Попробуем решить задачу эффективнее. Вместо n копий стека будем хранить n первых элементов. Тогда операции push и pop будут иметь следующий вид:

  • [math]push(x, i)[/math] - создает новый элемент со значением x, который ссылается на элемент с номером i как на предыдущий элемент в стеке.
  • [math]pop(i)[/math] - возвращает значение, хранящееся в элементе с номером i и копирует элемент, предыдущий для него.

Пример:

Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека:

nothumb


Далее выполним push(1, 5). Создается новая вершина со значением 5, ссылающаяся на 1-ую:

nothumb


Аналогично выполним push(2, 10) и push(1, 6):

nothumb


Очевидно, что все 4 стека сейчас верно построены и легко восстанавливаются. Давайте теперь попробуем выполнить последовательно операции pop(2) и pop(3):

pop(2) возвращает 5 и копирует 1-ую вершину. Результирующий пятый стек — пустой.

nothumb


pop(3) возвращает 10 и копирует 2-ую вершину: получаем шестой стек.

nothumb


См. также

Ссылки