SlideShare a Scribd company logo
1 of 41
Download to read offline
Лекция 1:
Амортизационный анализ
(Amortized analysis)
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Анализ вычислительной сложности алгоритмов
22
1. Определяем параметры алгоритма,
от которых зависит время
его выполнения
2. Выражаем количество операций,
выполняемых алгоритмом, как
функцию от его параметров
(для худшего, среднего
или лучшего случаев).
3. Строим асимптотическую оценку
вычислительной сложности
алгоритма – переходим
к асимптотическим обозначениям
O, Θ, Ω.
n, m
T(n, m) = 2n2 + 4log2m
T(n, m) = O(2n2 + 4log2m)
= O(max{n2, log2m})
Сортировка выбором (Selection Sort)
function SelectionSort(v[1:n], n)
for i = 1 to n 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
3 операции
(худший случай – worst case)
5 операций
1 операция
T(n) = n + 5n + 3((n – 1) + (n – 2) + … + 1) = ?
Сумма членов
арифметической
прогрессии
3
Сортировка выбором (Selection Sort)
function SelectionSort(v[1:n], n)
for i = 1 to n 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
3 операции
(худший случай – worst case)
5 операций
1 операция
ࢀ ࢔ = ૟࢔ +
૜࢔૛
− ૜࢔
૛
= ࡻ(࢔૛) 4
Бинарный счетчик (Binary Counter)
55
Счетчик имеет длину L бит (может принимать 2L значений)
Поддерживает операцию Increment – увеличивает значение
на единицу
Начальное значение счетчика – 0
Пример 5 разрядного счетчика:
Разряд 4 3 2 1 0
Вес 16 8 4 2 1
Значение 0 0 0 0 0
Бинарный счетчик (Binary Counter)
66
Разряд 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)
77
Разряд 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)
8
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
8
Разряд 3 2 1 0
Вес 8 4 2 1
Значение 1 1 0 0
При каждом вызове
функции Increment время
ее работы разное
Время работы зависит от
внутреннего состояния –
значений A
Бинарный счетчик (Binary Counter)
9
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
9
Какова вычислительная сложность функции Increment?
Бинарный счетчик (Binary Counter)
10
В худшем случае массив A состоит только из единиц,
для выполнения операции Increment требуется время O(L)
Это грубая оценка!
При каждом вызове функции Increment время ее работы
разное
10
Как анализировать вычислительную сложность
алгоритмов время, выполнения которых зависит
от их внутреннего состояния?
Амортизационный анализ
11
Амортизационный анализ (Amortized analysis) –
метод анализа алгоритмов, позволяющий осуществлять
оценку времени выполнения последовательности из n
операций над некоторой структурой данных
Позволяет строить оценку сверху времени выполнения n
операций в худшем случае, а также оценку среднего
времени выполнения каждой операции
11
Амортизационный анализ
12
Некоторые операции структуры данных могут иметь
высокую вычислительную сложность, другие низкую
Например, некоторая операция может подготавливать
структуру данных для быстрого выполнения других
операций
Такие “тяжелые” операции выполняются редко и могут
оказывать незначительное влияние на суммарное время
выполнения последовательности из n операций
12
Амортизационный анализ
13
Амортизационный анализ возник из группового анализа
(Aggregate analysis).
Введен в практику Робертом Тарьяном (Robert Tarjan)
в 1985 году:
Tarjan R. Amortized Computational Complexity // SIAM. J. on
Algebraic and Discrete Methods, 6(2), 1985. – P. 306–318.
13
Методы амортизационного анализа
14
Групповой анализ (Aggregate analysis)
Метод бухгалтерского учета (Accounting method)
Метод потенциалов (Potential method)
Все методы позволяют получить одну и ту же
оценку, но разными способами
14
Групповой анализ (Aggregate analaysis)
15
Групповой анализ (Aggregate analysis) – метод
амортизационного анализа позволяющий оценивать
верхнюю границу времени T(n) выполнения
последовательности из n операций в худшем случае
Амортизированная стоимость (Amortized cost, учетная
стоимость) выполнения одной операции определяется как
T(n) / n
Амортизированная стоимость операции – это оценка
сверху среднего времени выполнения операции в худшем
случае
15
Стековые операции (Last In – First Out)
1616
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)
17
TMultiPop = O(min(|S|, k))
15
4
22
78
34
12
Top →
34
12
Top →
→ MultiPop(S, 4) → → MultiPop(S, 7) →
Групповой анализ стековых операций v1.0
18
Методом группового анализа оценим верхнюю границу
времени 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)
18
Грубая оценка сверху для T(n)!
Групповой анализ стековых операций v2.0
19
Получим более точную оценку сверху времени T(n) выполнения
произвольной последовательности из n стековых операций
1. Количество операций Pop (включая вызовы из MultiPop)
не превышает количества операций Push. В свою очередь,
число операций Push не превышает n
2. Таким образом для выполнения произвольной
последовательности из n операций Push, Pop, MultiPop
требуется время O(n)
Суммарное время выполнения n операций в худшем случае есть
O(n), тогда амортизированная стоимость (средняя стоимость)
одной операции
O(n) / n = O(1)
19
Групповой анализ стековых операций: вопрос
20
Останется ли справедливой оценка
амортизированной стоимости стековых
операций, равная О(1), если включить в
множество стековых операций операцию
MultiPush(S, k), помещающую в стек k
элементов?
20
MultiPush(S, k)
k
TMultiPush = O(k)
Групповой анализ стековых операций: ответ
21
Ответ – нет
Оценка амортизированной стоимости одной
стековой операций станет O(k)
В последовательности из n стековых
операций может быть n операций
MultiPush, что требует времени O(nk)
Тогда амортизированная стоимость
(средняя стоимость) одной стековой
операции T(n) / n = O(nk) / n = O(k) 21
MultiPush(S, k)
k
Бинарный счетчик (Binary Counter)
2222
Счетчик имеет длину 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
Бинарный счетчик (Binary Counter)
23
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
23
Разряд 3 2 1 0
Вес 8 4 2 1
Значение 1 1 0 0
При каждом вызове
функции Increment время
ее работы разное
Время работы зависит от
внутреннего состояния –
значений A
Бинарный счетчик (Binary Counter)
24
Бинарный счетчик (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 24
Бинарный счетчик (Binary Counter)
25
Бинарный счетчик (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 25
Какова амортизированная стоимость выполнения
функции Increment (среднее время в худшем случае)?
Бинарный счетчик (Binary Counter)
26
Бинарный счетчик (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 26
Оценим сверху время T(n) выполнения
n операций Increment
Тогда амортизированная стоимость операции
Increment (среднее время выполнения) будет
T(n) / n
Бинарный счетчик (Binary Counter)
2727
Бинарный счетчик (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)
2828
Бинарный счетчик (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௅ିଵ
раз
ܶ ݊ = ݊ +
݊
2
+
݊
4
+ ⋯ +
݊
2௅ିଵ
=
= ݊ + ݊ = 2݊
Бинарный счетчик (Binary Counter)
2929
Бинарный счетчик (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)
3030
Динамическая таблица (Dynamic table, dynamic array,
growable array) – это массив поддерживающий вставку
и удаление элементов и динамически изменяющий
свой размер до необходимого значения
Поддерживаемые операции
o Insert(T, x)
o Delete(T, x)
o Size – количество свободных ячеек
o k – количество элементов
добавленных в массив
T
Size
k
Динамические таблицы (Dynamic tables)
31
При выполнении операции 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
x1
x2
x3
x5
x4
32
32
Динамические таблицы (Dynamic tables)
3333
Проведем амортизационный анализ времени T(n)
выполнения последовательности из n операций Insert
T
Size
k
Время работы операции Insert зависит
от состояния таблицы – количества k
элементов и её размера Size
Будем учитывать только операции
записи элементов в таблицу!
Table[k] = x
Амортизационный анализ операции Insert
34
function Insert(x)
if Size = 0 then
Size = 1
Table = AllocateMemory(1)
k = 0
else if Size = k then
Size = Size * 2
NewTable = AllocateMemory(Size * 2)
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 – 1 операция
Второй вызов – 2 оп.
(Copy 1 + Write 1)
Третий – 3 оп.
(Copy 2 + Write 1)
Четвертый – 1 оп.
Пятый – 1 оп.
(Copy 4 + Write 1)
…
34
Амортизационный анализ операции Insert
3535
Обозначим через ci количество операции, выполняемых
на i-ом вызове Insert
ܿ௜ = ൜
݅, если	݅ − 1	степень	2,
	1, иначе.
Тогда оценка сверху времени T(n) выполнения n
операций Insert есть
ܶ ݊ = ܿଵ + ܿଶ + ⋯ + ܿ௡ ≤ ݊ + 2଴
+ 2ଵ
+ 2ଶ
+ ⋯ + 2 ௟௢௚మ ௡
ܶ(݊) < ݊ + 2݊ = 3݊
Амортизационный анализ операции Insert
3636
Оценка сверху амортизированной сложности одной
операции Insert есть
ܶ݅݊‫ݐݎ݁ݏ‬ =
ܶ ݊
݊
=
3݊
݊
= 3 = ࡻ(૚)
Среднее время выполнения (вычислительная сложность)
одной операции Insert в худшем случае есть O(1)
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
Обработчик с накопителем
3737
Обработчик с накопителем
3838
Построить оценку сверху времени T(n)
выполнения n операций AddToBuffer
Оценить амортизированную сложность
функции AddToBuffer
Амортизационный анализ операции AddToBuffer
3939
Обозначим через ci количество операции, выполняемых
на i-ом вызове AddToBuffer
ܿ௜ = ൜
‫ܪ‬ + 3, если	݅	%	‫ܪ‬ = 0,
	2, иначе.
Тогда оценка сверху времени T(n) выполнения n
операций AddToBuffer есть
ܶ ݊ = ܿଵ + ܿଶ + ⋯ + ܿ௡ < 2݊ +
݊ 3 + ‫ܪ‬
‫ܪ‬
< 2݊ + 3݊ + ‫ܪ‬
= 5݊ + ‫ܪ‬
ܶ ݊ = ܱ 5݊ + ‫ܪ‬ = ܱ(݊)
Амортизационный анализ операции AddToBuffer
4040
Оценка сверху времени T(n) выполнения nопераций
AddToBuffer
ܶ ݊ = ܱ 5݊ + ‫ܪ‬ = ܱ ݊
Амортизированная стоимость (сложность) одной
операции AddToBuffer
ܶ ݊
݊
=
ܱ ݊
݊
= ܱ(1)
Задание
41
Прочитать в CLRS:
o 17.2 Метод бухгалтерского учета
o 17.3 Метод потенциалов
o 17.4.2 Расширение и сжатие таблицы
(амортизационный анализ с учетом операции удаления)
41

More Related Content

What's hot

ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Ontico
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Technopark
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Параллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхПараллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхSergey Vasilyev
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)Alexey Paznikov
 
сортировка слияниями
сортировка слияниямисортировка слияниями
сортировка слияниямиDmitry Protopopov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Platonov Sergey
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

What's hot (20)

ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3Алгоритмы и структуры данных осень 2013 лекция 3
Алгоритмы и структуры данных осень 2013 лекция 3
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Параллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхПараллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данных
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
 
сортировка слияниями
сортировка слияниямисортировка слияниями
сортировка слияниями
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

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

Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliaminComputer Science Club
 
практика 3
практика 3практика 3
практика 3student_kai
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийsimple_people
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)Ontico
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование цикловstudent_kai
 
быстрая оценка ит проекта.максим русаков, григорий колесников
быстрая оценка ит проекта.максим русаков, григорий колесниковбыстрая оценка ит проекта.максим русаков, григорий колесников
быстрая оценка ит проекта.максим русаков, григорий колесниковOntico
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Про Python и вычисления.
Про Python и вычисления.Про Python и вычисления.
Про Python и вычисления.Optima-PROMO
 
Руслан Гроховецкий — Python и вычисления
Руслан Гроховецкий — Python и вычисленияРуслан Гроховецкий — Python и вычисления
Руслан Гроховецкий — Python и вычисленияYandex
 
Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...
Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...
Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...Alexander Orlov
 
оператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и выводаоператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и выводаliza2209
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркингаAndrey Akinshin
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 

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

Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin
 
практика 3
практика 3практика 3
практика 3
 
Lektsia 9
Lektsia 9Lektsia 9
Lektsia 9
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функций
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование циклов
 
быстрая оценка ит проекта.максим русаков, григорий колесников
быстрая оценка ит проекта.максим русаков, григорий колесниковбыстрая оценка ит проекта.максим русаков, григорий колесников
быстрая оценка ит проекта.максим русаков, григорий колесников
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Step cpp022
Step cpp022Step cpp022
Step cpp022
 
Про Python и вычисления.
Про Python и вычисления.Про Python и вычисления.
Про Python и вычисления.
 
Руслан Гроховецкий — Python и вычисления
Руслан Гроховецкий — Python и вычисленияРуслан Гроховецкий — Python и вычисления
Руслан Гроховецкий — Python и вычисления
 
Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...
Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...
Оценка ИТ-проекта на ранней стадии. Практический опыт применения методологии ...
 
оператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и выводаоператор присваивания и процедуры ввода и вывода
оператор присваивания и процедуры ввода и вывода
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 

More from Mikhail Kurnosov

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)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
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)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
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)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
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)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
 
Лекция 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
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости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
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 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)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 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)
 

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

  • 1. Лекция 1: Амортизационный анализ (Amortized analysis) Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Анализ вычислительной сложности алгоритмов 22 1. Определяем параметры алгоритма, от которых зависит время его выполнения 2. Выражаем количество операций, выполняемых алгоритмом, как функцию от его параметров (для худшего, среднего или лучшего случаев). 3. Строим асимптотическую оценку вычислительной сложности алгоритма – переходим к асимптотическим обозначениям O, Θ, Ω. n, m T(n, m) = 2n2 + 4log2m T(n, m) = O(2n2 + 4log2m) = O(max{n2, log2m})
  • 3. Сортировка выбором (Selection Sort) function SelectionSort(v[1:n], n) for i = 1 to n 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 3 операции (худший случай – worst case) 5 операций 1 операция T(n) = n + 5n + 3((n – 1) + (n – 2) + … + 1) = ? Сумма членов арифметической прогрессии 3
  • 4. Сортировка выбором (Selection Sort) function SelectionSort(v[1:n], n) for i = 1 to n 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 3 операции (худший случай – worst case) 5 операций 1 операция ࢀ ࢔ = ૟࢔ + ૜࢔૛ − ૜࢔ ૛ = ࡻ(࢔૛) 4
  • 5. Бинарный счетчик (Binary Counter) 55 Счетчик имеет длину L бит (может принимать 2L значений) Поддерживает операцию Increment – увеличивает значение на единицу Начальное значение счетчика – 0 Пример 5 разрядного счетчика: Разряд 4 3 2 1 0 Вес 16 8 4 2 1 Значение 0 0 0 0 0
  • 6. Бинарный счетчик (Binary Counter) 66 Разряд 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
  • 7. Бинарный счетчик (Binary Counter) 77 Разряд 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
  • 8. Бинарный счетчик (Binary Counter) 8 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 8 Разряд 3 2 1 0 Вес 8 4 2 1 Значение 1 1 0 0 При каждом вызове функции Increment время ее работы разное Время работы зависит от внутреннего состояния – значений A
  • 9. Бинарный счетчик (Binary Counter) 9 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 9 Какова вычислительная сложность функции Increment?
  • 10. Бинарный счетчик (Binary Counter) 10 В худшем случае массив A состоит только из единиц, для выполнения операции Increment требуется время O(L) Это грубая оценка! При каждом вызове функции Increment время ее работы разное 10 Как анализировать вычислительную сложность алгоритмов время, выполнения которых зависит от их внутреннего состояния?
  • 11. Амортизационный анализ 11 Амортизационный анализ (Amortized analysis) – метод анализа алгоритмов, позволяющий осуществлять оценку времени выполнения последовательности из n операций над некоторой структурой данных Позволяет строить оценку сверху времени выполнения n операций в худшем случае, а также оценку среднего времени выполнения каждой операции 11
  • 12. Амортизационный анализ 12 Некоторые операции структуры данных могут иметь высокую вычислительную сложность, другие низкую Например, некоторая операция может подготавливать структуру данных для быстрого выполнения других операций Такие “тяжелые” операции выполняются редко и могут оказывать незначительное влияние на суммарное время выполнения последовательности из n операций 12
  • 13. Амортизационный анализ 13 Амортизационный анализ возник из группового анализа (Aggregate analysis). Введен в практику Робертом Тарьяном (Robert Tarjan) в 1985 году: Tarjan R. Amortized Computational Complexity // SIAM. J. on Algebraic and Discrete Methods, 6(2), 1985. – P. 306–318. 13
  • 14. Методы амортизационного анализа 14 Групповой анализ (Aggregate analysis) Метод бухгалтерского учета (Accounting method) Метод потенциалов (Potential method) Все методы позволяют получить одну и ту же оценку, но разными способами 14
  • 15. Групповой анализ (Aggregate analaysis) 15 Групповой анализ (Aggregate analysis) – метод амортизационного анализа позволяющий оценивать верхнюю границу времени T(n) выполнения последовательности из n операций в худшем случае Амортизированная стоимость (Amortized cost, учетная стоимость) выполнения одной операции определяется как T(n) / n Амортизированная стоимость операции – это оценка сверху среднего времени выполнения операции в худшем случае 15
  • 16. Стековые операции (Last In – First Out) 1616 Push(S, x) x TPush = O(1) Pop(S) TPop = O(1) MultiPop(S, k) TMultiPop = O(min(|S|, k)) k
  • 17. 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) 17 TMultiPop = O(min(|S|, k)) 15 4 22 78 34 12 Top → 34 12 Top → → MultiPop(S, 4) → → MultiPop(S, 7) →
  • 18. Групповой анализ стековых операций v1.0 18 Методом группового анализа оценим верхнюю границу времени 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) 18 Грубая оценка сверху для T(n)!
  • 19. Групповой анализ стековых операций v2.0 19 Получим более точную оценку сверху времени T(n) выполнения произвольной последовательности из n стековых операций 1. Количество операций Pop (включая вызовы из MultiPop) не превышает количества операций Push. В свою очередь, число операций Push не превышает n 2. Таким образом для выполнения произвольной последовательности из n операций Push, Pop, MultiPop требуется время O(n) Суммарное время выполнения n операций в худшем случае есть O(n), тогда амортизированная стоимость (средняя стоимость) одной операции O(n) / n = O(1) 19
  • 20. Групповой анализ стековых операций: вопрос 20 Останется ли справедливой оценка амортизированной стоимости стековых операций, равная О(1), если включить в множество стековых операций операцию MultiPush(S, k), помещающую в стек k элементов? 20 MultiPush(S, k) k TMultiPush = O(k)
  • 21. Групповой анализ стековых операций: ответ 21 Ответ – нет Оценка амортизированной стоимости одной стековой операций станет O(k) В последовательности из n стековых операций может быть n операций MultiPush, что требует времени O(nk) Тогда амортизированная стоимость (средняя стоимость) одной стековой операции T(n) / n = O(nk) / n = O(k) 21 MultiPush(S, k) k
  • 22. Бинарный счетчик (Binary Counter) 2222 Счетчик имеет длину 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
  • 23. Бинарный счетчик (Binary Counter) 23 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 23 Разряд 3 2 1 0 Вес 8 4 2 1 Значение 1 1 0 0 При каждом вызове функции Increment время ее работы разное Время работы зависит от внутреннего состояния – значений A
  • 24. Бинарный счетчик (Binary Counter) 24 Бинарный счетчик (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 24
  • 25. Бинарный счетчик (Binary Counter) 25 Бинарный счетчик (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 25 Какова амортизированная стоимость выполнения функции Increment (среднее время в худшем случае)?
  • 26. Бинарный счетчик (Binary Counter) 26 Бинарный счетчик (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 26 Оценим сверху время T(n) выполнения n операций Increment Тогда амортизированная стоимость операции Increment (среднее время выполнения) будет T(n) / n
  • 27. Бинарный счетчик (Binary Counter) 2727 Бинарный счетчик (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)
  • 28. Бинарный счетчик (Binary Counter) 2828 Бинарный счетчик (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௅ିଵ раз ܶ ݊ = ݊ + ݊ 2 + ݊ 4 + ⋯ + ݊ 2௅ିଵ = = ݊ + ݊ = 2݊
  • 29. Бинарный счетчик (Binary Counter) 2929 Бинарный счетчик (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)
  • 30. Динамические таблицы (Dynamic tables) 3030 Динамическая таблица (Dynamic table, dynamic array, growable array) – это массив поддерживающий вставку и удаление элементов и динамически изменяющий свой размер до необходимого значения Поддерживаемые операции o Insert(T, x) o Delete(T, x) o Size – количество свободных ячеек o k – количество элементов добавленных в массив T Size k
  • 31. Динамические таблицы (Dynamic tables) 31 При выполнении операции Insert размер массива увеличивается Как увеличивать размер массива? Аддитивная схема – текущий размер массива увеличивается на k ячеек (по арифметической прогрессии) Мультипликативная схема – текущий размер массива увеличивается в k раз (по геометрической прогрессии) Примеры реализации: o С++: std::vector o Java: ArrayList o .NET 2.0: List<> o Python: list
  • 32. Динамические таблицы (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 32 32
  • 33. Динамические таблицы (Dynamic tables) 3333 Проведем амортизационный анализ времени T(n) выполнения последовательности из n операций Insert T Size k Время работы операции Insert зависит от состояния таблицы – количества k элементов и её размера Size Будем учитывать только операции записи элементов в таблицу! Table[k] = x
  • 34. Амортизационный анализ операции Insert 34 function Insert(x) if Size = 0 then Size = 1 Table = AllocateMemory(1) k = 0 else if Size = k then Size = Size * 2 NewTable = AllocateMemory(Size * 2) 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 – 1 операция Второй вызов – 2 оп. (Copy 1 + Write 1) Третий – 3 оп. (Copy 2 + Write 1) Четвертый – 1 оп. Пятый – 1 оп. (Copy 4 + Write 1) … 34
  • 35. Амортизационный анализ операции Insert 3535 Обозначим через ci количество операции, выполняемых на i-ом вызове Insert ܿ௜ = ൜ ݅, если ݅ − 1 степень 2, 1, иначе. Тогда оценка сверху времени T(n) выполнения n операций Insert есть ܶ ݊ = ܿଵ + ܿଶ + ⋯ + ܿ௡ ≤ ݊ + 2଴ + 2ଵ + 2ଶ + ⋯ + 2 ௟௢௚మ ௡ ܶ(݊) < ݊ + 2݊ = 3݊
  • 36. Амортизационный анализ операции Insert 3636 Оценка сверху амортизированной сложности одной операции Insert есть ܶ݅݊‫ݐݎ݁ݏ‬ = ܶ ݊ ݊ = 3݊ ݊ = 3 = ࡻ(૚) Среднее время выполнения (вычислительная сложность) одной операции Insert в худшем случае есть O(1)
  • 37. 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 Обработчик с накопителем 3737
  • 38. Обработчик с накопителем 3838 Построить оценку сверху времени T(n) выполнения n операций AddToBuffer Оценить амортизированную сложность функции AddToBuffer
  • 39. Амортизационный анализ операции AddToBuffer 3939 Обозначим через ci количество операции, выполняемых на i-ом вызове AddToBuffer ܿ௜ = ൜ ‫ܪ‬ + 3, если ݅ % ‫ܪ‬ = 0, 2, иначе. Тогда оценка сверху времени T(n) выполнения n операций AddToBuffer есть ܶ ݊ = ܿଵ + ܿଶ + ⋯ + ܿ௡ < 2݊ + ݊ 3 + ‫ܪ‬ ‫ܪ‬ < 2݊ + 3݊ + ‫ܪ‬ = 5݊ + ‫ܪ‬ ܶ ݊ = ܱ 5݊ + ‫ܪ‬ = ܱ(݊)
  • 40. Амортизационный анализ операции AddToBuffer 4040 Оценка сверху времени T(n) выполнения nопераций AddToBuffer ܶ ݊ = ܱ 5݊ + ‫ܪ‬ = ܱ ݊ Амортизированная стоимость (сложность) одной операции AddToBuffer ܶ ݊ ݊ = ܱ ݊ ݊ = ܱ(1)
  • 41. Задание 41 Прочитать в CLRS: o 17.2 Метод бухгалтерского учета o 17.3 Метод потенциалов o 17.4.2 Расширение и сжатие таблицы (амортизационный анализ с учетом операции удаления) 41