Саморасширяющийся массив — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «== Операции == Определим операции, которые мы будем применять к саморасширяющемуся массиву:…»)
 
(Стоимость операции add(x))
Строка 10: Строка 10:
 
:Возвращает значение i-ой ячейки массива. Время выполнения — <tex>O(1)</tex>.
 
:Возвращает значение i-ой ячейки массива. Время выполнения — <tex>O(1)</tex>.
 
== Стоимость операции add(x) ==
 
== Стоимость операции add(x) ==
Применим амортизационный анализ (конкретно — метод предоплаты) для того, чтобы доказать, что среднее время работы операции add(x) — O(1).
+
Применим амортизационный анализ (конкретно — метод предоплаты) для того, чтобы доказать, что среднее время работы операции add(x) — <tex>O(1)</tex>.
 
Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции add(x), при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили i-ый элемент, мы будем класть по одной монетке к элементам с номерами <tex>i</tex> и <tex>i-\frac{n}{2}</tex>). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции add(x) — 3, и среднее время её работы — <tex>O(1)</tex>.
 
Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции add(x), при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили i-ый элемент, мы будем класть по одной монетке к элементам с номерами <tex>i</tex> и <tex>i-\frac{n}{2}</tex>). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции add(x) — 3, и среднее время её работы — <tex>O(1)</tex>.

Версия 02:55, 29 марта 2011

Операции

Определим операции, которые мы будем применять к саморасширяющемуся массиву:

get(i)

Возвращает значение i-ой ячейки массива. Время выполнения — [math]O(1)[/math].

set(i,x)

В i-ую ячейку массива записывается элемент x. Время выполнения — [math]O(1)[/math].

add(x)

Добавление в массив элемента x. Время выполнения — [math]O(1)[/math]; в худшем случае, при котором необходимо перенести все элементы из текущего массива в вдвое больший массив — [math]O(n)[/math] (n — размер массива).

size

Возвращает значение i-ой ячейки массива. Время выполнения — [math]O(1)[/math].

Стоимость операции add(x)

Применим амортизационный анализ (конкретно — метод предоплаты) для того, чтобы доказать, что среднее время работы операции add(x) — [math]O(1)[/math]. Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции add(x), при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили i-ый элемент, мы будем класть по одной монетке к элементам с номерами [math]i[/math] и [math]i-\frac{n}{2}[/math]). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции add(x) — 3, и среднее время её работы — [math]O(1)[/math].