SlideShare a Scribd company logo
Лекция 1
Амортизационный анализ
(amortized analysis)
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры иалгоритмы обработкиданных»
Сибирский государственныйуниверситет телекоммуникацийиинформатики (Новосибирск)
Осенний семестр, 2015
22
1. Определяем параметры алгоритма,
от которых зависит время его
выполнения
2. Выражаем количество операций,
выполняемых алгоритмом,
как функцию от его параметров
(для худшего, среднего или лучшего
случаев)
3. Строим асимптотическую оценку
вычислительной сложности
алгоритма – переходим к
асимптотическим обозначениям:
O, , 
n, m
T(n, m) = 2n2 + 4log2m
T(n, m) = O(2n2 + 4log2m)
= O(max{n2, log2m})
Анализ вычислительной сложности алгоритмов
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
3
Анализ сортировки выбором
(худший случай)
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
4
Анализ сортировки выбором
(худший случай)
1 операция
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
5
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
6
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
4 операции
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
7
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
4 операции
i = 1, j = 2 to n, n – 1 итер.
i = 2, j = 3 to n, n – 2 итер.
i = 3, j = 4 to n, n – 3 итер.
…
i = n – 1, j = n to n, 1 итер.
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
8
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
4 операции
T(n) = (n – 1) + 4 (n – 1) + 2((n – 1) + (n – 2) + … + 1) = ?
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
9
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
4 операции
T(n) = (n – 1) + 4 (n – 1) + 2((n – 1) + (n – 2) + … + 1) = ?
Сумма членов
арифметической прогрессии
T(n) = 5n – 5 + 2((n2 – n) / 2) = n2 + 4n – 5
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
10
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
4 операции
T(n) = n2 + 4n – 5 = O(n2)
function SelectionSort(v[1..n])
for i = 1 to n - 1 do
min = i
for j = i + 1 to n do
if v[j] < v[min] then
min = j
end if
end for
if min != i then
temp = v[i]
v[i] = v[min]
v[min] = temp
end if
end for
end function
11
Анализ сортировки выбором
(худший случай)
1 операция
2 операции
(худший случай – worst case)
4 операции
Бинарный счетчик (binary counter)
1212
 Счетчик имеет длину L бит (может принимать 2L значений)
 Поддерживает операцию Increment, которая увеличивает
его значение на единицу
 Начальное значение счетчика – 0
 Пример 5 разрядного счетчика:
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 0 0 0
Бинарный счетчик (binary counter)
1313
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 0 0 1
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 0 1 0
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 0 1 1
Increment: 1 → 2
Increment: 0 → 1
Increment: 2 → 3
Бинарный счетчик (binary counter)
1414
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 1 0 0
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 1 0 1
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 1 1 0
Increment: 4 → 5
Increment: 3 → 4
Increment: 5 → 6
Бинарный счетчик (binary counter)
15
function Increment(A)
i = 0
while i < L and A[i] = 1 do
A[i] = 0
i = i + 1
end while
if i < L then
A[i] = 1
end if
end function
15
Разряд 3 2 1 0
Вес 8 4 2 1
Значение 1 0 1 1
Заменяем начальную
последовательность
единиц нулями
(перенос в старший
разряд)
= 1110
Бинарный счетчик (binary counter)
16
function Increment(A)
i = 0
while i < L and A[i] = 1 do
A[i] = 0
i = i + 1
end while
if i < L then
A[i] = 1
end if
end function
16
Разряд 3 2 1 0
Вес 8 4 2 1
Значение 1 0 1 1 = 1110
 При каждом вызове
функции Increment
время ее работы разное
 Время зависит от внутреннего
состояния – значений A[1..L]
Бинарный счетчик (binary counter)
17
function Increment(A)
i = 0
while i < L and A[i] = 1 do
A[i] = 0
i = i + 1
end while
if i < L then
A[i] = 1
end if
end function
17
 При каждом вызове
функции Increment
время ее работы разное
 Время зависит от внутреннего
состояния – значений A[1..L]
Вычислительная сложность функции Increment?
Бинарный счетчик (binary counter)
18
 В худшем случае массив A[1..L] состоит только из единиц,
для выполнения операции Increment требуется время O(L)
 Это пессимистическая оценка!
 При каждом вызове функции Increment время ее работы
разное
18
Как анализировать вычислительную сложность алгоритмов
время, выполнения которых зависит
от их внутреннего состояния?
Амортизационный анализ
19
 Амортизационный анализ (amortized analysis) –
метод анализа алгоритмов, позволяющий осуществлять
оценку времени выполнения последовательности из n
операций над некоторой структурой данных
 Время выполнения усредняется по всем n операциям,
и оценивается среднее время выполнения одной операции
в худшем случае
19
Амортизационный анализ
20
 Некоторые операции структуры данных могут иметь
высокую вычислительную сложность, другие низкую
 Например, некоторая операция может подготавливать
структуру данных для быстрого выполнения других
операций
 Такие «тяжелые» операции выполняются редко и могут
оказывать незначительное влияние на суммарное время
выполнения последовательности из n операций
20
Амортизационный анализ
21
 Амортизационный анализ возник из группового анализа
(aggregate analysis)
 Введен в практику Робертом Тарьяном (Robert Tarjan)
в 1985 году:
Tarjan R. Amortized Computational Complexity //
SIAM. J. on Algebraic and Discrete Methods, 6(2), 1985.
– P. 306–318.
21
Методы амортизационного анализа
22
 Групповой анализ (aggregate analysis)
 Метод бухгалтерскогоучета (accountingmethod)
 Метод потенциалов(potential method)
Все методы позволяют получить одну и ту же
оценку, но разными способами
[CLRS ed., С. 487]
22
Групповой анализ (аggregate analysis)
23
 Групповой анализ (aggregate analysis) –
метод амортизационного анализа, позволяющий
оценивать верхнюю границу времени T(n) выполнения
последовательности из n операций в худшем случае
 Амортизированная стоимость (amortized cost, учетная
стоимость) выполнения одной операции определяется как
T(n) / n
 Амортизированная стоимость операции – это оценка
сверху среднего времени выполнения операции в худшем
случае
23
Стековые операции (Last In – First Out)
2424
Push(S, x)
x
TPush = O(1)
Pop(S)
TPop = O(1)
MultiPop(S, k)
TMultiPop = O(min(|S|, k))
k
function MultiPop(S, k)
while StackEmpty(S) = False and k > 0 do
StackPop(S)
k = k – 1
end while
end function
Стековые операции (Last In – First Out)
25
TMultiPop = O(min(|S|, k))
15
4
22
78
34
12
Top →
34
12
Top →
→ MultiPop(S, 4) → → MultiPop(S, 7) →
Групповой анализ стековых операций v1.0
26
 Методом группового анализа оценим верхнюю границу
времени T(n) выполнения произвольной последовательности
из n стековых операций (Push, Pop, MultiPop)
1. Стоимость операции Pop равна O(1)
2. Стоимость операции Push равна O(1)
3. Стоимость операции MultiPop в худшем случае O(n),
так как в ходе выполнения n операций в стеке не может
находится более n объектов
 В худшем случае последовательность из n операций может
содержать только операции MultiPop
 Тогда, суммарное время T(n) выполнения n операций есть O(n2),
а амортизированная стоимость одной операции
O(n2) / n = O(n)
26Грубая оценка сверху
Групповой анализ стековых операций v2.0
27
 Получим более точную оценку сверху времени T(n) выполнения
произвольной последовательности из n стековых операций
1. Количество операций Pop (включая вызовы из MultiPop)
не превышает количества операций Push. В свою очередь,
число операций Push не превышает n (операция MultiPop
реализована на базе Pop)
2. Таким образом для выполнения произвольной
последовательности из n операций Push, Pop, MultiPop
требуется время O(n)
 Суммарное время выполнения n операций в худшем случае есть
O(n), тогда амортизированная стоимость (средняя стоимость)
одной операции над стеком есть
O(n) / n = O(1)
27
Групповой анализ стековых операций: вопрос
28
Останется ли справедливой оценка
амортизированной стоимости стековых
операций, равная О(1), если включить в
множество стековых операций операцию
MultiPush(S, k), помещающую в стек k
элементов?
28
MultiPush(S, k)
k
TMultiPush = O(k)
Групповой анализ стековых операций: ответ
29
Ответ – нет
Оценка амортизированной стоимости одной
стековой операций станет O(k)
 В последовательности из n стековых
операций может быть n операций
MultiPush, что требует времени O(nk)
 Тогда амортизированная стоимость
(средняя стоимость) одной стековой
операции T(n) / n = O(nk) / n = O(k) 29
MultiPush(S, k)
k
Бинарный счетчик (binary counter)
3030
 Счетчик имеет длину L бит (может принимать 2L значений)
 Поддерживает операцию Increment
 Пример 5 битный счетчик
o Значение счетчика 1, битовая последовательность: 00001
o Значение счетчика 3, битовая последовательность: 00011
o Значение счетчика 4, битовая последовательность: 00100
o Значение счетчика 5, битовая последовательность: 00101
o Значение счетчика 10, битовая последовательность: 01010
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 1 1 0 0
function Increment(A)
i = 0
while i < L and A[i] = 1 do
A[i] = 0
i = i + 1
end while
if i < L then
A[i] = 1
end if
end function
Бинарный счетчик (binary counter)
3131
 При каждом вызове функции
Increment время ее работы
разное
 Время работы зависит от
внутреннего состояния –
значений A
Разряд 3 2 1 0
Вес 8 4 2 1
Значение 1 0 1 1
Бинарный счетчик (binary counter)
Бинарный счетчик (L = 8 бит)
Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость
(# операций)
Суммарная
стоимость
1 0
…
0 0 0 0 1 1 1
2 0 0 0 0 1 0 2 3
3 0 0 0 0 1 1 1 4
4 0 0 0 1 0 0 3 7
5 0 0 0 1 0 1 1 8
6 0 0 0 1 1 0 2 10
7 0 0 0 1 1 1 1 11
8 0 0 1 0 0 0 4 15
9 0 0 1 0 0 1 1 16
10 0 0 1 0 1 0 2 18
11 0 0 1 0 1 1 1 19
12 0 0 1 1 0 0 3 22
13 0 0 1 1 0 1 1 23
14 0 0 1 1 1 0 2 25
15 0 0 1 1 1 1 1 26
16 0 1 0 0 0 0 5 31
Бинарный счетчик (binary counter)
Бинарный счетчик (L = 8 бит)
Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость
(# операций)
Суммарная
стоимость
1 0
…
0 0 0 0 1 1 1
2 0 0 0 0 1 0 2 3
3 0 0 0 0 1 1 1 4
4 0 0 0 1 0 0 3 7
5 0 0 0 1 0 1 1 8
6 0 0 0 1 1 0 2 10
7 0 0 0 1 1 1 1 11
8 0 0 1 0 0 0 4 15
9 0 0 1 0 0 1 1 16
10 0 0 1 0 1 0 2 18
11 0 0 1 0 1 1 1 19
12 0 0 1 1 0 0 3 22
13 0 0 1 1 0 1 1 23
14 0 0 1 1 1 0 2 25
15 0 0 1 1 1 1 1 26
16 0 1 0 0 0 0 5 31
Какова амортизированная стоимостьвыполнения
функции Increment (среднее время в худшемслучае)?
Бинарный счетчик (binary counter)
Бинарный счетчик (L = 8 бит)
Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость
(# операций)
Суммарная
стоимость
1 0
…
0 0 0 0 1 1 1
2 0 0 0 0 1 0 2 3
3 0 0 0 0 1 1 1 4
4 0 0 0 1 0 0 3 7
5 0 0 0 1 0 1 1 8
6 0 0 0 1 1 0 2 10
7 0 0 0 1 1 1 1 11
8 0 0 1 0 0 0 4 15
9 0 0 1 0 0 1 1 16
10 0 0 1 0 1 0 2 18
11 0 0 1 0 1 1 1 19
12 0 0 1 1 0 0 3 22
13 0 0 1 1 0 1 1 23
14 0 0 1 1 1 0 2 25
15 0 0 1 1 1 1 1 26
16 0 1 0 0 0 0 5 31
 Оценим сверху время T(n) выполнения
n операций Increment
 Тогда амортизированная стоимостьоперации
Increment (среднее время выполнения) будет
T(n) / n
Бинарный счетчик (binary counter)
Бинарный счетчик (L = 8 бит)
Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость Суммарная
стоимость
1 0
…
0 0 0 0 1 1 1
2 0 0 0 0 1 0 2 3
3 0 0 0 0 1 1 1 4
4 0 0 0 1 0 0 3 7
5 0 0 0 1 0 1 1 8
6 0 0 0 1 1 0 2 10
7 0 0 0 1 1 1 1 11
8 0 0 1 0 0 0 4 15
9 0 0 1 0 0 1 1 16
10 0 0 1 0 1 0 2 18
11 0 0 1 0 1 1 1 19
12 0 0 1 1 0 0 3 22
13 0 0 1 1 0 1 1 23
14 0 0 1 1 1 0 2 25
15 0 0 1 1 1 1 1 26
16 0 1 0 0 0 0 5 31
Можно заметить,
что время выполнения n операций
2n ≥ T(n)n T(n)
Бинарный счетчик (binary counter)
Бинарный счетчик (L = 8 бит)
Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость Суммарная
стоимость
1 0
…
0 0 0 0 1 1 1
2 0 0 0 0 1 0 2 3
3 0 0 0 0 1 1 1 4
4 0 0 0 1 0 0 3 7
5 0 0 0 1 0 1 1 8
6 0 0 0 1 1 0 2 10
7 0 0 0 1 1 1 1 11
8 0 0 1 0 0 0 4 15
9 0 0 1 0 0 1 1 16
10 0 0 1 0 1 0 2 18
11 0 0 1 0 1 1 1 19
12 0 0 1 1 0 0 3 22
13 0 0 1 1 0 1 1 23
14 0 0 1 1 1 0 2 25
15 0 0 1 1 1 1 1 26
16 0 1 0 0 0 0 5 31
 Бит 0 изменяется n раз
(при каждомвызове Increment)
 Бит 1: 𝑛/2 раз
 Бит 2: 𝑛/4 раз
 …
 Бит L-1 изменяется 𝑛/2 𝐿−1
раз
𝑇 𝑛 = 𝑛 +
𝑛
2
+
𝑛
4
+ ⋯ +
𝑛
2 𝐿−1 =
= 𝑛 + 𝑛 = 2𝑛
Бинарный счетчик (binary counter)
Бинарный счетчик (L = 8 бит)
Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость Суммарная
стоимость
1 0
…
0 0 0 0 1 1 1
2 0 0 0 0 1 0 2 3
3 0 0 0 0 1 1 1 4
4 0 0 0 1 0 0 3 7
5 0 0 0 1 0 1 1 8
6 0 0 0 1 1 0 2 10
7 0 0 0 1 1 1 1 11
8 0 0 1 0 0 0 4 15
9 0 0 1 0 0 1 1 16
10 0 0 1 0 1 0 2 18
11 0 0 1 0 1 1 1 19
12 0 0 1 1 0 0 3 22
13 0 0 1 1 0 1 1 23
14 0 0 1 1 1 0 2 25
15 0 0 1 1 1 1 1 26
16 0 1 0 0 0 0 5 31
Средняя (амортизированная) стоимость
одной операции Increment
O(n) / n = O(1)
Динамические таблицы (dynamic tables)
3838
 Динамическая таблица (Dynamic table, dynamic array,
growable array) – это массив поддерживающий вставку
и удаление элементов и динамически изменяющий
свой размер до необходимого значения
 Поддерживаемые операции
o Insert(T, x)
o Delete(T, x)
o Size – количество свободных ячеек
o k – количество элементов
добавленных в массив
Size
k
Динамические таблицы (dynamic tables)
39
 При выполнении операции Insert размер массива увеличивается
 Как увеличивать размер массива?
 Аддитивная схема – текущий размер массива увеличивается
на k ячеек (по арифметической прогрессии)
 Мультипликативная схема – текущий размер массива
увеличивается в k раз (по геометрической прогрессии)
 Примеры реализации:
o С++: std::vector
o Java: ArrayList
o .NET 2.0: List<>
o Python: list
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
x2
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
x2
x3
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
x2
x3
x4
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
x2
x3
x5
x4
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
x2
x3
x6
x5
x4
Динамические таблицы (dynamic tables)
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
x1
x2
x3
x7
x6
x5
x4
Динамические таблицы (dynamic tables)
4848
Проведем амортизационный анализ времени T(n)
выполнения последовательности из n операций Insert
 Время работы операции Insert зависит
от состояния таблицы: количества k
элементов и её размера Size
 Будем учитывать только операции
записи элементов в таблицу
Table[k] = x
Size
k
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if k = Size then
Size = Size * 2
NewTable = AllocateMemory(Size)
for i = 0 to k – 1 do
NewTable[i] = Table[i]
end for
FreeMemory(Table)
Table = NewTable
end if
Table[k] = x
k = k + 1
end function
Амортизационный анализ операции Insert
 Первый вызов
Insert – 1 операция
 Второй вызов –
2 оп. (Copy 1 + Write 1)
 Третий – 3 оп.
(Copy 2 + Write 1)
 Четвертый – 1 оп.
 Пятый – 5 оп.
(Copy 4 + Write 1)
 …
Амортизационный анализ операции Insert
5050
 Обозначим через ci количество операции, выполняемых
на i-ом вызове Insert
𝑐𝑖 =
𝑖, если 𝑖 − 1 степень 2,
1, иначе.
 Тогда оценка сверху времени T(n) выполнения
n операций Insert есть
𝑇 𝑛 = 𝑐1 + 𝑐2 + ⋯ + 𝑐 𝑛 ≤ 𝑛 + 20
+ 21
+ 22
+ ⋯+ 2 log2 𝑛
𝑇(𝑛) < 𝑛 + 2𝑛 = 3𝑛
5151
 Оценка сверху амортизированной сложности одной
операции Insert есть
𝑇𝐼𝑛𝑠𝑒𝑟𝑡 =
𝑇 𝑛
𝑛
=
3𝑛
𝑛
= 3 = 𝑶(𝟏)
Среднее время выполнения (вычислительная сложность)
одной операции Insert в худшем случае есть O(1)
Амортизационный анализ операции Insert
function AddToBuffer(value)
Count = Count + 1
Buffer[Count] = value
if Count = H then
for i = 1 to H do
Packet[i] = Buffer[i]
end for
Count = 0
end if
end function
Обработчик с накопителем
5252
Обработчик с накопителем
5353
 Построить оценку сверху времени T(n)
выполнения n операций AddToBuffer
 Оценить амортизированную сложность
функции AddToBuffer
Амортизационный анализ операции AddToBuffer
5454
 Обозначим через ci количество операции, выполняемых
на i-ом вызове AddToBuffer
𝑐𝑖 =
𝐻 + 3, если 𝑖 % 𝐻 = 0,
2, иначе.
 Тогда оценка сверху времени T(n) выполнения n
операций AddToBuffer есть
𝑇 𝑛 = 𝑐1 + 𝑐2 + ⋯ + 𝑐 𝑛 < 2𝑛 +
𝑛 3 + 𝐻
𝐻
< 2𝑛 + 3𝑛 + 𝐻
= 5𝑛 + 𝐻
𝑇 𝑛 = 𝑂 5𝑛 + 𝐻 = 𝑂(𝑛 + 𝐻)
Амортизационный анализ операции AddToBuffer
5555
 Оценка сверху времени T(n) выполнения n операций
AddToBuffer
𝑇 𝑛 = 𝑂 5𝑛 + 𝐻 = 𝑂 𝑛 + 𝐻
 Амортизированная стоимость (сложность) одной
операции AddToBuffer
𝑇 𝑛
𝑛
=
5𝑛 + 𝐻
𝑛
= 𝑂 1
Задание
56
 Прочитать в [CLRS 3ed., С. 487]:
o 17.2 Метод бухгалтерского учета
o 17.3 Метод потенциалов
Кормен Т.Х., Лейзерсон Ч.И., Ривест Р.Л., Штайн К.
Алгоритмы: построение и анализ.
– 3-е изд. – М.: Вильямс, 2013. – 1328 с.

More Related Content

What's hot

Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Technopark
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Mikhail Kurnosov
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Оценка сложности алгоритма
Оценка сложности алгоритмаОценка сложности алгоритма
Оценка сложности алгоритма
Нижегородский институт управления
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
Mikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Mikhail Kurnosov
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
Mikhail Kurnosov
 
Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
Theoretical mechanics department
 
Основы SciPy
Основы SciPyОсновы SciPy
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Technopark
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
Mikhail Kurnosov
 

What's hot (20)

Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Оценка сложности алгоритма
Оценка сложности алгоритмаОценка сложности алгоритма
Оценка сложности алгоритма
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Алгоритмы поиска
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)
 
Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 

Viewers also liked

Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Mikhail Kurnosov
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыMikhail Kurnosov
 

Viewers also liked (6)

Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицы
 

Similar to Лекция 1. Амортизационный анализ (amortized analysis)

Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
Fedor Tsarev
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Mikhail Kurnosov
 
практика 3
практика 3практика 3
практика 3student_kai
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функций
simple_people
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
сортировка массива
сортировка массивасортировка массива
сортировка массиваlonge7
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
husniyarova
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование цикловstudent_kai
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliaminComputer Science Club
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
Fedor Tsarev
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 

Similar to Лекция 1. Амортизационный анализ (amortized analysis) (20)

Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
Algo 01 part01
Algo 01 part01Algo 01 part01
Algo 01 part01
 
практика 3
практика 3практика 3
практика 3
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функций
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
сортировка массива
сортировка массивасортировка массива
сортировка массива
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
Цикл
Цикл Цикл
Цикл
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование циклов
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 

More from Mikhail Kurnosov

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
Mikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Mikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
Mikhail Kurnosov
 

More from Mikhail Kurnosov (19)

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 

Лекция 1. Амортизационный анализ (amortized analysis)

  • 1. Лекция 1 Амортизационный анализ (amortized analysis) Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры иалгоритмы обработкиданных» Сибирский государственныйуниверситет телекоммуникацийиинформатики (Новосибирск) Осенний семестр, 2015
  • 2. 22 1. Определяем параметры алгоритма, от которых зависит время его выполнения 2. Выражаем количество операций, выполняемых алгоритмом, как функцию от его параметров (для худшего, среднего или лучшего случаев) 3. Строим асимптотическую оценку вычислительной сложности алгоритма – переходим к асимптотическим обозначениям: O, ,  n, m T(n, m) = 2n2 + 4log2m T(n, m) = O(2n2 + 4log2m) = O(max{n2, log2m}) Анализ вычислительной сложности алгоритмов
  • 3. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 3 Анализ сортировки выбором (худший случай)
  • 4. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 4 Анализ сортировки выбором (худший случай) 1 операция
  • 5. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 5 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case)
  • 6. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 6 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case) 4 операции
  • 7. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 7 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case) 4 операции i = 1, j = 2 to n, n – 1 итер. i = 2, j = 3 to n, n – 2 итер. i = 3, j = 4 to n, n – 3 итер. … i = n – 1, j = n to n, 1 итер.
  • 8. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 8 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case) 4 операции T(n) = (n – 1) + 4 (n – 1) + 2((n – 1) + (n – 2) + … + 1) = ?
  • 9. function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 9 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case) 4 операции T(n) = (n – 1) + 4 (n – 1) + 2((n – 1) + (n – 2) + … + 1) = ? Сумма членов арифметической прогрессии
  • 10. T(n) = 5n – 5 + 2((n2 – n) / 2) = n2 + 4n – 5 function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 10 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case) 4 операции
  • 11. T(n) = n2 + 4n – 5 = O(n2) function SelectionSort(v[1..n]) for i = 1 to n - 1 do min = i for j = i + 1 to n do if v[j] < v[min] then min = j end if end for if min != i then temp = v[i] v[i] = v[min] v[min] = temp end if end for end function 11 Анализ сортировки выбором (худший случай) 1 операция 2 операции (худший случай – worst case) 4 операции
  • 12. Бинарный счетчик (binary counter) 1212  Счетчик имеет длину L бит (может принимать 2L значений)  Поддерживает операцию Increment, которая увеличивает его значение на единицу  Начальное значение счетчика – 0  Пример 5 разрядного счетчика: Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 0 0 0
  • 13. Бинарный счетчик (binary counter) 1313 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 0 0 1 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 0 1 0 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 0 1 1 Increment: 1 → 2 Increment: 0 → 1 Increment: 2 → 3
  • 14. Бинарный счетчик (binary counter) 1414 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 1 0 0 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 1 0 1 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 1 1 0 Increment: 4 → 5 Increment: 3 → 4 Increment: 5 → 6
  • 15. Бинарный счетчик (binary counter) 15 function Increment(A) i = 0 while i < L and A[i] = 1 do A[i] = 0 i = i + 1 end while if i < L then A[i] = 1 end if end function 15 Разряд 3 2 1 0 Вес 8 4 2 1 Значение 1 0 1 1 Заменяем начальную последовательность единиц нулями (перенос в старший разряд) = 1110
  • 16. Бинарный счетчик (binary counter) 16 function Increment(A) i = 0 while i < L and A[i] = 1 do A[i] = 0 i = i + 1 end while if i < L then A[i] = 1 end if end function 16 Разряд 3 2 1 0 Вес 8 4 2 1 Значение 1 0 1 1 = 1110  При каждом вызове функции Increment время ее работы разное  Время зависит от внутреннего состояния – значений A[1..L]
  • 17. Бинарный счетчик (binary counter) 17 function Increment(A) i = 0 while i < L and A[i] = 1 do A[i] = 0 i = i + 1 end while if i < L then A[i] = 1 end if end function 17  При каждом вызове функции Increment время ее работы разное  Время зависит от внутреннего состояния – значений A[1..L] Вычислительная сложность функции Increment?
  • 18. Бинарный счетчик (binary counter) 18  В худшем случае массив A[1..L] состоит только из единиц, для выполнения операции Increment требуется время O(L)  Это пессимистическая оценка!  При каждом вызове функции Increment время ее работы разное 18 Как анализировать вычислительную сложность алгоритмов время, выполнения которых зависит от их внутреннего состояния?
  • 19. Амортизационный анализ 19  Амортизационный анализ (amortized analysis) – метод анализа алгоритмов, позволяющий осуществлять оценку времени выполнения последовательности из n операций над некоторой структурой данных  Время выполнения усредняется по всем n операциям, и оценивается среднее время выполнения одной операции в худшем случае 19
  • 20. Амортизационный анализ 20  Некоторые операции структуры данных могут иметь высокую вычислительную сложность, другие низкую  Например, некоторая операция может подготавливать структуру данных для быстрого выполнения других операций  Такие «тяжелые» операции выполняются редко и могут оказывать незначительное влияние на суммарное время выполнения последовательности из n операций 20
  • 21. Амортизационный анализ 21  Амортизационный анализ возник из группового анализа (aggregate analysis)  Введен в практику Робертом Тарьяном (Robert Tarjan) в 1985 году: Tarjan R. Amortized Computational Complexity // SIAM. J. on Algebraic and Discrete Methods, 6(2), 1985. – P. 306–318. 21
  • 22. Методы амортизационного анализа 22  Групповой анализ (aggregate analysis)  Метод бухгалтерскогоучета (accountingmethod)  Метод потенциалов(potential method) Все методы позволяют получить одну и ту же оценку, но разными способами [CLRS ed., С. 487] 22
  • 23. Групповой анализ (аggregate analysis) 23  Групповой анализ (aggregate analysis) – метод амортизационного анализа, позволяющий оценивать верхнюю границу времени T(n) выполнения последовательности из n операций в худшем случае  Амортизированная стоимость (amortized cost, учетная стоимость) выполнения одной операции определяется как T(n) / n  Амортизированная стоимость операции – это оценка сверху среднего времени выполнения операции в худшем случае 23
  • 24. Стековые операции (Last In – First Out) 2424 Push(S, x) x TPush = O(1) Pop(S) TPop = O(1) MultiPop(S, k) TMultiPop = O(min(|S|, k)) k
  • 25. function MultiPop(S, k) while StackEmpty(S) = False and k > 0 do StackPop(S) k = k – 1 end while end function Стековые операции (Last In – First Out) 25 TMultiPop = O(min(|S|, k)) 15 4 22 78 34 12 Top → 34 12 Top → → MultiPop(S, 4) → → MultiPop(S, 7) →
  • 26. Групповой анализ стековых операций v1.0 26  Методом группового анализа оценим верхнюю границу времени T(n) выполнения произвольной последовательности из n стековых операций (Push, Pop, MultiPop) 1. Стоимость операции Pop равна O(1) 2. Стоимость операции Push равна O(1) 3. Стоимость операции MultiPop в худшем случае O(n), так как в ходе выполнения n операций в стеке не может находится более n объектов  В худшем случае последовательность из n операций может содержать только операции MultiPop  Тогда, суммарное время T(n) выполнения n операций есть O(n2), а амортизированная стоимость одной операции O(n2) / n = O(n) 26Грубая оценка сверху
  • 27. Групповой анализ стековых операций v2.0 27  Получим более точную оценку сверху времени T(n) выполнения произвольной последовательности из n стековых операций 1. Количество операций Pop (включая вызовы из MultiPop) не превышает количества операций Push. В свою очередь, число операций Push не превышает n (операция MultiPop реализована на базе Pop) 2. Таким образом для выполнения произвольной последовательности из n операций Push, Pop, MultiPop требуется время O(n)  Суммарное время выполнения n операций в худшем случае есть O(n), тогда амортизированная стоимость (средняя стоимость) одной операции над стеком есть O(n) / n = O(1) 27
  • 28. Групповой анализ стековых операций: вопрос 28 Останется ли справедливой оценка амортизированной стоимости стековых операций, равная О(1), если включить в множество стековых операций операцию MultiPush(S, k), помещающую в стек k элементов? 28 MultiPush(S, k) k TMultiPush = O(k)
  • 29. Групповой анализ стековых операций: ответ 29 Ответ – нет Оценка амортизированной стоимости одной стековой операций станет O(k)  В последовательности из n стековых операций может быть n операций MultiPush, что требует времени O(nk)  Тогда амортизированная стоимость (средняя стоимость) одной стековой операции T(n) / n = O(nk) / n = O(k) 29 MultiPush(S, k) k
  • 30. Бинарный счетчик (binary counter) 3030  Счетчик имеет длину L бит (может принимать 2L значений)  Поддерживает операцию Increment  Пример 5 битный счетчик o Значение счетчика 1, битовая последовательность: 00001 o Значение счетчика 3, битовая последовательность: 00011 o Значение счетчика 4, битовая последовательность: 00100 o Значение счетчика 5, битовая последовательность: 00101 o Значение счетчика 10, битовая последовательность: 01010 Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 1 1 0 0
  • 31. function Increment(A) i = 0 while i < L and A[i] = 1 do A[i] = 0 i = i + 1 end while if i < L then A[i] = 1 end if end function Бинарный счетчик (binary counter) 3131  При каждом вызове функции Increment время ее работы разное  Время работы зависит от внутреннего состояния – значений A Разряд 3 2 1 0 Вес 8 4 2 1 Значение 1 0 1 1
  • 32. Бинарный счетчик (binary counter) Бинарный счетчик (L = 8 бит) Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость (# операций) Суммарная стоимость 1 0 … 0 0 0 0 1 1 1 2 0 0 0 0 1 0 2 3 3 0 0 0 0 1 1 1 4 4 0 0 0 1 0 0 3 7 5 0 0 0 1 0 1 1 8 6 0 0 0 1 1 0 2 10 7 0 0 0 1 1 1 1 11 8 0 0 1 0 0 0 4 15 9 0 0 1 0 0 1 1 16 10 0 0 1 0 1 0 2 18 11 0 0 1 0 1 1 1 19 12 0 0 1 1 0 0 3 22 13 0 0 1 1 0 1 1 23 14 0 0 1 1 1 0 2 25 15 0 0 1 1 1 1 1 26 16 0 1 0 0 0 0 5 31
  • 33. Бинарный счетчик (binary counter) Бинарный счетчик (L = 8 бит) Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость (# операций) Суммарная стоимость 1 0 … 0 0 0 0 1 1 1 2 0 0 0 0 1 0 2 3 3 0 0 0 0 1 1 1 4 4 0 0 0 1 0 0 3 7 5 0 0 0 1 0 1 1 8 6 0 0 0 1 1 0 2 10 7 0 0 0 1 1 1 1 11 8 0 0 1 0 0 0 4 15 9 0 0 1 0 0 1 1 16 10 0 0 1 0 1 0 2 18 11 0 0 1 0 1 1 1 19 12 0 0 1 1 0 0 3 22 13 0 0 1 1 0 1 1 23 14 0 0 1 1 1 0 2 25 15 0 0 1 1 1 1 1 26 16 0 1 0 0 0 0 5 31 Какова амортизированная стоимостьвыполнения функции Increment (среднее время в худшемслучае)?
  • 34. Бинарный счетчик (binary counter) Бинарный счетчик (L = 8 бит) Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость (# операций) Суммарная стоимость 1 0 … 0 0 0 0 1 1 1 2 0 0 0 0 1 0 2 3 3 0 0 0 0 1 1 1 4 4 0 0 0 1 0 0 3 7 5 0 0 0 1 0 1 1 8 6 0 0 0 1 1 0 2 10 7 0 0 0 1 1 1 1 11 8 0 0 1 0 0 0 4 15 9 0 0 1 0 0 1 1 16 10 0 0 1 0 1 0 2 18 11 0 0 1 0 1 1 1 19 12 0 0 1 1 0 0 3 22 13 0 0 1 1 0 1 1 23 14 0 0 1 1 1 0 2 25 15 0 0 1 1 1 1 1 26 16 0 1 0 0 0 0 5 31  Оценим сверху время T(n) выполнения n операций Increment  Тогда амортизированная стоимостьоперации Increment (среднее время выполнения) будет T(n) / n
  • 35. Бинарный счетчик (binary counter) Бинарный счетчик (L = 8 бит) Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость Суммарная стоимость 1 0 … 0 0 0 0 1 1 1 2 0 0 0 0 1 0 2 3 3 0 0 0 0 1 1 1 4 4 0 0 0 1 0 0 3 7 5 0 0 0 1 0 1 1 8 6 0 0 0 1 1 0 2 10 7 0 0 0 1 1 1 1 11 8 0 0 1 0 0 0 4 15 9 0 0 1 0 0 1 1 16 10 0 0 1 0 1 0 2 18 11 0 0 1 0 1 1 1 19 12 0 0 1 1 0 0 3 22 13 0 0 1 1 0 1 1 23 14 0 0 1 1 1 0 2 25 15 0 0 1 1 1 1 1 26 16 0 1 0 0 0 0 5 31 Можно заметить, что время выполнения n операций 2n ≥ T(n)n T(n)
  • 36. Бинарный счетчик (binary counter) Бинарный счетчик (L = 8 бит) Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость Суммарная стоимость 1 0 … 0 0 0 0 1 1 1 2 0 0 0 0 1 0 2 3 3 0 0 0 0 1 1 1 4 4 0 0 0 1 0 0 3 7 5 0 0 0 1 0 1 1 8 6 0 0 0 1 1 0 2 10 7 0 0 0 1 1 1 1 11 8 0 0 1 0 0 0 4 15 9 0 0 1 0 0 1 1 16 10 0 0 1 0 1 0 2 18 11 0 0 1 0 1 1 1 19 12 0 0 1 1 0 0 3 22 13 0 0 1 1 0 1 1 23 14 0 0 1 1 1 0 2 25 15 0 0 1 1 1 1 1 26 16 0 1 0 0 0 0 5 31  Бит 0 изменяется n раз (при каждомвызове Increment)  Бит 1: 𝑛/2 раз  Бит 2: 𝑛/4 раз  …  Бит L-1 изменяется 𝑛/2 𝐿−1 раз 𝑇 𝑛 = 𝑛 + 𝑛 2 + 𝑛 4 + ⋯ + 𝑛 2 𝐿−1 = = 𝑛 + 𝑛 = 2𝑛
  • 37. Бинарный счетчик (binary counter) Бинарный счетчик (L = 8 бит) Знач. A[7] … A[4] A[3] A[2] A[1] A[0] Стоимость Суммарная стоимость 1 0 … 0 0 0 0 1 1 1 2 0 0 0 0 1 0 2 3 3 0 0 0 0 1 1 1 4 4 0 0 0 1 0 0 3 7 5 0 0 0 1 0 1 1 8 6 0 0 0 1 1 0 2 10 7 0 0 0 1 1 1 1 11 8 0 0 1 0 0 0 4 15 9 0 0 1 0 0 1 1 16 10 0 0 1 0 1 0 2 18 11 0 0 1 0 1 1 1 19 12 0 0 1 1 0 0 3 22 13 0 0 1 1 0 1 1 23 14 0 0 1 1 1 0 2 25 15 0 0 1 1 1 1 1 26 16 0 1 0 0 0 0 5 31 Средняя (амортизированная) стоимость одной операции Increment O(n) / n = O(1)
  • 38. Динамические таблицы (dynamic tables) 3838  Динамическая таблица (Dynamic table, dynamic array, growable array) – это массив поддерживающий вставку и удаление элементов и динамически изменяющий свой размер до необходимого значения  Поддерживаемые операции o Insert(T, x) o Delete(T, x) o Size – количество свободных ячеек o k – количество элементов добавленных в массив Size k
  • 39. Динамические таблицы (dynamic tables) 39  При выполнении операции Insert размер массива увеличивается  Как увеличивать размер массива?  Аддитивная схема – текущий размер массива увеличивается на k ячеек (по арифметической прогрессии)  Мультипликативная схема – текущий размер массива увеличивается в k раз (по геометрической прогрессии)  Примеры реализации: o С++: std::vector o Java: ArrayList o .NET 2.0: List<> o Python: list
  • 40. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function
  • 41. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1
  • 42. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1 x2
  • 43. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1 x2 x3
  • 44. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1 x2 x3 x4
  • 45. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1 x2 x3 x5 x4
  • 46. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1 x2 x3 x6 x5 x4
  • 47. Динамические таблицы (dynamic tables) function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function x1 x2 x3 x7 x6 x5 x4
  • 48. Динамические таблицы (dynamic tables) 4848 Проведем амортизационный анализ времени T(n) выполнения последовательности из n операций Insert  Время работы операции Insert зависит от состояния таблицы: количества k элементов и её размера Size  Будем учитывать только операции записи элементов в таблицу Table[k] = x Size k
  • 49. function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if k = Size then Size = Size * 2 NewTable = AllocateMemory(Size) for i = 0 to k – 1 do NewTable[i] = Table[i] end for FreeMemory(Table) Table = NewTable end if Table[k] = x k = k + 1 end function Амортизационный анализ операции Insert  Первый вызов Insert – 1 операция  Второй вызов – 2 оп. (Copy 1 + Write 1)  Третий – 3 оп. (Copy 2 + Write 1)  Четвертый – 1 оп.  Пятый – 5 оп. (Copy 4 + Write 1)  …
  • 50. Амортизационный анализ операции Insert 5050  Обозначим через ci количество операции, выполняемых на i-ом вызове Insert 𝑐𝑖 = 𝑖, если 𝑖 − 1 степень 2, 1, иначе.  Тогда оценка сверху времени T(n) выполнения n операций Insert есть 𝑇 𝑛 = 𝑐1 + 𝑐2 + ⋯ + 𝑐 𝑛 ≤ 𝑛 + 20 + 21 + 22 + ⋯+ 2 log2 𝑛 𝑇(𝑛) < 𝑛 + 2𝑛 = 3𝑛
  • 51. 5151  Оценка сверху амортизированной сложности одной операции Insert есть 𝑇𝐼𝑛𝑠𝑒𝑟𝑡 = 𝑇 𝑛 𝑛 = 3𝑛 𝑛 = 3 = 𝑶(𝟏) Среднее время выполнения (вычислительная сложность) одной операции Insert в худшем случае есть O(1) Амортизационный анализ операции Insert
  • 52. function AddToBuffer(value) Count = Count + 1 Buffer[Count] = value if Count = H then for i = 1 to H do Packet[i] = Buffer[i] end for Count = 0 end if end function Обработчик с накопителем 5252
  • 53. Обработчик с накопителем 5353  Построить оценку сверху времени T(n) выполнения n операций AddToBuffer  Оценить амортизированную сложность функции AddToBuffer
  • 54. Амортизационный анализ операции AddToBuffer 5454  Обозначим через ci количество операции, выполняемых на i-ом вызове AddToBuffer 𝑐𝑖 = 𝐻 + 3, если 𝑖 % 𝐻 = 0, 2, иначе.  Тогда оценка сверху времени T(n) выполнения n операций AddToBuffer есть 𝑇 𝑛 = 𝑐1 + 𝑐2 + ⋯ + 𝑐 𝑛 < 2𝑛 + 𝑛 3 + 𝐻 𝐻 < 2𝑛 + 3𝑛 + 𝐻 = 5𝑛 + 𝐻 𝑇 𝑛 = 𝑂 5𝑛 + 𝐻 = 𝑂(𝑛 + 𝐻)
  • 55. Амортизационный анализ операции AddToBuffer 5555  Оценка сверху времени T(n) выполнения n операций AddToBuffer 𝑇 𝑛 = 𝑂 5𝑛 + 𝐻 = 𝑂 𝑛 + 𝐻  Амортизированная стоимость (сложность) одной операции AddToBuffer 𝑇 𝑛 𝑛 = 5𝑛 + 𝐻 𝑛 = 𝑂 1
  • 56. Задание 56  Прочитать в [CLRS 3ed., С. 487]: o 17.2 Метод бухгалтерского учета o 17.3 Метод потенциалов Кормен Т.Х., Лейзерсон Ч.И., Ривест Р.Л., Штайн К. Алгоритмы: построение и анализ. – 3-е изд. – М.: Вильямс, 2013. – 1328 с.