SlideShare a Scribd company logo
1 of 11
Основы анализа алгоритмов
(продолжение)

7. Компромиссы между
алгоритмическим временем и
алгоритмической памятью
Основными характеристиками алгоритма,
рассматриваемыми при его анализе, являются
временная сложность и емкостная сложность.
Они позволяют оценить требуемый объем
памяти и время исполнения алгоритма
соответственно.
В настоящее время большее внимание, как
правило, уделяется временной сложности
алгоритмов.
А на ранних этапах развития компьютеров при
ограниченных объемах компьютерной памяти
(как внешней, так и внутренней) анализ
емкостной сложности носил принципиальный
характер.
Все алгоритмы разделяются на такие, которым достаточно
ограниченной памяти, и те, которым нужно
дополнительное пространство.
Предположим, например, что мы записываем вещественное число
в интервале от -10 до +10, имеющее один десятичный знак
после запятой. При записи в виде вещественного числа
большинство компьютеров потратит от 4 до 8 байтов памяти,
однако если предварительно умножить число на 10, то мы
получим целое число в интервале от -100 до +100, и для его
хранения выделяется всего один байт. По сравнению с первым
вариантом экономия составляет от 3 до 7 байтов. Программа, в
которой сохраняется 1000 таких чисел, экономит от 3000 до 7000
байтов. Если принять во внимание, что еще недавно (в начале
80-х годов прошлого века) у компьютеров была память объемом
лишь 65536 байтов (64 К), экономия получается существенной.
Именно эта необходимость экономить память наряду с
долголетием компьютерных программ привела к проблеме 2000го года. Если программа использует много различных дат, то
половину места для записи года можно сэкономить, сохраняя
значение 99 вместо 1999. К тому же авторы программ не
предполагали в 80-х годах, что их продукция доживет до 2000-го
года.
Некоторую новую ноту внесло недавнее
распространение карманных компьютеров (PDA –
personal digital assistant). У типичного такого
устройства от 2 до 8 мегабайт на все про все – и на
данные, и на программы. И поэтому разработка
маленьких программ, обеспечивающих компактное
хранение данных, становится критической. То же
самое можно отнести и к программам для других
мобильных устройств, выполненным на базе
микроконтроллеров (например, мобильные
телефоны).
Таким образом, в какой-то степени анализ емкостной
сложности алгоритмов является актуальным и в
настоящее время. При этом необходимо учитывать
«правило рычага», которое заключается в том, что в
общем случае, «выигрывая в памяти»,
«проигрывают во времени», и наоборот.
Например, на рис. приведены два
алгоритма, решающих одну и ту же задачу
обмена значений двух переменных (эта
задача очень часто используется на
практике). Первый алгоритм (а) обходится
без дополнительной памяти, но требует
больше времени, на исполнение (он
применяет операции присваивания,
сложения и вычитания). Второй алгоритм
(б) использует дополнительную
переменную (т.е. дополнительную
память), но при этом использует только
операцию присваивания (т.е. выполняется
быстрее).
НАЧАЛО

НАЧАЛО

A=A+B

T=A

B=A-B

A=B

A=A-B

B=T

КОНЕЦ

КОНЕЦ

а) Экономия памяти

б) Экономия времени

Рис. Компромисс между временем и памятью
8. Использование
рекуррентных соотношений
для анализа рекурсивных
алгоритмов
Многие алгоритмы основаны на принципе
рекурсивного разбиения большой задачи
на меньшие, когда решения подзадач
используются для решения исходной
задачи.
Рекурсивное разбиение алгоритма
напрямую проявляется в его анализе.
Например, время выполнения подобных алгоритмов
определяется величиной и номером подзадачи, а
также временем, необходимым для разбиения
задачи. Математически зависимость времени
выполнения алгоритма для ввода величиной N от
времени выполнения при меньшем количестве
вводов легко задается с помощью рекуррентных
соотношений. Такие формулы точно описывают
производительность алгоритмов: для вычисления
времени выполнения необходимо решить эти
рекурсии.
Рекуррентные соотношения на сложность алгоритма
выводятся непосредственно из вида алгоритма,
однако с их помощью нельзя быстро вычислить эту
сложность. Для этого следует привести
рекуррентные соотношения к так называемому
замкнутому виду, отказавшись от их рекуррентной
природы. Производится такое приведение
посредством последовательных подстановок,
позволяющих уловить общий принцип.
Пример 1. В рекурсивной программе, где
при каждой итерации цикла количество
вводов уменьшается на единицу,
возникает следующее рекуррентное
соотношение: CN = CN – 1 + N, где N ≥ 2 и
C1 = 1.
Решение: CN порядка N2 / 2. Для решения
рекурсии ее можно раскрыть, применяя
саму к себе следующим образом:
CN = CN – 1 + N = CN – 2 + (N – 1) + N = CN
– 3 + (N – 2) + (N – 1) + N = …
= C1 + 2 + … + (N – 2) + (N – 1) + N = 1 + 2 +
… + (N – 2) + (N – 1) + N =
= N(N + 1) / 2.
Пример 2. В рекурсивной программе, где на каждом шаге
количество вводов уменьшается вдвое, возникает
следующее рекуррентное соотношение: CN = CN / 2 + 1,
где N ≥ 2 и C1 = 1.
Решение: CN порядка log2 N. Из написанного следует, что
это уравнение бессмысленно за исключением случая,
когда N четно или же предполагается, что N /2 является
целочисленным делением. Сейчас предположим, что N =
2n, чтобы рекурсия была всегда определена. Тогда
рекурсию еще проще раскрыть, чем в предыдущем
случае:
CN = CN / 2 + 1 = CN / 4 + 1 + 1 = CN / 8 + 1 + 1 + 1 = … = C1
+ n = 1 + n = n + 1.
Точное решение для любого N зависит от интерпретации
N/2. Если N/2 представляет собой N/2, тогда существует
очень простое решение: CN – это количество бит в
двоичном представлении числа N.
Пример 3. В рекурсивной программе, где
количество вводов уменьшается вдвое, но
необходимо проверить каждый элемент,
возникает следующее рекуррентное
соотношение: CN = CN / 2 + N, где N ≥ 2 и C1 =
0.
Решение: CN порядка 2N. Рекурсия раскрывается
в сумму N + N/2 + N/4 + N/8 + ... . (Как и в
примере 2, рекуррентное соотношение
определено точно только в том случае, если N
является степенью числа 2). Если данная
последовательность бесконечна, то сумма
простой геометрической прогрессии равна 2N.
Поскольку мы используем целочисленное
деление и останавливаемся на 1, данное
значение является приближением к точному
ответу. В точном решении используются
свойства двоичного представления числа N.

More Related Content

What's hot

Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIAlexey Paznikov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
алгоритм циклический
алгоритм циклическийалгоритм циклический
алгоритм циклическийKhydosilova
 
03
0303
03JIuc
 
Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыEvgeny Smirnov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
лабораторная работа 4
лабораторная работа 4лабораторная работа 4
лабораторная работа 4Gulnaz Shakirova
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Ruby — Паттерны программирования
Ruby — Паттерны программированияRuby — Паттерны программирования
Ruby — Паттерны программированияEvgeny Smirnov
 

What's hot (16)

23
2323
23
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 
106170
106170106170
106170
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
алгоритм циклический
алгоритм циклическийалгоритм циклический
алгоритм циклический
 
03
0303
03
 
Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмы
 
алгоритм
алгоритмалгоритм
алгоритм
 
Goto
GotoGoto
Goto
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
лабораторная работа 4
лабораторная работа 4лабораторная работа 4
лабораторная работа 4
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
лекция 5
лекция 5лекция 5
лекция 5
 
Ruby — Паттерны программирования
Ruby — Паттерны программированияRuby — Паттерны программирования
Ruby — Паттерны программирования
 

Viewers also liked

лекция 21 управление безопасностью-ч1
лекция 21 управление безопасностью-ч1лекция 21 управление безопасностью-ч1
лекция 21 управление безопасностью-ч1student_kai
 
лекция 12 управление релизами-ч2
лекция 12 управление релизами-ч2лекция 12 управление релизами-ч2
лекция 12 управление релизами-ч2student_kai
 
презентация14
презентация14презентация14
презентация14student_kai
 
лекция №2
лекция №2лекция №2
лекция №2student_kai
 
лекция №3
лекция №3лекция №3
лекция №3student_kai
 
лекция №5
лекция №5лекция №5
лекция №5student_kai
 
лекция №12
лекция №12лекция №12
лекция №12student_kai
 
лекция №4
лекция №4лекция №4
лекция №4student_kai
 
лекция №6
лекция №6лекция №6
лекция №6student_kai
 

Viewers also liked (20)

л26с
л26сл26с
л26с
 
п8
п8п8
п8
 
лекция 21 управление безопасностью-ч1
лекция 21 управление безопасностью-ч1лекция 21 управление безопасностью-ч1
лекция 21 управление безопасностью-ч1
 
л13
л13л13
л13
 
лекция 12 управление релизами-ч2
лекция 12 управление релизами-ч2лекция 12 управление релизами-ч2
лекция 12 управление релизами-ч2
 
п2 08
п2 08п2 08
п2 08
 
п1
п1п1
п1
 
лекция 26
лекция 26лекция 26
лекция 26
 
п2 04 05
п2 04 05п2 04 05
п2 04 05
 
л25с
л25сл25с
л25с
 
презентация14
презентация14презентация14
презентация14
 
лекция 25
лекция 25лекция 25
лекция 25
 
лекция №2
лекция №2лекция №2
лекция №2
 
п11
п11п11
п11
 
лекция №3
лекция №3лекция №3
лекция №3
 
лекция №5
лекция №5лекция №5
лекция №5
 
лекция №12
лекция №12лекция №12
лекция №12
 
лекция 6
лекция 6лекция 6
лекция 6
 
лекция №4
лекция №4лекция №4
лекция №4
 
лекция №6
лекция №6лекция №6
лекция №6
 

Similar to лекция 7

Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыsimple_people
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 
394.аналитический метод расчета коэффициента гидравлического трения
394.аналитический метод расчета коэффициента гидравлического трения394.аналитический метод расчета коэффициента гидравлического трения
394.аналитический метод расчета коэффициента гидравлического тренияivanov1566359955
 
практика 5
практика 5практика 5
практика 5student_kai
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
01 готовимся к экзамену по информатике. теория. задачи 2002
01  готовимся к экзамену по информатике. теория. задачи 200201  готовимся к экзамену по информатике. теория. задачи 2002
01 готовимся к экзамену по информатике. теория. задачи 2002dfdkfjs
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Alexander Borzunov
 
Борзунов Александр, Cpmoptimize
Борзунов Александр, CpmoptimizeБорзунов Александр, Cpmoptimize
Борзунов Александр, CpmoptimizeDarya Zubova
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Расчет минимального времени выполнения задач при оптимальном распределении на...
Расчет минимального времени выполнения задач при оптимальном распределении на...Расчет минимального времени выполнения задач при оптимальном распределении на...
Расчет минимального времени выполнения задач при оптимальном распределении на...Sergey Vasilyev
 
практика 10
практика 10практика 10
практика 10student_kai
 
практика 10
практика 10практика 10
практика 10student_kai
 

Similar to лекция 7 (20)

лекция 11
лекция 11лекция 11
лекция 11
 
лекция 4
лекция 4лекция 4
лекция 4
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 
394.аналитический метод расчета коэффициента гидравлического трения
394.аналитический метод расчета коэффициента гидравлического трения394.аналитический метод расчета коэффициента гидравлического трения
394.аналитический метод расчета коэффициента гидравлического трения
 
практика 5
практика 5практика 5
практика 5
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
01 готовимся к экзамену по информатике. теория. задачи 2002
01  готовимся к экзамену по информатике. теория. задачи 200201  готовимся к экзамену по информатике. теория. задачи 2002
01 готовимся к экзамену по информатике. теория. задачи 2002
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
 
Борзунов Александр, Cpmoptimize
Борзунов Александр, CpmoptimizeБорзунов Александр, Cpmoptimize
Борзунов Александр, Cpmoptimize
 
презентация1
презентация1презентация1
презентация1
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
106170
106170106170
106170
 
Расчет минимального времени выполнения задач при оптимальном распределении на...
Расчет минимального времени выполнения задач при оптимальном распределении на...Расчет минимального времени выполнения задач при оптимальном распределении на...
Расчет минимального времени выполнения задач при оптимальном распределении на...
 
практика 10
практика 10практика 10
практика 10
 
практика 10
практика 10практика 10
практика 10
 

More from student_kai

презентация
презентацияпрезентация
презентацияstudent_kai
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкетаstudent_kai
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке Cstudent_kai
 
презентация курсовой работы
презентация курсовой работыпрезентация курсовой работы
презентация курсовой работыstudent_kai
 
лекция№34
лекция№34лекция№34
лекция№34student_kai
 
лекция№32
лекция№32лекция№32
лекция№32student_kai
 
лекция№33
лекция№33лекция№33
лекция№33student_kai
 
лекция№31
лекция№31лекция№31
лекция№31student_kai
 
лекция№30
лекция№30лекция№30
лекция№30student_kai
 
лекция№29
лекция№29лекция№29
лекция№29student_kai
 
лекция№28
лекция№28лекция№28
лекция№28student_kai
 
лекция№27
лекция№27лекция№27
лекция№27student_kai
 
лекция№26
лекция№26лекция№26
лекция№26student_kai
 
лекция№25
лекция№25лекция№25
лекция№25student_kai
 
лекция№25
лекция№25лекция№25
лекция№25student_kai
 
лекция№24
лекция№24лекция№24
лекция№24student_kai
 
лекция№23
лекция№23лекция№23
лекция№23student_kai
 
лекция№22
лекция№22лекция№22
лекция№22student_kai
 
лекция№21
лекция№21лекция№21
лекция№21student_kai
 
лекция№20
лекция№20лекция№20
лекция№20student_kai
 

More from student_kai (20)

презентация
презентацияпрезентация
презентация
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке C
 
презентация курсовой работы
презентация курсовой работыпрезентация курсовой работы
презентация курсовой работы
 
лекция№34
лекция№34лекция№34
лекция№34
 
лекция№32
лекция№32лекция№32
лекция№32
 
лекция№33
лекция№33лекция№33
лекция№33
 
лекция№31
лекция№31лекция№31
лекция№31
 
лекция№30
лекция№30лекция№30
лекция№30
 
лекция№29
лекция№29лекция№29
лекция№29
 
лекция№28
лекция№28лекция№28
лекция№28
 
лекция№27
лекция№27лекция№27
лекция№27
 
лекция№26
лекция№26лекция№26
лекция№26
 
лекция№25
лекция№25лекция№25
лекция№25
 
лекция№25
лекция№25лекция№25
лекция№25
 
лекция№24
лекция№24лекция№24
лекция№24
 
лекция№23
лекция№23лекция№23
лекция№23
 
лекция№22
лекция№22лекция№22
лекция№22
 
лекция№21
лекция№21лекция№21
лекция№21
 
лекция№20
лекция№20лекция№20
лекция№20
 

лекция 7

  • 1. Основы анализа алгоритмов (продолжение) 7. Компромиссы между алгоритмическим временем и алгоритмической памятью
  • 2. Основными характеристиками алгоритма, рассматриваемыми при его анализе, являются временная сложность и емкостная сложность. Они позволяют оценить требуемый объем памяти и время исполнения алгоритма соответственно. В настоящее время большее внимание, как правило, уделяется временной сложности алгоритмов. А на ранних этапах развития компьютеров при ограниченных объемах компьютерной памяти (как внешней, так и внутренней) анализ емкостной сложности носил принципиальный характер.
  • 3. Все алгоритмы разделяются на такие, которым достаточно ограниченной памяти, и те, которым нужно дополнительное пространство. Предположим, например, что мы записываем вещественное число в интервале от -10 до +10, имеющее один десятичный знак после запятой. При записи в виде вещественного числа большинство компьютеров потратит от 4 до 8 байтов памяти, однако если предварительно умножить число на 10, то мы получим целое число в интервале от -100 до +100, и для его хранения выделяется всего один байт. По сравнению с первым вариантом экономия составляет от 3 до 7 байтов. Программа, в которой сохраняется 1000 таких чисел, экономит от 3000 до 7000 байтов. Если принять во внимание, что еще недавно (в начале 80-х годов прошлого века) у компьютеров была память объемом лишь 65536 байтов (64 К), экономия получается существенной. Именно эта необходимость экономить память наряду с долголетием компьютерных программ привела к проблеме 2000го года. Если программа использует много различных дат, то половину места для записи года можно сэкономить, сохраняя значение 99 вместо 1999. К тому же авторы программ не предполагали в 80-х годах, что их продукция доживет до 2000-го года.
  • 4. Некоторую новую ноту внесло недавнее распространение карманных компьютеров (PDA – personal digital assistant). У типичного такого устройства от 2 до 8 мегабайт на все про все – и на данные, и на программы. И поэтому разработка маленьких программ, обеспечивающих компактное хранение данных, становится критической. То же самое можно отнести и к программам для других мобильных устройств, выполненным на базе микроконтроллеров (например, мобильные телефоны). Таким образом, в какой-то степени анализ емкостной сложности алгоритмов является актуальным и в настоящее время. При этом необходимо учитывать «правило рычага», которое заключается в том, что в общем случае, «выигрывая в памяти», «проигрывают во времени», и наоборот.
  • 5. Например, на рис. приведены два алгоритма, решающих одну и ту же задачу обмена значений двух переменных (эта задача очень часто используется на практике). Первый алгоритм (а) обходится без дополнительной памяти, но требует больше времени, на исполнение (он применяет операции присваивания, сложения и вычитания). Второй алгоритм (б) использует дополнительную переменную (т.е. дополнительную память), но при этом использует только операцию присваивания (т.е. выполняется быстрее).
  • 6. НАЧАЛО НАЧАЛО A=A+B T=A B=A-B A=B A=A-B B=T КОНЕЦ КОНЕЦ а) Экономия памяти б) Экономия времени Рис. Компромисс между временем и памятью
  • 7. 8. Использование рекуррентных соотношений для анализа рекурсивных алгоритмов Многие алгоритмы основаны на принципе рекурсивного разбиения большой задачи на меньшие, когда решения подзадач используются для решения исходной задачи. Рекурсивное разбиение алгоритма напрямую проявляется в его анализе.
  • 8. Например, время выполнения подобных алгоритмов определяется величиной и номером подзадачи, а также временем, необходимым для разбиения задачи. Математически зависимость времени выполнения алгоритма для ввода величиной N от времени выполнения при меньшем количестве вводов легко задается с помощью рекуррентных соотношений. Такие формулы точно описывают производительность алгоритмов: для вычисления времени выполнения необходимо решить эти рекурсии. Рекуррентные соотношения на сложность алгоритма выводятся непосредственно из вида алгоритма, однако с их помощью нельзя быстро вычислить эту сложность. Для этого следует привести рекуррентные соотношения к так называемому замкнутому виду, отказавшись от их рекуррентной природы. Производится такое приведение посредством последовательных подстановок, позволяющих уловить общий принцип.
  • 9. Пример 1. В рекурсивной программе, где при каждой итерации цикла количество вводов уменьшается на единицу, возникает следующее рекуррентное соотношение: CN = CN – 1 + N, где N ≥ 2 и C1 = 1. Решение: CN порядка N2 / 2. Для решения рекурсии ее можно раскрыть, применяя саму к себе следующим образом: CN = CN – 1 + N = CN – 2 + (N – 1) + N = CN – 3 + (N – 2) + (N – 1) + N = … = C1 + 2 + … + (N – 2) + (N – 1) + N = 1 + 2 + … + (N – 2) + (N – 1) + N = = N(N + 1) / 2.
  • 10. Пример 2. В рекурсивной программе, где на каждом шаге количество вводов уменьшается вдвое, возникает следующее рекуррентное соотношение: CN = CN / 2 + 1, где N ≥ 2 и C1 = 1. Решение: CN порядка log2 N. Из написанного следует, что это уравнение бессмысленно за исключением случая, когда N четно или же предполагается, что N /2 является целочисленным делением. Сейчас предположим, что N = 2n, чтобы рекурсия была всегда определена. Тогда рекурсию еще проще раскрыть, чем в предыдущем случае: CN = CN / 2 + 1 = CN / 4 + 1 + 1 = CN / 8 + 1 + 1 + 1 = … = C1 + n = 1 + n = n + 1. Точное решение для любого N зависит от интерпретации N/2. Если N/2 представляет собой N/2, тогда существует очень простое решение: CN – это количество бит в двоичном представлении числа N.
  • 11. Пример 3. В рекурсивной программе, где количество вводов уменьшается вдвое, но необходимо проверить каждый элемент, возникает следующее рекуррентное соотношение: CN = CN / 2 + N, где N ≥ 2 и C1 = 0. Решение: CN порядка 2N. Рекурсия раскрывается в сумму N + N/2 + N/4 + N/8 + ... . (Как и в примере 2, рекуррентное соотношение определено точно только в том случае, если N является степенью числа 2). Если данная последовательность бесконечна, то сумма простой геометрической прогрессии равна 2N. Поскольку мы используем целочисленное деление и останавливаемся на 1, данное значение является приближением к точному ответу. В точном решении используются свойства двоичного представления числа N.