Постоянные структуры данных являются неизменными структурами данных. Операции над ними возвращают новую «копию» структуры данных, но измененную операцией; старая структура данных остается неизменной. Эффективность обычно достигается за счет совместного использования некоторых базовых данных и предотвращения полного копирования структуры данных.
Вопросов:
Есть ли результаты о классах структур данных, которые можно сделать постоянными (при сохранении тех же или очень похожих сложностей)?
Можно ли сделать все структуры данных постоянными (при сохранении одинаковых или очень похожих сложностей)?
Известно ли, что какие-либо структуры данных невозможно сделать постоянными (при сохранении тех же или очень похожих сложностей)?
Ответы:
Положительный результат: настойчивость не стоит слишком дорого. Можно показать, что каждая структура данных может быть сделана полностью постоянной с максимальным замедлением .O ( LGн )
Доказательство: вы можете взять массив и сделать его постоянным, используя стандартные структуры данных (например, сбалансированное бинарное дерево; более подробную информацию смотрите в конце этого ответа). Это приводит к замедлению : каждый доступ к массиву занимает время O ( lg n ) с постоянной структурой данных вместо времени O ( 1 ) для непостоянного массива. Теперь возьмем любой императивный алгоритм, время работы которого в модели ОЗУ равно O ( f ( n ) ) , где n обозначает объем используемой памяти. Представлять всю память как один большой массив (сO ( LGн ) O ( LGн ) O ( 1 ) O ( f( н ) ) N элементов), и сделайте его постоянным, используя постоянную карту. Каждый шаг императивного алгоритма влечет за собой самое большее O ( lg n ) замедление, поэтому общее время работы составляет O ( f ( n ) lg n ) .N O ( LGн ) O ( f( н ) LGн )
По-видимому, это можно сделать немного лучше: очевидно, можно уменьшить коэффициент замедления до (ожидаемое, амортизированное время), используя методы, приведенные ниже в статье Demaine, - но я не знаком с деталями этой работы, поэтому я не могу поручиться за это сам. Спасибо jbapple за это наблюдение.O ( LGЛ.Г.н )
Отрицательный результат: вы не можете избежать некоторого замедления для некоторых структур данных. Чтобы ответить на ваш третий вопрос, существуют структуры данных, в которых известно, что их постоянство приводит к некоторому замедлению.
В частности, рассмотрим массив из элементов. Без сохранения каждый доступ к массиву занимает O ( 1 ) времени (в модели RAM). С постоянством, по-видимому, было показано, что нет способа построить постоянный массив с O ( 1 ) наихудшей сложностью для доступа к случайному элементу. В частности, очевидно, что существует нижняя граница, показывающая, что у полностью постоянных массивов должно быть время доступа Ω ( lg lg n ) . Эта нижняя граница утверждается на стр.3 следующей статьи:N O ( 1 ) O ( 1 ) Ω ( lgЛ.Г.н )
Нижняя граница относится к Михаю Патраску, но нет упоминания об источнике, который подробно описывает доказательство этой утвержденной нижней границы.
Богатая область исследований. Если мы возьмем произвольную структуру данных или алгоритм, это немного деликатный вопрос, можете ли вы сделать его постоянным с максимальным замедлением или нет. Я не знаю ни одной общей классификационной теоремы. Тем не менее, существует множество исследований способов сделать конкретные структуры данных устойчивыми и эффективным способом.O ( 1 )
Существует также тесная связь с функциональными языками программирования. В частности, каждая структура данных, которая может быть реализована чисто функциональным способом (без мутаций), уже является постоянной структурой данных. (Увы, обратное утверждение не обязательно так.) Если вы хотите прищуриться, вы можете принять это за некоторую слабую теорему частичной классификации: если она реализуется в чисто функциональном языке программирования с теми же временными рамками, что и в императивный язык, то есть постоянная структура данных с теми же временными рамками, что и непостоянная. Я понимаю, что это, вероятно, не то, что вы искали - это, в основном, тривиальное перефразирование ситуации.
Вы можете найти больше объяснений, с красивыми картинками, на следующих ресурсах:
Прочитайте разделы, озаглавленные «Двоичные деревья поиска» и «Структуры произвольного доступа» (в частности, метод дерева), по адресу http://toves.org/books/persist/index.html .
Или прочитайте http://netcode.ru/dotnet/?artID=6592#BinaryTrees и некоторые последующие разделы.
Или прочитайте разделы, озаглавленные «Функциональные структуры данных» и «Копирование пути» (начиная с стр. 4) упомянутой выше статьи Demaine: http://erikdemaine.org/papers/ConfluentTries_Algorithmica/paper.pdf
Это даст вам основную идею. Есть дополнительные детали, о которых нужно позаботиться, но детали этого вопроса не входят в объем. К счастью, это все стандартные вещи, и в литературе доступно много информации о том, как строить такие структуры данных. Не стесняйтесь задавать отдельный вопрос, если вышеперечисленных ресурсов недостаточно, и вам нужна дополнительная информация о деталях построения структуры данных постоянного массива.
источник