Персистентная очередь
Версия от 11:09, 7 июня 2013; Genyaz (обсуждение | вклад)
После того, как мы получили очередь в реальном времени с обычными стеками, ее можно легко превратить в персистентную, сделав все стеки персистентными, но реально можно ограничиться всего пятью персистентными стеками.
Эффективная реализация
По сравнению с реализацией на шести стеках, теперь у нас все стеки персистентные, а значит у нас нет необходимости хранить отдельно копию стека
, так как все его версии теперь доступны по его персистентности. Это позволяет нам заменить два стека на один стек , в который мы и будем записывать перекопированный кусок.Персистентная очередь будет состоять из пяти персистентных стеков:
, причем стеки используются для операций , стеки используются для операций , а стек используется для временного хранения содержимого стека .В каждый момент времени определено, какой стек
из стеков сейчас используется для операций , какой стек из стеков сейчас используется для операций , а также находится ли очередь в режиме перекопирования (recopy mode).В режиме перекопирования операции
перенаправляются в парный стек ; операции выполняются над последней персистентной версией , тогда операция всегда возвращает , так как стек содержит элементов, а в режиме перекопирования мы не можем извлечь их операцией .Для хранения последней персистентной версии
мы используем второй имеющийся стек , а также переменную — количество элементов, оставшихся в , оно уменьшается на с каждой следующей операцией .Режим перекопирования активируется, когда в стеке
становится больше элементов, чем в стеке . Пусть в стеке в этот момент находилось элементов, тогда в стеке находилось элементов. Заметим, что мы можем корректно обработать только запросов , операции и мы обрабатываем корректно всегда, следовательно мы должны закончить перекопирование за операцию, включая активирующую.Для заверешения перекопирования нужно:
- Переместить все содержимое стека в , операций.
- Переместить все содержимое стека в , операция.
- Переместить первые элементов стека в , а оставшиеся элементы выкинуть, операций.
- Обменять местами стеки и , операции.
Итого, мы должны сделать
дополнительных действия за операций, то есть выполняя дополнительных действия на операцию, мы сможем завершить перекопирование и вернуться в обычный режим до исчерпания стека , получив реального времени и памяти на персистентность на операцию.