Положительный результат: настойчивость не стоит слишком дорого. Можно показать, что каждая структура данных может быть сделана полностью постоянной с максимальным замедлением .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 ) .NO ( LGн )O ( f( н ) LGн )
По-видимому, это можно сделать немного лучше: очевидно, можно уменьшить коэффициент замедления до (ожидаемое, амортизированное время), используя методы, приведенные ниже в статье Demaine, - но я не знаком с деталями этой работы, поэтому я не могу поручиться за это сам. Спасибо jbapple за это наблюдение.O ( LGЛ.Г.н )
Отрицательный результат: вы не можете избежать некоторого замедления для некоторых структур данных. Чтобы ответить на ваш третий вопрос, существуют структуры данных, в которых известно, что их постоянство приводит к некоторому замедлению.
В частности, рассмотрим массив из элементов. Без сохранения каждый доступ к массиву занимает O ( 1 ) времени (в модели RAM). С постоянством, по-видимому, было показано, что нет способа построить постоянный массив с O ( 1 ) наихудшей сложностью для доступа к случайному элементу. В частности, очевидно, что существует нижняя граница, показывающая, что у полностью постоянных массивов должно быть время доступа Ω ( lg lg n ) . Эта нижняя граница утверждается на стр.3 следующей статьи:NO ( 1 )O ( 1 )Ω ( lgЛ.Г.н )
Нижняя граница относится к Михаю Патраску, но нет упоминания об источнике, который подробно описывает доказательство этой утвержденной нижней границы.
Богатая область исследований. Если мы возьмем произвольную структуру данных или алгоритм, это немного деликатный вопрос, можете ли вы сделать его постоянным с максимальным замедлением или нет. Я не знаю ни одной общей классификационной теоремы. Тем не менее, существует множество исследований способов сделать конкретные структуры данных устойчивыми и эффективным способом.O ( 1 )
Существует также тесная связь с функциональными языками программирования. В частности, каждая структура данных, которая может быть реализована чисто функциональным способом (без мутаций), уже является постоянной структурой данных. (Увы, обратное утверждение не обязательно так.) Если вы хотите прищуриться, вы можете принять это за некоторую слабую теорему частичной классификации: если она реализуется в чисто функциональном языке программирования с теми же временными рамками, что и в императивный язык, то есть постоянная структура данных с теми же временными рамками, что и непостоянная. Я понимаю, что это, вероятно, не то, что вы искали - это, в основном, тривиальное перефразирование ситуации.
O ( LGн )
ℓdd
NO ( LGн )O ( LGн )O ( LGн )
Вы можете найти больше объяснений, с красивыми картинками, на следующих ресурсах:
Это даст вам основную идею. Есть дополнительные детали, о которых нужно позаботиться, но детали этого вопроса не входят в объем. К счастью, это все стандартные вещи, и в литературе доступно много информации о том, как строить такие структуры данных. Не стесняйтесь задавать отдельный вопрос, если вышеперечисленных ресурсов недостаточно, и вам нужна дополнительная информация о деталях построения структуры данных постоянного массива.