Изменения

Перейти к: навигация, поиск

Персистентные структуры данных

572 байта добавлено, 22:23, 15 апреля 2015
Общий метод построения частично персистентных структур данных
==Общий метод построения частично персистентных структур данных==
  [[Файл:Частичная персистентность.png|мини|слева|600x400px| Пунктирные линии — обратные ссылки,<br> <tex>X</tex> — исходный узел, актуальный до версии <tex>10</tex>,<br> <tex>X'</tex> — склонированный узел, актуальный с версии <tex>11</tex>, с пустым списком изменений]]Применим методы, описанные выше, в общем случае для абстрактной структуры данных.  Пусть есть структура данных, у каждого узла которой количество указателей на этот узел не больше некоторой константы <tex>P</tex>. При клонировании узла, важно знать, откуда на этот узел идут указатели, чтобы затем их переставить. Поэтому необходимо в каждом узле хранить обратные ссылки на те узлы, которые ссылаются на клонируемый узел.
Все узлы будут храниться в виде «толстых» узлов, в которых содержится начальная версия этого узла и список внесенных в него изменений (англ. ''change log'') длиной не больше <tex>2P</tex>.
Пусть нужно внести изменение в структуру данных в узел <tex>X</tex>. Если есть место в списке изменений, просто вносим изменение туда. Если ''change log'' заполнен, то клонируем узел <tex>X</tex>: берем стартовую версию узла, производим в ней все изменения, записанные в ''change log'', добавляем последнее изменение и делаем версию со свободным списком изменений. Затем пройдем по обратным ссылкам от <tex>X</tex> и в ''change log'' каждого узла, ссылающегося на <tex>X</tex>, добавим изменение указателя начиная с этой версии структуры данных с <tex>X</tex> на <tex>X'</tex>.
[[ФайлПусть нужно внести изменение в структуру данных в узел <tex>X</tex>. Если есть место в списке изменений, просто вносим изменение туда: записываем номер версии, с которой начинается это изменение, в какое поле узла вносится изменение и какое именно. Если ''change log'' заполнен, то клонируем узел <tex>X</tex>:Частичная персистентностьберем стартовую версию узла, производим в ней все изменения, записанные в ''change log'', добавляем последнее изменение и делаем версию со свободным списком изменений. Затем пройдем по обратным ссылкам от <tex>X</tex> и в ''change log'' каждого узла, ссылающегося на <tex>X</tex>, добавим изменение указателя начиная с этой версии структуры данных с <tex>X</tex> на <tex>X'</tex>.png|700x500px]]
Оценим время работы этого алгоритма. Введем функцию потенциала, которая будет равна суммарному размеру всех списков изменений в последней версии. Посмотрим, как меняется суммарный размер списков изменений, когда мы совершаем одно изменение. Если ''change log'' был не полный, то мы просто добавляем туда один элемент, потенциал увеличится на единицу.
142
правки

Навигация