<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.178.21.24&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.178.21.24&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.178.21.24"/>
		<updated>2026-05-20T09:08:29Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D1%82%D0%B5%D0%BA&amp;diff=22716</id>
		<title>Персистентный стек</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D1%82%D0%B5%D0%BA&amp;diff=22716"/>
				<updated>2012-05-24T19:43:45Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.21.24: Отмена правки 22715 участника Yurik (обсуждение)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=Персистентными структурами данных называются такие структуры, что при всяком их изменении остается доступ ко всем предыдущим версиям этой структуры.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Рассмотрим такую структуру на примере стека.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Наивная реализация ==&lt;br /&gt;
&lt;br /&gt;
Самое простое и очевидное решение этой задачи —  честное копирование стека при каждой операции.  &amp;lt;br&amp;gt;&lt;br /&gt;
Очевидно, что это не самое эффективное решение. Сложность одной операции составляет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и количество требуемой памяти — &amp;lt;tex&amp;gt;O(n * n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Эффективная реализация ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Попробуем решить задачу эффективнее. Заведем массив указателей, ссылающихся на каждую версию стека. &lt;br /&gt;
&lt;br /&gt;
Вместо n копий стека будем хранить n первых элементов. Тогда операции push и pop будут иметь следующий вид:&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;push(x, i)&amp;lt;/tex&amp;gt; - создает новый элемент со значением x, который ссылается на элемент с номером i как на предыдущий элемент в стеке.&lt;br /&gt;
* &amp;lt;tex&amp;gt;pop(i)&amp;lt;/tex&amp;gt; - возвращает значение, хранящееся в элементе с номером i и копирует элемент, предыдущий для него.&lt;br /&gt;
Результирующие стеки будут иметь номер n + 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть изначально у нас есть один пустой стек. Для удобства, будем хранить его как «голову» с пометкой пустого стека:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:B5bb212f3702e565498c4412e13242a7.jpg|Картинка]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Далее выполним &amp;lt;tex&amp;gt;push(1, 5)&amp;lt;/tex&amp;gt;. Создается новая вершина со значением 5, ссылающаяся на 1-ую:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:612b6fe1562242b3a455b2abb698dfc9.jpg|nothumb]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Аналогично выполним &amp;lt;tex&amp;gt;push(2, 10)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;push(1, 6)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:2beb71892fd79b675e095d5432827d03.jpg|nothumb]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, что все 4 стека сейчас верно построены и легко восстанавливаются. Давайте теперь попробуем выполнить последовательно операции &amp;lt;tex&amp;gt;pop(2)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;pop(3)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;pop(2)&amp;lt;/tex&amp;gt; возвращает 5 и копирует 1-ую вершину. Результирующий пятый стек — пустой.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:3ab7456751529d76c5f1392d5d3b5fcb.jpg|nothumb]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;pop(3)&amp;lt;/tex&amp;gt; возвращает 10 и копирует 2-ую вершину: получаем шестой стек.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Eced2ebbcee643d6c87576b0d3460785.jpg|nothumb]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В итоге мы имеем доступ ко всем версиям стека за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; времени и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти (массив длины n и n самих &amp;quot;стеков&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== См. также==&lt;br /&gt;
&lt;br /&gt;
* [[Стек]]&lt;br /&gt;
* [[Персистентный дек]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/113585/ Персистентный стек - статья на хабре]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Структуры данных ]]&lt;/div&gt;</summary>
		<author><name>178.178.21.24</name></author>	</entry>

	</feed>