Author: Головешкин В.А. Ульянов М.В.
Tags: вычислительная математика численный анализ математика программирование теория алгоритмов информатика учебное пособие компьютерные технологии
ISBN: 5-9221-0721-6
Year: 2006
УДК 519.6
ББК 22.19
[бl
[ол о в е ш к и н В. А., Ул ь я н о в М. В. Теория рекурсии для проrрам
мистов. М.: ФИЗМАТЛИТ, 2006. 296 с. ISBN 5922I07216.
Книrа является учебным пособием по теории рекурсии в аспекте ее при
менения в области проrраммирования. В ней рассматриваются основы теории
рекурсии и ее использование в области разработки и анализа рекурсивных
алrоритмов. Приводятся основные сведения о рекурсивных последовательно
стях и функциях, даны примеры рекурсивных алrоритмов, разработанных
на основе рекуррентных соотношений, метода декомпозиции и метода ди
намическоrо проrраммирования, излаrаются методы разработки рекурсивных
алrоритмов и их теоретическоrо анализа, в том числе элементы теории pe
сурсной эффективности вычислительных алrоритмов. Детально изложены Me
тоды анализа рекурсивных алrоритмов, проиллюстрированные целым рядом
примеров. Приложение содержит тексты проrрамм, реализующих рекурсивные
алrоритмы, рассмотренные в основном тексте книrи, и результаты экспери
ментальных исследований. Учебное пособие ориентировано на специалистов в
области информатики и анализа алrоритмов, разработчиков алrоритмическоrо
обеспечения и предназначено для студентов, аспирантов и преподавателей
вузов, специализирующихся в области математической информатики, теории
рекурсии, разработки, анализа и исследования рекурсивных алrоритмов.
ISBN 5.е221.0721.6
@ ФиЗМАТлит. 2006
@ В. А. rоловещкин, М. В. Ульянов, 2006
Scan. OCR & DjVu Каооп [KartUn@yandex.riJ]
оrЛАВЛЕНИЕ
Предисловие. 5
Введение. . . 7
r л а в а 1. Введение в теорию рекурсии . 11
1. Основные понятия и определения . . . II
2. Рекурсивно заданные последовательности и функции. 23
3. Классификация рекурсивно заданных последовательностей и
функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 30
4. Методы исследования и решения рекуррентных соотношений . 36
Задачи и упражнения к rлаве I . . . . . . . . . . . . . . . . . . . . . . . . .. 50
r л а в а 2. Рекурсивные алrоритмы и особенности их nporpaMMHbIX
реализаций. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 51
1. Рекурсивные алrоритмы. . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2. Особенности nporpaMMHbIX реализаций рекурсивных алrоритмов 56
3. Механизм обслуживания рекурсивноrо вызова . . . . . . . . . . . . 59
4. Представление последовательности рекурсивных вызовов в виде
дерева рекурсии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 62
Задачи и упражнения к rлаве 2 . . . . . . . . . . . . . . . . .. . . . . .. 65
r л а в а 3. Методы разработки рекурсивных алrоритмов 67
1. Метод рекуррентных соотношений . . . . . 68
'2. Метод декомпозиции. . . . . . . . . . . . . . . . . 71
3. Метод динамическоrо проrраммирования 74
Задачи и упражнения к rлаве 3. . . . . . . . . . . . 79
[' л а в а 4. Элементы теории ресурсной эффективности вычисли
тельных алrоритмов. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 82
1. Терминолоrия и обозначения в теории ресурсной эффективности
вычислительных алrоритмов . . . . . . . . . . . . . . . . . . . . . . . . .. 83
2. Функции ресурсной эффективности алrоритмов и их nporpaMMHbIX
реализаций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 87
З. Классы открытых и закрытых задач и теоретическая нижняя rpa
ница временной сложности. . . . . . . . . . . . . . . . . . . . . . . . . . 97
4. Классификации вычислительных алrоритмов по трудоемкости. .. 101
5. Информационная и размерностная чувствительность вычислитель
НЫХ алrоритмов .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
4
Оzлавленuе
6. КлассификаllИЯ вычислительных алr-оритмов по дополнительной
памяти . . . . . . . . . . . . . . . . . . . . . . ,. 123
r л а в а 5. Специальные rлавы теории рекурсии . . . . . . . .. 129
1. Основная теорема о рекуррентных соотношениях и некоторые осо-
бые случаи. . . . . . . . . . . . . . . . . . . . . . . . . . . .. 129
2. Производяшие функции. ............... 133
3. Методы исчисления конечных сумм. . . . . . 152
4. Функция (31 (п) и друr'ие специальные ФУНКЦИИ. 163
5. Комбинаторные соотношения и их связь с рекурсивными алrорит
мами. . . . . . . . . . . . . . . . . . . . . .. 166
Задачи и упражнения к rлаве 5. . . . . . . . . . . . . . . . . . . . . . . . .. 170
r л а в а 6. Методы теоретическоrо анализа ресурсной эффективно
сти рекурсивных алrоритмов . . . . . . . . . . . . . .. ....... 172
1. Базовые операции процедурноrо языка BblcoKoro уровня и методи
ка анализа основных алrоритмических конструкций. . . . . . . 172
2. Особенности анализа временной и емкостной эффективности pe
курсивных алrоритмов . . . . . . . . . . . . . . . . . . . . . . 178
3. Анализ трудоемкости методом подсчета вершин дерева рекурсии 181
4. Анализ трудоемкости методом рекуррентных соотношений . 185
5. Способы повышения ресурсной эффективности рекурсивных алrо
ритмов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 187
Задачи и упражнения к rлаве 6. . . . . . . . . . . . . . . . . . . . . . . . .. 190
r л а в а 7. Рекурсивные алrоритмы решения некоторых задач и их
теоретический анализ. . . . . . . .. ................... 192
1. Алrоритм вычисления факториала. . . . . 192
2. Алrоритм вычисления чисел Фибоначчи. . . . . . . . . . . 195
3. Ашоритм вычисления квадратноrо корня. 198
4. Алrоритм быстроrо возведения числа в целую стспень 204
5. Алrоритм Караllубы умножения длинных целых ЧИСCJI . 209
6. Алrоритм фон Неймана сортировки массива чисел слиянием. 219
7. rенетический ашоритм эвристическоrо .поиска экстремума функ
ции нескольких переменных . . . . . . . . . . . . . . . . . .. 228
8. Алrоритм Тарьяна поиска OCToBHoro дерева в rрафе . . . 243
9. Алrоритм Беллмана оптимальной одномерной упаковки 219
Задачи и упражнения к rлаве 7. . . . . . . . . . . . . . . . . . . 262
11 Р и л о ж е н и е АД. Брейман, r-п. Рябов.
Проrраммные реализации рекурсивных алrоритмов и их эксперимен
тальное исследование. . . . . . . .. ......... 266
ПРЕДИСЛОВИЕ
Коrда в мае 2005 rода издательство «Техносфера» любезно пpeд
ложило нам написать дополнение к книrе Р. Хаrrарти «Дискретная
математика для проrраммистов», то, обсуждая оrлавление будущеrо
дополнения, мы единодушно включили в Hero rлаву, посвященную
элементам теории рекурсии. В ходе работы над дополнением был
подrотовлен довольно обширный материал по применению рекурсии
в проrраммировании и оценке рекурсивных алrоритмов, и стало ясно,
что у нас есть база для написания отдельной книrи. Этот материал
и стал одним из стимулов создания «Теории рекурсии для проrрам
:I1ИСТОВ» книrи, которую наш уважаемый читатель держит сейчас
в руках.
Основной материал книrи базируется на лекционных курсах «Дис
кретная математика» и «Разработка эффективных алrоритмов», чи
таемых авторами на протяжении ряда лет в Московском rосудар
ственном университете приборостроения и информатики (мrупи»
на материалах реrулярноrо научноrо семинара «Анализ и разработка
эффективных вычислительных алrОРИТМОВ8 кафедры «Персональные
компьютеры и сети» мrупи, а также на наших научных публикациях,
посвященных исследованию и анализу вычислительных алrоритмов.
Наше понимание содержания «Теории рекурсии для проrрамми
стов» как совокупности специальноrо раздела современной дискретной
математики математической теории рекурсии, и основанных на ней
методов анализа рекурсивных алrоритмов и элементов теории pecypc
ной эффективности нашло отражение в структуре данной книrи. Мы
начинаем с математическоrо ввсдения в теорию рекурсии, которому
посвящена rлава 1, включая частично рекурсивные и общерекурсивные
функции, введенные С. Клини и А. Чёрчем, персходим к рекурсивным
алrоритмам и методам их разработки в rлавах 2 и 3, и излаrаем эле
менты теории ресурсной эффективности вычислительных алrоритмов
в rлаве 4. Этот материал является о€новой для понимания более де-
тальноrо теоретическоrо исследования рекурсии, KOTOpO:vIY посвящена
r'лава 5, на основе KOToporo в rлаве 6 излаrаются методы теоретическо
1'0 анализа и способы совершенствования рекурсивных алrоритмов.
Мы ставили своей основной целью создание учебноrо пособия для
студентов, преподавателей и проrраммистов, поэтому на разнообразных
примерах теоретическоrо анализа рекурсивных аJ1I'ОрИТМОВ, приведен
ных в rлаве 7, начиная с очень простых (мы надеемся, что подrотовлен
ный читатель нас здесь извинит), мы хотели показать, как эти методы
& djvu Kartun [kаrtuп@уапdех. ruJ
6
Предисловие
применимы в практике оценки ресурсной эффективности рекурсивных
алrоритмов.
«Теория рекурсии для проrраммистов» это не руководство по
написанию проrрамм, реализующих рекурсивные алrоритмы в различ
ных языках проrраммирования это изложение элементов теории
рекурсии и методов оценки рекурсивных алrоритмов, ставящее своей
задачей показать возможности, предоставляемые рекурсией в теории
и практике проrраммирования. В этом аспекте авторы уверены, что
в современном море проrраммных средств и систем, опирающихся
на итерационные алrоритмы, реализованные в рамках процедурноrо
объектноориентированноrо подхода, у рекурсивных алrоритмов есть
свои освещённые солнцем заливы.
В процессе работы над книrой мы старались сохранить стиль и дух,
присущий книrам издательства (,ФИЗМАТЛИТ», целевой аудиторией
которых являются, в первую очередь, студенты, аспиранты и препо
даватели. Мы надеемся, предлаrая эту книrу уважаемым читателям,
на то, что наша аудитория, равно как и те, кто занимается реальной
разработкой проrраммных средств и систем, найдут в ней некоторые
полезные и интересные для себя сведения и результаты.
Наши искренние блаrодарности коллективу издательства «ФИЗ
МАТЛИТ,>, и лично л.Ф. Соловейчику, за поддержку и творческое
сотрудничество. Особые блаrодарности мы при носим авторам приложе
ния нашим коллеrам: доценту кафедры «Персональные компьютеры
и сети» мrупи А.Д. Брейману и аспиранту кафедры r.п. Рябову,
взявшим на себя труд провести серию экспериментов с проrраммными
реализациями рекурсивных алrоритмов с целью подтверждения полу
ченных нами теоретических результатов.
В.А. rоловешкuн,
М.В. Ульянов
Москва, апрель 2006 r.
ВВЕДНИЕ
Парадиrма рекурсивноrо проrраммирования. В середине 1930x
rr. Стивен Клини, основываясь на исследованиях Курта rёделя и Жака
Эрбрана, вводит рекурсивные функции для уточнения общеrо понятия
арифметическоrо алrоритма. Предложение считать понятие вычисли
мой функции равномощным понятию рекурсивной функции известно
под названием тезиса Чёрча-Клини, сформулированноrо Алонзо Чёр
чем и Стивеном Клини в 1936 [оду, «любая интуитивно вычис
лимая функция является частично рекурсивной функцией. Начиная
с этих работ, аппарат рекурсивных функций становится ОДНОЙ из
фундаментальных основ современной теории алrоритмов. Возможность
поддержки механизма рекурсивноrо вызова в языках BbIcoKoro уровня,
равно как и создание специальных языков, в которых рекурсивные
вычисления являются базисом описания вычислительноrо процесса
(Рефал, Лисп и т. д.), перевели рекурсию из области теоретическоrо
аппарата исследования общих свойств алrоритмов в область практи
ческоrо проrраммирования. Идеи Р. Беллмана и ero «основное функ
циональное уравнение,), на наш взrляд, также немало способствовали
популяризации рекурсии как парадиrмы проrраммирования. В MaTe
матике и проrраммировании рекурсия это метод ОIlределения или
выражения функции или процедуры посредством ТОЙ же функции или
процедуры. Рекурсия как парадиrма проrраммирования это метод
создания проrрамм, ИСПОЛЬЗУЮЩИЙ проrраммные конструкции функций
или процедур, которые вызывают сами себя либо непосредственно,
либо косвенно. Рекурсия естественным образом встречается во всех
областях машинной математики. CTporoe описание идентификаторов
и имен в языках проrраммирования, записанное в нотации Бэкуса
Наура, содержит явные рекурсивные определения. На принципах pe
курсии строятся формальные rрамматики, описывающие сами языки
проrраммирования. Мноrие структуры данных, например, деревья, TaK
же допускают простое рекурсивное описание.
Те, кто впервые сталкивается с проrраммированием, обычно очень
настороженно относятся к рекурсии. Эта настороженность объясняется
тем, что изначально механизм рекурсивноrо вызова не является оче
видным, и возникает интуитивная опасность бесконечноrо цикла или
аварийноrо завершения по обращению к адресу памяти за допустимы
:>!И rраницами. В противовес этому мнению мы считаем, что парадиrма
рекурсивноrо проrраммирования предоставляет разработчикам в целом
& djvu Kartun [kаrtuп@уапdех. ruJ
8
Введение
ряде случаев простой, лоrичный и изящный инструмент создания про
[рамм, имеющий ряд прсимуществ.
Преимущества рекурсивноrо подхода. Что реально может по
лучить проrраммист, используя рекурсивные функции и процсдуры
при разработке своих проrрамм? Мы не пытаемся окружить рекурсию
розовым облаком, но, тем не менее, в определенных случаях ее приме
нение может принести значительную пользу. Мы хотим остановиться
на нескольких aprYMeHTax в пользу рекурсии, а именно таких.
1. Существует достаточно обширный Kpyr задач, которые имеют pe
курсивную природу, а ряд методов разработки алrоритмов, в частности,
те, о которых пойдет речь в настоящей книrе, естественно порожда
ют рекурсивные алrоритмы. Метод динамическоrо проrраммирования
рекурсивен по своей сути; метод декомпозиции, предполаrающий раз
биение задачи на несколько аналоrичных задач меньшей размерности,
с последующим объединенисм рсшений, также порождает алrоритмы
с очевидной рекурсивной структурой.
2. Целый ряд структур данных и мноrие объекты современных язы
ков проrраммирования рекурсивны по самой своей сути. Повторение
цслоrо в ero части основное свойство фрактальных объектов. Иерар
хия классов в объектноориентированном проrраммировании, раЗJlИЧ
ныс древовидные реrулярные структуры данных имеют простое pe
курсивное описание. lIporpaMMb! для работы с такими структурами
выrлядят HaMHoro более естественно в рекурсивной реализации.
3. Рекурсия в проrраммировании является аналоrом метода MaTeMa
тической индукции в математике. На наш взrляд, оба метода обладают
как внутренним изяществом и простотой, так и широкой областью
применения.
4. Рекурсивно реализованные алrоритмы, при правильных на то
основаниях, имеют лаконичную запись и менее трудоёмки при после
дующей отладке и модификации. Сеrодня такой фактор, Еак временные
затраты на разработку, отладку и модификацию прО!'раммных средств
также может быть использован в качестве aprYMeHTa н пользу pe!,(yp
сии.
5. И, наконец, aprYMeHT с теоретическим подтекстом если аппа
рат частично и общерекурсивных функций является одним из базисов
современной теории алrоритмов, то поче1У сами алrоритмы не должны
быть рекурсивными?
KOHTpaprYMeHTbI. Несмотря на перечисленные aprYMeHTbI, peKYP
сия в настоящее время отнюдь не яв"яется обыденным средством
разработки алrоритмов и проrрамм для мноrих проrраммистов, даже
профессиональных. Обычно н качестве KOHTpaprYMcHToB выдвиrаются
следующие положения, в основе которых лежат интуитивные оценки
ресурсной эффективности nporpaMMHbIX реализаций.
1. Рекурсивно реализованные аJJ['ОрИТМЫ обладают худшей BpeMeH
ной эффективностью. Да, конечно, обслуживание реJ<УРСИВНЫХ BЫ
Введение
9
зовов влечет определенные накладные расходы, но при этом peKYP
сивные алrоритмы, разработанные, например, методом декомпозиции,
имеют лучшие аСЮ1Птотические оценки. Это означает, что, начиная
с некоторой длины входа, достаточно часто соответствующей области
практическоrо использования, проrраммная реализация рекурсивноrо
алrоритма будет иметь лучшие временные показатели.
2. Емкостная эффективность рекурсивных реализаций хуже, чем
итерационных. Да, рекурсивно реализованный алrоритм требует боль
ше памяти за счет использования области проrраммноrо стека, но эти
затраты определяются rлуБИIIОЙ рекурсии. Для большинства peKYP
сивных алrоритмов и практически значимых размерностей задач эта
rлубина, при современном объеме оперативной памяти компьютеров,
не вносит существенноrо вклада в общий требуемый объем памяти.
Рекурсия в сравнении с итерацией. В соответствии с рядом
тезисов теории алrоритмов (тезис ЧёрчаКлини, тезис Чёрча Тьюринrа)
любой алrоритм, который можно реализовать в виде машины Тью
ринrа, может быть описан аппаратом рекурсивных функций. На прак
тике этот результат означает, что рекурсия и итерация как способы
разработки аю'оритмов и проrрамм эквивалентны. Рассмотрение этоrо
вопроса с точки зрения теории ресурсной эффективности показывает,
что, в зависимости от задачи и диапазона длин входов, более эф
фективной является или итерационная или рекурсивная реализация.
В ряде случаев, особенно в проrраммных реализациях алrоритмов,
основанных на методе динамическоrо проrраммирования, эффективное
решение состоит в построении комбинированноrо алrоритма, совмеща
ющеrо рекурсию и итерацию.
Мы не можем предложить уважаемому читателю однозначных pe
шений если Вы придерживаетесь интуитивноrо подхода, то решение
по выбору рекурсивноrо или итерационноrо подхода лежит в области
Вашеrо понимания «рекурсивIOСТИ» caMoro а.лrоритма или обрабатыва
емых им объектов, если Вы сторонник математическоrо обоснования
выбора между рекурсией и итерацией Torдa в Вашем распоряжении
современные методы анализа алrоритмов.
Обоснование выбора рациональноrо алrоритма. Наша точка
зрения состоит в том, что рекурсия это естественный метод pea
.лизаI.lЛИ алrоритмов для решения множества математических и вычис
лительных задач, и решение о выборе рекурсивной или итерационной
реализации необходимо принимать на основе анализа их ресурсной
'7ффективности. Современные математические методы анализа peKYP
сивных аJJrоритмов базируются как на методах решения рекуррентных
соотношений, так и на методах асимптотической оценки рекурсивно
:lзданных функций. Их применение позволяет получить теоретические
оненки временной эффективности рекурсивных алrоритмов. Получен
I!LIe результаты, например, для алrоритмов, основанных на методе
JLекомпозиции, показывают целесообразность применения рекурсии для
!о
Введение
решения целоrо ряда задач, по крайней мере, по критерию асимпто
тической оценки временной эффективности. Если мы при этом имеем
в своем распоряжении методы детальной оценки ресурсной эффек
тивности, то появляется возможность решать задачу рациональноrо
выбора вычислительных алrоритмов в реальном диапазоне длин BXO
дов. Вполне возможно, что такое решение будет принято в пользу
рекурсивноrо, а не итерационноrо алrоритма.
Что такое рекурсия в математике и проrраммировании, каким
образом можно разрабатывать рекурсивные алrоритмы и как можно
анализировать их ресурсную эффективность на эти вопросы мы
и пытаемся ответить в настоящей книrе.
rлава 1
ВВЕДЕНИЕ В ТЕОРИЮ РЕКУРСИИ
Введение. Мы начинаем изложение материала книrи с введения
в теорию рекурсии. Рассматривая ряд примеров, при ВОДЯЩИХ к peKYP
сивно заданным последовательностям и функциям, мы вводим OCIIOB
ные понятия и определения общей теории рекурсии и указываем связь
классической теории алrоритмов с понятием частично рекурсивной
функции. Более детальное рассмотрение особенностей задания peKYP
сивных последовательностей и функций позволяет дать их классифи
кацию, на основе которой мы приводим некоторые методы исследова
ния и решения рекуррентных соотношений. Этот материал является
базовым для изложения дальнейшеrо материала книrи, и мы советуем
читателям не только внимательно ознакомиться с содержанием этой
rлавы, но и решить предлаrаемые задачи и выполнить упражнения,
приведенные в конце этой rлавы.
1. Основные понятия и определения
Прежде чем переходить к основным понятиям и определениям об
щей теории рекурсии, рассмотрим некоторые примеры.
Пример 1.1. Эта задача, которая может показаться читателю
HeMHoro странной, состоит в том, что, предположим, нам требуется
решить на компьютере следующее уравнение: О,7х == 2, но наш KOM
пьютер таков, что он умеет складывать, вычитать, умножать и cpaB
нивать, но не умеет делить. Предложим алrоритм, который позволит
этому странному компьютеру решить данное уравнение (rоворя более
высоким стилем, мы покажем, что данная задача разрешима в предло
женной модели вычислений).
Перепишем уравнение в виде Х == О,3х + 2, зададим значение ХI == 1
и рассмотрим последовательность значений Х n , определенных COOTHO
llIениями
{ Х1 == 1;
Х п +l == О,3Х п + 2.
(1.1.1)
Мы получили рекурсивно заданную последовательность, в которой
следующее значение определяется на основе предыдущеrо. Изучим
свойства этой последовательности. Обозначим IXn+1 хпl через r n ,
& djvu Kartun [kаrtuп@уапdех. ruJ
12
[Л. 1. Введение 8 теорию рекурсии
а поскольку по формуле (1.1.1) Х п +] == 0,3Х п -+ 2, и Х п +2 == 0,3Х п + [ -+ 2,
то имеем
Х п +2 Хп+l =--с 0,3(X n +1 Х п ),
следовательно, 1'п+1 == 0,31'п. Покажем, что последовательность Х п
оrраничена для всех значений п. Так как Х] == 1, то Х2 == 2,3, тоrда при
п > 2 получаем
IX n х[1 == I(xn Xпl) -+ (Xnl Xп2) +-... -+ (Х3 Х2) -+ (Х2 x1)1.
Воспользовавшись свойством модуля, мы :vIожем записать неравенство
IX n х]1 Ixn Xn[! -+ IXn1 Xп21 -+... -+ I X 3 Х21 -+ IX2 X[I,
следовательно,
IX n X[I 1'п[ -+ 1'n2 -+... -+ 1'2 -+ 1'1,
а поскольку 1'п+[ == 0,31'п, то
IX n :Е I1 0,зп21'1 -+ о,зпз1'] -+ . . . -+ 0,31'1 -+ 1'].
Используя формулу суммы rсометрической проrрессии, получаем
1 О зп, [
l ' 1 :s::: '
XпXI ",1'1 10,3 '
таким образом доказана or'раничснность последовательности Хп.
Далее докажем, что данная последовательность имеет предел. Для
этоrо обозначим через d rnn "с. Ixn Х rn 1, и, для определенности, будем
полаrать, что п > т. Лналоrично только что проделанным рассужде
ниям получаем следующее неравенство
d rnn 1'n1 + 1'п2 +... + Тт+l + Тт,
следоватсльно,
d mn 0,зп21'1 -+ О,зпз1'[ -+ ... +- О,з rn 1'[ -+ О,зт 1 1'[ ==
rn 1 1 О,зпт
== 0,3 1'[ 1 0,3 '
тоrда для любоrо Е > О найдется число по =----= по(Е) такое, что при любых
п > по, т > по будет выполнсно d rnn < Е. ИЗ свойства полноты множе
ства действительных чисел следует, что последовательность Х п имеет
предсл при п, стремящемся к бесконсчности. Обозначим lim Х п ==
п----->:)()
,= Z И псрейдем к пределу в соотношснии Х п +[ == 0,3Х п -+ 2, имее:vI
lim Х п + 1 == liш (0,3Х п -+ 2), тоrда получаем z == 0,3z -+ 2, следователь
n-------+(Х) п--+oc
НО, значение предела и являстся корнем уравнения. Таким образом,
ашоритм, основанный на соотношении (1.1.1), позволяет решить ypaB
НСНИС с любой заданной точностью, не используя операцию деления.
Отмстим, что в соотношении (1.1.1) мы использовали опрсделение
следующеrо члсна последовательности через ero предыдущее значение.
Пример 1.2. I !еобходимо найти .;а (а > О), если разрешается
ИС11Ользовать только четырс арифметические операции сложение,
9 1. Основные понятия и определения
13
вычитание, умножение, деление и операцию сравнения. Значение va
является положительным корнем квадратноrо уравнения х2 == а. Пре
образуем это уравнение в уравнение 2х2 == х2 + а, которое представим
в виде
x==(x+).
Рассмотрим последовательность Х п , определяемую соотношениями:
{ ::: н х n <.) (1.1.2)
Очевидно, что данная последовательность принимает только поло
жительные значения. Для Toro чтобы исследовать свойства данной по
слсдовательности, нам понадобится некоторая информация о свойствах
функции
у(х) == (x+),
более точно нас интересует ее производная
dy == ( 1 )
dx 2 х2'
При положительных значениях aprYMeHTa производная равна нулю при
х == va. Функция у (х) убывает на интервале (О; va) и возрастает
на интервале (va; 00). Тоrда для положителы!ых значений aprYMeHTa
точка х == va является точкой минимума, и, следовательно, при всех
неотрицательных ero значениях имеем
у (х) ( va + ;а ) == va.
Значит, все члены последовательности, кроме, может быть, первоrо,
больше, либо равны va: ;Еп va при п > 1. Далее покажем, что
все члены последовательности, начиная со EТoporo, не возрастают, т. е.
.Тп+I :::;; х п при п 2. Нетрудно заметить, что при х va выполнено
неравенство
1 ( й ) 1
'2 х +;: :::;; '2 (;{; J х) == х.
Следовательно, члены последовательности не возрастают, начиная со
BToporo. Но из курса математическоrо анализа известно, что не воз
растающая оrраниченная lIOследователыIOСТЬ имеет предел. Обозначим
lirn Х п == Z и, переходя к пределу в соотношении
п,OO
1 ( а )
Х п + I == '2 Х п + Х п '
получаем, что значение предела является положительным корнем ypaB
нения
z==(z;),
& djvu Kartun [kаrtuп@уапdех. ruJ
14
fл. 1. Введение в теорию рекурсии
который равен z == у'а. Записанная последовательность, в которой
опять следующее значение определено по некоторой формуле через
предыдущее, может быть леrко преобразована в алrоритм, позволяю
ЩИй вычислять квадратные корни с нужной степенью точности мы
рассмотрим ero подробно в rлаве 7.
Отметим, что изложенные методы основаны на более широком
методе, применяемом в математике и известном под названием «метод
сжимающих отображении». Сам математический метод опирался на
идею построения peKyppeHTHoro соотношения, строrий смысл понятия
«рекуррентное соотношение» мы поясним несколько позже, после
рассмотрения нескольких примеров.
1r/2
При мер 1.3. Требуется вычислить f cosnxdx, rде n;;:: О целое
о
число. Будем рассматривать данный определенный интеrрал как после
довательность [n.
1r/2
Обозначим [" == f cosnx dx, нетрудно видеть, что
О
1r/2 1r/2
[о == f cos O xdx == f dx == 1r/2,
о о
1r/2
11 == f cos х dx == sin xl/2 == 1.
о
Теперь мы попытаемся найти способ вычисления данноrо интеrрала
в общем случае. Для этоrо воспользуемся известной формулой инте
rрирования по частям
ь ь ь
f и dv == uv I а f v dи,
а а
мы надеемся, что большинство читателей помнят эту формулу и. не
будут в обиде на нас за это напоминание, но на всякий случай мы все
же ее приводим. Преобразуем искомый интеrрал к виду
1r/2 1r/2
I n == f cosnxdx == f cosпlx. cosxdx
о о
и обозначим и == СОБп 1 Х, dv == cos х dx, следовательно,
du == (COSп1 x)'dx == (n 1). СОБn2 х. sinxdx,
1) == f d-v == f cos х dx == sin х.
1. Основные понятия и определения
15
Применяя формулу интеrрирования по частям, получаем
-rr /2 t -rr /2
In-= J COBn! xdsinx==cosn! x,sinx\ + (п 1) f COBn2 х. sin 2 xdx,
о о о
поскольку sin О == О, cos(7!' /2) -= О, sin 2 х == 1 сов 2 Х, то полученное
выражение преобразуется к виду
-rr/2
In == (п 1) J cosn2x. (1 cos 2 x)dx ==
о
-rr/2 -rr/2
== (п 1) J СОSn.7:ФС.-:--: (n -----: 1) f cosnx.dx.
о о
-rr/2
Вспомним наши обозначения, так как In == f casnxdx, In2
о
-rr/2
f cosn2x dx, то
о
I n == (п 1 )In2 (п 1 )I n , п I n ::;::: (п 1)In2,
следовательно,
пl
I n == 1n2'
п
Зная значения 10 и 11, С помощью формулы (1.1.3) мы можем BЫ
числить за конечное число шаrов значение l п для любых п. Например,
требуется вычислить
(1.1.3)
-rr/2
15 == J cos 5 Х dx,
о
тоrда, применяя (1.1.3), получаем
4 4 2 4 2 8
15 == [/3 == '5' "3 I ! == '5 . "3 . 1 == 15'
Мы снова получили метод вычисления, в данном случае последова
тельности значений определенноrо интеrрала, в котором, зная несколь
ко предыдущих элементов упорядоченноrо множества, мы вычисляем
следующий.
Приведем еще один пример, коrда по подобной схеме вычисляется
не числовая последовательность, а функция.
Пример 1.4. Рассмотрим метод нахождения первообразной для
функции
1
f (х) == (х 2 + а 2 )п '
& djvu Kartun [kаrtuп@уапdех. ruJ
16
Fл. 1. Введение в теорию рекурсии .
rде n целое положительное число. Будем рассматривать первооб
разную как функцию двух переменных независимой переменной х
и целой переменной n. Поскольку любая первообразная определена
с точностью до произвольной постоянной, то произвольную постоян
ную мы будем опускать. Обозначим через
f dx
Jn(x) == (х 2 +- а 2 )n '
(1.1.4)
Нетрудно видеть, что
J[(x) == I (x2a2) == arctg.
Для вычисления первообразной при произвольном n преобразуе:\!
подынтеrральное выражение. При это:\! будем использовать широко
применяемые в математике приемы: прuбавлен-ие н-уля и умн-ожен-ие
н-а един.ицу (при этом важно «удачно» записать ноль и единицу). Итак,
имеем
( 2 2 2 )
Jn(x) == J dx , == J х +- а х dx =,'
. (х 2 +- а 2 )п а 2 (х 2 --j--- (12)п
1 f (х2 +- a 2 )dx 1 J x2dx
=ос а 2 (х 2 +- а 2 )" а 2 (х 2 +- а 2 )n'
Это выражение может быть преобразовано к виду
Jn(X)== J dx J x xdx
а 2 (х 2 +- a2)пl а 2 (х2 +- а2)п'
Первое слаrаемое в правой части, соrласно принятым обозначениям,
равно
1 J dx 1
2 (2 2) [ == 2 .Jn[(X).
ах+- а п а
Для вычисления BTOporO CJJaraCMOro ВОСПОЛЬЗУСМСЯ формулой интеrри
рования по частям, для чеrо обозначим
u == х, dv == х (lх тоrда du == (lх, 'и== I :Е dx .
(х 2 -+- а 2 )n ' (х 2 +- а 2 )n .
Для вычисления ПОСJJсднеrо интсrрала сдепаем замену псремснной z ==
== х 2 +- а 2 , Torдa х dx .-= d(x2 +- а 2 ) == (lz. СJJсдовательно,
f х dx 1 f dz 1 1
'и-= (х2+а2)п =='2 zn ==2(п1)zn1 ==2(n1)(x2+a2)n1'
получаем
1
.Jn(x) == 2JnI(X)
а
I [ х 1 f dx ]
а 2 2(n 1)(х 2 +- a2)nl +- 2(п 1) (х 2 +- a2)n1 .
1. Основные понятия и определения
17
Раскрывая скобки и приводя подобные, получаем формулу для вычис
ления (1.1.4):
х (2п 3)
Jn(x) == 2(п l)а2(х2 +a2)nl + 2(п l)a2 Jn1(X). (1.1.5)
Используя полученную формулу, вычислим, например, значение
J 2dx 3 ' при этом а == 1, п == 3, и на основании (1.1.5) имеем:
(х + 1)
J dx х (2 . 3 3)
Jз(х) == (х 2 + 1)3 == 2. (3 1)(х2 + 1)31 + 2(3 l)a2 J31(X) ==
== 4(х2: 1 )2 + J2(X) == 4(х2: 1 )2 + [ 2(х2Х+ 1) + J! (х)] ==
х 3 х 3
== 4(х 2 + 1)2 + '8 (х 2 + 1) + '8 arctgx.
При мер 1.5. Приведем еще один при мер пример разработки
алrоритма ВЫЧИслений по подобной схеме, в которой параметром явля
ется размер массива исходных данных. Рассмотрим задачу вычисления
определителя квадратной матрицы. Мы надеемся, что читатели зна
комы с классическим курсом линейной алrебры и аналитической reo
метрии, но на всякий случай напомним некоторые основные моменты.
Матрицей А размера т х п называется прямоуrольная таблица чисел,
содержащая т строк и п столбцов, которую будем представлять в виде
аl1 а12
а21 а22
alj
a2j
al n
а2п
А==
ai! ai2
aij
ajn
атl а т 2 ... ат) ... а тп
Символом Щj обозначается элемент, стоящий на пересечении строки
с номером i и столбца с номером j. Если число строк равно числу
столбцов, то матрица называется квадратной. Понятие определителя
имеет смысл только для квадратной матрицы. Определитель это
некоторое число, которое ставится в соответствие квадратной матрице,
оно обозначается символом /),. или IAI. Ниже будет изложено правило
cro вычисления. Для матрицы А размерности 1 х 1 А == (all) по
определению IAI == all. Минором J\1 ij матрицы А называется опреде
литель матрицы, получаемой из матрицы А путем удаления строки
с номером i и столбца с номером j. Например для матрицы
( 1 2 5 )
А== 4 1 3
234
М2! == I I.
Алrебраическим дополнением элемента aij называется число, равное
:тачению минора M ij , если значение i + j четное число, и равное
& djvu Kartun [kаrtuп@уапdех. ruJ
18
rл. 1. Введение в теорию рекурсии
значению минора с противоположным знаком (Mij) в противном
случае. Алrебраическое дополнение будем обозначать символом A ij .
Таким образом A ij == (l )i+j Mij. Например для матрицы
( 1 2 5 )
А== 4 1 3
234
A 2J == ' I.
Одно из свойств определителя формулируется следующим образом:
определитель равен сумме произведений элементов любой строки
или столбча f.щ их алсебраические дополнения. Для построения
алrоритма вычисления определителя квадратной матрицы для любой
размерности мы это свойство СфОРМУ,'1ируем в следующем виде: onpe
делитель равен сумме про изведений элементов ПЕРвоrо столбча
на их алсебраическuе дополнения. Например, для матрицы BToporo
порядка имеем
' а ы == ad сЬ'
с d '
(1.1.6)
для матрицы TpeTbero порядка
l a1 Ь1
а2 Ь 2
аз Ьз
l l ==а (1)1+l l b2 С2 ! +а (1)2+1 I bl С1 1 +
2 J Ь з СЗ 2 Ьз СЗ
сз
+0 (l)З+I I ЬJ С1 1 ==а1 1 Ь2 C2 1 a [ ы
з Ь 2 С2 Ь з СЗ 2 Ь з
CI I + о I b l CI I .
СЗ з Ь 2 С2
Отметим, что вычисление определителя матрицы TpeTbero порядка
свелось к вычислению трех определителей матрицы BToporo порядка.
Точно по такой же схеме вычисление определителя матрицы порядка
п сводится к вычислению n определителей матриц порядка п 1.
Например, для матрицы четвертоrо порядка
1
2
8. ,--= 3
1
== 1(1)1+1 1 i I + 2(1)2+1 I I +
854 563 563
563
+ 3(I)З+I I I + 1(1)4+1 I I ==
5 6 3 8 5 4
[6(I)I+II jl +8(1)2+11 I +5(1)З+11 I]
2 [2(1)1+11 il + 8(1)2+11 jl + 5(1?+1 I I] +
i 3[2(1)1+11 1+6(1)2+11 1+5(1)З+11 I]
1. Основные понятия и определения
19
[2(1)]+] 1: ! +6(1)2+11 I +8(1)3+11 I] ==
== [6(15 24) 8(12 36) + 5(16 30)] 2 [2(15 24) 8(9 6) +
+ 5(12 5)] + 3 [2(12 36) 6(9 6) + 5(18 4)] [2(16 30)
6(12 5) + 8(18 4)] == [54 + 192 70)] 2 [18 24 + 35] +
+ 3 [48 18 + 70] [28 42 + 112] == 68 + 14 + 12 42 == 52.
Мы специально подробно провели все промежуточные выкладки, что
бы отметить один из существенных недостатков предложенноrо алrо
ритма. Оценим необходимое количество операций для ero выполнения.
Вычисление определителя матрицы порядка п сводится к вычислению
п определителей матриц порядка п 1. КаждыЙ из определителей
матриц порядка п 1 сводится к вычислению п 1 определителя
матриц порядка п 2. Таким образом, вычисление определителя по
подобной схеме требует количества операций порядка п(п 1)(п 2) х
х ... . 3 . 2 . 1 == п!. При п == 1 О имеем 1 О! == 3628800, и с ростом размер
ности матрицы количество операций очень быстро возрастает. Отметим
также, что предложенный алrоритм обладает и друrи:vIИ недостатками,
связанными с оrраниченностью разрядной сетки представления чисел,
что может привести к значительной потере точности вычисления опре
делителя для матриц большой размерности.
Можно привести друrой метод вычисления определителя, OCHOBaH
ной на той же схеме, но который свободен от некоторых указанных
недостатков (алrоритм [аусса). Для этоrо напомним еще два свой
ства 'определителя при перестановке двух строк (или столбцов)
определитель меняет знак на противоположный, и определитель не
изменится, если к элементам одной строки или столбца прибавить
соответствующие элементы друrой строки или столбца, умноженные
на некоторый множитель. Отметим, 'по если все элементы первоrо
столбца кроме самосо пер60сО равны нулю, то вычисление определи
теля матрицы порядка п сводится к вычислению односо определителя
матрицы порядка п 1. Первое свойство позволяет на начальном
этапе изменить матрицу так, что этот элемент будет не равен нулю.
Вычислим тсперь тот же определитель с примснснисм этих свойств.
.6. -
123 1
264 6
3 8 5 4
1 563
Из второй строки вычтем первую, умноженную на 2; из третьей вычтем
rlервую, умноженную на З; из четвертой вычтем первую, Torдa
1 2 3 1 1 2 3 1
.6.== 2 2.1 6 2.2 4 2.3 6 - 2.1 О 2 2 4
3 З. I 8 З. 2 5 З. 3 4 З. I О 2 4 1
1 1 52 6З 3 1 О 3 3 2
& djvu Kartun [kаrtuп@уапdех. ru]
20
fл. 1. Введение в теорию рекурсии
Разложив определитель по первому столбцу, получаем
1 2 2 4 1
6. == 2 4 1 .
332
Про ведем аналоrичные действия с полученным определителем. ИЗ BTO
рой строки вычтем первую; из третьей строки вычтем первую, YMHO
3
женную на множитель 2'
2
6.== 22
3 . 2
2
4 (2)
3 . (2)
4
14
2 :l. 4
2
1 2 2 4 1
== о 2 3.
О 6 4
Разложим по первому столбцу, и СlOлучим окончательный результат
1 2 3 1
6. == 2. 6 4 -.= 52.
Оценим количество операций, которое требует данный метод. Для Toro
чтобы обнулить первый элемент в некоторой строке путем Ilрибавле
ния первой строки, умноженной на соответствующий множитель, для
матрицы порядка п требуется попераций. Bcero имеется п строк. Сле
довательно, для Toro чтобы свести вычисление определителя матрицы
порядка п к вычислению односо определителя матрицы порядка п . 1,
число требуемых операций имеет IlОрЯДОК п 2 . Следовательно, общее
число операций, которое требуется для вычисления определителя, име
ет порядок п З , а для больших значений п величина п З существенно
меньше, чем п!. Особенностью предложенноrо алrоритма является тот
факт, что ero реализация для массива, хранящеrо квадратную матрицу
некоторой заданной размерности, сводится путем некоторых преобразо
ваний к реализации Toro же caMoro алrоритма, но для массива меньшей
размерности. Останов алrоритма происходит, коrда размер мэ>трицы
равен 2 х 2, и определитель может быть вычислен непосредственно по
формуле (1.1.6).
Основные понятия и определения. Существует один общий MO
мент, который объединяет изложенные в примерах математические
методы решения рассмотренных задач. Так:
в примерах 1.1 1.3 следующие члены последователЬ/юсти BЫ
числялись по известным формулам с использованием предыдущих,
ранее найденных членов исследуемой последовательности;
в при мере 1.4 полученное соотношение позволяет вычислять
элементы функциональной последовательности по известным ее
предыдущим элементам;
в при мере 1.5 предложенный метод позволяет сводить процедуру
решения задачи для массива некоторой размерности к точно такой
же процедуре, но для массива меньшей размерности.
1. Основные понятия и определения
21
Все эти методы опираются на идею построения peKyppeHTHoro
соотношения. Далее мы попытаемся пояснить смысл понятия peKYP
сии. Понятие рекуррентный восходит к латинскому recurreпtis
возвращающийся. В математике рекуррентные последовательности
(возвратные последовательности) это последовательности, каждый
следующий член которых, начиная с HeKoToporo, выражается по задан
ному определенному правилу через предыдущие. Рекурсивные функ
ции (восходит к латинскому recursio возвращение) это такие
функции, значения которых для данноrо aprYMeHTa вычисляются с по
мощью значений для предшествующих aprYMeHToB. Рекурсивные функ
ции являются частичными функциями, т. е. функциями, не обязательно
всюду определенными. Чтобы подчеркнуть это обстоятельство, часто
используют термин «частично рекурсивные функции!). Под термином
(<рекурсия» подразумевается способ задания функции, при котором
значения определяемой функции для любых значений aprYMeHTa BЫ
ражаются по известным правилам через значения этой функции для
меньших значений aprYMeHToB. Сам этот термин подразумевает, что
значения aprYMeHToB упорядочены в некотором смысле и для каждой
конкретной реализации процесса определения значения функции мы
имеем конечный набор меньших значений aprYMeHTa. То есть фактиче
ски, в каждой конкретной реализации процесса определения значении
рекурсивно заданной функции мы имеем дело с последовательностью
ее значений. И в некотором смысле термины рекурсивно заданная
функция и рекурсивно заданная последовательность эквивалентны,
однако исторически сложилось так, что в некоторых случаях упо
требляется термин последовательность, а в некоторых рекурсивно
заданная функция.
Далее мы попытаемся дать более cTporoe математическое понятие
термину «рекурсивно заданная функция>). Числовые функции, зна
чения которых можно установить с помощью HeKoToporo известноrо
алrоритма, называются вычислимыми функциями. Функция называ-
ется рекурсивной, если существует эффективная процедура для ее
вычисления т. е. существует определенный конечныЙ набор извест
ных математических операциЙ, при выполнении которых мы получаем
требуемое значение функции.
Впервые класс рекурсивных функции описал К. rёдель как
класс всех числовых функций, определимых в некоторой формальной
системе. А. Черч в 1936 rоду вывел тот же класс числовых функ
ций, что И rёдель, исходя из совершенно друrих предпосылок. Чер-
чем была сформулирована rИI10теза, известная под названием тезиса
Черча: класс рекурсивных функций тождественен с классом всюду
определенных вычислимых функций. Поскольку понятие вычислимой
функции носит интуитивный характер, то доказать этот тезис не преk
ставляется возможным.
Рекурсивные функции в теории алrоритмов. Применение pe
курсивных функциЙ в теории алrоритмов основано на идее нумерации
]
22
rл. 1. Введение в теорию рекурсии
слов в определенном алфавите. После нумерации входных и выходных
слов любой алrоритм превращается в функцию у == f(x), [де aprYMeHTbl
Х и значения функции у принимают лишь неотрицательные целые
значения. Отметим, что указанная функция может быть определена
не ДЛЯ всех значений aprYMeHTa, а ЛИШЬ дЛЯ тех, которые составляют
ее область определения. Данные функции будем называть арифмети
ческими функциями. Среди арифметических функций выделим класс
элементарных арифметических функций в который входят
функции, тождественно равные нулю ОП(Хl, Х2,..', Х п ) == о;
функция прибавления единицы SI(x) == Х + 1;
функция, выделяющая из системы натуральных чисел член с дaH
ным номером Ц'(Хl, Х2,..., xrJ == Xi (1 i n; n == 1,2,...).
Используя перечисленные элементарные функции и небольшое чис
ло конструктивных приемов, можно строить более сложные функции.
В теории рекурсивных функций важное значение имеют следующие
три операции суперпозиции, примитивной рекурсии и минимизации.
Операция суперпозиции сопоставляет функции f от n переменных
и функциям 91, ... ,9п от тn переменных функцию h от т переменных,
такую, что для любых натуральных чисел Х1, ..., Х т имеем
!l(XI, ... ,Х т ) s:! 1(91 (XI, ... ,Х т ), ... ,9n(Xj, ... ,Х т )),
здесь и далее условное равенство S:! означает, что оба выражения,
связываемые им, осмыслены одновременно, и в случае осмысленности
имеют одно и то же значение.
Оператор примитивной рекурсии сопоставляет функции f от n
переменных и функции 9 от n + 2 переменных функцию h от n +
+ 1 переменных такую, что для любых натуральных чисел Xl, ... Х п , У
имеем
h(X1, ... ,Х п , о) S:! f(X1, ... ,Х п ),
h(x!,...,X n , у+ 1) 9(XI,,,,,Xn, у, h(x},...,x n , у)).
Оператор минимизации (н.аименьшесо корня) сопоставляет функ
ции f от п + 1 переменных f (Xl"", Х п , у) функцию h, от п перемен
ных h (Х1, ... ,Х п ) такую, что для любых натуральных чисел Х1, ... ,Х п
В качестве соответствующеrо значения у == h(x"... ,Х п ) принимается
наименьший неотрицательный корень уравнения 1(Xl"", Х п , у) == о.
В случае отсутствия целых неотрицательных корней данноrо ypaB
нения функция !(Xl"", Х п ) считается неопределенной при данном
наборе переменных.
Важную рОЛЬ в теории рекурсивных функций Иf'рают так наЗbJва
емые примитивно рекурсивные функции такие рекурсивные функ
ции, которые получаются из исходных функций в результате примене
ния конечноrо числа одних ЛИШЬ операторов подстановки и примитив
ной рекурсии. Арифметические функции, которые MorYT быть постро
ены из элементарных арифметических функций с помощью операций
суперпозиции, примитивной рекурсии и минимизации, называются ча
fj 2. Рекурсивно заданные последовательности и функции 23
стич.н.о рекурсивн.ыми ФУНК4uями. Если такие функции оказываются
определенными ВСЮДУ, то они называются общерекурсuвНblми фун.к
4 UЯМU .
Понятие частично рекурсивной функции является одним из rлавных
понятий в теории алrоритмов. Значение этоrо понятия определяется
двумя моментами. Вопервых, каждая стандартно заданная частично
рекурсивная функция вычислима путем определенной процедуры. Bo
вторых, оказывается, что числовые функции, вычислимые известными
на настоящее время точно очерченными алrоритмами, являются ча
стично рекурсивными. Последнее замечание является подтверждением
УПОYlянутоrо выше тезиса Чёрча. В аспекте реальноrо проrраммиро
вания это означает, что любой вычислительный алrоритм может быть
реализован рекурсивно, т. е. задан в виде частично рекурсивной функ
ции.
2. Рекурсивно заданные последовательности
и функции
в данном разделе мы попытаемся систематизировать некоторые
наши знания, касающиеся рекурсивно заданных последовательностей
и функций.
Рекурсивно заданные последовательности как функции цe
лочисленноrо aprYMeHTa. Предположим, что требуется определить
зна<jения членов некоторой последовательности t n мы их будем
рассматривать как значения функции 1'(п), rде aprYMeHT п является
целым положительным числом, при этом обычно предполаrается, что
п ;?: О или п;?: 1. Кратко мы будем записывать t n == 1'(п). Рекурсив
ное задание последовательности t n как последовательности значений
функции 1'(п) включает следующие два этапа.
Первый этап. Функция 1'(п) задается непосредственно в виде
числовых значений для HeKoToporo конечноrо множества начальных
значений aprYMeHTa п: 1 :о;; п :о;; т.
Второй этап. Задается метод или формула, которые позволяют,
зная все значения функции 1'(п) при п :о;; k (k т), вычислить ее
значения при п == k + 1, т. е. найти 1'(k + 1) мы получаем peKyppeHT
ные соотношения, описывающие рекурсивно заданную функцию Т(п),
равноположенную (равносильную) последовательности t n . Полученная
запись этих двух этапов, обычно объединенная фиrурной скобкой
{ 1'(1) '-'= tl, 1'(2) == t2,,,,, 1'(т) == t m ;
1'(n+1)==f(tn,tnI,...,tl), п;?:rп,
(1.2.1)
носит название рекуррен.тн.О20 соотн.ошения. Таким образом, мы
будем rоворить, что рекуррентное соотношение (1.2.1) определяет
рекурсивно заданную фун.кцию 1'(п), эквивалентную последователь
ности t n .
& djvu Kartun [kаrtuп@уапdех. ruJ
24
rл. 1. Введение в теорию рекурсии
Рассмотрим ряд примеров, и вначале вернемся к примерам преды
дущеrо параrрафа, в которых были описаны некоторые рекурсивно
заданные последовательности.
Пример 1.6. Запишем рекурсивно заданную последовательность
для решения уравнения 0,7х =о 2 (см. параrраф 1.1) в виде рекурсивно
заданной функции 1'( п) на основе (1.1.1) имеем рекуррентное
соотношение
{ 1'( 1) == 1;
1'(п + 1) == 0,31'(п) + 2, п 1,
(1.2.2)
которое позволяет нам с нужной степенью точности вычислить корень
уравнения 0,7 х == 2, не используя операцию деления.
При мер 1.7. Касаясь BToporo при мера предыдущеrо параrрафа
вычисления Квадратноrо корня, стоит сказать, что в современных
компьютерах представление действительных чисел сводится к пpeд
ставлению в виде оrраниченной двоичной мантиссы и порядка мы
оперируем с рациональными числами, имеющими фиксированный дe
литель. Для получения с нужной точностью величин, не являющихся
рациональными числами, приходится прибеrать к таким математиче
ским приемам, которые, почти всеrда (а может быть и Bcerдa) требуют
построения рекуррентных соотношений. Последовательность, заданная
формулой (1.1.2), может быть представлена в виде рекурсивно задан-
ной функции 1'(п), а именно рекуррентное соотношение
{ 1'(1) -= 1;
1'(п + 1) =-с, 4 (1'(п) + 1':1) )' п 1
(1.2.3)
позволяет нам получить с нужной степенью точности значение х с= va
при положитеJJЫIЫХ значениях числа а.
При мер 1.8. На основе формулы (1.1.3) (см. пример 1.3) для BЫ
/2 .
числения определенноrо интеrрала J cosnx dx как фУНКILИИ aprY1eHTa
о
п полученное рекуррентное соотношение может быть представлено
в виде
{ 7J
1'(0) == 2; 1'(1) == 1;
п1
Т(п + 2) == .1'(п),
п
(1.2.4)
п О.
Пример 1.9. Теперь приведем еще один пример, который показы
вает необходимость применения рекуррентных соотношений для про
rра1МИСТОВ. Все, мы надеемся, знают онределение п1 (пфакториал),
как произведение всех положительных чисел от 1 до п. По определе
ни ю О! ---= 1, далее: 1! == 1, 2! == 1 .2, 3! == 1 . 2 . 3 == 6, и так далее п! == 1 .
.2. ... . (п 1) . п. Однако современные компьютеры мноrоточие пока
не воспринимают. Поэтому для вычисления последовательности t n == п!
2. Рекурсивно заданные последовательности и функции 25
удобно использовать рекуррентное соотношение. задающее рекурсивно
заданную функцию Т (п) с= п! в виде
{ Т(О) ",. 1;
Т(n+ 1) '-'= (п + 1) .Т(п). п;;:: О.
Рекурсивно заданные функции. Во всех приведенных выше при
мерах мы имели дело с рекурсивно заданными последовательностями.
как функциями, aprYMeHToM которых является номер члена последо
вательности. Касаясь рекурсивно заданных функций. нужно отметить
один момент, поскольку это понятие допускает неоднозначное толко
вание. Под термином «рекурсивно заданная функция», как правило,
пони мается такая функция, значение которой для данноrо aprYMeHTa
вычисляется с помощью значений для предшествующих aprYMeHToB.
При каждой конкретной реализации процесса вычисления такой функ
ции мы И;\1еем дело с рекурренТlIO заданной последовательностью.
В практике вычислений это связано с тем, что, имея дело с реальной
функцией (для простоты будем rоворить о функции одной перемен-
ной), мы не вычисляем ее в реальной задаче на всей числовой оси,
а вычислнем для некоторой конечной последовательности значений
aprYMeHToB. Поэтому в таком аспекте фраза «рекурсивно заданная
функция» носит несколько условный характер.
Пример 1.10. Примером вычисления значений непрерывной функ
ции длн некоторой последовательности значений aprYMeHToB может
слуить известный метод Эйлера численноrо решения дифференци
альноrо уравнения. Мы заранее хотим отметить. что не будем rоворить
ни о точности этоrо метода. ни об условиях ero применимости. Нам
важна лишь принципиальная сторона этоrо :\'!етода с точки зрения
рекурсивноrо задания функции. Рассмотрим дифференциальное ypaB
нение первоrо порядка
dy
dx == ЛХ; у)
(1.2.5)
с начальным условие:\'! у(Хо) == УО (задача Коши). Требуется определить
решение этоrо уравнения при х > хо. Известно, что большинство таких
уравнений не решается в аналитическом виде, и решение приходится
искать численно. Зададимся некоторым, достаточно малым, шаI'ОМ h
разбиения числовой оси и построим последовательность точек х n , rде
:r n .-= хо при п с= О и з;n == хо + п 11 нри п ;;:: 1. Мы будем считать задачу
онределения решения выполненной, если сумеем определить :шачения
не известной функции у(х) не на всей ЧИСЛОвой оси, а в последова
тельности точек х п . Обозначим Уп == У(Х n ). тоrда наша цель состоит
в том, чтобы определить последовательность значений Уп' Вспомним
определение производной:
ау == lim y(x+.6.x)y(x) .
dx Llx-----+O .6.х
26
rл. 1. Введение в теорию рекурсии
Если считать шаr разбиения ' достаточно малым, то мы можем запи
сать приближенное равенство
dY I Y(Xi+I)Y(Xi)
dx XXi h
(1.2.6)
а соrласно (1.2.5)
сlу I
1 := f(Xi; Yi),
r Х XXi
(1.2.7)
следовательно, в соответствии с (1.2.6) и (1.2.7) имеем приближенное
равенство
Ун! . Yi f( )
h Xi; Yi ,
которое преобразуется к виду
Yi+I Yi +- f(Xi;Yi) ./.
(1.2.8)
Формула (1.2.8) позволяет записать рекуррентное соотношение для
определения последовательности значений УН := У(Х н ), т. е. функции
У(Х) в точках ХН == Ха +- n h
{ У(Ха) := Уа;
Y(Xh-'-! )=--= У(Хп) +- f ('т н ; У(Х н )) . 11, п;?: О.
Отметим, что при каждой конкретной реализации этоrо метода мы
будем иметь дело с рекурсивно заданной последовательностью зна
чений, которые с некоторой степенью точности представляют неиз
вестную функцию У(:Е). В заключение этоrо при мера мы считаем
необходимы:vI напомнить, что данное учебное пособие посвящено Teo
рии рекурсии, а не численным методам решения дифференциальных
уравнений. Поэтому мы не рекомендуем непосредственно применять
метод Эйлера для решения конкретных дифференциальных уравнений
без ознакомления со специальной литературой по числнным метода:vI.
у непосредственноrо применения метода Эйлера есть достаточно MHoro
«подводных камней», в частности, это касается рациональноrо выбора
шаrа интеrрирования для достижения требуе:vIОЙ точности результата.
Пример 1.11. Расширением нашеrо понимания рекурсивно задан
ной функции является более общий случай, коrда речь идет о peKYP
сивно заданной последовательности функций. В этом случае предпо
лаrается, что задана функциональная последовательность }"r,(x) как
функция двух переменных рп(.т) := f(n; х), rде первая переменная
п принимает лишь целые значения (для определенности полаrаем
n ;?: 1). При 1 :::;; n :::;; т члены функциональной последовательности
являются известны:vIИ функциями, и существует некоторое правило,
которое позволяет для n ;?: т вычислить F п + 1 (х) по известным всем
предшествующим членам функциональной последовательности.
2. Рекурсивно заданные последовательности и функции 27
Например, задачу, рассмотренную в примере 1.4 из предшествую
щеrо параrрафа, мь! можем переформулировать как задачу нахождения
функции двух перемеННbIХ, задающей первообразную вида
f dx
J(n; х) == (х 2 + а 2 )п '
rде п целое положительное число. Поскольку первообраЗНbIе опре
делеНbI с точностью до произвольной постоянной, чтобbI избежать
неоднозначности, будем вести речь о первообраЗНbIХ, значения КОТОРЫХ
равнЬ! нулю в начале координат. Полученную формулу (см. (1.1.5))
для первообразной мы можем записать в виде функции, рекурсивно
заданной по первому aprYMeHTY, и определенной рекуррентным COOTHO
шением
{ J ( 1; х) == arctg :: ;
а а
х (2n З)
J(n; х) == 2(n l)a 2 (x 2 + a2)nl + 2(n l)а 2 J(n 1, х), n 2.
Отметим, что в данном примере для каждоrо KOHKpeTHoro значения
переменной х мь! имеем рекурсивно заданную числовую последова
тельность.
Пример 1.12. При ведем еще один при мер, к которому в полной
мере применим термин «рекурсивно заданная функция». Вспомним
формулу ВbIчисления биномиаЛЬНbIХ коэффициентов
k п!
Сп == k!(n k)!
Дадим этому соотношению более широкое толкование. Рассмотрим
функцию двух перемеННbIХ С(n; k), область определения которой: n
цеЛbIе неотрицатеЛЬНbIе числа, а k цеЛbIе числа. Положим, что
. k n!
С(n, k) == Сп == k!(n k)!
при О ::;:; k ::;:; п, и С(п; k) == О при k < О и k > п.
Заданную таким образом функцию можно леrко определить как
рекурсивно заданную функцию по переменной n следующим COOTHO
шением
{ С(О; k) == О, k =1- О, С(О; О) == 1;
С(п+ 1; k) == С(п; k) +С(n; k 1), п O.
Нетрудно видеть, что определенная таким образом функция представ
ляется хорошо извеСТНbIМ треуrольником Паскаля. Подробное исследо
вание предлаrаем самостоятельно провести читателям.
& djvu Kartun [kаrtuп@уапdех. ruJ
28
rл. 1. Введение в теорию рекурсии
При мер 1.13. Рассмотрим известную в математике rаммафункцию
Эйлера r(x). Она определяется соотношением
00
r(x) == f tXletdt.
о
Будем ее рассматривать при значениях х > О. Преобразуем выражение
для [(х), используя формулу интеrрирования по частям
00 00
r(x) == J tXletdt == J tXldet ==
о о
00
== tXlet[ + (х 1) J tX2etdt == (х 1). l' (х 1)
о
при х > 1. Полученное соотношение позволяет по известным значениям
функции r(x) на полуинтервале (О; 1], полученным с использованием
численных методов, вычислять значения этой функции для aprYMeHTa
х > 1 с помощью peKyppeHTHoro соотношения
I'(x) == (x 1).I'(x 1).
При мер 1.14. В заключение рассмотрим пример использования
рекуррентных соотношений для решения линейных дифференциальных
уравнений. Рассмотрим дифференциальное уравнение вида
d 2 y 2
== x у
dx 2
С условиями у(О) == С, у'(О) == d, Данное уравнение не решается aHa
литически в элементарных функциях. Попробуем найти ero решение
в виде степенноrо ряда, задающеrо искомую функцию у (х)
y(x)==ao+alx+a2x2+... +апх П +...
Наша цель состоит в том, чтобы найти коэффициенты данноrо ряда.
Из начальных условий следует, что ао == С, а1 == d. Вычисляя вторую
производную, получаем
d 2 y
dx' 2 == 1 . 2 . а2 + 2 . 3 . азх -+ 3 . 4 . а4х2 + '" + п( n . 1 )aпxn2 + ...
Подставляя результат в исходное уравнение, имеем
1.2'Q2+2.з.Qзх+3.4'Q4х2+... +п(п 1)anxn2+...
о:с x2(ao+alx+a2x2+... +апх П +...),
92. Рекурсивно заданные последовательности и функции 29
и, приравнивая коэффициенты при одинаковых степенях х, получаем
а2 == о;
аз о;
3 . 4 . а4 == ao;
п. (п 1). а п =--' aп4'
Из этих соотношений получаем рекуррентное соотношение для опре
деления значений рекурсивно заданной последовательности коэффици
ентов искомоrо степенноrо ряда
{ ао == с; а 1 == d; а2 == о;
aп4
а п == , п 4.
п.(пl)
аз == о;
Мы надеемся, что наши читатели без труда cMorYT записать аналоrич
ное соотношение для рекурсивно заданной функции Т (п) == а п . Полу
ченные соотношения позволяют определить коэффициенты степенноrо
ряда, задающеrо неизвестную функцию у (х). Мы оставляем за преде
лами обсуждения вопрос определения области сходимости полученноrо
ряда и, соответственно, вопрос о правомерности ero почленноrо диф
ференцирования. Эти вопросы изучаются в соответствующих разделах
общеrо курса высшей математики.
Таким образом, термин «рекурсивно заданная функция» может
рассматриваться в различных аспектах, а именно:
рекурсивно заданные функции с целочисленным aprYMeHToM как
аналоr рекурсивно заданных последовательностей (примеры 1.6 1.9,
1.14);
рекурсивно заданные функции с действительным aprYMeHToM,
задающие значения непрерывной функции для счетной или конечной
последовательности значений aprYMeHTa (примеры 1.1 о, 1.13);
рекурсивно заданная последовательность функций как функция
двух переменных, одна из которых принимает целочисленные значения
и является aprYMeHToM рекурсии (при меры 1.11, 1.12).
Этим перечислением отнюдь не исчерпываются разновидности pe
курсивно заданных функций, ниже мы познакомимся с дважды pe
курсивными функциями (функция Аккермана), понятием косвенной
рекурсии и т. д. Тем не менее, приведенные при меры уже показывают,
что рекурсивно заданные функции, в различных аспектах их понима
ни я, возникают в целом ряде задач, предполаrающих использование
компьютера для их решения в «задачах компьютерной математи
ки», мы считаем, что этот мало распространенный термин заслуживает
HaMHOro более широкоrо использования.
& djvu Kartun [kаrtuп@уапdех. ruJ
30
Fл. 1. Введение в теорию рекурсии
3. Классификация рекурсивно заданных
последовательностей и функций
Классификация. При классификации рекурсивно заданных по
следовательностей используется следующая терминолоrия. Последова
тельность Х[, Х2, ... ,Х п называется последовательностью с частич
ной предысторией, если следующий член последовательности зависит
от HeKoToporo фиксированноrо числа предыдущих членов. Она может
быть выражена соотношение:vI
Х п ::::: f(Xnj, Xп2,... ,Xni),
rде n > i. Если Х п зависит от всех предыдущих членов, то rоворят, что
рекурсивно заданная последовательность имеет полную пpeдыcтo
рию.
Важным классом рекурсивно заданных последовательностей яв
ляются последовательности, определяемые линейными однородными
и линейными неоднородными рекуррентными соотношениями.
Линейным однородным рекуррентным соотношением порядка р
называется соотношение вида
йп == hj(n). aп[ + h 2 (n). aп2 +... + hp(n)' aпp,
rде h, (п), h 2 (п), ..., IIp(п) заданные функции aprYMeHTa n, hp(п) i= О.
Если h j (n), h2(п), ..., hp(n) не зависят от n, а являются постоянными,
то такое соотношение называется линейным однородным peKyppeHт
ным соотношением с постоянными коэффициентами порядка р.
Линейным неоднородным рекуррентным соотношением порядка
р называется соотношение вида
а п == h[(n). an! + h2(n)' aп2 +... + hp(n)' aпp + g(n),
rде h[ (n), h 2 (n), ..., hp(n), g(n) заданные функции aprYMeHTa n,
hp(n) i= О.
Примеры классификации. Приведем некоторые примеры OTHece
ния рекурсивно заданных последовательностей и соответствующих pe
куррентных соотношений к указанным классам. Полученное в примере
1.6 рекуррентное соотношение (1.2.2)
{ Т( 1) == 1;
Т(n+1):::::О,3Т(n)+2, n1
является линейным неоднородным рекуррентным соотношением по
рядка 1 с постоянными коэффициентами, а последовательность t n ==
::::: Т (n) последовательностью с частичной предысторией. В при мере
1.7 полученное рекуррентное соотношение (1.2.3)
{ Т( 1) == 1;
Т(n+ 1)::::: [Т(n) + Tn) ]' n 1
3. Классификация рекурсивных последовательностей и функций 31
является нелинейнЫМ рекуррентным соотношением с частичной
предысторией. В примере 1.8 рекуррентное соотношение (1.2.4)
{ Т . (О) == i; Т(I) == 1;
n1
Т(n+2) == T(n), n;;:: О
n
является линейным однородным рекуррентным отношением порядка 2
с переменными коэффициентами.
Приведем еще некоторые примеры математических задач, приводя
щих к необходимости использования рекуррентных соотношений.
Х
Пример 1.15. Вывести формулу для вычисления S t n e kt dt как pe
о
курсивно заданную функцию aprYMeHTa n. Будем рассматривать инте
rрал
Х
J tnektdt
О
как функцию двух переменных n и х
Х
J(n; х) == J tne*tdt.
о
Для n == О пфлучаем
J X 1 1 3: 1
J(O;x)== ektdt==kekt ==k(ekXl).
о о
При n > О. используя известную формулу интеrрирования по частям,
получаем
Х 3: Х
J(n;x) == f tnektdt == f tnde kt == (tnekt)l :;, f tnlektdt ==
о о о
1 k n
== xne 3: J ( n l' Х )
k k "
таким образом, для каждоrо фиксированноrо значения независимой
переменной х мы получили рекуррентно заданную последовательность
вида
{ 1
J(O;x) == k (e kx 1) ;
J(n;x) == :;'J(n l;х) + xnekX,
n>О.
r lолученное соотношение является линейным неоднородным peKYP
рснтным соотношением порядка 1 с переменными коэффициентами.
32
Тл. 1. Введение в теорию рекурсии
Пример 1.16. В алфавите n символов. Сколько имеется слов в дaH
ном алфавите, которые содержат k символов и не содержат при этом
одинаковых СИМВОJJОВ?
Обозначим количество таких слов через А(n; k). Нетрудно видеть,
что количество таких спов равно О при n < k. При n k количество
слов может быть оценено следующим образом. Рассмотрим аJJфавит,
содержащий n 1 символ, и добавим еще один. Вопервых, сохранятся
все слова содержащие k символов в алфавите из n 1 символов
таких спов А(n 1; k). BOBTOpЫX, образовать слово из k символов
можно, если взять любое слово из cTaporo алфавита, содержащее k 1
символ и добавить на любое место новый символ таких слов будет
kA(n 1; k 1). Таким образом,
А(n; k) == А(n 1; k) +- kA(n 1; k 1).
СледоватеJJЬНО, функциональная последовательность А(n; k) для п 1
и целых значений k может быть определена рекуррентным соотноше
нием
{ A(I;k)==O, kfl, kfO; А(1;I)==I, А(I;О)==l;
А(п;k)==А(пl;k)+-kА(nl;kI), n>1.
Данное соотношение является рекуррентным соотношением с частич
ной предысторией, но не для числовой последовательности, а для
функциональной. Отметим, что определенное таким образом А(n; k) ==
== о при k < О и при k > п. Для О :::;;; k :::;;; п значение А(n; k) равно числу
размещений по k элементов на множестве, содержащем n ЭJJементов
k n!
А(n; k) == Аn == (n , k)! '
Отметим, что форма задания рекуррентной ПОСJJедовательности иrрает
существенную ропь при ее дальнейшем исследовании.
Пример 1.17. Рассмотрим рекурсивную последовательность
Хl, Х2, ... ,Х n С полной предысторией, определяемую рекуррентным
соотношением
{ Хl == о; Х2 == 1;
Хn+l == tXk' п 2.
kl
ИсследуеIi1 'ВНlНdательно эту поспедоватепьность приrI 2, для Хn+l
имеем
(1.3.1)
Хn+1 == Хl +- Х2 +- ... +- х n ,
( 1.3.2)
а для Хn+2
(1.3.3)
Хn+2 == Хl +- Х2 +- ... +- Х N +- Xn+l.
Соотношение (1.3.3) может быть переписано в виде
Хn+2 == (Хl +- Х2 +-... +- Х n ) +- Хn+I == 2Xn+l.
3, Классификация рекурсивных последовательностей и функций 33
следоватеJJЬНО, ПОСJJедоваТСJJЬНОСТЬ Хl, Х2, ... ,Х" может быть задана
БОJJее простым рекуррентным соотношением, как ПОСJJедоватеJJЬНОСТЬ
с частичной предысторией
{ Хl == о; Х2 == 1; Хз с= 1;
:7;,,+1 "'" 2х", п?:: 3.
(1.3.4)
Соотношение (1.3.4) очень напоминает rеометричсскую проrрессию и,
наверное, не нужно ДОJJrо объяснять преимущество такой записи по
сравнснию с (1.3.1).
Влияние вида peKyppeHTHoro соотношения на характеристики
рекурсивноrо алrоритма. На СJJсдующем Ilримере мы хотим показать,
как в рамках ОДНОЙ задачи применяемые ДJJЯ ее решения JJинсйное
однородное рекуррентное соотношснис и нслинейное рскуррснтнос со-
отношенис влияют на характеристики алrоритмов, реализующих эти
соотношсния.
Пример 1.18. Задача о случайном блуждании частицы. Прсдполо
жим, что частица может находиться в одном из т состояний SI, S2, ...
..., Sffi' За один шаr она может перейти из состояния Si В состояние
Sj с вероятностью Pij (1). Требустся определить вероятность Pij (п)
вероятность перехода из состояния Si В состояние Sj за 1, шаrов.
Введем в рассмотрение матрицу персходов Р(п). Матрица переходов
Р( п) это квадратная матрица размерности (т- х т-), ЭJJементы KOTO
рой в строке с номером i и столбlе с номером j соответственно равны
Pij(n), т. е.
Pll (п)
Р21 (п)
PI2(n)
Р22 ( п )
Plj(n)
P2j ( п )
Plrп(п)
Р2т ( п )
Р(п) ==
Pil (п) Pi2(n)
Pij (п)
Pim(n)
Prпt(n) Рт2(п) ... Ртз(п) ... РтrШ1Jп)
Отметим, что матрица Р(1) нам известна. Для Toro чтобы получить
выражение для матрицы Р(п) (п> 1), проведем следующие рассужде
ния. Рассмотрим некоторое промежуточное СОСТОЯНИС, возникшее 1l0
сле k (I ::::; k < п) шаrов перехода. Частица может находиться в любом
состоянии SI, rде 1 ::::; 1 ::::; т. Вероятность перехода в состояние SI
из состояния Si за k шаrов соответствснно равна Pii(k). Вероятность
перехода частицы из состояния SI В состояние Sj за оставшиеся п k
шаrов равна Plj(n k). Соrласно формуле полной всроятности
Pij(n) ==Pi! (k)'Plj(n k) ---'--- Pi2(k) . P2j(n . k)+ ... +- Pim(k) . Pmj(n k),
то есть
m
Pij(n) == LPii(k) Plj(n -- k).
I1
2 rоловешкин
& djvu Kartun [kаrtuп@уапdех. ruJ
34
rл. 1. Введение в теорию рекурсии
Если мы вспомним опеrtaцию умножения матриц, то мы обнаружим
следующее матричное соотношение
Р(п) == P(k) . Р(п k),
О.3.5)
тоrда
Р(2) == Р(I). Р(2 1) == [Р(I)]2,
Р(3) == Р(I). Р(3 1) == [Р(I)]З,
Р(п) == Р(l) . Р(п 1) == [Р(l)] n .
В результате мы получили, что матрица Р(п) при п> 1 и при извест
ной матрице Р( 1), удовлетворяет рекуррентному соотношению
Р(п) == Р(l) . Р(п 1).
О.3.6)
Это соотношение является линейным однородным рекуррентным COOT
ношением. Соотношение О.3.5) также можно рассматривать как peKYP
рентное соотношение, но уже нелинейное. Возникает вопрос а какое
из соотношений более удобно для использования? Ответ на этот BO
прос можно получить на основе рассмотрения количества операций,
задаваемых алrоритмами, которые построены по этим рекуррентным
соотношениям.
Попробуем оценить количество операций. которое требуется BbInok
нить, чтобы вычислить Р(п), если использовать соотношение О.3.6).
Будем считать, что при умножении матриц мы используем самый
простой алrоритм, который требует количества операций порядка тЗ.
Поскольку операцию умножения матриц мы выполняем п 1 раз,
то количество операций оценивается величиной порядка (п 1 )т З .
Оценим требуемый объем памяти. Для хранения в памяти матрицы
размерности (т х т) требуется объем памяти порядка т 2 . В процес
се использования AaHHoro алrоритма на каждом шаrе требуются две
матрицы, следовательно, суммарный объем требуемой памяти имеет
порядок 2 т 2 .
Но можно использовать и друrой способ вычисления Р(п) с исполь
зованием соотношения (I .3.5). Представим число п в двоичной форме
п == ak2k + ak12k1 +... + a i 2 i +... + a 1 2 1 + а о 2 0 .
Заметим, что числа ai MorYT принимать только два значения ноль
или единица. Используя О.3.5), получаем
Р(п) == P(ak2k + ak12k1 +... + ai2i +... + a 1 2 1 + а о 2 0 ) ==
, k 1 ak k I i 1 О
== lP(2)J . P(ak12 +... + ai2 +... + а12 + ао2 ) ==
== [Р (2 k )]a k . [Р (2kI)]aH..... [Р (2 i )]a i .... . [Р (2 1 )]a 1 . [Р (l)]а о .
О.3.7)
3. Классификация рекурсивных последовательностей и функций 35
Нетрудно заметить, что p(2k) == p(2kI). p(2k1). Посколь
I\Y k == [log2 n], то количество операций, необходимых для вычис
ления Р (2k), оценивается величиной [log2 n] m З . При вычислении
с использованием соотношения (1.3.7) операция произведения MaT
риц выполняется /31 (n) 1 раз, rде функция /31 (n) определяется
как число единиц в двоичном представлении числа n. Следова
rсльно, суммарное количество операций оценивается величиной по
i)ядка ([log2n] +/31(n) l)m З . При больщих значениях n величина
Clog2n] +/31(n) l)m З существенно меньше (n l)m З . Значит, при
()ольших значениях n, с точки зрения требуемоrо количества операций,
I!ТОрОЙ вариант алrоритма является более предпочтительным. Но этот
i1ЩОРИТМ требует больщеrо объема памяти порядка (/31 (n) + 1) т 2 .
С друrой стороны, мы можем переписать соотношение (1.3.7), изменив
JIOрЯДОК сомножителей на обратный, т. е. в виде
Р(п) == P(ak2k + ak12k1 +... + ai2i +... + a l 2 1 + ао2 0 ) ==
== [p(l)]ao. [Р (2 1 )]a 1 ..... [Р (2 i )]a i ..... [Р (2k1)]ak1. [Р (2 k )]a k .
( 1.3.8)
Преимущество соотношения (1.3.8) по сравнению с (1.3.7) состоит
I! том, что вычисление степеней матрицы для одноrо фиксированноrо
Iначения n требует объема памяти порядка 3т2, а количество операций
11рИ этом имеет прежний порядок ([log2n] +/31(n) l)m З . Данный
IJример показывает, что, с точки зрения требований KOHKpeTHoro ak
соритма вычислений, сама форма ero peKyppeHTHoro представления
"rpaer существенную роль.
Нелинейные рекуррентные соотношения. В заключение приве
je!'v! еще два характерных типа нелинейных рекуррентных соотноше
IJИЙ, которые встречается при решении конкретных задач. Рассмотрим
следующую иrру. Первый партнер задумывает одно из целых чисел от
I до п. Второй партнер пытается уrадать задуманное число. Называя
некоторое число, второй партнер получает от первоrо один из трех
I)ТВСТОВ «равно», «больше», «меньше». Требуется найти функцию
(Сп), [де f(n) среднее число вопросов при оптимальной стратеrии
IlТoporo иrрока. Нетрудно заметить, что можно положить 1(0) == О,
(( 1) == 1. Тоrда при значениях n > 1 из предположения об оптимальной
I'тратеrии BToporo иrрока при выборе числа i, которое он называет,
:lOлучаем следующее рекуррентное соотношения для определения l(п):
f( п) == 1 + min { i 1 1 (i 1) + n i f( п i) } .
l';;l';;n п n
()'с'метим, что при исследовании вопроса о трудоемкости алrоритмов
III'ИХОДИТСЯ довольно часто иметь дело с еще одним типом нелинейных
i'I'I(yppeHTHbIx соотношений, а именно с соотношениями вида
Т(п) == а. Т ([]) + l(п),
& djvu Kartun [kаrtuп@уапdех. ruJ
36
rл. 1. Введение в теорию рекурсии
rде [х] обозначает целую часть выражения. Отметим, что довольно
часто вместо целой части [х] в выражснии встречаются функции вида
l:r J «пол» или r х l «потолок». Исследованию асимптотическоrо
поведения ФУНКЦИЙ, заданных подобными рскуррентными соотношени
ями, будет в дальнейшем посвящен спеllиальный раздел.
9 4. Методы исследования и решения рекуррентных
соотношений
Цели исследования рекуррентных соотношений и асимптотиче
ские обозначения. Сформулируем некоторыс цели, которые мы ставим
персд собой, исследуя рекуррентные соотношения. Формулируя цели,
мы будем иметь в виду рекурсивно заданную последовательность. Чле
ны рекурсивно заданной последовательности будсм обозначать функ
ционально через Т(п). Итак, пусть последовательность Т(п) задана
рекуррентным соотношением
{ T(I)==a 1 , Т(2)==а2, ... Т(т)=а т ;
T(n+l)'=g(an,anl,...,anт), п>т.
Конечно, идеальной целью является нахождение функции j(n) cpaB
нительно простоrо вида, такой что Т(п) == /(п). Однако найти такую
функцию удается достаточно редко, хотя ниже мы приведем HeKOTO
рые методы нахождения точноrо выражения для членов рекуррентной
последовательности. Чаще удается решить более скромную задачу
задачу нахождения оценок этих членов. Как правило, нас интересуют
их оценки при достаточно больших значениях п. Ilрежде чем перейти
к постановке задач, напомним некоторые основные обозначения. Вводя
эти обозначения, мы заранее предполаrаем, что речь идет о неотри
цательных функциях, стремящихся, как правило, к бесконечности при
стремлении к бесконечности aprYMCHTa п.
Обозначение омалое. Если lim f ( (п ) ) =, О, то пишем'j(п) == о(у(п))
n----->ОС 9 n
(читается эф от ЭН есть о малое от же от эн).
Обозначение О-большое. Если сущсствует число С > О, такое что
; < с для всех Значений п, то пишем /(п) =- D(,q(п))(читается эф от
эн есть О большое от же от эн). Заметим, что всякое омалое являстся
одновременно и Обольшим, но не наоборот.
Обозначение е. Если найдутся две неотрицательные константы
СI > О И С2 > О, а так же число по, такое что при всех п > по выполнено
Clg(u) /(п) C2g(n), то пишем /(п) =--'0(g(n)).
Если j(u) == e(g(n)), то rоворят, что 9(п) является асимптотuче
ски точной оценкой для j(n).
4. Методы исследовu . я- и решен-ия рекуррен-тных соотн-ошен-иu 37
Эквuвалентность. Если ]iш f ( (n ) ) "" 1, то пишем f (п) rv у(п) (чи
пoo .9 п
тается эф от эн эквивалентно же от эн). Заметим, что если f (п) rv у(п),
то f(n) == g(n) -+ o(,q(n)).
Получение подобных оценок и является основной задачей иссле
дования рекуррентных соотношений. Если не удастся найти точное
выражение для значения последовательности Т(п) == f(n), ТО J1УЧШИМ
результатом является такая оценка у(п) для члена последовательности,
что 1'(п) rv у(п). Но такую оценку также удается найти достаточно
редко. Неплохой оценкой считается Т(п) =" (-)(g(n)), особенно если
известны значения С[ и С2, а не просто доказано, что они существуют.
Оценка Т(n) == О(у(n)) также позволяет делать некоторые выводы
() характере поведения исследуемой последовательности.
Методы асимптотической оценки функций, заданных peKYP
рентными соотношениями. ОДИН из приемов, который используется
ДЛЯ построения подобных оценок это построение такой функции
f(n), которая бы мажорироваJIа Т(п) ДJIЯ всех значений п, т. е. при
(!сех п;? 1 должно выполняться Т(п) f(n). Иноrда для Оllределения
такой функции используется следующий llрием. 3адаетсн вид функции
.1'( п) в предположении, что она зависит от некоторых параметров,
а значения этих пара метров уточняются в процессе доказательства.
Ilроиллюстрируем это на примере.
Пример 1.19. Пусть
{ Т ( 1)' (;1;
Т(п)." 2Т ([Ю) Т С 2 Т /, n> 1,
'Iерез [х] мы обозначаем целую часть apl'Y:\1eHTa. Будем искать f(n)
;! виде f(n) == an]og2 п + Ь, rде а и Ь пока неизвестные параметры.
130спользуе:\1СЯ методом математической индукции. При п == 1 оценка
работает, если положить Ь ;? С[. В соответствии с методом математиче
('кой индукции полаrае:\1, что ДЛЯ всех k < п выполннется неравенство
1'( k) (l k log2 k +- Ь. ПОСКОJJЬКУ
T(п)==2T([]) -+С2п,
!О, полаrая k " [], получаем
['(п) == 2Т ([)) + (;2п 2 (aklog 2 k --:- Ь) + С2п
( 11 11 )
2 0'210g2'2 -1 Ь ,;, С2п 'се
---- а n ]og2 п 011 ---'--- С2п -+ 2Ь 011 log2 11 '; Ь.
IIОСJJеднее неравенство получено в предположении, что а ?: (;2 f- Ь,
,аким образом, привел.енная оценка будет справедлива при условии Ь ?:
. С[ и а ;? С2 + Ь. Можно положить Ь == Cj, а",. С2 -+ Сl. ТOI'да МОЖНО
& djvu Kartun [kаrtuп@уапdех. ruJ
38
rл. 1. Введение в теорию рекурсии
сделать вывод, что при всех п ;;:: 1 имеет место оценка Т(п) (с! +
+ С2)п log2 п + С!. ЭТО означает, что Т(п) == О(п log2 п). Отметим, что
при приведенном доказательстве мы не можем утверждать, что по
лученная оценка является точной асимптотической оценкой. Мы лишь
доказали тот факт, что Т( n) растет не быстрее чем f( n) == п log2 n.
И уж если быть совсем строrим, то полученная оценка должна быть
записана в виде
Т(n) (С1 + С2)n' log2n' +С1,
rде n' =.: n, если n четное число, и n' == n + 1 в противном случае.
Второй прием это оценка peKyppeHTHoro отношения методом
подстановки, который мы иллюстрируем на следующем при мере.
При мер 1.20. Рассмотрим рекуррентное соотношение
T(п)==3T([])+п.
Выберем целое число т такое, что 4т I < п 4 т , Torдa Т( n)
3Т (4т 1) + 4 т В свою очередь, Т( 4rп 1) == 3Т (4т2) + 4rп 1. Под
ставляя полученный результат В первое неравенство, получаем
Т(п) 3 (3Т (4"'2) +4rпl) +4 rп == з 2 т (4rп2) +4'" (1 +).
Поскольку Т( 4"'2) == 3 . Т (4mЗ) + 4rп2, то получаем
Т(п) з З Т (4mз) + 4т (1 + +- () 2) .
Продолжая этот процесс, мы получим следующее неравенство:
( 3 ( 3 ) 2 ( 3 ) "'1 )
т(n)зmТ(1)+4'" !т'4+ '4 +...+ '4 .
Последняя сумма в круrлых скобках является суммой rеометрической
проrрессии со знаменателем q == 3/4, и ее значение не превышает
суммы аналоrичной бесконечной rеометрической проrрессии, которая
равна 4. Тоrда Т(n) З т Т (1) + 4 т +!, но ПОСКОЛЬКУ т log4 n + 1, то
Т(п) з 1оg4 п+1 . т (1) ---r- 16п,
а так как з 1оg4 п == n1og, 3 == о(n), то Т(n) == О(n).
Аналоrия между линейными однородными рекуррентными co
отношениями и линейными однородными дифференциальными
уравнениями. Как уже отмечалось выше, явное выражение дЛЯ COOT
ветствующеrо члена рекурсивно заданной последовательности удается
найти довольно редко. Тем не менее, существует важный класс peKYP
сивно заданных последовательностей, для которых всетаки удается
найти явное выражение для соответствующеrо члена последовательно
сти. Рассмотри:'vl линейные однородные рекуррентные отношения с по
стоянными коэффициентами с частичной предысторией.
1. Методы исследования и решения рекуррентных соотношений 39
Напомним, что линейным однородным рекуррентным отношением
с постоянными коэффициентами порядка р называется соотношение
[)Ида
а п == C1aп1 + C2aп2 + ... + сра,,__р,
rде С р i' о.
Решения данноrо peKyppeHTHoro отношения обладают свойством
линейности. Свойство линейности означает следующее. Пусть после
дователыlOСТИ Ь 1 , Ь2, ... ,Ь п и Сl, С2, ... ,Сп явлнются решениями данноrо
peKyppeHTHoro отношения. Для краткости обозначим В == {Ь1, Ь 2 , .,.
.. , Ь п }, С == {с" С2, ... ,Сп}, Torдa последовательность D == Ь в -+- с С,
(rде Ь и с произвольные постоннные величины), являющаяся линей
I-ЮЙ комбинацией последовательностей В и С, также будет решением
peKyppeHTHoro отношения. Решение исследуемых рекуррентных отно--
шений во M\IOI"OM аналоrично решению ,1инейных однородных диффе
ренциалы!ых уравнений с постоянными коэффициентами порядка р.
Чтобы дать качественную картину, рассмотрим случай р == 2 и предста
вим эту аналоrию. Однородное линейное дифференциальное уравнение
BToporo порядка
d 2 y, dy
;- d 1 + d 2 y == о.
dx 2 dx
Jlинейное однородное рекуррентное соотношение с постоянными ко--
',)ффициентами порядка 2 а п == Cla,,, -+- C2aп2. Решение линейноrо
однородноrо дифференциальноrо уравнения ищем в виде у == е ЛХ . Под
ставляя в уравнение, получаем
>..2 е лх + dj>..е ЛХ -+ d 2 е ЛХ == о; >..2 -+- d 1 >" + d 2 == о.
Для определения значения >.. получено уравнение >.. 2 + d, >.. + d 2 == О,
которое называется характеристическим уравнением. Решение линей--
lIoro однородноrо peKyppeHTHoro соотношения с постоянными коэффи
:lиентами порядка 2 ищем в виде а п == r ft . Подставлян в уравнение,
I:олучаем
r " == Сl rrt 1 + C2rn2;
r 2 ----' с, r -.. С2 =О' о.
Jlля определения значения r получено уравнение r 2 Сl r С2 ='00 о,
;\(!Торое называется характеристическим уравнением. При решении xa
Рi\ктеристических уравнений возможны три случая.
Первый случай. Если характеристическое уравнение >..2 + d! >.. +
d 2 == О имеет два различных действительных корня>.. == k\, >.. == k 2 , то
"lJщее решение линейноrо однородно!"О дифференциальноrо уравнения
::рсдставляется В виде
у =, Ae k : x BC k2X ,
I;(l' А и I3 произвольные постоянные (этих обозна'!ений мы будем
I\ридерживаться и для остальных случаев). Если характеристическое
vравнение r 2 С] r С2 == О имеет два различных действительных корня
& djvu Kartun [kаrtuп@уапdех. ruJ
40
rл. 1. Введение в теорию рекурсии
7' == 7'[, 7' == 1'2, то общее решение линейноrо однородноrо peKyppeHTHoro
соотношения представляется в виде
а" == Лr'!' + H,'J] .
Второй случай. Если характеристическое уравнение ..\2 + d 1 ..\ +
+ d 2 =--= О и:wеет два равных действительных корня ..\\ == ..\2 == k, то
общее решение линейноrо однородноrо дифференциалыюrо уравнения
представляется в виде
у == А e kx + В х e kx .
Если характеристическое уравнение 1'2 Cj7' - С2 == О имеет два равных
действительных корня 7') == 7'2 == а, то общее решение линейноr'о OДHO
родноrо peKyppeHTHoro соотношения представляется в виде
ан == Лап + Пnа".
Поясним этот факт. Очевидно, что последовательность а" == а п яв
ляется решение:w peKyppeHTHoro соотношения, поскольку число 7' == а
нвляется корнем характеристическоrо уравнения. Рассмотрим последо
вательность а п == пап Подставим эту пОСJlедователыюсть в peKyppeHT
ное соотношение а п == (;, а п -- \ + C2a,,2, имеем
па" == (;)(п ---- l)aпl + (;2(n 2)a"2.
Преобразуе:w данное соотношение к виду
пa"2(a2 -- с\а (;2) + а п --\ (Сlа + 2С2) == О.
Поскольку а явлнется корне;\1 характеристическоrо уравнения, то (а 2
С, а ..- (;2) == О, а поскольку а является корнем кратности 2 характе-
ристическоrо уравнения, то (с\а +- 2(;2)"-; О. Таким образом, последова
тельность а" == па" действительно является решением peKyppeHTHoro
соотношенин.
Третий случай. Если характеристическое уравнение ..\2 + d 1 ..\ +
+- d 2 == О имеет два комплексно сопряженных корня ..\ == а ::!: i(J, то
общее решение линейноrо однородноrо дифференциальноrо уравнения
представляется в виде
у == Ае';;" cos ПХ -+- вс ах sitl (Зх.
Если характеристическое уравнение .,.2 (;1 Т С2 == О имеет два ком--
плексно сопряженных корня т == (х :::1:- i(3, то общее решение линейноrо
однородноrо рекуррентноrо соотношения представляется в виде
а" == А(а + i(3)" + В(а .-.. i(3)".
Воспользуе;\1СЯ тем, что мы рассматриваем уравнение с действитеЛЬНbl
ми коэффициентами и перепишем полученную формулу в более удоб-
ном виде. Очевидно, что если некоторая комплексная последователь
ность нвляется решением линейноrо OAHopoAHoro peKyppeHTHoro COOT
ношения с действительными коэффициентами, то решениями TaKoro
peKyppeHTHoro соотношения будут являться действительная и мнимая
fj 4. Методы исследования и решения рекуррентных соотношений 41
части последовательности. Комплексное число (} :1:: i(3 может быть запи
сано в триrонометричсской форме й + i(3 =о p(cos '-Р + i sin:p), [ДС модуль
КОМIIлексноrо числа р равен р =о V а2 (32 , а aprYMeHT :р определяется
из условия
й
cosep == ,
р
. (3
SlIl <.р ==
р
(О :( <.р < 2'71-).
Соrласно формуле Муавра [p(COsep + isiIl:p)] n =о p"(COSrL<.p +
-'--- '1 siIl пер). Поскольку и действитеЛЫlая и мнимая части IIоследо
вательности являются решениями pCKyppeHTHoro соотношения, то
последоватсльности Ь 11 == р" COS n<.р и СП =о р" sin n<.р будут решениями
peKyppeHTHoro соотношенин. Тоща общее решение может быть
записано в виде а п == Арп cos п:р + в рп SiIl пер, {'де А и В
произвольные постоянные.
При ведем примеры.
Пример 1.21. Найти решение для последовательности чисел Фи
боначчи fb (п), заданной соотношениями
{ fb(l) '''' 1;
fb (2) =о 1;
flJ(71)=ofb(n-I)+fb(n2), п>2.
Характеристическое уравнснис имеет вид т 2 =о r + l' или т 2 r 1 == О.
Решая это уравнение, получаем
rl,2 =о
1 + v's
2
TorAa
( ) П ( ) П
1+v's 1v's
flJ(п)=ос 2 i - d 2
Ullределим значения постоянных с и d. Поскольку {Ъ (1) =о 1, то
( 1+v's ) ( 1v's )
с 2 +d 2
=о 1,
а так как fb (2) =о 1, то
2 2
C C+2v's ) +d C2v's ) =01.
м ы получили систему двух линейных уравнсний с двумя неизвестны
Mfl для определенин с и d. Решан эту систему, получаем
1
С=О
v's'
1
(1 =о
v's'
& djvu Kartun [kаrtuп@уапdех. ru]
42
Тл. 1. Введение в теорию рекурсии
таким образом
fЪ(n) == ( 1 + 15 ) п ( 1 15 ) 11
15 2 15 2
При мер 1.22. Найти формулу для общеrо чмна рекурсивно заДан
Ной последовательности (решить рекуррентное соотношение)
{ ::;
а п == 4а"., [ 3a1l2, n > 2.
Характеристическое уравнение имеет вид т 2 == 4т 3 или Т'2 4т + 3 ==
== О. Решая уравнение, получаем Т'} := 1, Т2 :.:= 3. Общее решение имеет
вид а п == с + d .311. Поскольку а} == 7, то с + 3d '--= 7, а поскольку а2 ==
== 19, то с + 9d == 19. Решая полученную систему уравнений, получаем
с ::= 1, (1 == 2, тоща ап == 1 -+ 2 . з п .
При мер 1.23. I!айти формулу для общеrо члена рекурсивно задан
ной последовательности (решить рекуррентное соотношение)
{ : : ;
(1п :се' 4anI'. 4(1,,2, п > 2.
Характеристическое уравнение имеет вид т 2 == 4т 4 или т 2 4т + 4 ==
=-::: О. Решая уравнение, получаем Т} == Т2 == 2. Поскольку характеристи
чес кое уравнение имеет два равных действительных корня, то общее
решение имсет вид а п == с. 2 п + dn . 2". 1 Iоскольку а [ == 4, то 2с + 2d ==
== 4, а поскольку (12 '.се 12, то 4с + 8d == 12. Решая полученную систему
уравнений, получаем с == 1, d =: 1, тоrда
(1п " 2" + n . 2 п == (n + 1) . 2".
Пример 1.24. Найти формулу для общеrо члена рекурсивно задан
ной последовательности (решить рекуррентное соотношсние)
{ а[ == 1;
а2 == 2;
(1п == 2(1п.,.[ 4(1,,2, п > 2.
Характеристическое уравнение имеет вид т 2 == 21' .. 4 или т 2 2т +
+ 4 == О. Решая уравнение, получаем TI.2 == 1 :1:: i VЗ. Поскольку xapaK
теристическое уравнение имеет два КО1ПлеКСIIО сопряженных корня,
то прсдставим их в триrонометрической форме. Модуль комплексноrо
числа р == VТ+3 == 2. Для определсния aprYMeHTa имеем
. vз "
соо;<р "-" 2' SШ'Р == 2; 'р == 3'
(1" =-::: с. 2" cos с; ) + d. 2" sin ( n з ,, ) .
тоrда
fj 4. Методы исследования и решения рекуррентных соотl-iошений 43
Используя начальные значения функции, получаем систему уравнений
{ c+/3.d==l;
2с + 2/3 . d == 2.
Решая эту систему, получаем с == 1, d == О, и окончательно
а п 0= 2" . cos ( п з 7r ) .
Обобщение на случай линейноrо однородноrо peKyppeHTHoro
соотношения с постоянными коэффициентами порядка р. Для
peKyppeHTHoro соотношения
а" == с, a,, 1 + C2aп2 + ... + Cpa,,p,
rде С р i- о,
характеристическое уравнение имеет вид
т Р == СI TP' + C2Tp2 +- ... + Ср,
или
т Р C]TPl C2Tp2 ... С р == О.
Если действительное число r == Ь является корнем характеристическоrо
уравнения кратности т, то оно порождает rп решений вида
1) а п == Ьп;
2) а" == пьп;
З) а п == п 2 ьп;
т) а" == nт,]ьп.
Если комплексно сопряженные числа т == р( cos 'Р ::i: i sin <р) являются
корнями характеристическоrо уравнения кратности rп каждое, то они
lюрождают 2т решений вида:
1) а" == рп cos n'Р, а п == рп SiIl n'Р;
2) а п == nрп cos п'Р, а п == пр" SiIl n'Р;
З) а п == п 2 р" cos n'Р, а п == n 2 рп sin n'Р;
т) а п == nтl р" cosn'P. а" == nт] рТ! sin n'Р.
Тоrда общее решение может быть представлено в виде суммы YKa
занных решений, умноженных на произвольные постоянные. Проде
монстрируем это на примере.
Пример 1.25. Найти формулу для общеrо члена рекурсивно задан
ной последовательности (решить рекуррентное соотношение)
{ :: : ;
аз == 19;
а" == 4a,, 1 5a,,2 + 2а,,з, n > З.
Характеристическое уравнение имеет вид тЗ == 4т 2 5т + 2 или тЗ
4т 2 + 5т 2 == О. Данное характеристическое уравнение имеет сле
& djvu Kartun [kаrtuп@уапdех. ruJ
44
rл. 1. Введение в теорию рекурсии
дующие корни Тl == Т2 "'с 1, Тз == 2. Поскольку r == 1 является корнем
кратности 2, то этот корень порождает 2 решения: 1) Оп == 1; 2) Оп == п.
Корень Т == 2 порождает решение Оп == 2 п . Тor'да общее решение peKYP
peHTHoro соотношения имеет вид Оп ос, Ь...)... сп +- d . 2 п . Для определения
значений Ь, с, d и:\!ее:\! систему уравнений
{ Ь '1' С+- 2d "" з;
ь -+- 2с +- 1r1 == 10;
Ь -1 Зсt 8d =--= 19.
Решая эту систему, получаем Ь == О, С == 1, d == 1, тоrда Оп == 71 +- 2 п .
Метод решения линейных неоднородных рекуррентных COOT
ношений с постоянными коэффициентами порядка р. Напомним,
что так называются соотношения вида
Оп ==CIOn! +-C20п2 ...:...... +сроп.р+у(п),
[де С р =f О, у(п) известная функция. Метод решения таких соотно,
шений состоит в следующем. На первом этапе удаляется 9(71), (т. е.
полаrается равной НУЛЮ) и находится общее решение соответствующе-
ro однородноrо соотношения. Далее ищется какоелибо частное реше
ние неоднородноrо соотношения. Тоrда общее решение неоднородноrо
соотношения представляется как сумма частноrо решения и обще
ro решения соответствующеrо однородноrо соотношения. Поскольку
существует универсальный метод решения однородных соотношений,
то проблема решения неоднородноrо состоит в том, 'побы «уrадать»
любое частное решение неоднородноrо соотношения. Для некоторых
частных видов У(71) существует универсальный прием отыскания част
ных решений. Об ЭТО:\! прие:\!е мы скажем ниже. А пока отметим
один полезный факт. Если функция 9(71) представима в виде суммы
двух слаrаемых 9(71) == У1 (71) +- 92(71) и какимто образом удалось найти
частные решения соотношений
Оп ,= C!Oп1 + C20п2 +... +- CpOпp +- 91(71),
и
Оп == CIOnI'i' С2 0 п2 +-... +- CpOпp +- 92(71),
то сумма таких частных решений будет частным решением соотноше
ния
Оп'=- CIOn,.! ,t C20п2 -+ ... +- CpOпp +- 9(71).
Касаясь вопроса отыскания частных решений, отметим следующее. Ec
ли функция 9(71) имеет вид 9(71) == Рт(п) . ь п , rде Рт(71) мноrочлен
степени тп, то частное решение может быть найдено в виде Оп == 71 S Х
Х Qm(71) . ь п , rде Qm(-n) МНОf'Oчлен той же етепени, что и Рт(-п) ,
" кратность корня Т == Ь в характеристическом уравнении. Если r == Ь
не является корне:\! характеристическоrо уравнения, то " се О. Отмети:\!,
что сам мноrочлен Рт(п) представим в виде Рт(п) == Рт(71)' 1 п .
Рассмотрим пример.
4. Методы исследования и решения рекуррентных соотношений 45
Пример 1.26. Найти формулу для общеrо члена рекурсивно задан
ной последовательности (решить рекуррентное соотношение)
а" == 1a,,1 За,,2 -+ 5.2" + (5п -+ 1).
Соответствующее однородное соотношение исследовалось ранее,
и были найдены корни характеристическоrо уравнения Т, == 1, Т2 'с'7 З.
Общее решение однородноrо соотношения имеет вид ан "'- с -+ d . 3",
rде с и d произвольные постоянные. В данном при мере ФУНКllИЯ
9(п) := 5.2" + (5п -+ 4). Она состоит из двух слаrаемых: 91 (п) == 5 . 2"
и 92(п) =:.: (5п -+ 4). Вначале найдем частное решение соотношения
а" '00 4a,,1 Заn2 -+ 5.2".
Имеем функцию 91(п) вида YI(n) с.= Prп(п). Ь", rде Prп(п) == 5 MHO
rочлен нулевой степени, и, значит, т == о; Ь с:= 2, и поскольку число
Ь == 2 не является корнем характеристическоrо уравнения, то МОЖНО
ПОЛОЖИТЬ ero кратность s == о. Тоrда частное решение соотношения
ищем в виде а" == по . Qo(n) .2" == А. 2", rде А неизвестная величи
на, которую мы определим из peKYPpCHTHoro соотношения. Подставляя
данное выражение в рскуррентное соотношение, получаем
А. 2" == 4А. 2,,l ЗА . 2,,2 -+ 5.2"; А == 20.
Следовательно, частное решение имеет вид а" == 20 . 2". Далсе най
дем частное решение соотношения
а" ., 4an1 , За,,2 + (5п 1'1).
Имеем функцию 92(п) вида 92(п) == Prп(п) . ь n , rде Prп(п) == 5п -+ 4
мноrочлен первой степени, и, значит, т"'" 1; Ь == 1, и поскольку число
Ь == 1 является корнем характеристическоrо уравнения кратности 1,
то МОЖНО положить s == 1. Тоrда частное решение соотношения ищем
в видс
а п == п'. QI(n). 1":-.= п(Ап + В),
['де А и n неизвестные величины, которые мы определим из peKYP
peHTHoro соотношения. Подставляя данное выражение в рекуррентное
соотношение, получаем
п(Ап -+ В)==1(п', 1)(А(п..1) --7-- П) З(п 2)(А(п 2) -+ В) -+ (5п -+ 4).
Приравнивая коэффициенты при одинаковых степенях п, получаем
систему уравнений для определения А и В:
{ 4 А -+ 5 С.'С о;
. 8А -+ 2В + 4 == о.
Решая эту систему, получаем А ., .5/4, В == 7. Тоrда частное реше
lIие peKyppeHTHoro СООТНОШСНИЯ имеет вид
а" .с-= 20. 2" - п (п -+ 7) .
& djvu Kartun [kаrtuп@уапdех. ruJ
46
rл. 1. Введение в теорию рекурсии
Общее решение соответственно равно
а п == d. з п 20. 2 п п (п -+ 7) + с,
rде с и d произвольные постоянные.
Исчисление конечных сумм с использованием линейных Heoд
нородных рекуррентных соотношений. Довольно часто приходится
иметь дело с вычислением конечных сумм вида
п
8 п == L ak,
kl
rде ak == f(k) заданная функция. Отметим, что последовательноC'I;Ь
конечных сумм может быть задана линейным неоднородным рекуррент"
ным соотношением nepBoro порядка в виде
{ 80 =-= о;
8 п == 8пl -+ l(п), п> О.
Проиллюстрируем этот подход на следующем примере.
п
Пример 1.27. Найти 8 п == 2:: k.
kO
Данная сумма может быть задана рекуррентным соотношением
вида
{ 80 == о;
8 п == 8п1 + п,
п > О.
Для соответствующеrо однородноrо peKyppeHTHoro соотношения име
ем следующее характеристическое уравнение: l' == 1. Далее найдем
частное решение соотношения 8 п == 8пl + п. Имеем функцию у(п)
вида 9(п) == Рт(п) . ь п , rде Рт(п) == п мноrочлен первой степени,
и, значит, т ',' 1; Ь == 1, и поскольку число Ь == 1 является корнем
характеристическоrо уравнения кратности 1, то можно положить 8 == 1.
Torдa частное решение соотношения ищем в виде
8 п == п 1 . Ql(n). lп == п(Ап -+ В),
rде А и В неизвестные величины, которые мы определим из peKYP
peHTHoro соотношения. Ilодставляя данное выражение в рекуррентное
соотношение, получаем
п(Aп:-- В) == (п 1)(А(п 1) -+ В) + п.
Приравнивая коэффициенты при одинаковых степенях п, получаем
систему уравнений для определения А и В
{ 2А == 1,
А В == О.
94. Методы исследования и решения рекуррентных соотношений 47
Решая эту систему, получаем А == 1/2, В == 1/2, тоrда частное решение
peKyppeHTHoro соотношения имеет вид
п(п + 1)
Вп == 2 .
Общее решение соответственно равно
п(п + 1)
8 п == 2 + с,
rде с произволь,наяпостоянная. Используя условие 80 == о, получаем
с == О. Следовательно,
8 п == t k == п( п 2+ 1) .
kO
п
Пример 1.28. Найти 8 п == I: k З .
kO
Данная сумма может быть задана
вида
рекуррентным соотношением
{ 80 == о;
3
8 п == 8п 1 + п ,
п > О.
Для соответствующеrо однородноrо peKyppeHTHoro соотношения име
ем следующее характеристическое уравнение: r == 1. Далее найдем
частное решение соотношения Sn == Bп 1 +- п 3 . Имеем функцию g( п)
вида g(n) == Рт(п) . ь п , rде Рт(п) == п 3 мноrочлен третьей степени,
и, значит, т == 3; Ь == 1, и поскольку число Ь == 1 является корнем
характеристическоrо уравнения кратности 1, то можно положить s == 1.
Тоrда частное решение соотношения ищем в виде
8 п == п l . Qз(п). l п == п(Ап 3 + Вп 2 + Сп + D),
rде А, В, С, D неизвестные величины, которые У1Ь! определим из
peKyppeHTHoro соотношения. Подставляя данное выражение в peKYP
рентное соотношение, получаем
п(Ап 3 + Вп 2 + Сп + D) == (п I)(А(п 1)3 + В(п 1)2 +
С(п 1) -;./)) +- п 3 .
Приравнивая коэффициенты при одинаковых степенях п, получаем
систему уравнений для определения А, В, С, D.
{ 4А 1;
6А +- 3В == о;
4А 3В + 2С == о;
А + в с -+ D == О.
& djvu Kartun [kаrtuп@уапdех. ruJ
48
rл. 1. Введение 8 теорию рекурсии
Решая эту систему, получаем А с.;:; 1/4, В == 1/2, С == 1/4, D == О. Тоrда
частное решение pekyppeI-lтноrо соотношения имеет вид
п(п 3 + 2п 2 + п)
8" == 4
Общее решение соответственно равно
п 2 (п -+- 1)2
S" --= 4 t. с,
п 2 (п -+ 1)2
4
rAe с произвольная постоянная. Используя условие 80 == О, получаем
с == О. Следовательно,
" 2 ( ) 2
, '" k 3 п п ,+- 1
8" 4
kO
В качестве <,бесплатноrо» приложения из решения последних двух
примеров мы получили любопытный факт:
(13 + 23 ... + TI,:) 'С.С (1 " 2 + ... ,t п) 2 .
Метод решения рекуррентных соотношений первоrо порядка
с переменными коэффициентами. Рекуррентным соотношением пер
Boro порядка с перемеI-lНЫМИ коэффициентами называется соотношение
вида
а" == b(п)a"1 с(п), п 1,
rдe ао нредполаrается известной величиной. Идея решения данноrо
соотношения состоит во введении суммирующеrо множителя F( п),
paBHoro
1
F(n), "
IТ Ь( k)
kl
УМQЖИМ обе части соотношения на суммирующий множюлр..Лолу
чим
а 11
a"IЬ(п)
с(п)
"
п b(k)
k1
"
п b(k)
k1
п
П Ь(k)
k-,---l
Обозначим через у" ,-' Ь(п + I)F(n -+ 1)(1". Тоrда полученное COOTHO
шение может быть перенисано в виде
у" = у" .1 + Р(п)с(п).
Это соотношение решается нростым суммированием
"
у" , УО + L P(k)c(k),
kl
Задачи и упражнения к славе 1
49
тота
n
аа -1- L F(k)c(k)
kl
Ь(п + I)F(n + 1)'
Ilоскольку вычисление произведений сводится к исчислению сумм
а п С=
11 b(k) == ехр (lIl Ц b(k)) == ехр (lIlb(k)),
то и исследование таких рекуррентных соотношений сводится к вопро
су исчисления сумм.
При мер 1.30. Найти решение рекуррентноrо соотношения
{ Ха == -+- 1 ,
Х" == 1;,,l + 2, п? 1.
п
Суммирующий множитель имеет вид
F(n) ==
n
П k1
k1
п--,---1
Обозначим
п :- 2 1 1
Уп== Ь(п+ I)P(п+ 1):1:,,== 1 . 2 'Хn == 1 'Хn.
п+ п--т- п+
Для определения Уп получаем рекуррентное соотношение
{ Уа == о;
2
у" == Ynl+ 1 '
пт
Torдa
н 2
ун == 2:= k ...: 1 '
kl
следовательно,
n 1
Х п == 2(п + 1) . 2:= k + 1 == 2 (п + 1) (Н п + 1 1) ,
k1
['де H i ioe rармоническое число.
В этом разделе мы коснулись лишь широко известных '\1етодов
:Iсследования рекуррентных соотношений. Более «тонким» методам
llССJlедования посвящена СIlециальная литература, с которой читатель,
('ели у Hero возникнет интерес или необходимость, может ознако
\иться. Такую информанию МОЖНО найти, например, в литературе,
рекомендованной в конце данной rлавы.
& djvu Kartun [kаrtuп@уапdех. ruJ
50
Fл. 1. Введение в теорию рекурсии
Задачи и упражнения к rлаве 1
1.1. Записать рекурсивную последовательность для вычисления
квадратноrо корня в виде рекурсивно заданной функции.
1.2. Показать, что рекурсивная последовательность
{::: (2an' + a8,). n> I
имеет предел ыри n -----> 00 и найти значение этоrо предела.
1.3. Найти решение peKyppeHTHoro соотношения
aп 1 2 2 2 1
а п == 3 + З- N + З- N З-.
1.4. Найти решение peKyppeHTHoro соотношения
а п == 2aпl n + 2.
1.5. Найти решение peKyppeHTHoro соотношения
а п == 5aп 1 6aп2'
1.6. Найти решение peKyppeHTHoro соотношения
а п == 6aп 1 9aп2
1.7. Найти решение peKyppeHTHoro соотношения
а п == 2aпl 2aп2'
1.8. Составить рекуррентное соотношение для вычисления . , а >
> О, п Е Z.
Список литературы к rлаве 1
1.1. FPUH Д, Кнут Д Математические методы анализа алrоритмов. М.:
Мир, 1987. 120 с.
1.2. Андерсон Дж. Дискретная математика и комбинаторика: Пер. с анrл.
М.: Издателький дом (,Вильямс». 2003. 960 с.
1.3. Fрэхем Р, Кнут Д, Паташник О. Конкретная математика. Основание
информатики: Пер. с анrл. М.: Мир, 1998. 703 с.
1.4. Фалевuч Б.я. Теория алrоритмов: Учебное пособие. М.: Машинострое
ние, 2004. 160 с.
1.5. Ноден П. Китте К. Алrебраическая алrоритмика (с упражнениями и pe
шениями): Пер. с франц. М.: Мир, 1999. 720 с.
1.6. Хассарти Р. Дискретная математика для проrраммистов. М.: TeXHO
сфера, 2005. 400 с.
rлава 2
РЕКУРСИВНЫЕ АлrоРитмы И ОСОБЕННОСТИ
ИХ проrРАММНЫХ РЕАЛИЗАЦИЙ
Введение. Цель этой небольшой rлавы показать, как рекурсивно
заданные последовательности и функции, определенные peKyppeHT
ными соотношениями, MorYT быть реализованы в виде рекурсивных
алrоритмов. Язык проrраммирования, поддерживающий рекурсивные
вызовы, должен обладать специальным механизмом, который обеСIlечи
вает правильное обращение проrраммноrо модуля к самому себе, мы
приводим одну из возможных моделей TaKoro механизма, достаточно
близкую к реальным языкам процедурноrо проrраммирования. Мы
так>ке вводим понятие дерева рекурсии как лоrической конструкции,
отражающей последовательность рекурсивных вызовов, порожденных
рекурсивным алrоритмом на определенном входе. Исследование таких
деревьев рекурсии будет продол>кено в rлаве б, rде на их основе
мы опишем один из методов исследования и анализа рекурсивных
алrоритмов.
1. Рекурсивные алrоритмы
Общая схема. Имея рекуррентное соотношение, описывающее
рекурсивно заданную последовательность или функцию, мы можем
на этой основе построить вычислительную процедуру, позволяющую
IlО,1УЧИТЬ значение необходимоrо нам члена последовательности или
функции для заданноrо aprYMeHTa. Такая процедура будет обращаться
к самой себе для вычисления необходимых предыдущих значений
вплоть до останова рекурсии ситуации, коrда начальный член или
несколько первых членов последовательности MorYT быть вычислены
непосредственно. Мы получаем рекурсивный алrоритм, непосредствен
1/0 опирающийся на рекуррентное соотношение. Обрашаясь к примеру
ВЫЧИС"1ения опреде"1Ителя квадратной матрицы из параrрафа 1.1, за
:vIетим, что процесс вычисления определителя мо>кет быть представ
:leH как рекурсивный алrоритм, вызывающий сам себя с матрицами,
имеющими на каждом шаrе уменьшающуюся на единицу размерность,
вплоть до возможности непосредственнOI'О вычисления опредеJ1Ите
ЛЯ. Мо>кно интерпретировать процесс вычисления определителя как
процесс вычисления значения функции. aprYMeHToM которой является
квадратная матрица, тоrда у нас есть алrоритм, который позволяет
L'вести ВЫЧИСJ!ение этой функции для матрицы размерности п к вычис
лению функции для некоторой друrой :vIатрицы размерностью п 1.
52 rл. 2. Рекурсивные алсориmмы и их просрам.мные реализации
в дальнейшем, в целях единообразия изложения, мы будем считать,
что рекуррентное соотношение задает рекурсивную функцию.
Итак, рекуррентное соотношение задает непосредственно вычисля
емые значения функции для начальных значений aprYMeHTa и правило,
по которому значение функции для HeKoToporo aprYMeHTa может быть
вычислено на основе предыдущих известных значений. Переходя от
peKyppeHTHoro соотношения к рекурсивному алrоритму, мы должны
построить вычислительную процедуру. Таким образом, рекурсивный
алrоритм должен включать в себя [10 крайней мере два фраrмента
фраrмент непосредственноrо вычисления функции для начальных зна
чений aprY1eHTa и фраrмент, содержащий реКУРСИlJное обращение.
Такая схема носит наЗlJание схемы прямой рекурсии.
Мы буде:v. придерживаться IJ дальнейшем предположения о том, что
средой проrраммной реализации является процедурный язык BbIcoKoro
уровня. fоворя высоким стилем, мы остаемся в императивной парадиr
ме проrраммирования. Поскольку проrраммные реализации в приложе
нии к этой книrе выполнены на языке Delphi, то мы при ни маем форму
записи алrоритмов (llсевдокод), близкую к конструкциям данноrо язы
ка. Как это принято в псевдокоде, :\!ы опускаем описание типов данных
и операторных скобок, показывая структурные фраrменты сдвиrом
вправо, и надеемся, что такая форма записи алrОРИТМОIJ будет понятна
нашим читателям. Мы предполаrаем также, что у нашеrо читатеJIЯ
есть определенные навыки проrраммирования, но на одно:\! моменте
мы хотим остановиться подробнее. ОбращаеС\1 внимание на то, что
рекуррентное соотношение задает некоторую функцию целочисленноrо
aprYMeHTa в рамках llонимания термина «фУНКЦИЯ') в К,1ассическом
математическоС\1 анализе как однозначноrо отображения множества
допустимых значений aprYMeHTa на множество значений функции.
В отличие от этоrо, в контексте «алrоритм в виде процедурно реаJIИ
зованной рекурсивной функции F(n),) термин «Функция,) используется
в рамках ero llонимания в проrра:\!мировании, т. е. как именованноrо
фраrмента в языке записи алrоритмов или в языке проrрам:\!ирования,
возвращающеrо значение по своеС\1У имени [2.1].
Рассмотрим схему прямой рекурсии как рекурсивноrо алrоритма
в виде процедурно реализованной рекурсивной функции F(n).
Схема прямой рекурсии.
F(n)
If (п==пО)
then
r' <------- с
else
F .' ...F(щ),....
Return (П
End.
(рекурсивная функция)
(проверка останова рекурсии)
(прямое вычисление r' при п==пО)
(рекурсивный вызов, т<п)
1. Рекурсивные алzориmмы
53
Для начальных значсний aprY:vIeHTa (п==пО) значение функции БЫ
числяется непосредствешlO (F (------ С) и при водит к останову рекурсии,
а для друrих значений фунющя Р(п) обращается сама к себе (вызов
F(m» с меньшим значенисм aprYMCHTa, порождая рекурсивный вызов.
Более сложная конструкния, возникающая в некоторых задачах, при
водит к схеме, коrда процесс рскурсии ОРI'анизуется опосредованно,
нскоторая функция вызывается вновь через цепочку вызовов друrих
функций, например, две функнии вызывают друr друrа, такая схема
называется косвенной рекурсией. Рассмотрим, в качестве примера,
вариант схемы косвенной рекурсии для двух взаимосвязанных алrо
ритмов, реаJ1изоваllllЫХ в виде процедурных косвенно рскурсивных
функций F(n) и G(m).
Схема косвенной рекурсии д,ля двух функций.
F(n) (косвенно рекурсивная функция)
If (п==пО) (проверка останова рекурсии)
then
F {------ С (прямое вычисление F при п==х)
else
F +---- .. G(k)... (рекурсивный вызов, k < п)
Return(F)
End.
Щm)
If (т==тО)
then
G {C
else
G ...... . ..РО)... .
Return(G)
End.
(косвенно рскурсивная функция)
(проверка останова рекурсии)
(прямое вычисление G при т==тО)
(рекурсивный вызов, j<m)
R этом ПРИ:vIере схемы косвенной рекурсии двс функции вызывают
:tpyr друrа, и мы можем определить наличие рекурсии, только исследуя
Н'1(СТЫ двух функций одновременно.
I::ще одна схема, отличная от прямой рекурсии, возникает для функ
IlНЙ нескольких переменных. R случае, коrда не только сама функция,
"() И один из се aprYMCHToB вычисляются рекурсивно, мы получаем cxe
11// дважды рекурсивной функции. Классический пример функция
Л"ксрмана, которая задастся следующим рекуррснтным соотношением
1:12]:
{ п + 1, rп == о;
А (т, п) == А (т 1, п), п == о;
А (rп оо-оо 1, А (щ п 1» .
I t.-t'\\ЮТРЯ на достаточно простую форму caMoro PCKYPpCHTHoro COOTHO
..."!lИН, последоватеJ1ЬНОСТЬ рекурсивных вызовов достаточно сложна.
II i lJбы понять, как {<устроена» функция Аккермана, мы советуем Ha
54 rл. 2. Рекурсивные алzoритмы и их просраммные реализации
рисовать последовательность рекурсивных вызовов, а вместе с этим
и вычислить значение этой функции при rп == 3 , п == 5 А (3, 5).
Первый шаr рекурсии приведет к равенству
А(3,5) == А(2,А(3,4)),
и придется вычислить А (3,4), чтобы определить второй индекс.
Примеры рекурсивных алrоритмов. Продемонстрируем схему
прямой рекурсии на примере вычисления значения определенноrо инте
rрала (см. при мер 1.3 из параrрафа 1.1). Полученную при исследовании
определснноrо интеrрала
п/2
f cosrlx (lх
о
рекурсивно заданную последовательность будем интерпретироваiы как
рекурсивно заданную функцию цеЛОЧИСЛСllноrо aprYMeHTa
п/2
f (п) == I n == f cosrlx dx,
о
что позволяет, опираясь на (1.1.3), записать рекуррентное соотношение
{ f (О) == ,,/2; f (1) == 1;
п1
f(п)==,f(n2), п;;?:2.
п
Рассмотрим рекурсивный алrоритм, вычисляющий значение этоrо
определенноrо интсrрала, в виде процедурно реализованной рекурсив
ной функции F(n) (прямая рекурсия) с остановом при значениях п == О
и п == 1. Заметим, что если мы хотим вычислить, например, значение
этоrо определенноrо интеrрала при п == 1 О, то в вызывающей проrрам
ме мы пишем вызов у <---- Р(10), а запись рекурсивноrо алrоритма,
вычисляющеrо значение этоrо определенноrо интеrрала, имеет вид
(2.1.1 )
Р(п)
1 lf (п==О) (проверка останова рекурсии)
2 then
3 F , 0,5*pi, (прямое вычисление F при п==О)
4 else
5 If (п== 1) (проверка останова рекурсии)
6 then
7 F <---- (прямое вычисление F при п== 1)
8 else
9 F <---- «пI)/n)*F(п2) (рекурсивный вызов)
10Return(F)
End.
9 1. Рекурсивные алzориmмы
55
Дадим некоторые комментарии. В строках 1 и 5 мы, непосредствен
но следуя (2.1.1), проверяем условие останова рекурсии. В строках 3
и 7 вычисляется значение функции при останове рекурсии, которое
и возвращается через имя функции F в точку вызова. Строка 9 будет
ныполнена, если значение aprYMeHTa не равно ни нулю, ни единице
это рекурсивный вызов функция обращается сама к себе с меньшим
значение:v1 aprYMeHTa. Коrда будет получен результат из рекурсивноrо
вызова, то возвращенное по имени ФУНКЦИИ значение будет участво
вать в вычислениях строки 9, после чеrо функция снова возвращает
результат, полученный в строке 9, в точку cBoero вызова. Заметьте,
что схема вычислений имеет следующий вид: функция Р(п) разворачи
вает ценочку вызовов, не производя никаких вычислений, до тех пор,
пока не будет получено значение, непосредственно вычисленное при
останове рекурсии. Теперь, возвращая вычисленные значения в себя,
функция Р(п), выполняя строку 9, в конце концов (т. к. значение п
оrраничено), вернет вычисленное значение в вызывающую проrрамму.
Друrой нример рекурсивноrо алrоритма, который мы приведем cxe
матически вычисление определителя матрицы размерности п х п.
Воспользуемся результатами, получснными в при мере 1.5 параrрафа
1.1. ДЛЯ ТOI'О чтобы вычислить определитель, нам необходимо обну
лить все первые элементы строк, начиная со второй, путем вычисления
их линейной комбинации с первой строкой матрицы. Это нриводит
к следующему алrоритму в схеме прямой рекурсии. Обращаем вни
мание на то. что арrументами функции являются сама квадратная
матрица (в реальной проrрамме, очевидно, ее адрес) и ее линейная
размерность. Останов рекурсии происходит при п == 2, и в этом примере
мы предполаrаем, что значение aprYMeHTa при вызове функции из
основной проrраммы больше, либо равно двум.
D(A,n)
1 If (n==2) (проверка останова рекурсии)
2 then
3 D +------ A[I,I]*A[2,2]A[I,2]*A[2,1] (прямое вычисление О)
4 else
5 For i==2 to n (обнуление первых элементов строк)
6 вычислить коэффициент Ь для iой строки
7 вычесть из iой строки первую, умноженную на Ь
8 end For
<) zfA[1,I]
1 О сформировать новую матрицу А, размерностью n. 1
11 О +------ z*D(A,n 1) (рекурсивный вызов)
12 Return (О)
End.
Мы проверяем условие останова в строке 1 и вычисляем опреде-
литель непосредственно по формуле (1.1.6), если достиrли условия
останова. В противном случае мы, вычисляя линейную комбинацию
& djvu Kartun [kаrtuп@уапdех. ruJ
56 rл. 2. Рекурсивные алzоритмы и их просраммные реализации
(строки 58), обнуляем первые ЭЛС:\lСНТЫ всех строк, кроме нервой,
запоминаем нервый элемент первой строки (строка 9) и формируем
новую матрицу меньшей размерности. Строка 11 нредставляет собой
рекурсивный вызов с понижением размерности на единицу и CKOp
ректированной матрицей в качестве первоrо aprYMeHTa. Мы привели
только схему алrоритма, при ero детальной разработке необходимо
учесть, что эле:\lент А [1,1] исходной или скорректированной матрицы
может быть равен нулю.
При всей внешней нривлекательности записи рекурсивных алrо
ритмов (мы имеем в виду, прежде всеI'O, прямую аналоrию с записью
peKyppeHTHoro соотношения) остается непонятным мехаНИЗ:\l, который
обеспечивает реализацию рекурсивно!'о вызова объяснению этоrо
посвящен следующий параrраф.
92. Особенности проrраММНblХ реализаций
реКУРСИВНblХ алrоритмов
Процесс проrраммной реализации рекурсивных алrоритмов обла
даст, по сравнению с итерационпыми алrоритмами, специфическими
особенностями, а именно необходимостью орrанизации специальной
структуры данных и обслуживапия рекурсивных вызовов. При этом
орrанизация «правильной» структуры данных лежит на плечах про
rраммиста, в то время как мехаНИЗ:\l обслуживания рекурсивных вызо
вов обеспечивается языком проrраммирования, точнее, компилятором
этоrо языка, и поддерживается машинными командами компьютера.
Особенности разработки структур данных. Поскольку peKYP
сивный алrоритм задает во времени последовательность обраuний
к одному и тому же фраrменту пpOl'paM:\IHOrO кода, то применяемая
структура данных должна обеспечить сохранность тех ячеек и :\Iac
сивов, которые будут задействованы алrоритмом после возврата из
рекурсивноrо вызова. В рамках возможностей современных' языков
процедурноrо (императивноrо) проrраммирования :I1orYT быть исполь
зованы разнообразные варианты [2.3,2.4], из которых :\Ibl остановимся
на трех основных.
1. rлобальная структура данных. В этом случае пользователь
создает rлобальную структуру, содержащую помимо описания ячеек
и массивов для ОДНОI'O вызова, копии этих онисапий для всей ценочки
рекурсивных вызовов. Такая структура может представлять собой,
например, мноrомерный массив данных, один из индексов KOToporo
соответствует уровню вложенности вызова. Эта структура формирует
ся в вызывающей проrраМ:\Iе, и рекурсивной функции передается ее
адрес, а слой структуры, используемый на данном рекурсивном Jjызове,
определяется ero rлубиной. Более подробно мы продемонстрируем этот
подход в rлаве 7 на ряде примеров реализации рекурсивных алrорит
мов.
2. Особенности просраммных реализаций рекурсивных алсоритМО6 57
2. Локальная структура данных. При этом способе орrаниза
ции данных в теле рекурсивной функции или процедуры описывается
необходимая структура данных, и создание копии этой структуры на
рекурсивном вызове обеспечивается средствами языка проrраммиро
вания и компилятора. Несколько забеrая вперед, отметим, что такой
подход при водит, особенно при наJ1ИЧИИ массивов, к большим затратам
памяти в области проrраммноrо стека, размер KOToporo, вообще rоворя,
оrраничен. Этот способ при водит к тому, что общая структура данных,
соответствующая текущей rлубине рекурсии, последовательности
рекурсивных вызовов, будет создаваться механизмом обслуживания
рекурсивноrо вызова непосредственно во время выполнения проrрамм
Horo кода.
3. Динамическая структура данных. Третий подход к созданию
необходимой структуры для прorраммнои реализации реКУРСИВНОI'О
аш'оритма состоит в том, что пользователь средствами языка ПрOI'рам
мирования обращается к операпионной системе для выделения необхо
дшюrо в данный момент ресурса памяти. Этот подход, обладая опре
деленной rибкостью, требует от нользователя aKKypaTHoro обращения
с динамически выделяемой памятью, своевременноl'O ее освобождения
и орrанизации правильной передачи aprYMeHToB при рекурсивных вызо
вах и правильноrо возвращения полученных результатов при рекурсив
ных возвратах. Отметим еще одну особенность этоrо подхода в зави
симости от текущеrо состояния фраrментации области динамической
памяти, обслуживаемой средствами операционной системы, временные
затраты на динамическое выделение памяти мо/'ут существенно влиять
1/а 'общее время выполнения проrраммной реализации. Очевидно, что
в этом случае также затруднено теоретическое проrнозирование Bpe
менных характеристик проrрамм.
Модель nporpaMMHoro стека. Рассмотрение механизма орrаниза
нии рекурсивных вызовов мы начнем с модели проrраммноrо стека.
Будем предполаrать, что операционная система поддерживает специ
альную область оперативной памяти проrраммный стек, используя
специальный реrистр или ячейку памяти указатель стека, хранящий
адрес некоторой ячейки (слова) в этой оБJ1асти. Две специальные
команды «записать В стек» и «читать из стека» орrанизуют работу
с этой областью так. что лоrически мы считаем, что имеем дело со
стеком как классической структурой, хотя указанные операции и из
меняют адрес указателя стека. Например, команда «записать В стек»
уменьшает текущий адрес и записывает по этому адресу содержимое
CBoero операнда. Такой подход rарантирует, '!то любая операция со CTe
I\ОМ не приводит к перезаписи со сдвиrом еl'O содержимоrо, и позволяет
считать, что трудоемкость выполнения указанных команд не зависит
от объема хранимой информации. Хотя наши команды неявно исполь-
зуют текущий указатель вершины проrраммноrо стека, тем не менее,
:>1bI рассматриваем их как команды с одним операндом, указывающим
"Jлементарную ячейку хранения или реrистр, содержимое которых либо
58 rл. 2. Рекурсивные алсоритмы и их просраммные реализации
помещается в стек, либо считывается в них с вершины стека. При ведем
пошаrовое описание этих команд.
1. «Записать в стек.> <операнд>. Команда уменьшает адрес указате
ля стека на длину операнда и помещает содержимое операнда, начиная
с полученноrо адреса.
2. «Читать из стека.> <операнд>. Команда считывает информацию,
расположенную по указателю стека, в операнд и увеличивает указа
тель на длину операнда.
Механизм вызова процедуры с использованием проrраммноrо
стека. Прежде чем переходить к изучению механизма рекурсивноrо
вызова, рассмотрим обычный в языках процедурноrо (императивноrо)
проrраммирования механизм, обеспечивающий передачу управления на
некоторую процедуру и возврат управления в точку Вblзова. Напомним,
что под процедурой пони мается поименованный фраrмент проrраммы,
к KOTOpO:'vlY можно обращаться по ero имени с возможностью переда
чи ряда фактических пара метров как по значению, так и по ссылке
(адресу) для возврата полученных результатов в точку вызова [2.1].
В отличие от функции, процедура не возвращает значения по своему
имени. Механизм должен обеспечить сохранение реrистров процессо
ра, т. к. при возврате в точку вызова мы должны восстановить их
значения. кроме Toro, в процедуру должны быть некоторым образом
переданы фактические пара метры [2.1].
Для обеспечения этих действий :'vIbI и будем использовать опи
санный выше проrраммный стек и обслуживающие ero команды. По
скольку значения должны помещаться в проrраммный стек в порядке,
обратном их выборке, то вначале мы помещаем в стек адрес возврата
в точку вызова, зате:'vl значения необходи:'vlЫХ реrистров и передавае:'vlые
в процедуру фактические пара метры. Для заинтересованных читателей
отметим, что в разных языках проrраммирования, в зависимости от
принятоrо соrлашения, действия по сохранению реrистров выплня
ются либо в момент вызова процедуры из основной nporpaMMbI, либо
самой процедурой при получении управления. Схематично этот Mexa
низм проиллюстрирован на рис. 2.1 мы считаем, что вызывающая
проrрамма ca:'vla сохраняет реrистры, а вызываемая процедура BOCCTa
навливает их перед передачей управления (возвратом).
При вызове процедуры вызывающая проrрамма помещает в стек
адрес возврата, состояние неоБХОДЮ1ЫХ реr'истров процессора, адреса
возвращаемых значений и передаваемые парюлетры, lIOJ1ЬЗУЯСЬ KOMaH
дой «записать В стек.>. После этоrо ВЫllOлняется переход по адресу
на вызываемую процедуру, которая извлскает переданные фактиrIеские
пара метры (командой «читать из стека.», ВЫllOлняет неоБХОДИ:'vlые BЫ
числения и помещает результаты по указанны:'vl в стеке адресам. При
завершении работы вызываемая процедура восстанавливает значения
реrистров, выталкивает из стека адрес возврата и осуществляет пере
ход по этому адресу, возвращая управление в точку CBoer'o вызова (см.
рис. 2.1).
3. Механизм обслуживания рекурсивносо вызова
59
Вызов
ТЕЛ
процед
........ Proc 1 (х\...х т ; Y\...Yk)
I
Х\
Х т
I
Адрес (Уд
Адрес (Yk)
Содержимое
реrистров
Состояние
рсrистра
О I адреса
следующей
уры команды
т слов
....... стека
k слов
....... стека
Proc 1(...)
Сохранение
....... реrистров
Чтение Х,У
....... Адрес
возврата
Восстановление
реrистров
Чтение
адреса
возврата
Переход (возврат) по адресу
Рис. 2.1. Механизм вызова процедуры с использованием стека
3. Механизм обслуживания рекурсивноrо вызова
Очевидно, что механизм обслуживания рекурсивноrо вызова бази
руется на механизме вызова процедуры. Дополнительные изменения,
которые необходимо внести, касаются локальных ячеек рекурсивной
функции или процедуры и передачи значения через И:vJЯ функции.
110СКОЛЬКУ мы рекурсивно вызываем тот же фраrмент проrра:vJмноrо KO
Jl<-1. то состояние локальных ячеек рекурсивной функции ДОЛЖIЮ быть
!'акже сохранено в проrраммном стеке, равно как и значения реrистров.
Ilри рекурсивном возврате мы до"жны обеспечить то же состояние
j1t'I'ИСТрОВ и локальных ячеек, которое было в момент рекурсивноrо
lIы:юва. Это при водит к необходимости использовать проrраммный стек
ДJlЯ хранения локальных ячеек и массивов рекурсивной функции. Что
1{<lсастся передачи результата функцией через свое имя, то мы будем
]
60 rл. 2. Рекурсивные алzоритмы и их просраммные реализации
....... ProcA
Этап 3 чтение переданных
пара.\lетров из стека
Этап I заполнение стека I > Проrpа.\lМНЫЙ стек
Этап 2 .. рекурсивный вызов
A(Xt,...,xn)
Тело процедуры А Передаваемые фактические
параметры ,-- XJ,...,X n
Этап 4 восстановление
состояния локальных ячеек и Состояние локалЬНЫХ ячеек
реrистров из проrpаммноro процедуры на момеlП вызова
стека
Этап 5 Состояние реrиСтрО8 процессора
--, -- чтение из стека адреса
возврата
Этап 6 т' Адрес возврата
........... возврат переход по адресу
Рис. 2.2. Механизм реКУрСИВl!оrо вызова ПРОIJ,едуры
считать, что имя функции также является локальной ячейкой, с той
лишь разницей, что в МО\1ент возврата функция помещает в стек
вычисленное значение, и восстановление локальных ячеек при возврате
приведет к передаче этоrо значения в рекурсиВlШЙ вызов. С учетом
этоrо, мехаНИЗ:\1 рекурсивноrо вызова процедуры может быть cxeMa
тично представлен так, как это ноказано I-Iа рис. 2.2. Опише:\1 этапы
рекурсивноrо вызова и возврата более подробно, НУ:\1ерация этапов
соответствует рис. 2.2.
1. Непосредственно неред рекурсивным вызовом нроцедура после
довательно номещает в проrраммный стек адрес возврата, состояние
реrистров, содержимое своих локальных ячеек и массивов, и список
передаваемых пара метров реКУРСИВНОI'О вызова.
2. Выполняется рекурсивный вызов процедура вызывает сама
себя. Отмстим, что с точки зрения процессара это Bcero лишь Jlсредача
управления на друrую машинную команду в проrраММI-IОМ коде. Этой
командой является первая команда процедуры.
3. Механизм обслуживания рекурсивносо вызова
61
З. При получении управления процедура получает доступ к пере
данным параметрам через проrраммный стек они либо считываются
из стека в реrистры, либо процедура имеет прямой адресный доступ
к области проrраммноrо стека.
4. В предположении, что этот вызов является остановом рекурсии,
процедура формирует результат в некоторой области оперативной па
мяти, адрес которой БЫJl ей передан при вызове, и восстанаВJlивает
состояние JlOKaJlbHbIX ячеек и реrистров пропессора на момент ее BЫ
зова, используя информацию из стека и команду чтения.
5. ПОСJlе этапа 4 на верху стека остается адрес возврата, который
и считывается ДJlЯ последующей передачи упраВJlения.
6. выпJlняетсяя команда перехода по адресу процедура возвра
щает упраВJlение в тот проrраммный модуль, откуда она была вызвана,
но это возврат в TeJ10 этой же процедуры, и мы оказываемся в теле
процедуры А на предыдущем уровне цепочки рекурсии.
Остановимся более подробно на этапе 4. Мы ero описаJlИ в пред
ПОJlожении останова рекурсии. ЕСJlИ это не так, то в теле процедуры
формируется новый рекурсивный вызов, включающий сохранение JlO
кальных ячеек и реrистров и вызов процедуры с новыми параметрами.
Очевидно, что в этот момент информация о «новом>} вызове сохраняет
ся в стеке выше информации о «старом)} вызове. Это приводит к тому,
что хотя мы физически имеем один и тот же проrраммный код, но
предыстория вызовов сохраняется в стеке, и, С_1едоватеJlЬНО, мы храним
всю информацию о ПОСJlедоватеJlЫЮСТИ вызовов, на основе которой
орrанизуется цепочка возвратов после выполнения условия останова
рекурсии.
Все вышесказанное остается в СИJlе и для рекурсивной функции,
за исключением Toro, что в области сохранения локальных ячеек
и массивов будет выдеJlена еще одна дополнительная ячейка, хранящая
:тачение, вычисленное функцией.
Таким образом, механизм проrраммноrо стека позволяет орrани
зовать цепочку рекурсивных вызовов процедур ИJlИ функций в языке
проrраммирования BbIcoKoro уровня. Хранение в стеке всей текущей
ннформации об этих вызовах позволяет орrанизовать обратную цепоч
ку рекурсивных возвратов. Поэтому, если рассматривать ВЫПОJlнение
рекурсивной функции во времени, то в момент останова рекурсии
в стеке сохраняется вся информация о предыдущих рекурсивных BЫ
зовах, и в этот момент мы используем наиБОJlЬШИЙ объем памяти
в оБJlасти проrраммноrо стека. Эта информация будет необходима нам
в дальнейшем для исследования емкостной эффективности рекурсив
ных алrоритмов.
Отметим, что в настоящее время практически все языки про
l'раммирования для персональных компьютеров, более корректно
обслуживающие их компиляторы, поддерживают механизм рекурсив
!loro вызова, основанный на проrраммном стеке [2.1, 2.5]. В свете
вышесказанноrо этот механизм было бы более праВИJlЫЮ назвать
62 rл. 2. Рекурсивные алzориmМbl и их просраммные реализации
механизмом рекурсивноrо вызовавозврата. Мы еще раз напоминаем
уважаемым читателям, что изложенный здесь механизм является пусть
и приближенной к действительности, но все же моделью механизма
орrанизации рекурсивноrо вызова. Компиляторы реальных языков про
rраммирования BbIcoKoro уровня MorYT иметь собственные особенности
орrанизации TaKoro механизма, и мы советуем ознакомиться с тем, как,
например, этот механизм реализован в языках Delphi или СИ (см.,
например, [2.1,2.5]).
4. Представление последовательности рекурсивных
вызовов в виде дерева рекурсии
Uель этоrо парarрафа ввести понятие «дерево рекурсии», которое
мы будем в дальнейшем использовать как для представления peKYP
сивных алrоритмов, так и в целях их анализа. Мы уже знаем, что
рекурсивный алrоритм порождает цепочку рекурсивных вызовов, KO
торая обрывается при останове рекурсии. Рассмотрим более подробно
этот процесс на при мере рекурсивной функции, вычисляющей значение
факториала для натуральноrо aprYMeHTa. Рекуррентное соотношение,
задающее функцию факториала, имеет вид:
{ 1 (О) == 1;
1(1) == 1;
1(n)==n'1(n1), n2.
В принятом нами псевдокоде рекурсивный алrоритм, соответствующий
этому рекуррентному соотношению, может быть записан следующим
образом:
F(n)
1 If (п==О or п== 1) (проверка возможности прямоrо вычисления)
2 then
3 F 1 (останов рекурсии)
4 else
5 F n*F(nl) (рекурсивный вызов функции)
6 Return (F)
End.
Рассмотрим, как этот алrоритм порождает последовательность pe
курсивных вызовов. Информация об этой последовательности xpa
нится в проrраммном стеке, механизм работы которorо уже знаком
читателям. В данном случае нас будет интересовать, как во времени
орrанизуется вычисление этой функции, например, для вызова F(5).
Поскольку вызов функции F(n) с aprYMeHToM п==5 не при водит к OCTa
нову рекурсии, то в строке 5 происходит рекурсивный вызов F(4)
и так далее, до тех пор, пока не произойдет останов рекурсии при
п== 1. Полученная цепочка рекурсивных вызовов показана на рис. 2.3.
4. Представление рекурсивных вызовов в виде дерева рекурсии 63
основной
моду.nь
Y=F(S)
120
!
F(S)
F+----S*F (4)
24
Второй этап
Рекурсивные
возвраты
и вычисление
значений функции
F(4)
F+----4*F (3)
Первый этап
Создание
цепочки
рекурсивных
вызовов
6
F(3)
F+----3*F(2)
2
F(2)
F+----2*F (1)
.1
F(l)
F+----1
Рис. 2.3. Цепочка рекурсивных вызовов и возвратов
факториала для значения n == 5
Вычисленное непосредственно значение F(t)==l передается в точку
вызова в функцию F(2) и далее вверх, вплоть до вызова F(5), который
11 возвращает вычисленное значение в основную (относительно этоrо
вызова) проrрамму.
Таким образом, мы получаем во времени два этапа первый этап,
ш котором разворачивается цепочка рекурсивных вызовов, вплоть
До останова рекурсии, и второй этап этап возвратов по цепочке
рекурсии, на котором и происходит собственно вычисление функции
(\'. рис. 2.3). Заметим, что на втором этапе цепочка рекурсии все
Ilремя сокращается, и наибольшая rлубина определяется точкой OCTa
64 1А. 2. Рекурсивные алzоритМbl и их просраммные реализации
нова рекурсии. Если мы хотим показать только соподчинение pe
курсивных вызовов, то рис. 2.3 может быть преобразован в унарное
дерево, показанное на рис. 2.4, в вершинах
KOToporo мы указываем aprYMeHT, с которым
порожден следующий рекурсивный вызов.
Мы получаем, таким образом, rрафическую
интерпретацию последовательности рекурсив
ных вызовов, порожденную данным аJ]rорит
мом. В дальнейшем будем понимать ПОД дe
ревом рекурсии rраф, имеющий древовидную
структуру, вершины KOToporo отражают peKYP
сивную функцию или процедуру с данным apry-
ментом, а ду,'и непосредственно рекурсивные
вызовы.
Отметим, что в литературе [2.6] под деревом
рекурсии иноrда понимается rраф, каждая Bep
шина KOToporo представляет время, необходи
мое для выполнения отдеJIЫЮ взятой подзадачи,
решаемой при ОДНО:l1 из :I1ноrочисленных peKYP
сивных вызовов функции. Такое дерево имеет
вид, аналоrичный нашему пониманию дерева
рекурсии, разница состоит в том, что в нашем
понимании вершина дерева представляет собой
вызов рекурсивной функции с данным aprYMeH
том, а не нремя ее выполнения.
В терминах теории rрафов, дерево, представленное на рис. 2.4,
является унарным деревом rлубины пять [2.71. Всеrда ли дерево pe
курсии, порожденное некоторым рекурсивным алrоритмом, является
унарным? Ответ нет. Рассмотрим, в качестве примера, алrоритм,
вычисляющий числа Фибоначчи на основе peKyppeHTHoro соотношения
из rлавы 1.
Рис. 2.4. Лерева pe
курсии, порожденное
алrОРИТМО:l1 ВbJчисле
ния факториала при
п==5
Fb(m}
1 If (т== 1) or (т==2) (проверка останова рекурсии)
2 then
3 Fb <---- 1 (останов рекурсии)
4 else
5 Fb f----- Fb(m 1 )+Eb(m2) (рекурсивные вызовы)
6 Return (Fb)
End.
Строка 5 данноrо алrоритма порождает два рекурсивных вызо
ва с различными аРI'ументами. Возвращенные значения складыва
ются, и полученная сумма возвращается как результат этоrо Bb'
зова. Каждый из рекурсивных вызовов, в свою очередь, порожда
Задачи u упражнения к zлаве 2
65
ет также два вызова, вплоть до останова рекурсии. Вид порож
денноrо дерева рекурсии для вызова Fb(4) показан на рис. 2.5.
В этом случае дерево рекурсии является
бинарным. Более сложные деревья pe
курсии мы продемонстрируем на приме
рах рекурсивных алrоритмов в rлаве 7.
Обращаем внимание уважаемых чи
тателей на то, что дерево, показанное
на рис. 2.5, отражает все рекурсивные
вызовы, порожденные данным алrорит
мом при вызове с aprY:vIeHTOM 4. Если
мы будем рассматривать процесс порож
дения этоrо дерева во времени, то об
наружим, что в фиксированный момент
времени имеет место только одна ветвь
этоrо дерева, поскольку второй peKYP
сивный вызов в строке 5 не будет ВЫПОk
нен до тех пор, пока предыдущий вызов
не возвратит вычисленное значение. По
рядок рекурсивных вызовов во времени
пока за н нумерацией дуr на рис. 2.5. В терминолоrии теории rрафов
это означает, что последовательность рекурсивных вызовов порождает
дерево рекурсии левым обходом (2.7].
Рис. 2.5. Дерево рекурсии, по
рожденное алrоритмом ВbJЧИС
ленин чисел Фибоначчи при
п=-4
Задачи и упражнения к rлаве 2
2.1. Разработайте и реализуйте рекурсивный алrоритм, вычисля
ющий сумму элементов массива. ИтераЦИОIIНЫЙ алrоритм содержит,
очевидно, конструкцию цикла. Что является аналоrом цикла в peKYP
сивном алrоритме?
2.2. Реализуйте на языке проrраммирования рекурсивный алrоритм
вычисления функции Аккермана (см. параrраф 2.1). Если в тело ре-
курсивной функции Вы вставите фраrмент, печатающий переданные
в функцию aprYMeHTbI, то сможете проследить порождаемую последо
нательность рекурсивных вызовов. Какие особенности Вы можете при
лом отметить?
2.3. Разработайте полностью и реализуйте алrоритм вычисления
ОIJределителя квадратной матрицы, схема KOToporo приведена в па
раrрафе 2.1. Какой вариант орrанизации данных, из предложенных
11 Ilараrрафе 2.2, Вы при этом выбрали, и почему?
2.4. Определите, какое соrлашение о сохранении реrистров и ло
I\альных ячеек используется в том языке проrраммирования, который
111,1 используете. Для сравнения ознакомьтесь, как орrанизован меха-
IIЮМ рекурсивноrо вызовавозврата в языках СИ и Delphi.
2.5. Если Вы владеете Ассемблером и можете разобраться в :У1а-
IIIИННОМ коде, полученном дизассемблированием ЕХЕфайла для Вашей
66 rл. 2. Рекурсивные алzоритмы и их просраммные реализации
проrраммы вычисления определителя матрицы, то сможете ответить на
вопросы: какие реrистры сохраняются при рекурсивном вызове, и как
орrанизована передача пара метров.
2.6. Используя проrрамму, разработанную Вами в упражнении 2.2,
нарисуйте дерево рекурсии, порождаемое при вычислении функции
Аккермана А (3, 2).
Список литературы к rлаве 2
2.1. Арханzельский А.я. Язык Pascal и основы проrраммирования в Delphi. ....
М.:Бином, 2004. 496 с.
2.2. ryaMaH с., Хидетниеми С. Введение в разработку и анализ алrоритмов.
М.: Мир, 1981. 368 с.
2.3. Вирт Н Алrоритмы и структуры данных: Пер. с анrл. 2e ИЗД., испр.
СПб.: Невский диалект, 2001. 352 с.
2.4. Бакнел Дж.Н Фундаментальные алrоритмы и структуры данных в Del
phi. СПб.:ДиаСофтЮП, 2003. 560 с.
2.5. Савич У. С++ во всей полноте. СПб.: Питер, 2004. 784 с.
2.6. Кормен т., Лейзерсон ч., Ривест Р., Штайн К. Алrоритмы: построение
и анализ, 2e изд. М.: Изд. дом (.Вильямс,>, 2005. 1296 с.
2.7. Хассарти Р. Дискретная математика для проrраммистов. М.: TeXHO
сфера, 2005. 400 с.
[лава 3
МЕТОДЫ РАЗРАБОТКИ РЕКУРСИВflЫХ
Алrоритмов
Введение. В этой rлаве мы даем краткое описание некоторых
методов разработки рекурсивных алrоритмов. Прежде Bcero мы хотели
бы отметить, что, по нашему rлубокому убеждению, создание HOBoro
алrоритма это искусство, базирующееся на математике, интуиции и
«озарении». Недаром в названии алrоритма отражается фамилия ero
автора алrоритм Тарьяна, алrоритм Дейкстры, алrоритм Беллмана
Форда, алrоритм Карацубы и т. д. Рассматривая множество реально
применяемых алrоритмов, можно выделить rpynny алrоритмов, непо
средственно реализующих математические методы, например, метод
PYHr'eKYTTa. В этом случае алrоритм является простым переложением
на язык алrоритмических конструкций математически обоснованноrо
численноrо метода решения задачи. Друrую rpynny составляют алrо
ритмы, в основе которых лежит интеллект их авторов алrоритмы
Лжарвиса и rрэхема для построения охватывающеrо контура, алrоритм
I1рима для поиска OCToBHoro дерева минимальноrо веса и др. К третьей
I'руппе можно отнести алrоритмы, полученные на основе применения
к решаемой задаче некоторых «универсальных» методов разработки
i1лrоритмов.
Эти методы, о которых собственно и пойдет речь в настоящей
1'Jшве, не являются методами в CTporo математическом понимании этоrо
термина. Термин «метод» по отношению к разработке алrоритмов
--но скорее дань исторической традиции, а не констатация rарантии
(1ЫСТРОЙ и эффективной разработки. Под этим термином понимаются
lIриемы или способы, пользуясь которыми, может быть, можно постро
IПЬ алrоритм решения задачи при условиях, что, вопервых, сам метод
теоретически применим к этой задаче, и, BOBTOpЫX, что Вам удастся
адаптировать этот метод к ее особенностям. Речь скорее идет о HeKO
трых общих подходах, не содержащих конкретных рецептов, на базе
,,;оторых, вероятно, MorYT быть разработаны новые алrоритмы. В этом
('лучае конкретная разработка TaKoro метода по отношению к реаль
68
l"л. З. Методы ра:зра60тки рекурсивных алzоритмов
ной задаче требует специальных подходов и математических обосно
ваний мы снова констатируем интеллектуальный аспект в процессе
разработки алrоритмов.
Применительно к рекурсивным алrоритмам такими «универсаль
ными» И достаточно распространенными методами являются метод
рекуррентных соотношений, метод декомпозиции и метод динамиче
cKoro проrраммирования. Однако в каждом конкретном случае их
применение не является автоматическим. Мы недаром поставили сло
во «универсальный» В кавычки для каждоrо метода существуют
некоторые rраницы ero применимости, и чем более «универсально»
сформулирован сам метод, тем интеллектуально сложнее разработка
реальноrо алrоритма на ero основе. Чтобы убедиться в этом, попро
буйте выполнить упражнения и задачи к этой rлаве, и мы надеемся,
что Вы реально почувствуете разницу двух процессов алrоритмиро
вания, как интеллектуальноrо процесса разработки алrоритма решения
задачи, и проrраммирования, как техническоrо процесса записи уже
rOToBoro алrоритма на некотором языке проrраммирования.
1. Метод рекуррентных соотношений
Идея метода рекуррентных соотношений чрезвычайно проста
мы, используя некоторые рассуждения, получаем рекуррентное COOT
ношение, обеспечивающее решение нашей задачи, и на основе этоrо
peKyppeHTHoro соотношения разрабатываем рекурсивный алrоритм. OT
метим, что фраза «используя некоторые рассуждения» совершенно не
определяет конкретный метод получения peKyppeHTHoro соотношения
для определенной задачи. Мы можем лишь уточнить, что эти рас-
суждения должны отражать наше рекурсивное понимание структуры
задачи, т. е. следовать схеме понижения aprYMeHTa или размерности.
Решение для некоторой размерности задачи или для HeKoToporo apry
мента функции должно быть сформулировано на основе ее сведения
к задачам меньшей размерности или функциям с меньшим значением
aprYMeHTa. Условие останова рекурсии позволяет решить задачу при
некоторых малых размерностях или вычислить функцию при началь
ных значениях aprYMeHTa. Разнообразные примеры применения этоrо
метода к различным задачам уже были продемонстрированы в rлаве
1. Мы хотим привести еще один Ilример с комментариями к этапам
разработки peKyppeHTHoro соотношения.
При мер 3.1. Рассмотрим задачу вычисления количества разбиений
положительноrо целоrо числа. Разбиение положительноrо целоrо числа
т это ero представление в виде суммы целых положительных
чисел. Классической счетной задачей является определение функции,
задающей количество разбиений числа rn без учета порядка слаrаемых
1. Метод рекуррентных соотношений
69
[3.1]. При ведем все разбиения числа т == 6 в порядке убывания nepBoro
слаrаемоrо, прямой подсчет дает значение Р (6) == 11.
6'
5 + 1;
4 + 2, 4 + 1 + 1;
3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1;
2 + 2 + 2, 2 + 2 -+ 1 + 1, 2 + 1 + 1 + 1 + 1;
1+1+1+1+1+1.
к сожалению, источник [3.1] не указывает автора идеи, предложивше
ro следующий подход для рекурсивноrо вычисления количества разбие
ний числа т. Первым, и не совсем очевидны:vJ, шаrом является выраже
ние функции Р (т) через друrую функцию Q (т, п), которая определя-
ется как число разбиений целоrо rп со слаrаемыми, не превышающими
п. Если мы сможем вычислить Q (т, п) для любых aprYMeHToB, то эта
функция определяет Р (т), т. к. Р (т) == Q (т, т). На втором шаrе,
в соответствии с идеей метода, нам необходимо определить aprYMeHTbI,
с которыми функция Q (т, п) может быть вычислена непосредственно,
и определить, как Q (т, п) задается через свои предыдущие значения.
Этот шаr выполняется на основе «несложных рекурсивных рассужде
ний» это цитата из [3.1] (заметим, что рекурсивные рассуждения
требуют рекурсивноrо мышления). Эти рассуждения приводят к следу
ющим пяти соотношениям:
1. Q (rп, 1) == 1, поскольку существует только одно разбиение числа
т с наибольшим слаrаемым, равным единице, а именно rп ,= 1 + 1 +
-'-- ... + 1.
2. Q (1, п) == 1, это очевидно, т. к. существует только одно разбиение
Ilисла 1, которое не зависит от величины наибольшеrо слаrаемоrо п.
3. Q (т, п) == Q (т, rп), т :::; п. Совершенно ясно, что никакое разби
сние числа т не может содержать какихлибо слаrаемых п, больших,
'ICM .,n.
4. Q (т, т) == 1 + (2 (т, т 1). Есть только одно разбиение числа
1ft со слаrаемым, равным т, все друrие разбиения т имеют наиболь
:lcee слаrаемое п :::; т 1.
5. Q (т, п) == Q (т, п 1) + (2 (т п, п). Это основное рассужде
1I11е рекурсии любое разбиенис числа т с наибольшим слаrае
:11J,1:vJ, меньшим или равным п, или не содержит п в качестве слаrа
\'\10['0 В этом случае даннос разбиение подсчитывается функцисй
I,} (rп, п 1), или содержит п, но при этом остальныс слаrаемые обра
\\'ют разбиение числа rп п, и подсчитываются функцией Q (т п, п).
Полученные результаты позволяют записать следующее peKYP
р\'нтное соотношение, определяющее рекурсивно заданную функцию
& djvu Kartun [kаrtuп@уапdех. ruJ
70
Fл. 3. Методы разработки рекурсивных алеоритмов
Q (т, п):
Q(rn,l)==I;
Q(I,п)==I;
Q(rn,п)==Q(rn,m), т(п;
Q(rn,m)==I+Q(rn,mI), п==щ
Q (rn, п) == Q (rn, п 1) + Q (т п, п).
На основе полученноrо peKyppeHTHoro соотношения может быть
разработан рекурсивный алrоритм для вычисления количества разбие
ний числа т в виде процедурно реализованной рекурсивной функции
Q(m,n), вызов которой с арrументами Q(m,m) при заданном значении
т и решает поставленную задачу.
(3.1.1)
Q(m,n)
If (т==1) or (n==l)
then
Q +----1
If (т<п)
then
Q +---- Q(m,m)
If (т==п)
then
Q +---- I+Q(m,ml)
else
Q +---- Q(m,nI)+Q(m!1,1):)
Return (Q) , .
End.
(проверка останова рекурсии)
(прямое вычисление Q)
(рекурсивный вызов, т<п),
(рекурсивный вызов, т==п)
(рекурсивный вызов, т>п)
Заметим, что поскольку функция Q(m,n) имеет два aprYMeHTa, то
в теле нащеrо алrоритма три различных рекурсивных вызова COOTBeT
ствуют ситуациям, коrда aprYMeHTbI равны, первый aprYMeHT меньше
и первый aprYMeHT больше BToporo. Это не общее свойство рекурсив
ных функций двух aprYMeHToB, а отражение особенностей поведения
функции Q(m,n), и, следовательно решаемой задачи.
Мы не обсуждаем вопроса о том, насколько велики вычислитель
ные затраты этоrо алrоритма, и существует ли друrой алrоритм, может
быть, не рекурсивный, который быстрее вычисляет Q(m,n). Более об
щий вопрос формулируется следующим образом можно ли, зная, что
алrоритм разработан методом рекуррентных соотношений, rоворить
о ero вычислительной эффективности? Ответа в общем виде нет
в частных при мерах мы можем rоворить о том, что, например, для
чисел Фибоначчи мы получим неоправданно большие вычислительные
затраты, а при вычислении факториала аналоrичную итерационной
реализации асимптотическую оценку.
Пример 3.2. Мы приводим этот пример с целью показать, как
в примитивной модели вычислений рекурсивными алrоритмами MorYT
2. Метод декомпозиции
71
быть реализованы обычные арифметические операции. Наша модель
вычислений оперирует с целыми неотрицательными числами и раз
решает операции сравнения и нахождения предыдущеrо и последу
ющеrо числа, опираясь на аксиомы Пеано. Приведем формулировку
одной их аксиом Пеано [3.2]: «Для каждоrо натуральноrо числа х
имеется, и притом только одно, натуральное число, называемое ero
последующим и обозначаемое х',). В целях удобства записи, будем
обозначать операцию, задающую для целоrо неотрицательноrо числа п
ero последующее число через п -т- 1, а операцию, задающую для целоrо
I10ложительноrо числа п ero предыдущее число, через п 1. Наша
задача состоит в том, чтобы разработать рекурсивный алrоритм для
вычисления суммы двух чисел п, т в этой модели вычислений.
Условие останова рекурсии леrко формулируется: п + т == п, т == О.
Выберем число т в качестве aprYMeHTa рекурсии нам необходимо
записать сумму при уменьшении aprYMeHTa на единицу с использо
ванием разрешенных в нашей модели операций. Решение достаточно
очевидно:
п + rп == (п + 1) + (rп 1).
Проведенные рассуждения позволяют записать рекуррентное COOTHO
шение для рекурсивно заданной функции S (п, т), значением которой
является сумма ее aprYMeHToB:
{ S (п, т) == п, т == о;
B(п,т)==B((п+l),(тI)), т>О.
Наде-емся, что читатели без труда разработают соответствующий pe
курсивный алrоритм. Еще целый ряд интересных примеров разработки
алrоритмов методом рекуррентных соотнощений читатели cMorYT най
ти в [3.3], полезным будет также разработать рекурсивные алrоритмы
самостоятельно, выполнив упражнения к этой rлаве.
2. Метод декомпозиции
Чтобы перенести сотню кирпичей с одноrо места на друrое, мы,
скорее Bcero, будем переносить за один раз несколько кирпичей, а не
всю сотню сразу. Таким образом, вместо Toro, чтобы решать задачу
сразу, мы несколько раз решаем более простую задачу с понижением
размерности собственно rоворя, эта интуитивно здравая идея и ле
жит в основе метода декомпозиции. Друrое название этоrо метода
метод «разделяй И властвуй» [3.4]. Общая схема метода может быть
описана как последовательность следующих шаrов.
1. Шаr разделения задачи. На этом шаrе выбирается способ разде
':l'НИЯ задачи на некоторое количество подзадач меньшей размерности.
2. Шаr решения полученных подзадач. Это рекурсивный шаr мы
рассматриваем каждую подзадачу как задачу определенной раЗ:'v1ерно
П'Н, и разделяем ее на собственные подзадач и, выполняя снова шаr
& djvu Kartun [kаrtuп@уапdех. ruJ
72
rл. 3. Методы разработки рекурсивных алzоритмов
1 (рекурсия) до тех пор, пока не получим такую размерность, при
которой решение может быть найдено непосредственно.
3. Шаr останова рекурсии. На этом шаrе выполняется непосред
ственное решение полученных подзадач для малых размерностей.
4. Шаr объединения решений. На ЭТО:\1 шаrе полученные решения
подзадач меньшей размерности при возврате в точку рекурсивноrо
вызова объединяются в решение задачи текущей размерности.
Эти основные шаrи метода деКО:\1позиции требуют некоторых KOM
ментариев. Вопервых, идея метода ничеrо не rоворит о том, как эти
шаrи должны быть реализованы в конкретной задаче. Адаптация MeTO
да к конкретной задаче требует, как правило, серьезных раЗ:\1ышлений.
BOBTOpЫX, условием применения метода является свойство аддитивно
сти решений, полученных для подзадач меньшей размерности. CTporo
rоворя, нам необходимо доказать, что, объединяя решения, мы получим
правильный ответ, в особенности это касается задач оптимизации
в постановке поиска rлобалыюrо оптимума. Классическим примером
является задача коммивояжера [3.5] простое объединение двух
оптимальных путей для rрафов половинной размерности вообще не
является решением исходной задачи. В третьих, для одной и той же
задачи MorYT быть предложены различные идеи ее разделения, и здесь
необходимо оценить, к каким сложностям приводит каждая из этих
идей на этапе объединения решений, который, как правило, является
наиболее сложным.
Основное преимущество метода декомпозиции состоит в том, что
он позволяет получить алrоритмы с хорошими асимптотическими oцeH
ками трудоемкости. Именно этот подход позволил А.Л. Карацубе в
1962 r. получить аЛf'ОрИТМ умножения длинных целых чисел с оценкой,
лучше чем п 2 , а В. Штрассену в 1969 r. алrоритм умножения
квадратных матриц с оценкой, лучше чем п 3 [3.4J. Соответствующее
обоснование асимптотических оценок трудоемкости алrоритмов, разра-
ботанных меТОДО:\1 декомпозиции, читатель найдет в rлаве 6.
При ведем два при мера применения :\1етода декомпозиции.
Пример 3.3. Исторически одним из первых применений метода
считается алrоритм сортировки слиянием, приписываемый Дж. фон
Нейману мы детально анализируем этот аЛf'ОрИТМ в rлаве 7. Pac
смотрим задачу сортировки массива чисел из п элементов и обсудим
шаrи метода декомпозиции применительно к этой зада'-Iе.
1. Шаr разделения задачи. Мы орrанизуем деление на две подзада
чи массив разделяется на два массива, содержащих Lnj2J и rnj21
элементов.
2. Шаr решения полученных подзадач. Если условие останова pe
курсии не выполнено, то полученные массивы вновь разделяются на
два массива это шаr порождения дерева рекурсии.
3. Шаr останова рекурсии. В классическом изложении останов
рекурсии происходит при длине массива, равной еДИНИСLе массив из
oAHoro числа очевидно отсортирован.
92. Метод декомпозиции
73
4. Шаr объединения решений. На цепочке рекурсивных возвратов
мы получаем два отсортированных массива, которые должны быть
объединены в один. Этот шаr выполняется специальным алrоритмом
слияния сортированных массивов, по которому получил название и сам
алrоритм сортировки.
Эти шаrи порождают асимптотически оптимальный алrоритм для
задачи сортировки сравнениями со сложностью е (n ln п). Изза боль
шоrо коэффициента при rлавном порядке область ero рациональной
нрименимости начинается с длин массива порядка 100, и более точно
определяется особенностями реализации, в основном выбранным
алrоритмом слияния двух сортированных массивов.
При мер 3.4. Второй при мер задача умножения квадратных MaT
риц. Для изложения идеи мы рассмотрим случай, KorAa линейный
размер квадратной матрицы п является степенью двойки. Шаrи
метода декомпозиции MorYT быть реализованы следующим образом.
1. Шаr разделения задачи. Мы орrанизуем деление пополам ли
нейноrо размера матрицы. Поскольку значение п является степенью
двойки, то на любом шаrе деления значение n/2 является целым
число:vt. Таким образом, каждая из перемножаемых матриц делится на
четыре подматрицы одинаковой размерности
( ) х ( {) ( ),
rAe подматрицы результата задаются соотношениями
r а х е -+ ь х g;
s == а х f + ь х h;
t == с х е -+ d х у;
и == с х f -+ (1 х lL.
Эти уравнения при водят к необходимости решения восьми подзадач
размерности n/2. Операции умножения в (3.2.1) есть операции YMHO
жения матриц.
2. Шаr решения полученных подзадач. Если после разделения по
,1ученные :vtатрицы размерностью n/2 х п/2 не являются матрица:vtи,
состоящими из одноrо элемента, то полученные матрицы вновь разде
ляются на четыре подматрицы это шаr порождения дерева рекурсии.
3. Шаr останова рекурсии. Если на текущем вызове алrоритма
матрицы имеют размер 2 х 2, то результат может быть вычислен
непосредственно по формуле (3.2.1), обозначения в которой в данном
случае интерпретируются как обозначения элементов матриц.
4. Шаr объединения решений. По цепочке рекурсивных возвра
тов мы получаем восемь результирующих матриц, имеющих размер
1/./2 х n/2 относительно размера текущей матрицы. В соответствии
" (3.2.1) нам необходимо выполнить сложение матриц и заполнсние
соответствующих позиций матрицы результата.
(3,2.1)
& djvu Kartun [kаrtuп@уапdех. ruJ
74
rл. 3. Методы разработки рекурсивных аЛ20ритмов
Элементарный анализ этих шаrов позволяет получить рекуррентное
соотношение, задающее суммарное количество выполненных алrорит
мом операций умножения и сложения над числами элементами
матриц
5 (п) == 85 (п/2) + е (п 2 ) .
Асимптотическая оценка решения этоrо peKyppeHTHoro соотношения
5 (п) == е (п 3 ), так что в таком подходе алrоритм, разработанный MeTO
дом декомпозиции, оказывается по порядку таким же, как и обычный
алrоритм умножения матриц. Тем не :v!eHe, именно этот метод позволил
В. lIITpacceHY получить алrоритм с асимптотически лучшей оценкой
е (n 1ogz 7). Если Вы придумаете, как вместо восьми умножений матриц
размером п/2 х п/2 можно выполнить только семь, то Вы получите
результат, аналоrичный алrоритму Штрассена. Достаточно подробно
метод Штрассена изложен, например, в [3.4].
С использованием метода декомпозиции в настоящее вре:v!я получе
ны эффективные алrоритмы решения целоrо ряда задач. Основная их
особенность «плата,) за асимптотически лучшую функцию в оценке
сложности больши:v! коэффициентом при rлавном порядке. Тем самым,
эти алrоритмы становятся рационально применимыми, начиная с OTHO
сительно больших размерностей.
9 3. Метод динамическоrо проrраммирования
Метод динамическоrо проrраммирования был предложен и обосно
ван Р. Беллманом в начале 1960x rодов [3.6]. Первоначально метод co
здавался в целях существенноrо сокращения перебора для решения цe
лоrо ряда задач экономическоrо характера, формулируемых в терминах
задач целочисленноrо проrраммирования [3.5]. Однако Р. Беллман и Р.
Дрейфус в [3.6] показали, что он применим к достаточно широкому
Kpyry задач, в том числе к задачм вариационноrо исчисления, поиску
нулей функций и т. д. В общем виде метод ориентирован на поиск
оптимума целевой функции или функционала в некоторой оrраничен
ной области MHoroMepHoro пространства. Предложенный Р. Беллманом
метод не является универсальным, и условия ero применения требуют,
чтобы целевой функционал представлял собой аддитивную функцию,
т. е.
n
f(x) == Lgi(Xi),X== (Xl,"',X n ).
il
(3.3.1)
Заметим, что требование аддитивности может быть ослаблено до Tpe
бования сепарабельности. Приведем описание идеи этоrо метода, опи
раясь на ориrинальное изложение и терминолоrию ero автора в эко-
номической интерпретации метода динамическоrо проrраммирования
3. Метод дина.мuческоzо проzра.м.мuрованuя
75
[3.6]. в элементарной постановке задачи оrраничения, задающие об
ласть поиска экстремума для целевоrо функционала, имеют вид
n
L Xi == С, Xi О V i == 1, N .
i=1
Эти оrраничения рассматриваются как оrраничения на общий ресурс,
который должен быть распределен по n инвестиционным процессам,
IIРИНОСЯЩИМ некоторый доход. Значение дохода задается функциями
.9i (Xi), i == 1, n в условиях целочисленности и неотрицательности зна
чений Xi. Для решения задачи максимизации целевоrо функционала
(3.3.1) f (х) ....... шах, вместо рассмотрения одной задачи с данным
количеством ресурса и фиксированным числом процессов рассматри
вается целое семейство задач, в которых число п принимает все воз
можные целые значения от О до п. Если исходная задача представляет
собой статический процесс распределения оrраниченноrо ресурса, то
1I0ДХОД Р. Беллмана переводит ее в динамический процесс, требуя
распределения ресурса последовательно по каждому процессу, что
собственно и нашло отражение в названии метода динамическое
проrраммирование [3.6].
Максимум целевоrо функционала 1 (х) в указанной области зави
сит от количества процессов п, и от общеrо оrраничения ресурса С.
Эта зависимость в подходе динамическоrо проrраммирования записы
вается явно путем задания последовательности функций {fi (с)}, i ==
= 1, 1'/; , О :::; с С, следующим образом:
li (с) == шах 1 (XI,... ,Xi), Xi О,
x],....Xi.
i
LXj == С.
j=1
[Три этом функция li (с) выражает оптимальный доход, получаемый
ОТ распределения ресурса с по i процессам. В двух частных случаях
JНачения этой функции вычисляются элементарно. В разумном преk
:lOложении, что доход каждоrо процесса от нулевоrо ресурса равен
I/УЛЮ 9i (О) == О, Vi == 1, n , очевидно, что li (О) == О, Vi == 1, n . Также
)1jСВИДНО, что при значениях с О функция 1, (с) == 91 (с).
Для COBMeCTHoro распределения ресурса между несколькими про
ll'ссами достаточно просто находятся рекуррентные соотношения, свя
\),Iвающие 1т (с) и 1т1 (с) для произвольных значений т и с. Если
1'", количество ресурса, назначенное для процесса с номером т,
:11 остающееся количество (с Х щ ) должно быть оптимально pac
Iрсделено для получения максимальноrо дохода от остающихся т 1
lipofLeccoB. Таким образом, при не котором значении X rп совокупный
;(Оход от распределения по т процессам составит
9щ (Х т ) + 1т' (с Х т ).
& djvu Kartun [kаrtuп@уапdех. ruJ
76
/л. 3. Методы разработки рекурсивных алzоритмов
Очевидно, что оптимальным будет такой выбор значения Х т , который
максимизирует эту функцию, что и приводит К следующему peKyppeHT
ному соотношению, которое называется основным функциональным
уравнением метода динамическоrо проrраммирования [3.6]:
{ 11 (с) == 91 (с);
1", (с) == шах [9т (Хт) + Irп1 (с Х т )] , V т == 2, n, с О.
OXт.C
(3.3.2)
Таким образом, задача оптимизации в MHoroMepHoM пространстве
сводится к последовательности задач одномерной оптимизации, что
существенно сокращает трудоемкость получения решения. Но условия
применимости метода накладывают оrраничения аддитивности (сепара
бельности) на целевой функционал. Кроме Toro, система оrраничений
не должна быть слишком сложной и должна допускать построение pe
куррентно связанных между собой функций Беллмана через возможно
меньшее число aprYMeHToB, которые определяются «существенными»
оrраничениями задачи.
Рекуррентное соотношение (3.3.2) позволяет сразу получить peKYP
сивный алrоритм. Проблемы адаптации метода к конкретной задаче
состоят, прежде Bcero, в доказательстве при мени мости caMoro метода
и интерпретации постановки задачи в терминах динамическоrо про
rраммирования, т. е. как задачи поиска экстремума аддитивной или
сепарабельной целевой функции в замкнутой области MHoroMepHoro
пространства, заданной некоторой системой оrраничений. Непосред
ственно этот подход мы иллюстрируем в rлаве 7 на при мере задачи
одномерной оптимальной упаковки.
Более широкая трактовка метода динамическоrо проrраммирования
состоит в том, что функциональное уравнение Беллмана может быть
построено и в случае, коrда значение функции для больших значений
aprYMeHToB может быть получено на основе минимаксноrо выбора из
HeKoToporo ряда ее значений для меньших значений aprYMeHToB или
линейных комбинаций этих значений с друrими функциями. Эту си
туацию мы хотим проиллюстрировать на одном из классических при
меров применения метода динамическоrо проrраммирования задачи
вычисления редакционноrо расстояния.
Пример 3.5. Редакционное расстояние. Мы фиксируем некоторый
алфавит символов, например, латинский, и рассматриваем строки над
этим алфавитом. В целом ряде практически важных задач (проверка
правописания, задачи поиска в текстовых базах данных, задачи ис
следования ДНК и т. д.) требуется измерить различие между CTpO
ками, которое по аналоrии с термином в метрических пространствах
называется расстоянием. Существует несколько различных способов
формализации понятия расстояния между строками, один из них, наи
более общий и простой, носит название редакционноrо расстояния.
Термин и идея предложены В.И. Левенштейном [3.7] и достаточно
часто редакционное расстояние называется расстоянием Левенштейна.
9 3. Метод дuнамическоzо nрОi!раммирования
77
Идея основана на преобразовании одной строки в друrую с помощью
фиксированных операций редактирования вставки символа в первую
строку и), удаления символа из первой строки (D), замены символа
в первой строке (П) и «не операции» над праВИЛЬНblМ символом (М).
Эти операции совместно с механизмом их реализации образуют спе
циализированную модель вычислений. Последовательность этих опе
раций алrоритм преобразования строк называется редакционным
предписанием. Рассмотрим при мер мы хотим преобразовать строку
vintner в строку writers. Одна из возможных последовательностей
операций редактирования (редакционное предписание) имеет вид
R I М D М D М М I
v i n t n е r
w r i t е r .5
По определению, редакционное расстояние между двумя CTpOKa
ми есть минимальное число необходимых редакционных операций
вставок, удалений и замен, необходимых для преобразования первой
строки во вторую. При этом совпадения символов не являются опе
рациями, которые учитываются в редакционном расстоянии, поэтому,
если строки совпадают, то их редакциопное расстояние равно нулю для
любой длины строк. В нашем примере мы выполняем 5 редакционных
операций, но не rарантируем, что это значение является минимаЛЫIЫМ.
Следуя [3.8], введем следующие обозначения. Будем предполаrать,
что исходные строки символов 5, и 52 заданы посимвольно массивами
51 [1":.. п] и 52 [1... т]. Введем в рассмотрение функцию D (i,j), значе
lIием которой является редакционное расстояние между подстроками
51 [1 .., i] и 52 [1 ... Л. Функция D (i, j) определяет минимальное число
редакционных операций для преобразования первых i символов строки
8, в первые j символов строки 52. Таким образом, редакционное
расстояние между строками 5, и 52 В точности равно D (п, т).
Следуя подходу динамическоrо проrраммирования, мы должны
определить, при каких aprYMeHTax функция D (i, j) может быть BЫ
числена непосредственно и как значение D (п, т) выражается через
:У1Инимаксный выбор ее значений для меньших арсументов. 3амети:YI,
что этот подход очевидно предполаrает, что для вычисления D (n, т)
нам необходимо вычислить все предыдущие значения D (i,j), i == О, п ,
.i == О, т . Непосредственное вычисление функции D (i, j) возможно
Ij том случае, если одна из строк является пустой, Torдa
D(i,O) == i;
D (О, j) == j.
(3.3.3)
Действительно, для перевода строки из i символов в пустую CTpO
I\Y, единственным способом является удаление этих символов мы
ныполняем i операций удаления. Аналоrично для преобразования нуля
символов первой строки в j символов второй строки нам необходимо
i!ЫПОЛНИТЬ ровно j операций вставки. Основной шаr метода динами
& djvu Kartun [kаrtuп@уапdех. ruJ
78
rл. 3. Методы разработки рекурсивных алzоритмов
ческоrо проrраммирования определяется следующей теоремой, доказа
тельство которой мы ПРИВОДИМ В соответствии с [3.8].
Теорема 3.1. Если значения i и j cTporo положительны, то
D (i,)) =:се min {l) (i 1,)) + 1, J) (i,j I )+1, D и l,j 1) + t (i,))} ,
(3.3.4)
rде
t(i,j) == {:
8, [i] -1 82 [У] ;
8, [i] == 82 [j] .
д о к а з а т е л ь с т в о. Рассмотрим редакционное предписание,
преобразующее подстроку 81 [1...i] в 82 [1...]] за минимальное
число редакционных операций. Нас интересует последняя операция
этоrо предписания, которая может быть операцией 1, D, R или М.
Рассмотрим все возможные случаи.
Если это операция 1, то последняя операция это вставка СИМвола
82 [j] в конец преобразуемой первой строки. Предыдущие операции
этоrо предписания должны обеспечить минимальное число операций
для преобразования 81 [1...i] в 82 [1...j 1]. По определению, это
последнее преобразование требует D (i, j 1) редакционных опера
ций. Следовательно, если последняя редакционная операция 1, то
D(i,j) == D(i,j 1) + 1.
Рассуждая аналоrично для последней операции D в редакционном
предписании, получим, что поскольку это операция удаления последне
[о символа из 81 [1 ... i), то предыдущие операции предписания должны
оптимально преобразовывать 8, [1 ...i 1] в 82 [1...]]. По определе
нию, это последнее преобразование требует D (i -- 1, j) редакционных
операций. Следовательно, если последняя редакционная операция
D, то D(i,j) == D(i .--1,]) ---'---1.
Если последняя операция предписания R, то эта операция за
меняет 8, [i] на 82 []], а предыдущие операции предписания должны
оптимально преобразовывать 8] [1 '" i 1] в 82 [1 ... j 1]. В этом слу
чае D (i, j) == D (i 1, j 1) + 1.
Если последняя операция предписания М, то 8, [i] == 82 [j],
и поскольку эта операция не учитывается в редакционном расстоянии,
в этом случае D (i,j) == D (i l,j 1).
Вводя в рассмотрение дополнительную функцию t (i, Л, мы можем
объединить два последних случая в один: еслИ последний символ пpeд
писания R или М, то D (i,j) == D (i l,j 1) + t (i,j). Этим исчерпы
ваются все возможные случаи для последней операции в редакционном
предписании.
Каким образом можно пре06разовать 81 [1... ij в 82 [1...Л? Можно
прсобразовать 5, [1 ... i] в 82 1 ... j 1] за D (i, j 1) операций и BCTa
вить символ 82 []] в конце, что дает D (i, j 1) + 1 редакционных
операций. Можно преобразовать 8, [1...i 1] в 82 [1...]] за D(i 1,j)
операций и удалить 8) [i] в конце, что дает в итоrе D(i 1,Л +
+ 1 редакционных операций. И, наконец, очевидно, как выполнить
Задачи u упражнения к славе 3
79
такое преобразование за D (i 1, j 1) + t (i, j) операций. Принцип
оптимальности Беллмана rласит, что мы должны выбрать минимальное
значение из этих трех вариантов, выше мы показали, что никаких дpy
rих вариантов не существует. Отсюда следует, что D (i, j) определяется
формулой (3.3.4) и теорема доказана. Конец доказательства.
Таким образом, на основе доказанной теоремы мы получили функ
циональное уравнение метода динамическоrо проrраммирования для
задачи вычисления редакционноrо расстояния в виде следующеrо pe
KyppeHTHoro соотношения:
{ D (i, О) == i, j == о;
D(O,j)==j, i==O;
D (i,j) == min{D (i 1,j)+ 1, D (i,j 1)+ 1, D (i l,j 1)+t (i,j)} ,
i>O,j>O.
(3.3.5)
На основе этоrо peKyppeHTHoro соотношения достаточно просто может
быть разработан рекурсивный алrоритм, решающий задачу о вычисле
нии редакционноrо расстояния между строками. Небольшие дополне
ния позволяют получить И само оптимальное редакционное предписа
ние, подробности в [3.8].
Мы обращаем внимание читателей на то, что в большинстве слу
чаев метод динамическоrо проrраммирования требует математическоrо
обоснования для Функциональноrо уравнения, равно как и математи
ческоrо обоснования корректности ero применения для данной задачи.
ИСТQpически метод динамическоrо проrраммирования был одним из
первых методов, который позволил получить за приемлемое время
точное решение целоrо ряда переборных задач, сводящихея к задачам
целочисленноrо проrраммирования [3.5].
Задачи и упражнения к rлаве 3
3.1. Нарисуйте дерево рекурсии, порождаемое алrоритмом вычис
ления количества разбиений целоrо числа для вызова Q(6,6). COOTBeT
ствует ли порядок вычисления значения Q(6,6) порядку перечисления
различных вариантов сумм, приведенных в числовом примере из пара
rрафа 3.1?
3.2. Предположим, что Вы хотите оплатить почтовое отправление,
стоимость KOToporo составляет 96 копеек, а в Вашем распоряжении
только почтовые марки достоинством 4, 6 и 10 копеек. Сколькими
разными способами можно оплатить почтовое отправление? Введем по
нятие OI'раниченноrо разбиения целоrо числа в виде суммы некоторых
фиксированных чисел. Пусть функция Р4,б,IО (т) задает количество
оrраниченных разбиений числа т только с использованием чисел 4, 6
и 10. Решением нашей задачи является значение Р4,б.1O (96). Обозначим
;LЛЯ краткости S (т) == Р4,б,1O (т). Разработайте рекурсивный алrоритм
JLЛЯ вычисления S (т) методом рекуррентных соотношений. Одним из
80
rл. з. Методы разработки рекурсивных алеорит.мО8
возможных ПОДХОДОВ К разработке peKyppeHTHoro соотношения, задаю-
щеrо S (rп), является обобщение peKyppeHTHoro соотношения для чисел
Фибоначчи.
3.3. Рассмотрим последовательности длины п, состоящие из нулей
и единиц. Мы можем интерпретировать их как двоичные числа, со-
держащие п бит. Пусть G (п) функция, значением которой является
количество последовательностей длины п, не содержащих двух или
более единиц подряд. Получите рекуррентное соотношение, задающее
функцию G (п). Какие анаJlоrии с уже известными рекурсивно задан
ными функциями Вы можете провести?
3.4. Опираясь на алrоритм вычисления суммы двух целых чисел,
полученный в примере 3.2, разработайте рекурсивный алrоритм для
вычисления функции 1\1 (п, rп), значением которой является произве
дение ее aprYMeHTOB целых неотрицатеJlЬНЫХ чисел.
3.5. Разработайте методом декомпозиции алrоритм построения BЫ
пуклоrо охватывающеrо контура для п точек, заданных своими KO
ординатами. Условие останова рекурсии может быть сформулировано,
например, на основе следующеrо рассуждения: для трех точек, не
лежащих на одной прямой, мы получаем треуrольник, который и яв-
ляется выпуклым охватывающим контуром. Какие способы Вы можете
предложить для реализации шаrа разделения задачи?
3.6. Предложите аЛI'ОрИТМ, который умножает два комплексных
числа
(а +- ib) (с +- id) == r +- i8.
Входом алrоритма являются числа а, Ь, с, d, а результатом числа
Т', s. Для вычисления r, 8, если мы будем спедовать алrебраическому
выражению, полученному после раскрытия скобок, требуется четы
ре умножения, однако можно предложить способ, который позволяет
выполнить только три. Если Вы придумали, как это сделать, то Вы
уже на том пути, который привел А.Л. Карацубу и В. Штрассена
к алrоритмам, названым их именами.
3.7. Алrоритм сортировки слиянием может быть разработан деком-
позицией исходноrо массива на ша/'е разделения задачи не на два, а на
три подмассива. Как Вы думаете, приведет ли такой ПОДХОД к созданию
более быстроrо ат'оритма? Если Вы обоснуете ответ экспериментально,
то получите хорошие навыки разработки и ИССJJедования рекурсивных
алrоритмов.
3.8. Нарисуйте дерево рекурсии, порождаемое алrоритмом вычисле
нин редакционноrо расстояния, основанным на функциональном ypaB
нении Беллмана, при вычислении значения D (4,4). Определите общее
число вершин этоrо дерева. Попробуйте обобщить полученный резуль
тат и установить функциональную зависимость числа вершин дерева
речрсии R (п, rп) от длин обрабатываемых строк пит. Каков
Ваш проrноз времени выполнения этоrо алrоритма при ВЫЧИСJJении
D (20, 25)?
Список литературы к zлаве 3
81
3.9. Предложите простой итерационный алrоритм для вычисле
ния значения редакционноrо расстояния, основанный на восходящем
расчете, т. е. на последовательном вычислении значений D (п, т) от
меньших значений aprYMeHTa к большим. Такой табличный способ дo
оаточно часто применяется для реализации рекуррентных соотноше
ний, полученных методом динамическоrо проrраммирования. Каковы
вычислительные затраты TaKoro табличноrо алrоритма? Какой из двух
алrоритмов вычисления редакционноrо расстояния Вы будете исполь
зовать на практике?
Список литературы к rлаве 3
3.1. ryaMaH С., Хuдетнuеми С. Введение в разработку и анализ алrоритмов.
М.: Мир, 1981. 368 с.
3.2. Колмоzоров А-Н, Драzалин AI Математическая лоrика. М.: Едиторал
УРСС. 2005. 240 с.
3.3. Варрон Д Рекурсивные методы в проrраммировании, М.: Мир, 1974.
79 с.
3.4. Кормен. 7., Лейзерсон. ч., Ривест Р., Штайн. К. Алrоритмы: построение
и анаJ1И3, 2e изд.: Пер. с aHrJ1. М.: Изд. дОМ «ВИJ1ЬЯМС, 2005. 1296 с.
3.5. Хаиарти Р. Дискретная математика для проrраммистов. М.: TeXHO
сфера, 2005. 400 с.
3.6. Велл-м-ан Р., Дрейфус Р. Прикладные задачи динамическоrо проrраммиро
вания: Пер. с aHrJ1. М.: Наука, 1965, 457 с.
3.7. Левен.штейн. В.и. Двоичные коды с исправлением выпадений, вставок
11. замешений символов // ДОКJ1ады АН СССР. 1965. Т. 163. С. 70771O.
3.8. rасфилд Д. Строки, деревья и пОСJ1едовательности в алrоритмах: ИН
форматика и ВЫЧИСJ1ительная биолоrия / Пер с анrл. СПб.: Невский
диалект; БХВПетербурr, 2003. 654 с.
]
rлава 4
ЭЛЕМЕНТЫ ТЕОРИИ РЕСУРСНОЙ
ЭФФЕКТИВНОСТИ ВЫЧИСЛИТЕЛЬНЫХ
АлrоРитмов
Введение. В предыдущих rлавах, рассматривая различные pe
курсивные алrоритмы, мы уже оперировали такими понятиями, как
вычислительные затраты, сложность алrоритма и т. д., не давая их
строrих определений. Uель настоящей rлавы не только формализо
вать понятия и ввести терминолоrию, которая используется в области
анализа и исследования эффективности вычислительных алrоритмов,
но и описать некоторые классификации алrоритмов, которые мы будем
впоследствии использовать. Мы приводим также описание методик
оценки и выбора рациональных алrоритмов, которые MorYT быть ис
пользованы для обоснования решений при разработке алrоритмиче
cKoro обеспечения проrраммных средств и систем, и, в частности,
для обоснования выбора рекурсивных алrоритмов. Эта rлава содержит
краткое изложение теории ресурсной эффективности вычислительных
алrоритмов, которая является областью научных исследований авторов
этой книrи.
В целом теория ресурсной эффективности вычислительных алrо
ритмов имеет своей целью создание научнометодической базы для
решения вопросов сравнительноrо анализа и рациональноrо выбора
вычислительных алI'OРИТМОВ в реальном диапазоне длин входов. Oc
новная задача теории это повышение ресурсной эффективности
алrоритмическоrо обеспечения проrраммных средств и систем за счет
разработки методов оценки и выбора рациональных алrоритмов pe
шения вычислительных задач в заданных условиях применения. Для
достижения этой цели и решения постанленных задач аппарат анализа
ресурсной эффективности должен содержать ряд компонентов, Teope
тическое обоснование которых и составляет основы теории ресурсной
эффективности вычислительных алrоритмов:
систему обозначений, ориентированную на решение задач оценки
и анализа ресурсной эффективности алrоритмов;
способ оценки ресурсной эффективности алrоритмов на OCHO
ве их ресурсных функций, учитывающих как ресурсные требования
алrоритма, так и различные особенности области применения разраба
TblBaeMoro проrраммноrо продукта;
методы получения ресурсных функций функции объема па
мяти и функции трудоемкости для алrоритмов различных классов,
9 1. ТерМИНОЛОi!ИЯ и обозначения в теории ресурсной эффективности 83
включая трудоемкости для среднеrо и худшеrо случаев как для проце
дурной, так и для рекурсивной реализации алrоритмов;
методику анализа чувствительности алrоритмов к вариациям
входных данных, позволяющую оценить устойчивость функции TPYДO
емкости для среднеrо случая, а, следовательно, и временных оценок
алrоритма для различных вариантов исходных данных при фиксиро
ванной длине входа;
метод сравнительноrо анализа ресурсных функций алrоритмов
с целью выбора рациональноrо диапазона размерности множества BXOД
ных данных или рациональноrо алrоритма при известном диапазоне;
метод выявления областей эквивалентной ресурсной эффектив
ности алrоритмов, позволяющий указать предпочтения для выбора ал
I'оритма в зависимости от диапазона размерности множества входных
данных.
Изложению данноrо материаJIа и посвящена настоящая rлава.
1. Терминолоrия и обозначения в теории ресурсной
эффективности вычислительных алrоритмов
Наиболее употребительными характеристиками ресурсной эффек
тивности алrоритмов являются оценки временной и емкостной слож
ности, отражающие требуемые ресурсы процессора и оперативной па
мяти и/или внешней памяти. Терминолоrию в области анализа ak
rоритмов в настоящее время можно считать устоявшейся [4.1, 4.2],
однак{) собственная система обозначений развита слабо и представ
лена, в основном, обозначениями асимптотическоrо роста функций.
Таким образом, возникает задача уточнения терминолоrии и введения
системы соответствующих обозначений. ориентированных на анализ
ресурсной эффективности вычислительных алrорит:vIOВ. Предлаrаемые
ниже определения и обозначения были введены одним из авторов в
[4.3], этот материал также кратко изложен в [4.4].
Временная сложность и функция трудоемкости. Будем paCCMaT
ривать в дальнейшем, придерживаясь терминолоrии, введенной Э. По
стом, применимые к общей проблеме (задаче), правильные и финитные
алrоритмы [4.5]. В качестве модели вычислений будем рассматривать
;1бстрактную машину, включающую процессор, адресную оперативную
Ilамять и набор элементарных операций, соотнесенных с процедурным
нзыком проrраммирования BbIcoKoro уровня модели вычислений Ta
1\Oro типа носят название «машины С произвольным доступо:vI К памя
I'И» (НАМ) [4.6].
Классический анализ вычислительных алrоритмов в рамках данной
'юдели связан, прежде Bcero, с анализом их временной сложности. Ero
;Jсзультатом является асимптотическая оценка количества задаваемых
;\ыоритмом операций как функции длины входа, которая коррелирова
на с асимптотической оценкой времени выполнения проrраммной pea
84 rл. 4. Элементы теории ресурсной эффективности алzоритмов
лизации алrоритма. Однако асимптотические оценки указывают не бо
лее чем порядок роста функции, и результаты сравнения алrоритмов
по этим оценкам будут справедливы только при очень больших длинах
входов. Для сравнения алrоритмов в диапазоне реальных длин входов,
определяемых областью применения проrраммной системы, необходимо
знание о точном количестве операций, задаваемых алrоритмом, т. е.
о ero функции трудоемкости.
Определение 4.1. Трудоёмкость алzоритма.
Пусть D А есть множество допустимых конкретных проблсм задачи,
решаемой алrоритмом А, а ero элемент D Е D л конкретная пробле
ма (вход алrоритма А) размерности n. Множество D есть конечнос
упорядоченное множество из п элементов d i , представляющих собой
слова фиксированной длины в алфавите {О, 1}:
D == {d i , i == 1, п } , I D 1 с."С; n.
Под трудоёмкостью алrоритма А на входе D, будем понимать количе
ство элементарных операций в принятой модели вычислений, задавае
мых алrоритмом на этом входе. В дальнейшем будем обозначать через
IA (D) функцию трудоёмкости аЛCJоритма А для входа D.
Заметим, что значением функции трудоемкости ДЛЯ любоrо допу-
стимоrо входа D является цслое положительное число (в силу пред-
положения о том, что алrоритм А является финитным 1 процессом по
Посту) .
При более детальном анализе ряда алrоритмов оказывается, что не
всеrда трудоемкость алrоритма на одном входе D длины n, rде п ==
== IDI, совпадает с ero трудоемкостью на ApyroM входе такой же длины.
Рассмотрим допустимыс входы алrоритма длины п в общем случае
существует подмножество (ДЛЯ большинства алrоритмов собственное)
множества DA, включающее все входы, имеющие размерность n,
обозначим ero через Dn:
Dn == {D I i D 1== n}.
ПОСКОЛЬКУ элементы d i представляют собой слова фиксированной дли
ны в алфавите {О, '}, множество Dn является конечным обозначим
ero мощность через Л1[)" , т. е. М[)n == IDnl. Тоrда алrоритм А, полу
чая различные входы D из множества Dn, будет, возможно, задавать
в KaKOMTO случае наибольшее, а в KaKOMTO случае наименьшее KO
личество операций. Исключение составляют алrоритмы, для которых
трудоемкость определяется только длиной входа. В связи с этим введем
следующие обозначения, отметив, что соответствующая терминолоrия
является устоявшейся в области анализа алrоритмов.
Обозначим худший случай трудоемкости на всех входах фикси
рованной длины через 1:1 (п). Под худшим случаем мы понимаем
наибольшее количество операций, задаваемых алrоритмом А на всех
1. Терминол-оzuя и обозначения в теории ресурсной эффективности 85
входах размерности п:
1:1 (п) == тах {IA (D)},
DED"
по аналоrии через IX (п) будем обозначать лучший случай, как наи
меньшее количество операций, задаваемых алrоритмом А на входах
размерности п:
п (п) == min {IA (D)}.
DED"
Трудоемкость алrоритма в среднем будем обозначать через IA (n)
это средний случай трудоемкости, т. е. среднее количество операций,
задаваемых алrоритмом А на входах размерности п:
IA (п) == L p(D)IA (D),
DEDn
rде p(D) есть частотная встречаемость входа D для анализируемой
области применения алrоритма. В случае, если все входы D Е Dn
равновероятны, то
1 '"'
IA (п) == L IA (D).
D" DEDn
Заметим, что функция IA (п) есть вещественнозначная функция цело
численноrо aprYMeHTa. Если трудоемкость алrоритма зависит только от
длины входа, то мы будем использовать обозначение IA (п).
На основе функции трудоемкости в худшем случае можно уточнить
понятие сложности алrоритма. Заметим, что иноrда сложность pac
С:vIатривается и для среднеrо случая, но с соответствующей оrоворкой.
Определение 4.2. Временная сложность алсоритма (сложность
алrоритма).
Временная сложность алrоритма есть асимптотическая оценка
11 классах функций, определяемых обозначениями О или в, функции
трудоемкости алrоритма для худшеrо случая 1:1 (п) == О (у (п», или
п (п) == в (9 (п», rдe 9 (п) функция, задающая класс О или в для
п (п).
Заметим, что используе:vIЫЙ для оценки функции 1:1 (п) асимптоти
'Iеский класс О (О большое), включает в себя средний и лучший слу-
'Iаи иА (п) и п (п», т. к. запись О (у (п» обозначает класс функций,
имеющих скорость роста не более чем функция 9 (п) с точностью до
11OJ10жительной константы [4.2], а из введенных обозначений следует,
'по: fX (п) IA (п) f2. (п).
Емкостная сложность и функция объема памяти. Состояние
Ilа:vIЯТИ модели вычислений (для реальноrо компьютера это будет опе
ративная память) определяется значениями, записанными в ячейках
iТОЙ памяти. Тоrда процессор модели вычислений, выполняя операции,
заданные алrоритмом, переводит исходное состояние памяти модели
86 rл. 4. Элементы теории ресурсной эффективности алzоритмов
вычислений (исходные данные задачи вход алrоритма) в конечное
состояние найденное алrоритмом решение задачи в терминах слов
принятоrо алфавита. В ходе решения задачи может быть задействовано
некоторое дополнительное количество ячеек памяти. Рассуждая по aHa
лоrии с временной сложностью и трудоемкостью, определим функцию
объема памяти.
Определение 4.3. Функция 067JeMa памяти.
Под объемом памяти, требуемым алrоритмом А для входа, задан
Horo множеством D, будем пони мать максимальное количество яче
ек памяти модели вычислений, задействованных в ходе выполнения
алrоритма. Функцию объема памяти алrоритма для входа D будем
обозначать через V л (D). Значение функции VA (D) есть целое поло
жительное число.
Введем для функции объема Ilамяти, по аналоrии с трудоемкостью,
обозначения для лучшеrо, худшеrо и среднеrо случая на различных
входах размерности п: V: (п), VX (п), V А (п) соответственно. На этой
основе мы можем определить емкостную сложность алrоритма.
Определение 4.4. Емкостная сложность аЛ20ритма.
Емкостная сложность алrоритма есть асимптотическая оценка
в классах функций, определяемых обозначениями О или е, функции
объема памяти алrоритма для худшеrо случая V; (п) := О (lL (п)),
или V: (п) := е (h (п)), rде 1/ (п) функция, задающая класс О или е
для v; (п).
Ресурсная характеристика и ресурсная СЛОLКность алrоритма.
Содержательно термин «ресурсная эффективность алrоритма» включа
ет в себя как требуемый алrоритмом ресурс процессора, так и ресурс
памяти, которые будут задействованы алrоритмом при решении задач
размерности п. Поскольку в результате анализа алrоритма по этим
ресурсам MorYT быть получены или функциональные зависимости от
размерности, или их асимптотические оценки, то целесообразно BBe
сти следующие определения и обозначения, имея в виду, что MorYT
рассматриваться лучший, худший, или средний случай требуемых pe
сурсов при фиксированной размерности.
Определение 4.5. Ресурсная характеристика аЛ20ритма.
Под ресурсной характеристикой алrоритма в худшем, среднем или
лучшем случае будем понимать упорядоченную пару функций
соответствующих рассматриваемому случаю функции трудоемкости
и функции объема памяти. Ресурсную характеристику алrоритма
(Resource characteristic) будем обозначать через !R'h (А):
!R'h (А) =-= ил (п), V л (11,)), rде * Е {,\ V,}.
Определение 4.6. Ресурсная сложность аЛ20ритма.
Под ресурсной сложностью алrоритма (Resource complexity) в XYk
шем, среднем или лучшем случае будем понимать упорядоченную пару
классов функций, заданных асимптотическими обозначениями О или
2. Функции ресурсной эффективности аЛ20рит.мов
87
8 соответствующие рассматриваемому случаю временная СJJOЖНОСТЬ
и емкостная сложность алrоритма, и обозначать ее через эt; (А):
эt (А) с= (О (у (п» , О (lL (n») ,
rде
у(n):: f'A (п) == О (.Ч (п» , ' (п): v;; (п) == O-(h (п» ,
или
эt (А) == (8 (у1 (п)), 8 (lЙ (п))) ,
/'Де:
gl(n) :
Ы (п):
f'A (п) == 8 (у1 (п»,
v;; (п) == е (hl (п» ,
*E{II,V,}.
Заметим, что в ряде случаев, особенно при сравнительном анализе
ресурсной эффективности алrоритмов. более наrлядным является пе
реход в оценке емкостной сложности от общеrо объема памяти модели
вычислений к объему дополнительной памяти, требуемой алrоритмом,
т. к. объемы памяти для входа и результата одинаковы для всех
сравниваемых алrоритмов. В этом случае можно сохранить BBeдeH
ные обозначения, но использовать их с соответствующей оrоворкой.
В качестве при мера привецем обозначение ресурсной сложности для
алrоритма сортировки вставками, для KOToporo f:.i (п) == 8 (п 2 ) [4.2J,
а требуемая дополнительная память фиксирована и не зависит от
длины сортируемоrо массива. Для этоrо алrоритма
'.
эt (А) == (е (п 2 ) ,8 (1»).
2. Функции ресурсной эффективности алrоритмов
и их проrраммных реализаций
Особенности оценки и требования к алrоритмам в различных
проблемных областях. При разработке алrоритмическоrо обеспе
'Iения nporpaMMHbIx средств и систем, для решения задачи выбора
алrоритмов, рациональных в данных условиях применения, возникает
необходимость оценки качества алrоритма. Очевидно, эта задача яв
.'lнется только частью одноrо из этапов разработки математическоrо
11 проrраммнorо обеспечения. Само проrраммное обеспечение имеет
широкий спектр собственных оценочных критериев, широко обсужда
,'МЫХ в современной литературе. При этом сложность и разноплано
вый характер применения современных проrраммных средств и систем
обусловливают и комплексный подход к их оценке, учитывающий раз
,'Jичные, порой противоречивые, критерии и требования. Это важная
:lрактическая И научная задача, которой посвящено MHoro современных
i1убликаций укажем, например, на достаточно полное исследование
вопросов качества nporpaMMHoro обеспечения, содержащееся в MOHO
88 rл. 4. Элементы теории ресурсной эффективности алzоритМО8
rрафиях В.В. Липаева [4.7, 4.8]. Применение TaKoro комплексноrо
подхода целесообразно также и для оценки ресурсной эффективности
алrоритмов и их проrраммных реализаций. Это при водит к необходи
мости учета не только временной эффективности алrоритма, опреде
ляемой ero функцией трудоемкости и средой реализации, но и ряда
дополнительных оценок, отражающих требования алrоритма и реали
зующей ero nporpaMMbI к друrим ресурсам компьютера. Таким обра
зом, мы вводим функцию ресурсной эффективности вычислительноrо
алrоритма, учитывающую требования ат'оритма к ресурсам компью
тера. К таким ресурсам можно отнести ресурсы оперативной памяти,
необходимые для хранения исходных данных, промежуточных и OKOH
чательных результатов, машинноrо кода пporpaMMbI, и ресурс стека.
Ресурс процессора, требуемый алrоритмом, отражается непосредствен
но временной оценкой или, опосредованно, функцией трудоемкости.
Отметим, что в терминах этих же оценок MorYT быть сформулированы
и требования, предъявляемые к алrоритму со стороны разработчиков
проrраммной системы, учитывающие специфику ero применения.
Очевидно, что в зависимости от области применения важность
каждоrо ресурса будет изменяться, что приводит к необходимости
введения весовых коэффициентов для компонентов функции pecypc
ной эффективности алrоритма. Такие весовые коэффициенты MorYT
быть интерпретированы как удельныс стоимости ресурсов. Рассмотрим
наиболее характерные особснности оценки качества проrраммноrо и,
в основном, алrоритмическоrо обеспечения для некоторых проблемных
областей:
научнотехнические задачи большой сложности проrраммные
системы, ориентированные на эту проблемную область, характеризу
ются большим удельным вссом вычислений с плавающей точкой. При
этом временные затраты вычислений преобладают над операциями
ввода/вывода. Большие объемы исходных данных и промежуточных
результатов приводят к необходимости компромисса между временной
эффективностью, точностью результатов и объемами требуемой опера
тивной памяти;
сетевое проrраммное обеспечение и распределенные системы
одно из основных требований к таким проrраммным системам обес
печение минимально возможноrо времени передачи пакетов данных
и их диспетчеризация в динамически изменяющихся условиях. Pea
лизация этих требований при водит к необходимости быстроrо и эф
фективноrо решения задачи адаптивной маршрутизации. Для этой
сложной задачи продолжается поиск алrоритмов, эффективных как
по временным затратам на расчеты маршрутов, так и по полученным
результатам (времени передачи пакетов данных);
системы управления базами данных и знаний эта область
применения пporpaMMHoro обеспечения характеризуется, прежде Bcero,
значительными объемами обрабатываемой информации и созданием
специальных структур данных, поддерживающих алrоритмы быстроrо
2. Функции ресурсной эффективности аЛ20ритмов
89
поиска. Отметим, что на поиск информации в этих системах наклаДbl
ваются достаточно жесткие временные оrраничения. В Этой связи YKa
жем на актуальную задачу, решение которой связано с эффективными
алrоритмами мноrоключевоrо поиска задачу разработки «поисковых
машин» в современных Интернеттехнолоrиях;
диалоrовые и мультимедийные системы отличительной oco
бенностью в оценке качества таких систем является время отклика на
запрос, тем самым временные требования заставляют разработчиков
уделять серьезное внимание эффективности как алrоритмов решения
проБJlемных задач, так и алrоритмов мультимедийноrо общения;
проrраммное обеспечение бортовых компьютеров это rруп
па nporpaMMHbIx продуктов с наиболее жесткими требованиями и по
времени выполнения, и по занимаемой оперативной памяти. Ряд ДОПОk
нительных требований, связанных с точностью расчетов, надежностью
проrраммноrо обеспечения, только усиливает необходимость тщатель
Horo подхода к разработке алrоритмическоrо обеспечения таких про
rpaMMHbIx продуктов;
проrраммное обеспечение встраиваемых микропроцессорных си
стем, rде, помимо временных требований, существенную роль при
выборе алrоритмическоrо обеспечения иrрают ресурсные ш'раничения
по памяти. Дополнительно предъявляются также требования по надеж
ности и устойчивости проrраммноrо обеспечения. В рамках анализа
алrоритмов в этой проблемной области необходимо также учитывать
специфику машинных команд, особенно для микропроцессоров с RISC
архитектурой.
. Отетим, что требуемые ресурсы определяются как собственно
самим алrоритмом, так и характеристиками исходных данных. Ресурс
памяти может также зависеть и от особенностей поддерживаемых
выбранным языком проrраммирования типов и структур данных и тща
тельности проrраммной реализации.
Компоненты функции ресурсной эффективности проrраммной
реализации алrоритма. Пусть D А конкретное множество исходных
даНIIЫХ алrоритма (см. 4.1), тоща определим следующие компоненты
в терминах требуемых алrоритмом ресурсов компьютера, возможно, за
висящие от характеристик множества D А или некоторых ero элементов
[4.3J:
V сз : е (D л ) ресурс оперативной памяти в области кода, требуе
:lШЙ под размещение машинноrо кода, реализующеrо данный алrоритм.
Этот ресурс соотносим с объемом ЕХ Ефайла с учетом овеРJJейных
структур и принципа орrанизации управления проrраммной системой.
Заметим, что, как праВИJJО, короткие по объему реаJJизующеrо про
!'paMMHoro кода алrоритмы имеют худшие временные оценки, чем БОJJее
длинные, ДJJЯ одной и той же задачи «<быстрые алrоритмы являются
в большинстве случаев достаточно сложными» [4.1J). В основном для
небольших проrрамм объем оБJJасти кода не зависит от DA. В слу
чае БОJJЬШИХ nporpaMMHblx систем или КОМПJJексов МОДУJJИ управления
]
90 rл. 4. Элементы теории ресурсной эффективности алсоритмов
вычислитсльным процессом при опрсделенных исходных данных MorYT
подrружать в оперативную память дополнительные фраrменты кода.
Такой подход характерен для оверлейных структур или пporpaMMHblx
систем со структурой, адаптивной к входным данным. Аналоrичная
ситуация можст быть следствием выбора различных алrорит:vIOВ, раци
ональных в зависимости от характеристик входа. К получению такой
адаптивной структуры проrраммноrо обеспечения MorYT при водить pe
зультаты описываемоrо сравнительноrо анализа рссурсной эффектив
ности алrоритмов;
Vr'aт (D А) ресурс дополнительной оперативной памяти в об
ласти данных, требуемый алrоритмом под временные ячсйки, массивы
и структуры. Ресурс памяти для входа и выхода алrоритма не учиты
вается в этой оцснке, т. к. являстся неизменным для всех алrоритмов
рсшения данной задачи. Обычно более быстрые алrоритмы решения
некоторой задачи требуют большсrо объсма дополнительной памяти
[4.1, 4.9]. В качестве примсра можно привести быстрый алrоритм cop
тировки методом индексов [4.2], требующий дополнительной памяти
в объеме, равном значению :v!аксимальноrо элемента исходноrо массива
(алrоритм допускает только целочисленные входы). Такой дополни
тельный массив есть «плата» за быстродействие при определенных
условиях мы можем получить отсортированный массив за е (п) опера
ций, rде п размерность входноrо массива;
V.t (D А) ресурс оперативной памяти в области стека, требуе
мый алrоритмом для орrанизации вызова внутренних процедур и функ
ций. Объе:v! данноrо ресурса существенно зависит от Toro, в какой
методике итерационной или рекурсивной реализован данный ak
rоритм. Требуемый объем памяти в области стека может быть критичен
при рекурсивной реализации по отношению к размерности решаемой
задачи, если дерево рекурсии достаточно «rлубоко». Если алrоритм
реализуется в объектноориентированной среде проrраммирования, то
требования к ресурсу стека MorYT быть значительны за счет длинных
цепочек вызовов методов, связанных с наследованием в объектах;
т (D А) требуемый алrоритмом ресурс процессора оценка
времени выполнения данноrо алrоритма на данном компьютере. Эта
оценка определяется функцией трудоемкости алrоритма в зависимости
от характеристических особенностей множества исходных данных. Пе
реход от функции трудоемкости к временной оценке связан с определе
нием средневзвешенноrо времени t оп выполнения обобщенной базовой
операции в языке реализации алrоритма на данном процессоре и KOM
пьютере. Получение точной функции времени выполнения, учитыва
ющей все особенности архитектуры компьютера, представляет собой
достаточно сложную задачу; для оценки сверху можно воспользоваться
функцией трудоемкости для худшеrо случая при данной размерности
11 (п). в большинстве случаев может быть использована функция
трудоемкости в среднем ] А (11,). Средневзвешенное время t оп :v!ожет
2. Функции ресурсной эффективности алzорuт-М-О8
91
быть получено экспериментальным путем в среде реализации алrорит
ма.
Функции ресурсной эффективности алrоритма и ero про
rраммной реализации. Вводя в соответствии с принятым стоимост
ным подходом весовые коэффициенты, мы получаем функцию pecypc
ной эффективности алrоритма для входа D в виде
ФА (D) == C V ' VA (D) + С[. fA (D)
(4.2.1)
и функцию ресурсной эффективности проrраммной реализации
ФАН (D) ==С ехе ' v;,xe (D) + Cr<tm' V ram (D) + C st ' V.t (D) + C t . ТА (D) ,
(4.2.2)
rде конкретные значения коэффициентов C i , i Е {ехе, тат, st, t} зада
ют удельные стоимости ресурсов, определяеые условиями применения
алrоритма и спецификой проrраммной системы.
Выбор рациональноrо алrоритма Ar может быть осуществлен при
заданных значениях коэффициентов C i по критерию миниума функ
ции Ф AR (D), рассчитанной для всех претендующих алrоритмов из
множества А. Пусть множество претендующих алrоритмов А состоит
из т элементов А == {A i I i == 1, т }, тоrда
Ar (D): Ф ARr (D) == IrJtill {Ф ARi (D)} ,
(4.2.3)
rде цинимум берется по всем претендующим алrоритмам из множества
А, а запись Ar (D) обозначает рациональный алrоритм для данноrо
входа. Формально выполнив вычисления по формуле (4.2.3) для всех
входов D из множества DA, оrраниченноrо особенностями применения
данной задачи в разрабатываемой проrрамной системе, мы можем
определить те множества входов, при которых один из претендующих
алrоритмов будет наиболее рациональным. Однако такой подход Heцe
лесообразен изза слишком большоrо КOJIИчества эле:\1ентов в D.
Более реалистический и практически приемлемый подход связан
с использованием оценки в среднем или худшем случае ДЛЯ компонен
тов функции ресурсной эффективности. в зависимости от специфики
требований. Обозначая соответствующие компоненты ресурсной функ
1ЩИ как функции размерности с учетом обозначений из 4.1, получаем
ФА (п) == C v . VA' (п) ---1--- С[ . f-Л (п) ,
(4.2.4)
['де * Е {I\, V, } обозначение худшеrо. лучшеrо и среднеrо случая
ресурсной функции. и функцию ресурсной эффективности проrраМ:\1
IIОЙ реализации в виде
Ф AR (п) == С схе . V cxe (п) + C raт . V raт (п) + C st . V st (п) + C t . ТА (п),
(4.2.5)
92 rл. 4. Элементы теории ресурсной эффективности алzоритмов
Для выбора рациональноrо алrоритма определим функцию R (n),
значением которой является номер алrоритма 7', для KOToporo
R (n) == т, r Е {1, т} ; r == arg rnin {Ф AR, (n)} .
iJ.m
(4.2.6)
Тоrда на исследуемом cerMeHTe размерностей входа [п!, п2] возмож
ны следующие случаи:
функция R (n) принимает одинаковые значения на [n1, n2],
R(ni) == R(nj) == k, Vni,nj Е [n!,n2],
тем самым алrоритм с номером k является рациональным по ресурсной
функции (4.2.5) на всем cerMeHTe размерностей входа [п!, п2];
функция R(n) принимает различные значения на [nl'n2]:
::3 ni, nj Е [nJ, n2]: R (ni) =1= R (nj) ,
тем самым несколько алrоритмов являются рациональными по pecypc
ной функции (4.2.5) для различных размерностей входа на cerMeHTe
[nl,n2]. В этом случае на cerMeHTe [nl,n2] можно выделить подсеrмен
ты, в которых значение R (ni) == const, и реализовать адаптивный по
размеру входа выбор рациональноrо алrоритма.
Таким образом, на основе функции ресурсной эффективности мож
но выбрать алrоритм, имеющий минимальную ресурсную стоимость
при данных весах на некотором подсеrменте исследуемоrо cerMeHTa
размерностей. На основе функций ресурсной эффективности возможно
более детальное исследование задачи выбора рациональноrо алrоритма
с точки зрения характеристик KOHKpeTHoro компьютера и внешних
требований к алrоритму. Такой подход приводит к построению чеТbl
peXMepHoro пространства aprYMeHToB, координатами KOToporo являются
значения ресурсных функций (объем памяти кода, дополнительных
данных, стека и временная оценка). В таком пространстве внешние
требования к алrоритму (более точно к ero проrраммной реализа
ЦИИ), заданные в виде оrраничивающих cerMeHToB, задают четырех
мерную область W допустимых значений. Исследуемой проrраммной
реализации алrоритма на данном компьютере для каждоrо значения
размерности задачи n в этом пространстве соответствует точка Х(n)
с координатами
Х (п) == (V exe (n), V ram (n), V st (п), Т (n)),
rде координаты рассчитываются по среднему или худшему случаю
для данной размерности. Очевидно, что от характеристик компьютера
зависит только «координата» Т (n). Различным значениям n в этом про
странстве соответствует «точечный rрафик» набор точек, каждая из
которых связана со своим значением размерности. Интерес, очевидно,
представляют такие значения размерности п, которым соответствуют
точки Х (n), находящиеся на rранице области W. При таком подходе
появляется возможность исследования алrоритмов на устойчивость»
2. Функции ресурсной эффективности алсорит.мов
93
по отношению к характеристикам множества исходных данных (в
частности размерности задачи) в заданной области требований. Ha
пример, возможно определение максимальной размерности решаемой
задачи с учетом всех требуемых ресурсов. Друrая возможность состоит
в исследовании области W и характеристик компьютеров (опосредован
но через Т (п» с целью выбора рациональноrо компьютера для данноrо
алrоритма решения задачи с учетом внешних требований.
Приведем rрафическую иллюстрацию указанноrо подхода, связан
ную с определением максимальной размерности задачи. Для перевода
области W в двухмерное пространство введем обобщенный показатель
ресурса памяти в среднем, как функцию размерности входа, в виде
V (п) == V exe (п) + v,..am (п) + V';;t (п).
Пусть V* и Т* оrраничения со стороны разрабатываемой проrрамм
ной системы на максимально допустимый объем оперативной памяти
и время выполнения. При условии, что минимальные значения равны
нулю, прямоуrольник
w == {(О,О), (Т*, V*)}
задает область W. Пусть также значения п\, п2, пз, п4 принадлежат
области размерности задачи, причем п\ < n2 < nЗ < n4. В указанных
обозначениях на рис. 4.1 показано возможное определение верхней [pa
V
п4
.
ТЦ*
V*
Па
.
пз*
Область W
n2
.
*
n2
n\
.
nl*
Pl
Р2
Т*
Т
РИс.4.1. Определение верхней rраницы размерности задачи с учетом
ресурсных оrраничений для различных компьютеров
IIИНЫ размерности задачи в области W. Точки и звездочки на рис. 4.1
соответствуют различным компьютерам Рl и Р2 соответственно,
причем Рl является более производительным, чем Р2.
С возрастанием размерности задачи, по крайней мере, не уменьша
ются требуемая оперативная память и время выполнения проrраммной
94 rл. 4. Элементы теории ресурсной эффективности алzоритмов
реализации алrоритма. На рис. 4.1 показано, что для размерности пз
и реализации на компьютере Рl будет превышено пороrовое значение
(rраница области W) по объему оперативной памяти. Для размерности
п2 и реализации на компьютере Р2 будет превышена rраница области
W по времени выполнения.
Дополнительные компоненты функции ресурсной эффектив
ности. Предложенная функция ресурсной эффективности вычисли
тельных алrорит:vlOВ как функция размерности входа учитывает ре-
сурсы компьютера, требуемые данным алrоритмом. Можно rоворить
о том, что это базовая ресурсная функция, компоненты которой MorYT
быть модифицированы с учетом дополнительных требований к xapaK
теристикам алrоритма со стороны прorраммной системы. Такая моди-
фикация может быть осуществлена введением дополнительных KOM
понентов, учитывающих специальные требования к алrоритмическому
обеспечению, или введением функциональных зависимостей для стои-
мостных коэффициентов с aprYMeHTo:\l размерности входа в компонен
тах функции ресурсной эффективности. Дополнительные компоненты,
вводимые в функцию ресурсной эффективности, MorYT быть связа
ны с необходимостью как отражения специфики проблемной области
и учета особенностей задачи, так и учета специальных требований
к алrоритмическому обеспечению, обусловленных техническим зада
нием на разработку данной проrраммной системы. Укажем некоторые
характерные случаи и возможные варианты построения дополнитель
ных компонентов.
У ч е т т р е б о в а н и й т о ч н о с т и. Требования обеспечения
необходимой точности возникают, как правило, в задачах оптимизации,
решаемых алrоритмами, использующими в своей основе аппарат
численных методов. Друrая ситуация связана с необходимостью
получения решений для N Р-полных задач. Поскольку точное решение
для практически значимых размерностей не может быть пока
получено за полиномиальное время [4.2], то одним из вариантов
является использование специальных алrоритмов, обеспечивающих с-
полиномиальные приближения для N Рполных задач. Учет требуемой
точности получаемоrо решения может быть осуществлен в рамках
принятоrо стоимостноrо подхода следующими способами:
первый способ основан на непосредственном учете точности
в компонентах. Поскольку точность для оптимизационных алrорит
мов (имеется в виду не оценка точности метода, лежащеrо в основе
алrоритма, а точность, обеспечиваемая итерационной сходимостью)
обеспечивается, как правило, процессом итерационной сходимости, то
входное значение с сильно влияет на трудоемкость. При этом функция
трудоемкости, а следовательно, и время выполнения в среднем Т (п)
зависят как от размерности, так и от точности: Т == Т (n, с). Возможно,
что и дополнительные затраты памяти также зависят от точности, если
по какимлибо причина м в ходе итерационноrо процесса сходимости
необходимо запоминать промежуточные результаты. Таким образом,
2. Функции ресурсной эффективности алzоритмов
95
функция ресурсной эффективности проrраммной реализации является
функцией и размерности, и точности:
ФАR == ФАп(п,Е);
второй способ состоит в построении базовой функции при фикси
рованном минимально приемлемом значении точности Е == Ео. Pecypc
ные затраты на дальнейшее повышение точности результата MorYT быть
вынесены в отдельный компонент функции ресурсной эффективности
с собственным стоимостным весом:
Е (п, ) == Те ( п, Е; ) + Ve,ram ( п, ) ,
rде компонент Те учитывает в относительных единицах изменение Bpe
мен нои эффективности при изменении точности, а компонент , тат
изменение дополнительно требуемой памяти. Обозначая значение ба
зовой функции при Е == Ео через Ф AR (п, Ео), получаем
Ф AR (п, Е) == Ф AR (п, Ео) + Е (п, ), Е < Ео.
У ч е т т р е б о в а н и й п о в р е м е н н о й у с т о й ч и в о с т И.
В некоторых проблемных областях применения к проrраммному
обеспечению предъявляются специальные требования, связанные
с особенностями функционирования аппаратных средств. Наиболее
характерными примерами MorYT служить бортовые вычислительные
комплексы и КО:VIПьютеры, а также встраиваемые системы. Про
rpaMHoe обеспечение таких систем ДОЛJКно не только удовлетворять
жестким временным оrраничениям, но и обладать таким свойством,
которое может быть названо временной устойчивостью по данным.
Введенное понятие временной устойчивости по данным означает, что
различные входы вычислительноrо алrоритма при фиксированной
длине приводят к небольшим изменениям наблюдаемоrо времени
выполнения. Этот показатель является важным, т. к. обеспечивает,
наряду с исполнительной аппаратурой, расчетное время отклика
системы на внешние воздействия. Учет требования временной
устойчивости может быть выполнен на основе введения понятия
информационной чувствительности алrоритма, отражающей изменение
значений функции трудоемкости для различных входов фиксированной
длины.
Количественная мера информационной чувствительности опредеJIЯ
('тся в [4.10] на основе исследования алrОРИТ:vIа методами :vIатемати
'IССКОЙ статистики. Обозначив, следуя [4.10], количественную меру
информационной чувствительности алrоритма через 8 i (п) и связав
l' ней стоимостной коэффициент, получаем дополнительный компонент
функции ресурсной эффективности в виде: Сб8i (п). Важность Bpe:vIeH
ной устойчивости и связанной с ней информационной чувствительно
сти алrоритма может быть подчеркнута разработчиками путем выбора
больших значений коэффициента Сб.
]
96 Тл. 4. Элементы теории ресурсной эффективности алzоритмов
ф у н к Ц и о н а л ь н ы е с т о и м о с т н ы е к о э Ф Ф и ц и е н т ы.
Ряд специальных требований к nporpaMMHoMY обеспечению может
быть учтен в предлаrаемой функции ресурсной эффективности не
путем введения дополнительных компонентов, а путем изменения зна
чений стоимостных коэффициентов при изменении размерности реша
емой задачи. Такой путь эффективен при необходимости учета «по
poroBbIx» требований, например, по объему требуемой дополнительной
памяти или времени выполнения. Поскольку функция ресурсной эф
фективности проrраммной реализации алrоритма является функцией
размерности входа, а пороrовые требования формулируются в размер
ностях компонентов функции, то целесообразно рассматривать стои
мастные коэффициенты как функции значений компонентов, например,
С тат == С тат (V ram (п)) .
(4.2.7)
Таким образом, стоимостные коэффициенты являются сложной
функцией размерности задачи. Формализация пороrовых требований
коэффициентами функции ресурсной эффективности может быть BЫ
полнена с использованием функции Хевисайда Н (t), которую будем
использовать для произвольноrо aprYMeHTa х с обозначением Н (х):
х
Н(х) == J 8(х) dx,
oo
rде r5 (х) дельта функция. Рассмотрим общий случай, коrда CTO
имостной коэффициент представляет собой ступенчатую функцию
с несколькими пороrовыми значениями. Пример компонента функции
ресурсной эффективности, связанноrо с дополнительной, памятью по
казан на рис. 4.2.
С тат
о
V 1
V 2
V ram
Рис. 4.2. Коэффициент С тат , заданный ступенчатой функцией
Показанные на рис. 4.2 пороrовые значения объема дополнительной
памяти V, и V 2 MorYT соответствовать, например, значениям объемов
3. Классы открытых и закрытых ааdач и нижняя i.'!раница сложности 97
/,1 и L2 кэшпамяти компьютера. Пусть k количсство уровней коэф
фициента С тат , обозначим чсрез С ттn j разность значений :\Iежду j и
.i 1 уровнями, полаrая, что значение С тат О == О, тоrда коэффициенты
:vюrут быть заданы в виде
k
Стат(п) =" L CTaтjII(Vraт(п) V rarn иl)),
j1
!'Дс V rarn и I) пороrовые значсния aprYMeHTa ступенчатой функции,
причем V raт О == О. Помимо ступснчатой функции, MorYT paCCMaT
риваться также варианты задания коэффициентов в виде кусочно
линейной или нспрерывной функции.
3. Классы открытых и закрытых задач
и теоретическая нижняя rраница временной
сложности
в теоретическом аспекте анализа ресурсной эффсктивности пред
ставляет интерсс классификация задач, основой которой является
сравнение доказанной нижней rраницы временной сложности задачи
If оценки наиболес эффективноrо из существующих алrоритмов ее
решсния. На основе такой классификации можно rОБОрИТЬ о тсорети
'IССКОЙ ВОЗ:\lОЖНОСТИ улучшения времснной эффсктивности аЛI'оритма.
В совремснной теории анализа алrоритмов известны доказаТСJJьства
lIижнFrх rраниц временной сложности для целorо ряда задач [1\.1, 4.11].
Рсзультаты, полученные в области праКТИ'lССКОЙ разработки и анализа
,\J1rоритмов, позволяют указать наиБОJ1СС асимптотически эффсктивные
lIа данный момент аJ1rоритмы решения широкоrо Kpyra задач. В связи
" этим представляет интерес взаИ:\lНОС сравненис этих результатов
If построение на этой основе классификации вычислитсJlыJыx задач,
отражающей достижимость наиБОJ1се ЭффСКТИВНЫ:\l из извсстных В Ha
,'тоящее время аJ1rоритмов доказанной нижней rраницы ВрС:\lеНllOЙ
сложности задачи. За:V1етим, что опредеJ1ения классов Р и ЕХ Р в TCO
рlfИ алrоритмов [4.2, 1\.12] также опираются на асимптотику времснной
,'.'lOжности существующих алrоритмов решения задач в УI(юанных
".:1ассах.
Теоретическая нижняя rраница временной сложности. PaCCMOT
!,11:V1 некоторую вычислительную задачу Z. Обозначим, используя Tep
:vtIf1ЮJ10rию Э. Поста [4.5], чсрез Dz множество конкретных допусти
Щ,;Х проблем данной задачи Z. Введем также следующие обозначсния:
Н/. множество правильных решений, V ст верификационная функ
111tя задачи. Пусть D Е:- Dz конкретная допустимая проБJ1ема данной
lадачи. Обозначим через Ах ПОJ1lюе множество вссх алrоритмов (вклю
'1,Il0щсе как известные, так и будущие алrоритмы), решающих задачу
/. в I10нимании алrоритма как финитноrо 1 процесса по Посту, т. е.
98 rл. 4. Элементы теории ресурсной эффективности аморитмов
любой алrоритм А из Az I1рименим 'v D Е Dz, заканчивается и дает
правильный ответ
Az=={AIA: D------>R, DEDz, RERz, Ver(D,R)==Тruc,
1 А (D) i- 00 'v D Е Dz},
rде 1 А (D) значение функции трудоемкости алrоритма для входа
D. В общем случае существует подмножество (для большинства задач
собственное) множества Dz, включающее все конкретные проблемы,
имеющие размерность n, обозначим ero через Dnz:
D nz == {DI D Е Dz, I D 1== n}.
Для сравнения двух функций по асимптотике их роста будем исполь
зовать отношение --«, введенное ПольДюбуа Раймоном [4.15]:
1 (х) --« 9 (х) <=? lim 1 ( (х » == о.
xoc 9 х
Введем понятие теоретически доказанной нижней rраницы временной
сложности задачи с обозначением 1th lim (n) как еоценки некоторой
функции, aprYMeHToM которой является длина входа, такой, что Teope
тически невозможно предложить алrоритм, решающей данную задачу
асимптотически быстрее, чем с оценкой 1t1,lim (n). Более корректно это
понятие означает, что имеется cTporoe доказательство Toro, что любой
алrоритм решения данной задачи имеет в худшем случае на входе дли
ны n временную сложность не лучше, чем 1t1,lim (п), и данная функция
представляет собой точную верхнюю rpaHb множества функций, обра
зующих асимптотическую иерархию (по отношению «--«»), для которых
такое доказательство возможно. Иначе rоворя, для любой функции
9 (n) »-- 1thlirn (n) указанное свойство не может быть доказано. Дадим
формальное определение для 1thlirп (п) [4.4]. Определим множество
Flil1l' состоящее из функций 1lil1l:
Flil1l == {1lil1ll 'V А Е Az, 'V п > О, 1 (п) == n (flirп (n»},
rдe 12 (n) функция трудоемкости для худшеrо случая из всех
входов, имеющих размерность п, т. е. для любоrо D Е D nz , тоrда
1t1,НI1l (п) == sup {F lim }.
--<
Классическим примером задачи с теоретически доказанной нижней
rраницей сложности является задача сортировки массива с использо
ванием сравнений. Для этой задачи имеется cTporoe доказательство,
основанное на рассмотрении бинарноrо дерева сравнений, Toro, что
невозможно отсортировать массив, сравнивая элементы между собой,
быстрее, чем за е (log2 (n!») [4.13]. Применяя аппроксимацию для n!.
имеем
1Шim (n) == е (log2 (п!» == е (n log2 (п) n log2 е + 0,51og 2 (2пn» ==
== е (n (log2 (n) log2 е) + 0,51og 2 n + 0,51og 2 (211'».
3. Классы открытых и закрытых задач и нижняя сраница сложности 99
Тривиальная нижняя rраница сложности. Независимо от Toro,
доказана или нет теоретическая НИJКняя rраница временной СЛОJКно
сти, мы можем для подавляющеrо большинства вычислительных задач
указать НИJКнюю rраницу в виде еоценки некоторой функции на OCHO
ве рациональных рассуждений. Такая эвристическая оценка строится,
как правило, на основе тривиальных преДПОЛОJКений:
оценка е (п), если для решения задачи необходимо как минимум
обработать все исходные данные (задача поиска максимума в массиве,
задача УМНОJКения матриц, задача коммивояжера);
оценка е (1) для задач с необязательной обработкой всех исход
ных данных, например задача поиска в списке по ключу, при условии,
что сам список является входом алrоритма.
Обозначим эту оценку через 1tT (п) [4.4] и будем предполаrать
априорно, что оценка 1tT (п) существует для задачи Z, Torдa MOJК
но указать следующие возможные соотношения между оценками
1th lim (п) и 1tT (п): оценка 1t"'im (п) не доказана для задачи Z и для
данной задачи принимается оценка 1tT (п); оценка 1th lim (п) доказана,
тоrда либо: 1tT (п) ---< 1thlim (п), либо 1tT (п) == 1thlim (п).
Оценка сложности наилучшеrо известноrо алrоритма. PaCCMOT
рим MHOJКeCTBO всех известных алrоритмов, решающих задачу Z,
:vlНожество Ан; очевидно, что A R С Az, отметим, что множество Ан
конечно. Определим асимптотически лучший по СЛОJКности алrоритм,
обозначив ero через A rnin [4.4]. Отметим, что, как это чрезвычайно
часто бывает на практике, алrоритмы, имеющие лучшие асимптоти
ческме оценки, дают плохие по трудоемкости результаты на малых
размерностях изза значительных коэффициентов при rлавном порядке
функции трудоемкости. В качестве примера можно привести «быстрые»
алrоритмы умножения длинных двоичных целых чисел, предложенные
Карацубой, IIIтрассеном и Шенхаrе [4.2], реально эффективные "a
'{иная с чисел, имеющих двоичное представление в несколько сотен
и тысяч битов соответственно. Заметим TaKJКe, что может существовать
,1ибо один, либо несколько алrоритмов с минимальной по всему MHO
жеству Ан асимптотической оценкой в таком случае мы выбираем
один из них в качестве алrоритмапредставителя. Формально опреде
лим множество алrоритмов Ам == {А т } как подмножество известных
алrоритмов AR, обладающих минимальной асимптотической оценкой
трудоемкости, и выделим во множестве Ам любой алrоритм:
Ам == {Аrn 13А Е Ан: 1А (п) ---< 1А", (п)}, IAMI 1, A min Е А м .
Обозначим трудоемкость этоrо алrоритма через 1Arnin (п).
Классификация задач по соотношению теоретической нижней
"раницы временной сложности и сложности наиболее эффектив
lIoro из существующих алrоритмов. Сравнивая между собой полу
'll'HllbJe оценки для некоторой задачи fO,lim (п), если она существует,
.1'". (п) и 1Arnin (п), можно предложить следующую классификацию
100 /л. 4. Элементы теории ресурсной эффективности алzоритмов
задач, отражающую соотношение оценки задачи и наиболее эффектив
Horo из известных алrоритмов ее. решения [4.4].
Класс задач THCL (Theoretical close). Это задачи, для которых
fth lirп (п) существует и f Amin (п) == в иtl, lirп (п)). Можно rоворить, что
это класс теоретически (по временной сложности) закрытых задач,
т. к. существует алrоритм, решающий данную задачу с асимптотиче-
ской временной сложностью, равной теоретически доказанной нижней
rранице, что и отражено в названии этоrо класса. Разработка новых
или модификация известных алrоритмов из этоrо класса может пре
следовать лишь цель улучшения коэффициента при rлавном порядке
в функции трудоемкости, .при этом
fA (п) :c. П (fthlirп (п)) v А Е Az и fArпin (п) == е UtI,liш (п)).
Приведем несколько примеров задач этоrо класса: задача поиска MaK
сим ума в массиве, rде fthliш (п) == е (п), fЛmiп (п) == в (п); зада
ча сортировки массива с использованием сравнений, [де fth liш (п) ==
== в (п log2 (п)), f Лтiп (п) == е (п .log2 (п)) алrоритм сортировки пи
рамидой [4.13J; задача умножения длинных двоичных целых чисел:
ftftlim(n) == е(пlп(п).lпlп(п)), fAmin(n):= в(пlп(п).lпlп(п))
алrоритм Штрассена Шенхаr"е [4.2].
Класс задач PROP (Practical ореп). Это задачи, для которых
ftlllirn(n) существует и fЛmiп(п) fUllim(n). Таким образом, для
задач 3Toro класса существует зазор между теоретической нижней
rраницей сложности и оценкой наиболее эффективноrо из существу
ющих сеrодня алrоритмов ее решения. Предлаrаемая аббревиатура
р но р «практически открытые» задачи отражает тот факт, что
для задач этоrо класса имеет место практическая проблема разработки
алrоритма, обладающеrо доказанной теоретической нижней rраницей
временной сложности. В случае разработки TaKoro алrоритма данная
задача будет переведена в класс Т HCL. Отмстим, что достаточно
часто на основе ca:v!Oro доказательства теоретической нижней rраницы
временной сложности может быть построен алrоритм решения данной
задачи, что объясняет небольшое количество задач в данном клас
се. Такие доказательства MorYT опираться на ресурсные требования,
в частности, по объему дополнительной памяти, как например, при
рассмотрении задачи информационноrо поиска с использованием хэш-
адресации [4.1,4.11], таким образом, связь временной сложности и дo
ступ ной ДОIIолнительной памяти может быть предметом специаJ1ьноrо
рассмотрения в аспекте расширения предлаrаемой классификации.
Класс задач ТНОР (Theoretical ореп). Это задачи, для которых
оценка Jthlirп (п) не доказана, а fЛmiп (п) ftr (п). Для задач этоrо
класса существует зазор между тривиальной нижней rраницей BpeMeH
ной сложности и оценкой наиболее эффективноrо из существующих
сеrодня алrоритмов ее решения. Предлar'аемая аббревиатура тнор
«теоретически открытые» задачи [4.4] отражает тот факт, что для за
дач этоrо класса имеет место теоретическая проблема либо доказатель
11
fj 4. Классификации вычислительных алсоритмов по трудоемкости 101
ства оценки fU,lim (п), может быть даже равной ,(tr (п), переводящеrо
задачу в класс PROP, либо доказательства rлобальной оптимальности
наиболее эффективноrо из существующих алrоритмов, переводящеrо
задачу в класс THCL.
Отмстим, что в теоретическом плане класс тнор достаточно ши
рок. В этом классе находятся Бсе задачи из класса NPC (NРrlOлные
задачи), рассматриваемоrо в теории алrоритмов, для которых не из
вестно алrорипюв, имеющих полиномиальную оценку, но на сеrодня
пе доказано, что они не MOI'YT быть решены за полиномиаJIЫlOе время
[4.2]. Под полиномиальным временем понимается зависю1ОСТЬ Bpe;\1e
ни решения задачи размерности п вида O(n k ). В качестве друrоrо
непосредственноrо примера можно указать задачу умножения матрин,
ДJIЯ которой JЛтin (п) == О (п 2 . З4 ) [4.2J, а тривиаJlьная оценка, OTpa
жающая необходимость просмотра всех элементов исходных матриц
,(t,. (п) == е ( n 2 ), при этом теоретическая нижняя rраница вре1еНlIOЙ
СЛОЖНОСТИ ДJ1Я этой задачи пока не ДOl<азана.
4. Классификации вычислительных алrоритмов по
трудоемкости
Введение в классификацию алrоритмов. Важной составной ча
СТhЮ любоrо научноrо исследования некоторой совокупности объектов
нвляются КJIассификании, выявляющие характерные общие свойства
объектов и закладывающие теоретическую базу их дальнейших иссле
доваffИй. В рамках разработки математическоrо и алrоритмическOI'О
обеспечения компьютерных систем такой совокупностью объектов яв
ляются алrоритмы решения задач, на которых базируются разрабатьша
емые npOrpaMI\1HbIe системы. Впечатляющий рост производительности
современных компьютерных систем не снижает требований к алrорит
JИческому обеспечению, в том числе И по временной эффективности.
Обеспечение временных требований свнзано, при выбранноЙ annapaT
ной среде реализаllИИ, с выбором или разработкой матеlатических
leTOДOB и/или алr'оритмов решения поставленных задач. Решение aKTY
:!J!ЬНОЙ в практических целях эадачи выбора ранионаJJьноrо аJJrоритма
\!Ожет опираться и на специальные классификации вычислительных
;I:JrОРИТМОВ. ОпределенныЙ вклад в более эффективное решение этой
!одачи MorYT внести КJlассификании аJJrоритмов, отражающие как
l',IlОжностные оцснки аJlrоритмов, так и ВJIияние на эти оценки xapaK
:'рристических особенностей :>шожества исходных данных. ТраДИНИОII
;;;)51 классификация теории алrоритмов связана с теорией сложности
вычислений, в ра1I<ах которой получен целый ряд важных резуль
:';)ТОВ, ОТllOсящихся К l{лассам задач, ЯВШIЮЩИХСЯ объектом исследо
II<IНИЙ в этой теории [4.12]. К сожалению, объектами исследований
;;.:Iассической теории аJlrоритмов являются вычислительныс эадачи,
;: принятые в этой теории классификации (классы задач) не MorYT
102 rл. 4. Элементы теории ресурсной эффективности алсоритМО6
быть авто:\\атически перенесены на алrоритмы решения этих задач. Это
связано с тем, что теория СJJОЖНОСТИ оперирует классами задач, а не
классами алrоритмов, и большинство опредеJJений классов задач, за
исключением классов Р и ЕХ Р, не ВКЛЮ'lает в себя явноrо указания
СJJОЖНОСТНЫХ оценок [4.2, 4.12].
Уrловая мера асимптотическоrо роста функций. В рамках тео-
ретическоrо исследования аJJrоритмов предстаВJJяет интерес БОJJее де-
тальное разrраничение сложностнЬ!х оценок функций трудоемкости,
сохраняющее традиционное выделение полиномиальной и экспоненци
альной сложности. Таким образом, речь идет о математической задаче
разделения полиномов и экспонент в рамках единой меры, с выделе
нием множества функций, разrраничивающих полиномы и экспоненты,
и дополнительных множеств субполиномиальных и надэкспоненциаль
ных функций. Один из возможных вариантов решения этой задачи
предложен в [4.14]. Обозначим через п длину входа алrоритма, а через
f == f (п) функцию сложности алrоритма. В рамках дальнейшеrо
изложения будем считать, что aprYMeHT х непрерывен, т. е. f == f (х),
а необходимые значения функции f (х) вычисляются в целочисленных
точках х == п. Для разrраничения полиномов и экспонент предлаrается
использовать функцию степенноrо лоrарифма 9(Х) == (Inx)l"x.
Утверждение 4.1. Функция степенноrо лоrарифма 9(Х) == (Inx)lnx
является разrраничивающей для полиномов и экспонент.
Д о к а з а т е л ь с т в о. Утверждение эквивалентно тому, что функ
ция 9 (х) удовлетворяет следующим двум соотношениям при х 00:
если
f (х) == xk,
f (х) == е ЛХ ,
k > О,
л> О,
то f (х) =-= 0(9 (х)) ,
то 9 (х) == о (f (х)) .
(4.4.1)
(4.4.2)
если
Для доказательства этих соотношений воспользуемся леммой о лоrа
рифмическом пределе: если lim лх) == 00, и lim 9 (х) == 00, то если
Х.......-+сх) X...........j.CX)
lim lп f (х) == о
х---+оо 'П .9 (х) ,
то
lim f(x) ==O
Х---+ОО9(Х) ,
Т.е. f(X)==O(9(X)).
На основании этой леммы пакажем справедливость соотношения
(4.4.1):
. ln(.r k ) . k .lнх . k
l11Н 11111 -== 11 m == О
Х---+Х 'Н ((1п х )ln х) Х---+ОО lп х . lн (1п х) X'OO 'П (lH х) ,
следоватеJJЬНО, xk С." О ((111 Х )1п х) при k > о, и соотношения (1.4.2):
. 111 ( (l11x)lnx ) . l11x.1H(l11x)
lШl == 11111 == О
Х---+ОО 111 (е ЛХ ) Х---+()() АХ '
следовательно, (lн х) lп Х == О (е ЛХ ) при л > О. Конец доказательства.
1. Классификации вычислительных аЛi!оритмов по mpydoeMKocmu 103
Уrловая :vJepa асимптотическоrо роста функций вводится в [4.11]
следующим образо:\'!: пусть дана функция f (х), :vJOHOTOHHO возрастаю
щая, и liш f (:с) == 00. Ilоставим ей в соответствие функцию
xcx:
111 (f (х)
Il(x)==ln(f(x))+ 1 и()) 1
n х + IlХ
. з;.
(4.4.3)
Функция h (х) обладает следующими свойствами, которые YCTaHaB
ливаются двумя леМ:\<Iами.
Лемма 4.1. Пусть f (х) == е ЛХ (1 +- "1 (х» , rде Л > О, l' (:с) ==
:, 0(1). 1" (х) "'- 0(1) при х --> ос, тоrда Iiш ll' (:с) == Л + 1.
XQC
Лемма 4.2. Пусть f(x) =: xk(1 + l'(х)), rде 1 (х) == о (1), 1" (х) ==
с= О (1), ХI" (х) == () (1) при х -------> ос, тоrда liш '! (х) ,-= kj(k -с:--- 1).
XOO
Равенство константе предела производной функции h(x) как для
полиномов, так и для экспонент позволяет доказать следующую _1емму,
вводящую преобразование координатной системы.
Лемма 4.3. Пусть дана функция h (х), такая, что liш fl' (х) ==
X-------tОО
; С, rде С > О. Рассмотрим образованную на основе функции '! (х)
параметрически заданную функцию z (8), определенную следующим
образом:
{ s arctg ( ) ;
Z(8) ==
Z == arctg ( hx) );
тоrда
dz 1
liш d == С '
xoo s
. (sO)
(4.4.4)
rрафически полученный в лемме 4.3 реЗУJlьтат может быть ин
терпретирован следующим образом. В системе координат (z, в) поли
IIOMbl И экспоненты отображаются в функции, И:\<lеющие в асимпто
тике при х 7 00, S -------> О разные уrлы наклона касательной в точке
(z == О, s == О), что и определило название уr'ловой меры асимптотиче
CKoro роста функций. Пример функций z (в), полученных по формуле
(4.4.4) для f (х) == х 2 И f (х) == е Х , приведен на рис. 4.3.
Леммы 4.1, 4.2 и 4.3 служат основой следующей теоремы, ДOKa3aH
IIОЙ в [4.14].
Теорема 4.1 (об уrловой мере асимптотическоrо роста функций).
11усть дана функция f(x), монотонно возрастающая, и liш f(:c) == 00.
X......)oOC
Определим меру 7r (f (х») аси:\'!птотическоrо (на бесконеч.ности) роста
ФУНКЦИИ
f (х): 7r (f (х) ----,-- 7r 2 . шсtg (R) ,
ще
R 1 . dz
== lПl
X-.OC d8'
(s'O)
104 I"л. 4. Элементы теории ресурсной эффективности алсоритмов
0.14
0.12
0.1
0.08
Z О.Об
0.04
0.02
О
О
f==-x*x
..... Z == S
f == ехр х
0.02
0.1
0.04
S
0.06
0.08
Рис. 4.3. Функция z (8) для полинома J (х) == х 2 И экспоненты f (х) '''' е Х
rде пара:vlетрически заданная ФУНКЦИЯ z (8) определсна в виде (4.4.4),
а функция lL (х) задана по функции f (х) следующим образом:
lп (f (х))
lL(x),ln(f(x))+ l и()) 1 .х,
11 Х +- IlХ
тоrда если
1) f (:Е) . с Лх (11 ,(х)), rде л> О, ,(х) == 0(1), ,'(:1:) =--: 0(1), при
x' сю, то 71/2 < 7rи(х)) < 71;
2) f(x) == :Е/';(1 ---'--- ,(х)), rде ,(х) ... 0(1), " (х) ==- 0(1), :1:,' (х) ==-
0(1), ПрИ:С----4СЮ, тоО< 7rи(х)) < 71/2;
3) f (:Т) =СС lnx 1llx , то 71 (f (.т)) ==- 71/2.
Свойства уrловой меры асимптотическоrо роста функций.
Предложенная уrловая мсра асимптотическоrо роста функций обладает
рядом свойств, которые позволяют использовать её для постросния
классификации алrоритмов по сложности функции трудосмкости. На
базе введенной меры 71 (f (.т)) определим следующие пять Функцио
нальных :vIножеств в предноложении, что liш f (х) ==- сх:::
Х-------+СХ)
1) Определю! множество функций FZ: FZ ==- {J (х) I f (х) --<
-<: :I:/,;, V k > О}. Jlля функции f (х) из множества PZ значение R, опрс
деляе:vlОС по лемме 1.3, равно +00, и мера 71 (f (х)) '---= ir 2 arctg (П) ==-
o v f(x) Е PZ, в частности, 71 (lll (х)) ==0.
2) Опредслим множество полиномов F Р: F Р =, {J (х) I :3 k >
> О : f (х) ос, в (:I:k) }. Данное опрсделение базируется на лемме 4.2,
однако можно показать, что предложенная мера остается в силе и дЛЯ
БОJJСС широкоrо класса функций вида f(x) ==- е (:I:k). g(x), rде у(х) Е
Е PZ, тоrда множество F Р может быть определсно следующим обра
4. Классификации вычислительных алzоритмов по трудоемкости 105
зом. Вначале определим множество функций Fk
11, ='-' { f (х) I XkE --< f (х) --< Xk+E, k > О, Е .> '1 О, х -> +00 }
и на ero основе определим множество обобщенных полиномов F Р:
FP ==- {J (х) 1:3 k > о: f (х) Е Fk};
для функции f (х) из 1;'Р значение R ,= (k +- 1 )/k, k > О, по леммам
4.2 и 4.3, и мера тi (f (х)) ==- r. 2 arctg ((k + 1)/k), следовательно О <
< тi (f (х)) < тi /2.
[рафик меры для ПОЛИlюмов представлен на рис. 4.4.
3) Определим множество функций F L
FL ==- {f(x) I xk --< f(:r) --< е ЛХ , \j k > О, \j Л> о}.
Для функции f (х) из F L значение R, определяемое по лемме 4.3, paB
но 1, и мера тi (f (х)) :-'-' тi 2 arctg ( 1) ==- тi /2, в частности, Тi(ln х 1п Х) ==-
==- тi /2.
4) Определим множество экспонент F Е: F Е==-{ f (:1:) I л >
> о: f(x) ==- е (е ЛХ )}. Ланное определение базируется на лемме 4.1,
однако можно показать, что предложенная мера остается в силе и для
более широкоrо KJJacca функций вида f (х) ==- в (е ЛХ ) . 9 (х), rде 9 (:1;) Е
с: {FZ, FP, FL}, тоrда множество РЕ может быть определено сле
дующим образом. Определим множество функций F).,
F>..... ==- { f (х) I е(ЛЕ)'Х --< f (х) --< е(Л+Е)'Х, Л > О. Е --> +0, х --> +00 }
и на eI'o основе определим множество обобщенных экспонент F Е:
0.5
0.4
0.3
Тi(f(X)) 0.2
11'
0.1
О
FE ==- {f (х) 1:3 Л> О : f (х) Е }"л }.
о
2
3
4
Рис. 4.4. rрафик меры r. (J (х)) для пОJJиномовJ(х) ,,= е (xk)
k
106 rл. 4. Элементы теории ресурсной эффективности алсоритмов
Лля функции f (х) из РЕ значение R == 1/(1 7 А), А> О, по лем
мам 4.1 и 4.3, и мера п(f(х)) ==п2я,rсtg(I/(1 +А)), следователь
но, п/2 < п (f (х)) < п. fрафик :vrepbI для экспонент представлен на
рис. 4.5.
5) Определим множество функций F F: F F == {f (х) I е ЛХ
f (х), V А> О}. Для функции f (х) из FF значение R, определяемое
ПО лемме 4.3, равно О, и :\1ера п (f (х)) == п 2 arctg (Н) '.се п,
в частности т. (:r X ) == т..
Укажем свойства, которыми обладает введенная уrловая мера
асимптотическоrо роста функций т. (f (х)):
мера ПРИНЮ1ает значение, равное п / 4, для степени k == v2 /2;
мера т. (xk) принимает значение, равное 3т. /4, при показателе
A==V2;
мера т. и (.т)) обладает интересным свойством:
п (х'/Л) + п (е ЛХ ) == п,
в частности, п (х) + т. (С Х ) == п.
Классификация алrоритмов по сложности функции TpyдoeM
кости. Использование уrловой меры асимптотическоrо роста функций
т. и (х)) lJOзволяет предложить следующую классификацию аЛ20риm
М,О6 по аСЮ1Птотике роста функции трудоемкости (для среднеrо или
худшеI'O случаев). Сохраняя общепринятое обозначение п для раз
:vrерности входа алrорит:vrа А, обозначая через fA (п) функцию слож
ности И подразумевая формальный переход от п к х при вычисле
нии п (f (х)), введем следующее теоретико-множественное определение
классов [4.14].
1. Класс т.0 (пи нуль) класс «быстрых алrоритмов» это
алrоритмы, для которых функции сложности принадлежат множеству
1
0.9 '."..,
0.8
п (f( х ) ) 0.7
1r
0.6
0.5
О 1 2 3 4
А
Рис. 4.5. rрафик меры -тr (J (х)) для экспонент f (х) == е (е Лх )
4. Классификации вычислительных аЛёоритмов по трудоемкости 107
PZ и имеют меру нопь:
1тО == { А ! -п- ил (71)) == о <:-'> f'A (71) Е Р Z } .
АJJrоритмы, принаДJJежащис этому кпассу, ЯВJJЯЮТСЯ существснно
быстрыми ОТlюситеJJЬНО ДJJИНЫ входа; в основном это алrоритмы, име
ющие ПОJJИJJоrарифмическую ИJJИ JJоrарифмическую СJ10ЖНОСТЬ. Так,
например, к этому кпассу относится аJJrоритм бинарноrо поиска в Mac
сиве отсортированных КJJIочей асимптотическая оценка ero TpyдoeM
кости О (ln (71)) [4.2], мера -п- (ln (71)) == о.
2. Класс 1т Р кпасс «рационаJJЬНЫХ (собственно полиномиаJJЬНЫХ)
аJJrоритмов» это аJJrоритмы, функции СJJОЖНОСТИ которых принаДJJе
жат множсству Р Р:
-п- Р =се {А 1 о < 1т и'А (п)) < 1т /2 == О {=} fл (71) Е F Р } .
к этому кпассу ОТНОСИТСЯ БОJJЬШИНСТВО реапьно ИСIIОJJьзуемых aJ]ro
ритмов, ПОЗВОJJЯЮЩИХ решать ВЫЧИСJJитеJJьные задачи за рациональное
время; отметим, что этот кпасс оБJJадает свойством естественной за
мкнутости. Введенный кпасс алrоритмов -п- Р ЯВJJяется подклассом аЛI'О
ритмов, определяющих класс задач Р в теории сложности вычислсний.
3. Класс 1т L класс «субэкспоненциаJJЬНЫХ алrоритмов» это
алrоритмы, функции СJJОЖНОСТИ которых ПРИllаДJJежат множеству F [,:
-п-L == {А I-п- ил (71)) == -п-/2 {=} fA (71) Е FL }.
Этот кпасс образуют алrоритмы с более чем ПОJIиномиаJJЫЮЙ, но
мснее чем экспоненциальной СJJОЖНОСТЬЮ. ЭТИ аJ1J'ОрИТМЫ достаточ
110 трудоёмки, соответствующис задачи, как правило, при надлежат
сложностному классу N Р, но для некоторых задач такие алrоритмы
применяются на практике. Примером может служить алrоритм фак
торизации БОJ1ЬШИХ составных чиссл методом обобщенноrо числовоrо
решета, применяе:vrый дЛИ ПРЯМЫХ атак на криптосистс:vrу RSA. Если
n есть КОJJичество битов числа, предъявляемоrо ДJJЯ факторизации,
то эвристическая оцепка сложности этоrо алrоритма, приведенная в
[4.16], имеет вид
f л (71) == схр { О (71 \ . (ln (п)) i) } ,
и -п- ил (п)) =-= -п-/2.
Обозначение L в названии класса отражает тот факт. что функция
степенноrо лоrарифма 9 (х) == (lllх)lпх ЯВJJяется одной из функций,
разrраничивающих ПОJJИНОМЫ и экспоненты в СИJJУ теоремы 4.1.
4. Класс 1т Е кпасс «собственно экспоненциаJJЬНЫХ аJJrорит
мов,) это аJJrоритмы, функции СJJОЖНОСТИ которых принаДJJежат
:\1Ножеству РЕ:
-п- Е == { А 1r. /2 < -п- и'А (п)) < т.- {=} fл (71) Е F Е } .
Это аJJI'ОрИТМЫ с ЭКСIlOненциаJJЫIOЙ трудоемкостью. на сеI'ОДНЯ прак
тически применимые топько ДJJЯ маJJОЙ ДJ1ИНЫ входа, возможности
108 1л. 4. Элементы теории ресурсной эффективности алzоритМО6
рсалыюrо ИСllOJIьзования таких алrоритмов связаны с практичсской pe
ализацией квантовых комньютсров. Примсрами алrоритмов этоrо клас-
са являются псреборные алrОРИТМbl для точноrо решения N Р-полных
задач, таких, как задача о выполнимости схемы, задача о сумме, задача
о кликс и т. д. [4.2], И:l1сющие асимптотические оцснки трудоемкости
(сложность) вида
0(2"), О(п.2 п ), О(п 2 .2").
5. Класс т. F класс «надэкспонснциалыIЫХ ат'ОРИТ:I10В» это
алrоритмы, функции сложности которых принадлсжат :I1НОЖССТВУ F Р:
т.Е 0= {А I т. ил (п)) == 7r <> fл (п) Е ур }.
Это класс практически нспримеНИ:l1ЫХ аш'оритмов, обладающих
более чем экспоненциальной трудосмкостью факториальнOI'О или
показателыюстененно!'о вида. Например, алrОРИТ:I1 решения задачи
коммивояжсра методом полноrо псребора И:l1еет оценку П (п!) ,
а поскольку п! r (п + 1), rде r (х) ['аМ:I1афункция Эйлера,
и lп(r(х+-I))::::: ,1: .lll:r J:. то п!::::: crL.(I!lпI), поскольку мера
7r ( C,r(ln х - '») __ IТ, ТО этот ал rоритм относится к классу 7r F. К этому
жс классу относится аJН'ОрИТМ полноrо перечисления всех остовных
деревьев полноrо ,'рата на Т! всршинах с аСИ:l1нтотической оцснкой
трудоемкости П (пп-) [4.1]. Обозначенис F в названии класса
отражает принаДJlСЖНОСТЬ к этому классу алrоритмов с факториальной
(I;actorial) оцснкой трудосмкости.
Классификации алrоритмов по степени влияния характеристи
ческих особенностей множества исходных данных на функцию
трудоемкости. Поскольку значение функции трудоемкости может
определяться не только размером входа п, но и друrими характсристи
ками :I1!lOжества D (значеНИЯ:l1И и НОРЯДКО:l1 расположения элементов),
то выделим в функции f л (п, 1)) количественную и параметричсскую
составляющие, обозначив их через fn (п) и Ур (D) соотвстственно
[4.4], iA (п, JJ) == fA (/п (п), Ур (J))). Для большинства алrорив1ОВ
функция /А (п, D) может быть нредставлена как композиаия /" (п)
и У[I (Л) либо в МУЛЬТИПJIикативной fл (п, п) In (п) 9; (I)), либо
в аддитивной форм с fл (п, D) == fn (п) I 9;; (п).
Укажем, что МУJIьтипликативная форма характерна для ряда ат'о-
РИТ:I10В, коrда сильно парамстрически зависимый внешний цикл, опрс
деляющий нерсбор вариантов, содсржит внутрснний '(икл, проверяю-
щий решенис с полиномиальной зависимостью от размерности. Такая
ситуааия возникаст, наСlрИМСр, для ряда алrоритмов, решающих задачи
из класса N РС [4.2]. В силу консчности множества D n (см. 4.2)
существует худший СJIучай для функций .IJ; (D) и Y r ; (D). Обозначим
соответствующие функции чсрсз у* (п) и 9-t- (п):
у* (п) == шах { у; (D) }, у+ (п) == тах { y (D) }.
иЕи п ОЕи п
4. Классификации вычислительных аЛi!оритмов по трудоемкости 109
Отметим, что функция g+ (п) может быть выражена через функцию
,q* (п) следующим образом:
09+ (п) == 09* (п) ln (п) ln (п) .
в зависимости от влияния различных характеристик множества исход
ных данных на функцию трудоемкости алrоритма :\10жет быть предло
жена следующая классификация, имеющая практическое значение для
анализа ресурсной эффективности алrоритмов [4.3,4.4].
1. Класс N класс количественнозависимых по трудоемкости
алrоритмов. Это алrоритмы, функция трудоемкости которых зависит
только от размерности KOHKpeTHoro входа
у+ (п) == О =} у* (п) == 1 со} 1.1 (п, D) == 111 (п).
При мерами алrоритмов с количественнозависимой функцией TpyдoeM
кости MorYT служить алrоритмы для стандартных операций с массива
ми и матрицами умножение матриц, умножение матрицы на вектор
и т. д. Анализ таких алrоритмов, как правило, не вызывает затрудне
ний. Заметим, что для алrоритмов класса N справедливо соотношение
1 (п) == 1 (п) == 1.1 (п).
11. Класс Р R класс параметрическизависимых по трудоемкости
алrоритмов. Это алrоритмы, трудоемкость которых определяется не
размерностью входа (как правило, для этоrо класса раЗ:\1ерность входа
обычно фиксирована), а конкретными значениями всех или некоторых
элементов из входноrо множества D
...
1n (п)'- COl1st O с "-7- 1.1 (п, D) == С9* (п).
Примерами алrоритмов с параметрическизависимой трудоемкостью
являются алrоритмы вычисления стандартных функций с заданной
точностью путем вычисления соответствующих степенных рядов. Оче
видно, что такие алrоритмы, имея на входе два числовых значения
apr'YMeHT функции и точность, задают существенно зависнщее от зна
чений количество операций. Например, вычисление :r;k' последователь
ным умножением 1.1 (п) == 1.4 (х, k) или ашоритм вычисления е Х ==
== L (xnjn!), с точностью ДО Е 1.1 (D) == 1.1 (х, Е).
111. Класс N Р R класс количествеНIюпараметрических по TPYДO
емкости алrоритмов. Это достаточно широкий класс аЛI'ОрИТМОВ, т. к.
Н большинстве практических случаев функция трудоемкости зависит
как от количества данных на входе, так и от значений входных данных.
В этом случае
ln (п) f COl1st, ,q* (п) =f 1 =} 1 (п) -1- fX (п),
1.1 (п, D) == ln (п) g* (п), или 1.1 (п, Л) == 1n (п) + g--'- (п).
в качестве одноrо из общих примеров можно привести ряд алrоритмоl3
численных методов, в которых параметрическизависимый внешний
110 rл. 4. Элементы теории ресурсной эффективности алzоритмов
цикл по точности включает в себя количественнозависимый фраrмент
по размерности, порождая мультипликативную форму для fA (n, D).
П о д к л а с с ы к л а с с а Р R. Достаточно часто алrоритмы класса
Р R обладают трудоеYIКОСТЬЮ, которая зависит только от фиксиро
BaHHoro числа пара метров множества исходных данных. Рассмотрим
ситуацию, коrда имеется только один параметр, определяющий TPY
доемкость. Таким образоYI, fA (D) зависит либо от количества бит
в двоичноYI представлении этоrо пара метра , либо от их значений.
На основании этоrо рассуждения мы можем ввести дополнительные
подклассы в классс Р R, обозначив через т число значащих бит
параметра. В этих предположениях и обозначениях fA (D) fA (т),
и мы YIожем определить принадлежность функции f А (т) к одному
из классов сложности. Torдa будем rоворить, что алrоритм принадле
жит подклассу P1PH (полиномиальный подкласс), ссли fA (т) Е РР,
и подклассу ExPR (экспонснциальный подкласс), если fA (т) Е РЕ.
Содсржатсльно к подклассу P1P R относятся алrоритмы, трудоемкость
которых зависит от числа бит параметра, а к подклассу ЕхР R
алrоритмы с зависимостью трудоемкости от числовоrо значения этоrо
параметра. Конкретные примеры таких алrоритмов мы приведеYI в rла
ве 7.
П о д к л а с с ы к л а с с а N Р R. По отношению к количественно
пара метрическим алrоритмам представляет интерес более детальная
классификация, ставящая целью выяснение степени влияния количе
ственной и пара метрической составляющей на rлавный порядок функ
ции fA (n, D) fn (n)g* (n) и при водящая к выделению следующих
подклассов в классе N Р R [4.3]:
111.1. Подкласс N Р RL (Low) подкласс алrоритмов, TpyдoeM
кость которых слабо зависит от параметрической составляющей
у+ (n) О и" (n)) {о} g* (n) е (1).
Таким образоYI, для алrоритмов этоrо подкласса пара метрическая
составляющая влияет не более чем на коэффициент rлавноrо по
рядка функции трудоемкости, который определяется количественной
составляющей. В этом случае можно rоворить о коэффициентно
параметрической функции трудоемкости. К этому подклассу относится,
например, алrоритм поиска максимума в массиве, т. к. количество
переприсваиваний маКСИМУYIа в худшем случае (YIассив отсортирован
по возрастанию), определяющее y (n) е (n), имеет равный порядок
с оцснкой BHclllHero цикла перебора n элементов.
111.2. Подкласс N Р RE (Eq1Li'ualent) подкласс алrоритмов,
в трудое:У1КОСТИ которых составляющая у* (п) имеет порядок роста, не
превышающий fn (n):
09* (п) е и" (n)) {о} у+ (n) в иT (п)) .
4. Классификации вычислительных алzоритмов по трудоемкости 111
Таким образом, для алrоритмов этоrо подкласса параметрический KOM
понент имеет сопоставимое влияние (в мультипликативной форме)
с количественным компонентом на rлавный порядок функции TPYДO
емкости. Для алrоритмов, относящихся к этому подклассу, можно
rоворить о квадратичноколичественной функции трудоемкости. В этот
подкласс входит. например, алrоритм сортировки массива методом пу
зырька. для KOToporo количество перестановок элементов в худшем
случае (обратно отсортированный массив) определяет у+ (п) == е (п 2 ),
а In (п) == е (п).
111.3. Подкласс NPRH (Higl) подкласс алrоритмов, в TPYДO
емкости которых составляющая 9* (п) имеет асимптотический порядок
роста выше 1 n (п)
111 (п) == o(g* (п».
Таким образом, для алrоритмов этоrо подкласса именно параметриче
ский компонент определяет rлавный порядок функции трудоемкости.
Можно rоворить, что эти алrоритмы являются количественносильно
параметрическими по функции трудоемкости алrоритмами. В этот
подкласс входят, например, уже упоминавшиеся алrоритмы точно
ro решения NРполных задач из класса -тrE. ДЛЯ алrоритмов этоrо
подкласса характерна, как правило, мультипликативная форма функ
ции трудоемкости: IA (п, D) == In (п) g; (D). что позволяет rоворить
о количественноитерационнопараметрическом характере 1 А (п, D).
Мультипликативная форма особенно ярко выражена в алrоритмах
большинства итерационных вычислительных методов. в которых внеш
ний цикл по точности порождает параметрическую составляющую.
а трудоемкость тела цикла имеет количественную оценку.
Подклассы класса NPR по характеристическим
о с о б е н н о с т я м м н о ж е с т в а и с х о Д н ы х Д а н н ы х. Дpy
rая. не зависимая от предыдущей. классификация алrорит:vlOВ в классе
NPR [4.3] предполаrает выделение в функции 91' (D) аддитивных
компонентов, связанных со значениями элементов входа gv (D) и их
порядком g8 (D). Мы представляем функцию g1' (D) в виде
91' (D) == g11 (D) + 98 (D) .
Выделим во множестве D Е Dn подмножество однородных по существу
задачи элементов De, состоящее из элементов {d1....,d т }, IDel ==
== т, и определим Dp как множество всех упорядоченных последо
вательностей из {d l ,..., d т }, отметим, что в общем случае I Dp I ==
'----= т!. Если Del, D e 2 Е п р . то соответствующие им множества Dl. D2 Е
Е Dn, Torдa порядковая зависимость g8 (D) дЛЯ функции трудоемкости
имеет место. если IA (п, D 1 ) j IA (п, D2) хотя бы для одной пары
Dl, D 2 Е D1I' Зависимость трудоемкости от значений элементов входа
предполаrает, что
IA(rt,D)==IA(п.P1....,Pт), тп, PiED, i==l,т.
112 1л. 4. Элементы теории ресурсной эффективности аЛёоритмов
Оценивая степень влияния 9v (D) . 98 (D) на 91' (D), можно определить
следующие подклассы в классе N Р Н.
III.a. Подкласс N r Н5 (Sequeпse) подкласс алrоритмов с коли
чественной и порядковозависимой функцией трудоемкости: 91) (D) ==
== о (.Ч8 (D)). В этом случае трудоемкость зависит от размерности входа
и от порядка расположения однородных элементов; зависимость от
значений не может быть полностыо исключена, но она не является
существенной. Мы можем I'ОВОрИТЬ о количественнопорядковом xa
рактере функции трудоемкости. При мерами MorYT служить большин
ство алrОРИТМ08 сортировки сравнениями, алrоритмы ноиска минимума
и максимума в массиве.
III.b. Подкласс N Р НУ (Value) подкласс алrоритмов с функцией
трудоемкости, зависящей от длины входа и значений Э,lементов в D:
9" (D) 0(9,) (D)). В этом С.lучае трудоеу!кость зависит от размерности
входа и от значений элементов BxoAHoro множества; зависимость от
порядка не является определяющей. В этот подкласс входит алrоритм
решения задачи упаковки методом динамическоrо проrраммирования
(табличный метод), для KOToporo функция трудоемкости зависит как от
количества тинов rрузов, так и от значений объемов rрузов и упаковки.
IIорядок обработки типов I'рУЗОВ не является определяющим. Друrой
при мер алrоритм сортировки методом индексов [4.2], трудоемкость
KOToporo определяется количеством исходных чисел и значением MaK
сималыrоo из них. При этом порядок чисел в массиве вообще не
оказывает влияния на трудоемкость, за исключением фрю'мента поиска
максимума, лежащеrо в классе 1\7 Р П5.
Отметим, что объединение этих подклассов не образует класс
NPR:
NPH .. (NPRSUNPRV) i 0.
Существуют алrоритмы, в которых и значения, и СlOрядок расположе-
ния однородных элсментов оказывают реальное и существснное влия-
ние на функцию трудоемкости напримср, таковыми нrтяются итера-
ционные алrоритмы решения систем Jlинейных уравнений. Очевидно,
что как персстановка зна'{ений в исходной матрицс, так и измсне-
ние самих значсний существенно меняют собственныс числа матрицы,
которые опрсделяют сходимость итерационноrо процесса получения
рсшения [4.17].
5. Информационная и размерностная
чувствительность ВbIчислитеЛЬНbIХ алrоритмов
В некоторых проБJlемных областях применения npOI'paMMHbIX си
стем, например, для бортовых компьютсрных систем, возникаст трсбо
вание временной устойчивости. Практически это означает, что для раз
личных входов фиксированной длины врею! работы nporpaMMbI должно
измеН5IТЬСЯ незначитеJlЬ!-Ю. IIоэтому в целях анализа, исследования
5. Информационная и размерностная чувствительность алсоритмов 113
и выбора алrоритмов представляет интерес учет влияния различных
характеристик множества исходных данных на функцию TpyдoeMKO
сти. Отметим, что в классическом теории сложности рассматривается
только одна такая характеристика, а именно длина входа. В рамках
исследования устойчивости BpeeHHЫX характеристик алr'оритмов, на
основе введения понятия информационной чувствитеJIЫIOСТИ, представ
ляет интерес и разработка соответствующих классификаций.
ИнформаЦИОНlfая чувствительность алrоритмов по TpyдoeMKO
сти. Практически значимыми результатами анализа ресурсной эф
фективности HeKoToporo алrОРИТ:\1а является получение таких CBeдe
ний, которые моrли бы дать возможность ПРОПlOзирования требуемых
этим алrоритмом ресурсных затрат при решении задач из данной
проблемной области. В аспекте ресурса процессора мы хотели бы
проrнозировать трудое:\1КОСТЬ алrоритма как для разных размерностей
задачи, так и для различных входных данных. Идеальным результатом
проrнозирования трудоемкости аЛI"орипа можно считать ПОJJучение
точной функции fл (D). К сожалению, такая функция может быть
реально получена только для количественнозависимых ащ"оритмов,
образующих класс N, и, может быть, для отделыlЫХ алrоритмов друrих
классов, ввиду сложности фОр:\1аЛЫlOrо описания влияния параметри
'Iеской состаВJlЯющей на трудоемкость. Для большинства ащ"оритмов
класса N Р R нолучение точной функции трудоемкости затруднительно
даже для относительно простых алrОРИТ:\10В. а использование оценки
в средне:\1 позволяет пропюзировать трудоемкость только при ycpeДlle
нии !Jo большой выборке входов.
Более детальное рассмотрение задачи проrнозирования связано
(' изучением влияния характеристик множества исходных данных на
функцию трудое:\1КОСТИ алrОРИТ:\1а. Традиционно влияние изменений
параметров входа на выходную характеристИ!<у изучаемоrо объекта
называется чувствительностью по входному параметру. ТаКИ:\1 образом,
можно rоворить о чувствите"1ЫIOСТИ функции трудоемкости алrорит
:vш к исходным даННЫ:\1. Поскольку трудоемкость алrоритма зависит
как от количества элементов множества исходных данных, так и от
Ilэраметров этоrо множества, то МОЖIЮ выде.пить раз.пичные аспекты
'lувствительности алrОРИТ:\10В, соответствующие определения введены
в [4.10].
Определение 4.7. Под размерностной чувствительностью алсо
ритма будем понимать влияние изменения размерности на значение
функции трудоемкости.
Определение 4.8. 110Д информационной чувствительностыо ak
,'оритма будем пони:vrать влияние различных входов фиксированной
размерности на изменение значения ФУНКЦИИ трудоемкости ащ"оритма.
Количественная мера информационной чувствительности ал
I'ОрИТМОВ. ДJIЯ ИШIюстрации понятия информационной чувствитель
,\оСТИ рассмотрим качественно вид функции трудоемкости для HeKO
10porO а.пrоритма, нринад.пежащеrо классу 1'1 Р Н, нредставленной на
114 rл. 4. Элементы теории ресурсной эффективн.ости ал;;:оритмов
fA(D Е D n )
f;i.(n)
п(n)
1 2 ...
...IDnl
Рис. 4.6. rрафик трудоемкости количественнопараметрическоrо алrоритма для
различных входов фиксированной размерности
рис. 4.6. Здесь по оси абсцисс отложены номера конкретных входов
алrоритма с размерностью n, при надлежащих множеству D п , Bcero
таких входов 1 Dn 1. Мощность множества Dn значительна, однако
конечна, в предположении о конкретной реализации алrоритма, в силу
оrраниченности представления чисел в компьютере. В случае, если
n количество битов на входе, то максимально I Dn I == 2 n , если все
битовые комбинации являются допустимыми для AaHHoro алrоритма.
Реально мы имеем дело с целочисленной функцией целочисленноrо
aprYMeHTa, поэтому rрафик представляет собой набор точечных значе
ний. Для наrлядности на рис. 4.6 эти точечные значения соединены
кривой. Отметим, что качественно вид rрафика очень сильно зависит
от принятоrо способа нумерации эле:v!ентов множества Dn. Для KaKoro
то входа алrоритм выполняет максимальное количество операций, что
соответствует худшему случаю для данной размерности f (п), aHa
лоrично в лучшем случае количество операций будет минимально
fX (п), и трудоемкость для любоrо входа будет заключена между этими
крайними значениями.
Подсчитывая относительную по размерности множества Dn частот
ную встречаемость Toro или иноrо значения ФУНКЦИИ трудоемкости
f А, мы можем получить rистоrрамму относительных частот значе
ний функции трудоемкости Р (J А) как дискретной случайной величи
ны, Возможный вид соответствующей сrлаженной кривой показан на
рис. 4.7.
При этом очевидно выполнено следующее условие
L P (JA)==I,
:!
5. Информационная и размерностная чувствительность аЛёоритмов 115
р
fX(n)
fA (n)
fj\(n) fл(D Е Dn)
Рис. 4.7. [рафик относительных частот значений функции трудоемкости для
количественнопараметрическоrо алrоритма
Torдa среднее значение трудоемкости может быть определено как
fA (п) == LfA. риА).
rAe .,рбе суммы берутся по всем uелочисленным значениям функuии
трудоемкости f А на множестве D n : fX f А f. Таким образом,
мы получаем более детальную информацию о поведении алrоритма,
рассматривая функцию трудоемкости как дискретную случайную Be
личину, характеризуемую математическим ожиданием и дисперсией
и оrраниченную минимальным и максимальным значениями. В ряде
случаев значения математическоrо ожидания и дисперсии MorYT быть
получены теоретически на основании совокупноrо анаJ1Иза входов фик
сированной длины, для некоторых алrоритмов такие оценки получены,
например, Д. Кнутом [4.18].
Вводя понятие информационной чувствительности и в дальнейшем
обозначая ее через Oi (п). мы хотим установить количественную меру
разброса или рассеяния значений функции трудоемкости относитель
но cpeAHero значения ДJ1Я различных входов фиксированной длины
с учетом rраничных значений. В общем случае этот разброс будет
зависеть от размерности входа, поэтому Б i (п) вводится как функция
от aprYMeHTa п. Мерой рассеяния случайной величины относительно
математическоrо ожидания является дисперсия D или среднеквадрати
'lccKoe отклонение а. Верхняя rраница а! для среднеквадратическоrо
отклонения ОI'раниченной случайной величины. заданной функцией
I (х) определяется следующей теоремой [4.10].
116 rл. 4. Элементы теории ресурсной эффективности алzоритМО8
Теорема 4.2. Непрерывная случайная величина, оrраниченная по
х cerMeHToM [а, Ь] и заданная на нем функцией распределения 1 (х)
ь
\lx:a::::;'x::::;'b:l(x))O, и Jf(X)dXo=l,
а
имеет максимальную дисперсию D [1 (х)], если функция 1 (х) имеет
вид
1 (х) == q б (х а) + р8 (х Ь),
причем р == q == 1/2, [де б (х) дельтафункция, при этом D [J (х)] :(
:( 1/4.(а ь)2.
Переходя к дискретным случайным величинам, мы можем на oc
новании теоре:У!ы 4.2 rоворить, что дисперсия a-JA будет максимаJJьна
в СJJучае, KorAa функция трудоемкости как дискретная случайная Be
личина принимает равновероятно только минимальное и максимальное
значение. В этом случае, как JJerKO видеть, математическое ожидание
и среднеквадратическос отклонение принимают следующие значения:
М [Jл (п)] == и (п) + fX (п)) / 2, (JfAlпax (п) == и (п). Л (п)) / 2.
(4.5.1)
Корректное определение информационной чувствительности долж
но также учитывать размер интервала возможных значений функции
трудоемкости. При одинаковом значении дисперсии более чувстви
тельным должен быть алrоритм с БОJJЬШИМ интервалом возможных
значений. Для этоrо будем использовать такое понятие математической
статистики, как размах варьирования R -== и (п) 1'А (п)) [4.19]. OT
метим, что значение (J f А тах (п) равно половине размаха варьирования
в соответствии с опредеJJением Н. В целях дальнейшеrо рассмотрения
информационной чувствительности введем понятие нормированноrо
(относительноrо) размаха варьирования функции трудоемкости R.v (п)
для входов длины п как отношение половины вариантноrо интервала
к ero середине:
RN (п) -= и (п) fX (п)) /и. (п) + fX (п)).
(4.5.2)
Поскольку все значения функции трудоемкости положительны
и трудоемкость в худшем случае не меньше, чем в лучшем 1 (п) )
) fA (п), то 0:( IlN (п) :( 1.
Еще одной стандартной характеристикой вариационноrо ряда явля
ется rенеральный коэффициент вариации V, опредеJJяемый как ОТlIO
шение reHepaJJbHOrO среднеквадратическоrо отклонения к rенералыlOМУ
среднему значению [4.19]; для функции трудоемкости этот коэффици-
ент имеет вид
V (п) =ос (JfA(n)/ IА (п), 0:( V (п) :( 1,
(4.5.3)
[де (J fA(n) среднеквадратическое отклонение функции трудоемкости,
как дискретной случайной веJJИЧИНЫ при фиксированной размерности
5. Информационная и размерностная чувствительность алzоритмов 117
входа п. Обратим внимание на то, что в худшем случас для дисперсии
функции трудосмкости ['снераJlЬНЫЙ коэффициснт вариации совпадает
с нормированным размахом варьирования в соответствии с (4.5.2) и
(4.5.3). Поскольку О'!А(П) может изменяться от О до О'!.4 пшх (п), то
ввсдем, следуя [4.10], количественную меру информационной чувстви
тельности аю'оритма в виде
Oi (п) == V (п) HN (п), О Oi (п) 1.
( 4.5.4)
Тсм самым информационная чувствительность алrоритма при фик
сированной длинс входа учитывает и среднеквадратическое отклоне
нис функции трудоемкости, и размер интервала возможных значений
в нормированных единицах.
Предложенное поннтие и способ определения количественной мсры
информационной чувствительности алrоритмов MorYT быть использова
ны как дополнительный инструмент детальноrо исследования алrорит
мов. Например, КОЛИ'lественная мера информационной чувствительно
сти может быть применсна для болсс обоснованноrо решения задачи
выбора рациональных алrоритмов в рамках анализа рссурсной эффек
тивности. Н том СJlучае, если к проrраммной системе предъявляются
временные требования с узкими rраницами, то рациональным является
выбор алrоритма с малой количественной мерой информационной чув
ствителы-Iсти.. Такой подход при водит к постановке задачи классифи
кации алr'оритмов по введенной количественной мере информационной
чувствитсльности.
Рcfзмерностная чувствительность алrоритмов по трудоемкости.
Понятие информационной чувствительности отражает вероятностнос
варьирование трудоемкости алrоритма для различных входов фикси
рованной длины. Понятие размерностной чувствительности отражает
из:vtенение трудоемкости при измснснии ДJIИIIЫ входа. Однако если :vtbI
будем рассматривать такое изменснис для конкретных входов с раз
.iIИЧНОЙ Д.'1иной, то наблюдаемос изменение будет оБУСЛОВ.'1еllO как
размерностной, так и информационной чувствите.'1ЬНОСТЬЮ. Поэтому
размсрностную чувствительность есть смыс.'1 рассматривать ДJIЯ oco
()ых СJlучаев функции трудоемкости при фиксированной длине входа,
а и:vtеНlЮ для трудоемкости в лучшем, средне:vt и худшс:vt случаях.
Ввсдем обозначение 1.4 (п), rде под символом * подразумевается одно
Н3 обозначений особых случаев трудоемкости
*E:{".,Y}.
(4.5.5)
Таким образом, мы вводим три количественных меры размерност
ной чувствитеJJЬНОСТИ алrоритма с обозначением о;' (п), !"Де символ *
"l1ределен в соответствии с (4.5.5). За мстим, что поскольку COOTBCT
п'вующие функции трудос:vtкости используются В определении инфор
\1;ЩИОIllIOЙ чувствитсльности, то возникает возможность се определе
НИЯ дЛЯ друrих размерностсй на основе размерностной чувствительно
118 rл. 4. Элементы теории ресурсной эффективности алzоритмов
сти. Для фОР:'vlализации размерностной чувствительности необходимо
рассмотреть задание функции трудоемкости как в явном функциональ
ном виде, так и в виде рекурсивно заданной функции. Очевидным
является требование совпадения определения количественной меры
размерностной чувствительности вне зависимости от способа задания
функции трудоемкости алrоритма. Для каждоrо из указанных способов
задания функции трудоемкости будем считать, что мера размерностной
чувствительности должна отражать изменение трудоемкости, заданной
функциями f A (п), при увеличении размерности на единицу. PaCCMOT
рим отдельно оба возможных способа задания функции трудоемкости
[4.20].
С л у чай р е к у р с и в н о r о з а Д а н и я Ф у н к Ц и и. Без поте
ри общности можно считать, что функция f A (п) задана рекурсивно
в виде
fA (п -+ 1) == h A (n)fA (п).
(4.5.6)
Поскольку функция fл (n) является, по крайней мере, неубываю
щей
fA(n-+l)?:fА(n), и limfA(n)==oo, то h A (n)?:I,
п..........joOO
то представим функцию h л (n) в виде
h A (n) == 1 -+ O (п), O (п) ?: О. (4.5.7)
Подставляя (4.5.6) в (4.5.7) и выделяя O (n), получим формулу
для количественной меры размерностной чувствительности функции
трудоемкости алrоритма для лучшеrо, среднеrо и худшеrо случаев
исходных данных
-'О ( ) == f(n -+ 1) f(n)
Оп п f;(n)'
(4.5.8)
Таким образом, рекурсивно заданная функция Jл (n) связана с Me
рой размерностной чувствительности соотношением
fA (п -+ 1) == fл (п) -+ 8 (n) fA (n).
(4.5.9)
С л у чай з а д а н и я Ф у н к Ц и и в я в н о м в и Д е. Следуя
классическому определению чувствительности, необходимо pac
смотреть производную функции f A (n) по размерности, однако
для соrласования с формулой (4.5.8) предлаrается использовать
лоrарифмическую производную
8* ( п) == ln ( f* (n)) == ил(n»'
п dn А fA(n)
(4.5.10)
Если с учетом целочисленности арrумента функции перейти в фор
муле (4.5.10) от производной к конечной разности
ил (n))' ------> fл (п -+ 1) fA (n),
95. Информационная и размерностная чувствительность алzоритмов 119
то МЫ получим для 15 (п) формулу (4.5.8), соrласованную с определе
нием для рекурсивноrо случая.
Размерностная чувствительность алrоритмов в подклассах
класса N Р R. Представляет интерес выяснение поведения меры
размерностной чувствительности для различных подклассов алrо
ритмов в классе N Р R как наиболее широком классе практически
применяемых алrоритмов. Будем использовать обозначения, введенные
в параrрафе 4.4: 171 (п) количественный компонент функции
трудоемкости; g+ (п) пара метрический компонент в аддитивной
форме; g* (п) нараметрический компонент в мультипликативной
форме.
1. Подкласс NPRL g+ (п) == О ип (п)). В соответствии с опреде
лением понятия «О БОЛЫIlое» будем считать, что g+ (п) ::;; с1п (п), Torдa
для алr'оритмов этоrо подкласса количественная мера размерностной
чувствительности имеет вид
Ь* (п) == 1п(п + 1) + с1п(п + 1) 1п(п) с1п(п) == 1п(п + 1) 1п(п)
71 1п(п) + с1п(п) 1п(п).
(4.5.11)
Таким образом, для алrоритмов класса N Р RL количественная мера
размерностной чувствительности трудоемкости совпадает с мерой ero
количественноrо компонента.
2. Подкласс N Р RE g* (п) == е (J п (п)). в соответствии с опре
делением понятия «тета>} будем считать, что 9* (п) --= с1п (п), тоrда
длялrоритмов этоrо подкласса количественная мера размерностной
чувствительности имеет вид
б*(п)== 1п(n+l)c1п(n---'---I)fп(n)c1п(n) ==
71 1п(п) с1п(п)
, fn(n ?)fn(п) .fn(п+/ fn(п) БJ (п). ( 1+ 1nX+)I) ) , (4.5.12)
"п пп n пп
rде через Б Jn (п) обозначена мера размерностной чувствительности
количественной компоненты функции трудоемкости. Заметим, что
171 (п + 1) 171 (п), следовательно, б (п) 2Б Jn (п) в силу формулы
(4.5.12). Таким образом, для алrоритмов класса N Р RE количествен
нан мера размерностной чувствительности не менее чем в два раза
превышает количественную меру размерностной чувствительности KO
личественноrо компонента функции трудоемкости,
3. Подкласс NPRH 171 (п) == o(g* (п)). Используем запись компо
нентов функuии трудоемкости через размерностную чувствительность
в виде (4.5.9), Torдa
171 (п + 1) == 171 (п) + Б Jn (n).fn (п), g* (п + 1) == g* (п) + 15;g* (п),
!'Де через д; (п) обозначена мера размерностной чувствительности па
раметрическоrо компонента функции трудоемкости. Тоrда для алrорит
120 rл. 4. Элементы теории ресурсной эффективности алzоритмов
мов этоrо подкласса количественная мера размерностной чувствитель
ности имеет вид
8* (n) == иn(n) -+ 8 fn (n)fn(n)) . (g*(п) + 8;(n)g*(n)) fn(n)g*(n) ==
п fп(n)g*(п)
==of" (n)-+о;Сn)-+0f" (п) о;(п)==о;(n)-( 1 -+ 0f" (n)-+ Ofi'(;) )' (4.5.13)
в силу определения подкласса о; (n) » 8 jn (п), следовательно,
д (п) 8; (17,) (1 + 0f" (п)).
Таким образом, для алrоритмов класса N Р RH количественная мера
размерностной чувствительности определяется параетрическим и KO
личественным копонентами функции трудоемкости. Полученные pe
зультаты позволяют подойти к определению подклассов алrоритмов
в классе N Р R с точки зрения количественной epы размерностной
чувствительности.
Классификация алrоритмов по информационной чувствитель
ности. В целях определения возможных rраниц для классификации
алrоритов по информационной чувствительности рассмотрим xapaK
терные случаи, коrда функция трудоемкости как дискретная случайная
величина соответствует различным законам распределения верОЯТIIО
стей [4.20]
функция трудоемкости обладает аксимальным cpeДHeKBaдpa
тичным отклонением, а размах варьирования стремится к единице
в этом случае
O'fA (n) == О'jлmах == и (п) fX (17,))/2, УА (n) == и (п) + fX (n))/2,
fX (n) « f (п), или Л (п) == о и (17,)),
что обеспечивает RN (п) ------> 1 при 17, ------> 00 в соответствии с (4.5.2), Torдa
О;(п) ------> 1 при п------>ос:;
rистоrрамма относительных частот функции трудоемкости COOT
ветствует равномерному закону распределения, и RN (17,) > 1 при n ------>
------> 00, тоrда, по [4.] 9]
О'fл (n) == и (n) Л (п)) /vl2, У А (17,) == и (п) + fX (п)) / 2,
следовательно, о; (п) .----; 2/v'l2 0,57735 при п ------> 00;
rистоrрамма относительных частот функции трудоемкости COOT
ветствует нормальному закону распределения, в предположении, что
RN (п) ------> 1 при n 00, а размах варьирования составляет 6. О'jл (п),
получаем
O'jA (n) == и (n) fX (п)) / 6, У А (n) == и (п) -+ Л (п)) / 2,
Torдa Ji (n) 2/6 0,33333 при n ------> 00.
5. Информационная и размерностная чувствительность алzоритмов 121
rистоrрамма относительных частот функции трудоемкости COOT
ветствует нормальному закону распределения, RN (п) 1 при п 00,
а среднеквадратичное отклонение составляет 2,5 (1/40) от размаха
варьирования, т. е. интервал в 2(J' fA (п) составляет 5% от этоrо размаха.
В рамках таких допущений мы ожидаем отклонение наблюдаемых
значений функции трудоемкости от среднеrо не более чем на 2.5
с вероятностью р == 2Ф ( 1) 0,6826 [4.19], в этом случае
(J'fA (п) == и:1 (п) - J'j, (п)) / 40, 7 А (п) == и:4, (п) + J'j, (п)) / 2,
Torдa Di (п) 2/40 == 0,05 при п 00;
функция трудоемкости обладает нулевым среднеквадратическим
отклонением трудоемкость для любых входов фиксированной длины
одинакова, в ЭТО:\1 случае и дисперсия, и размах варьирования равны
нулю, тоrда Di (п) -:с: О.
На основе рассмотренных выше случаев введем следующую класси
фикацию алrоритмов по информационной чувствительности при фик
сированной длине входа [4.20].
Класс Н. Алrоритмы, не чувствительныс к входным данным по
функции трудоемкости: Di (п) == О. Этот тип совпадает с классом
количсственнозависимых алrоритмов (класс N).
Класс i2. Алrоритмы, слабо чувствительные к входным данным по
функции трудоемкости:
0< Di (п) < 0,05.
К..пасс i3. Алrоритмы, чувствительные к входным данным по функ
ции трудоемкости:
0,05 Di (п) < 1/3.
Класс i4. Алrоритмы, сильно чувствительные к входным данным
110 функции трудоемкости:
1/3 Di (п) 1,00.
Количественная мера информационной чувствитсльности Di (п) яв
Jlяется комплексной, поэтому одинаковую чувствительность :\10rYT
иметь алrоритмы, обладающие маЛЫ:\1 размахом варьирования при
большой дисперсии, и алrоритмы с большим размахом варьирования,
но с малой дисперсией. Такой подход является рациональным, т. к.
!:! каждом из этих случаев разброс (по вероятности) ожидае:\1ЫХ опlO
сительных изменений функции трудоемкости будет примерно одинаков.
Отметим также, что поскольку функция Di (п) зависит от размерности,
то, возможно, один и тот же алrоритм при разных размерностях будет
относиться к разным типам по информационной чувствительности.
Возможны два подхода к онределению значения меры Di (п)
тсорстический и экспериментальный. При теоретическом подходе необ
ходимо получить как функции трудоемкости для лучшеrо, среднеrо
и худшеrо случая, так и среднеквадратическое отклонение (J'fA (п).
122 rл. 4. Элементы теории ресурсной эффективности алzоритмов
На основе этих результатов можно получить rSi (n) в виде явной
функции и, анализируя или вычисляя ее значения для интервала раз
мерностей, характеризующих область применения, определить значе
ния информационной чувствительности и принадлежность алrоритма
к одному из введенных типов. Отметим особо, что необходимые для
получения rSi (n) теоретические зависимости, особенно (J f А (n), долж
ны учитывать особенности формирования входных данных ашоритма
в конкретных условинх применения. Экспериментальный подход ОIIери
рует методами математической статистики и связан в первую очередь
с получением статистическоrо распределения выборки [4.19], на oc
новании KOToporo MorYT быть численно определены все необходимые
для вычисления rSi (п) значения. TorAa на основе серии испытаний при
фиксированной размерности, используя такие показатели, как выбо
рочное среднее, выборочная дисперсия и выборочный коэффициент
вариации, можно проrнозировать ожидаемую трудоемкость на основе
значений Ji (n). Заметим, что, используя данный подход, мы получаем
выборочную информационную чувствительность, так как оперируем
с вариационным рядом, полученным по данным выборки. Отметим
также, что выборка должна быть репрезентативна относительно MHO
жества исходных данных, соответствующих особенностям применения
данноrо алrоритма в данной проrраммной системе, которые и составля
ют в данном случае rенеральную совокупность. При этом единичный
эксперимент состоит в определении значения функции трудоемкости
для проrраммной реализации алrоритма при конкретном входе.
Классификация алrоритмов по размерностной чувствительно
сти. Рассмотрим вначале несколько общих примеров определения
размерностной чувствительности с целью последующей классификации
алrоритмов.
При мер 4.1. Функция трудоемкости f'A (п) имеет полиномиальный
вид. Рассмотрим асимптотически r,1авный компонент f'A (п), представ-
ляющий собой степенную функцию fA (n) == cn k , k > О, целое, с> О.
Torдa в силу опредеJ1ения д (п)
* с(п + l)k cn k ck. nk1 + O(nk2) k 2
д п Сп) == k == k == + О(п ).
с.n с.n n
Аналоrичный результат для rлавноrо порядка д (п) можно полу-
чить и для действитеЛЫlOrо значения k, если заменить приближенно
f'A (n + 1) дифференциалом функции f'A (n) при 6.п == 1 f'A (n + 1) >::::
>:::: f'A (n) + knk l6.п. Таким обраЗО:\l, rлавный порядок размерностной
чувствительности для степенных функций трудоемкости имеет вид
k/n, rде k показатель степени, не зависит от коэффициента с
и rиперболически уменьшается с ростом размерности. В частности, для
f'A (n) == сп, д; (n) == 1/n.
Пример 4.2. Функция трудоемкости имеет экспоненциальный вид:
f'A (n) == се Лп , л> О, с> О.
96. Классификация алzоритмов по дополнительной памяти 123
По формуле (4.5.8)
>* (7 ' ) == сеЛ(n+l) се Лn се Лn еЛ се Лn л
и n ь л Л == е 1 == const > О.
се n се n
Таким образом, размерностная чувствительность для экспопенциаль
ных функций трудоемкости имеет вид еЛ 1 вне зависимости от раз
мерности входа алrоритма. На основе полученных результатов предла
rается следующая классификация алrоритмов по количественной мере
размерностной чувствительности к изменению размерности множества
исходных данных по функции трудоемкости [4.20]:
Класс nl. Алrоритмы, мало чувствительные (не более чем линей
ная функция):
о < б ::;; rLl,
\:Jn> 1.
Класс n2. Алrоритмы, слабо чувствительные (не более чем степен
ная функция со степенью больше единицы):
б == k . п 1 , \:J п > 1, k > 1.
Класс n3. Алrоритмы, чувствительные (более чем степенная, и Me
нее, чем показательная функция):
б (п) >--- пl и
lim б (п) == О,
n.........оо
rде >--- обозначение отношения асимптотической иерархии функций
[4.15].
Kacc n4. Алrоритмы, сильно чувствительные (не менее чем пока
зательная функция): .
б (п) == const, или liш б (п) == 00.
,,oo
Особо отметим, что у одноrо и Toro же алrоритма функции TPYДO
см кости для лучшеrо, среднеrо и худшеrо случаев MorYT иметь не
только разную количественную меру, но и обладать различным типом
размерностной чувствительности.
6. Классификация вычислительных алrоритмов по
дополнительной памяти
Теоретическое исследование ресурсных характеристик вычисли
TeJ1bHbIx алrоритмов предполаrает введение соответствующих класси
фикаций, отражающих различные ресурсные требования алrоритма
и ero проrраммной реализации. В этом параrрафе мы рассматриваем
классификацию вычислительных алrоритмов, в основу которой поло
жсн требуемый алrоритмом объсм дополнительной памяти в принятой
:уюдели вычислений. Мы рассматриваем в данном случае только объем
оперативной памяти, т. к. затраты памяти на внешних носителях Tpe
nуют отдельн.оrо рассмотрения и выходят за рамки книrи.
124 rл. 4. Элементы теории ресурсной эффективности ал?-оритмов
Пусть D конкрстный ВХОД алrоритма А, и iD! с= п, rде п длина
или некоторая мера длины входа. Функция объсма памяти V л (D) была
введена в параrрафе 4.1. Ресурсные трсбования алrоритма к объему !1a
мяти опрсделяются памятью входа, выхода и дополнительной. памятью,
задействованной алrоритмом в ходе ero выполнения. В соответствии
с этим будем различать следующис компонснты функции объема !1a
мяти.
1. Память входа V[ (И). При ЭТО\1 по объему памяти входа будем
различать две ситуаILИИ, связанные со способом получения ал!"Оритмом
ВХОДIIЫХ данных:
а) алrоритмы «HeIIOToKoBbIe 110 входу», или алrоритмы со статиче
ским (предопределенным) ВХОДО\1, хранящие ВХОД!1ые данные в памяти
целиком, в этом случае VJ (Л) ,= V[ (п);
б) алrоритмы «потоковые по входу», или алrоритмы с потоковым
входом, коrда объскты входа поступают и обрабатываются алrОРИТI\Ю\1
поэлемснтно. Отмстим, что поэлемснтное чтсние из файла объектов
входа в предопредсленный массив мы рассматривасм как непотоковый
вход. В этом случае для хранения тскущсrо объекта требуется не более
чем фиксированное число ячеек оперативной памяти, и VJ (D) =-- G (1).
2. Память выхода V R (D). Аналоrично будем различать:
а) алrоритмы со «статическим выходом», хранящие результат в па
мяти целиком, нри этом ОТ\1етим, что ДЛЯ хранения рсзультата может
использоваться как специальный блок намяти, так и память входа.
В последнем случае V R (D) :, О, и обычно для таких алrоритмов ис
пользуют термин ('результат 110 месту,>, например алrоритмы сортиров-
ки по месту [4.2];
б) алr'оритмы с «потоковым выходом'>. Рсзультаты, получаемые ak
rоритмом, поэлементно, в процессе их получения, выдаются на HCKOTO
рое устройство вывода, в это:vr случае нам нсобходима память не более
чем для одноrо элсмента результата, и \l п (D): G (1).
3. Дополнительная память , V j (D). Это дополнительная намять
модели ВЫЧИС,1ений, задействованная алrОРИТМО:\1 для по.пучения pe
зультата.
Поскольку ресурсные KOMIIOHeHTbI \1[ (D) и V R (D) во мно!"Ом опрс-
деJJЯЮТСЯ особснностями задачи, а для различных аJН'ОрИТМОВ се реше-
ния, обладающих статическим входом и выходом, фактически совпа-
дают, то именно KO"I!10HCHT vr (D) различает алrоритмы между собой
по ресурсным затратам памяти в рамках статическоrо или потоковоrо
типа. Очевидно, что для cOBpe:vreHHbIx компьютеров оr-раничсние реша-
емых задач по ресурсу оперативной памяти не столь существенно, как
оrраничения по временной эффективности. ТСУ! не мснее, известная
дилсмма «памятьвремя» приводит к ТО;\1У, что попытка улучшения
временных характеристик требует ощутимых затрат памяти, даже при
соврсменных её объсмах. Актуальные размерности современных СJIOЖ
ных задач такжс при водят к тому, что рссурс памяти становится
знаЧИМЫ\1 в комплексной оценке ресурсной эффективности алrорит
6. Классификация алzоритм.ов по дополнителыюй пам.яти 125
ма. Однако при сравнении алrоритмов, относящихся к статическому
или потоковому типу основную роль иrрает именно дополнительная
память, затраты которой обусловлены именно спецификой данноrо ал
rоритма. В связи с этим мы предлаrаем следующую классификацию
алrоритмов, основанную на оценке дополнительной памяти.
1. Класс VO алrоритмы с нулевой дополнительной памятью:
Уп > О, YD Е D ., vt (D) == О.
Алrоритмы этоrо класса либо вообще не требуют дополнительных
ячеек памяти, либо используют ресурсы памяти входа и/или памяти
выхода в качестве необходимых дополнительных ячеек по мере об
работки элементов входа или по мере заполнения памяти результата.
Очевидно, что это наиболее рациональные алrоритмы по критерию
емкостной эффективности.
11. Класс VC алrоритмы с фиксированной дополнительной па
мятью:
Уп > О, YD Е D ., vt (п) == const i- О.
Ллrоритмы класса VC используют постоянное, не зависящее от длины
и особенностей входа и длины выхода, число дополнительных ячеек
оперативной памяти. В реальных алrоритмах это, как правило, ячейки
для хранения счетчиков циклов, промежуточных результатов вычисле-
ний и указателей на структуры.
111. Класс V L алrоритмы, дополнительная память которых
линейно зависит от длины входа. Введем в рассмотрение функцию
допол"ительной памяти в худшем случае для всех допустимых входов
с мерой п, обозначив ее через v{, (п):
V/, (п) == шах {vt (D)} .
DEDn
в этих обозначениях аJlrоритм принадлежит к типу с линейной ДОПОk
нительной памятью, если:
v;" (п) == е (п) ,
rде обозначение е есть стандартное обозначение в асимптотическом
анализе функций. Содержательно такие затраты означают необходи
юсть хранения копии входноrо массива, или же аJlrоритм статическоrо
типа требует затрат дополнительной памяти порядка длины входа.
IV. Класс VQ алrоритмы, дополнительная память которых квад.
ратично зависит от длины входа. Для этоrо типа алrоритмов объем
:юполнительной памяти в худшем случае для входов размерности п
Ilропорционален по порядку квадрату меры размерности:
Л (п) == е (п 2 ) .
IIримером может служить стандартный алrоритм умножения длинных
нслых чисел, заданных побитно массивами длиной п. Алrоритм YMHO
126 rл. 4. Элементы теории ресурсной эффективности аморитмов
жения «в столбик» требует для двух исходных массивов длины n
и массива результата длины 2n дополнительноrо массива размерностью
2n х n == е (n 2 ).
V. Класс Vp алrоритмы, дополнительная память которых имеет
полиномиальную надквадратичную зависимость. Это алrоритмы, Tpe
бующие ресурса дополнительной памяти по порядку большеrо, чем
квадрат меры длины входа, но полиномиально зависящеrо от этой
меры:
:3 k > 2 : Л (n) == е (nk) .
к этому классу относятся, например, рекурсивные алrоритмы, порож
дающее дерево рекурсии с оценкой rлубины е (nk) , k > 1, и требу
ющие хранения в каждой вершине дерева дополнительноrо массива,
имеющеrо длину порядка е (n).
VI. Класс V Е алrоритмы, дополнительная память которых экс
поненциально зависит от длины входа. Формально это тип алrоритмов,
требующих, в худшем случае, ресурса дополнительной памяти, по
порядку экспоненциально зависящеrо от меры длины входа:
:3 л > о: Л (п) == е (е Лn ) .
Реально это алrоритмы, использующие дополнительные массивы или
более сложные структуры данных, размер которых определяется значе
ниями элементов входа. Характерным примером может служить алrо
ритм сортировки методом индексов или табличные алrоритмы, реализу
ющие метод динамическоrо проrраммирования. Например, табличный
алrоритм, решающий задачу одномерной упаковки для rрузов 100 ти
пов В объем 10000 будет использовать два массива, содержащих 1 об
элементов каждый [4.21].
С теоретической точки зрения определенный интерес может пред-
ставлять также и друrой подход, в основе KOToporo лежит нормирован
ная мера, равная отношению ресурса дополнительной памяти к общей:
vt (D)
Jv (D) == V A (D) ' V п V D Е Dn о::::; Jv (D) ::::; 1,
но предлаrаемая типизация по асимптотической оценке абсолютных
затрат дополнитсльной памяти представляется более целесообразной
с точки зрения разработчиков алrоритмическоrо обеспечения про
rpaMMHbIx средств и систем.
Заключение по rлаве 4. В заключение мы хотим кратко OCTaHO
виться на проблеме выбора рациональноrо алrоритма. Рациональный
выбор Toro или иноrо вычислительноrо алrоритма для решения HeKOTO
рой задачи требует проведения исследования претендующих алrорит
мов не только в целях получения асимптотических оценок функции
трудоемкости, т. е. оценок сложности алrоритмов. Проблема в том,
что для целоrо ряда вычислительных задач асимптотически более
эффективный алrоритм имеет значительный коэффициент при rлав
Список литературы к лаве 4
127
ном порядке функции трудоемкости, и тем самым не всеrда является
эффективным на всем заданном диапазоне размерности входа. Реаль
ные значения этоrо диапазона известны разработчикам проrраммной
системы, т. е. определяются особенностями использования данноrо ал
rоритма. Для выбора рациональноrо алrоритма по критерию pecypc
ной эффективности необходимо детальное исследование претендующих
алrоритмов в rраницах реальноrо диапазона применения. При этом
вполне вероятно, что на разных cerMeHTax этоrо диапазона разные
алrоритмы MorYT быть выбраны как наиболее рациональные. Таким
образом, возможно адаптивное по размерности входа управление выбо
ром алrоритма решения данной задачи в проектируемой проrраммной
системе. Решение по рациональному выбору лежит в области сравни-
тельноrо анализа вычислительных алrоритмов по ресурсным функциям
и связано с выполнением следующих этапов:
детальный анализ ресурсной эффективности сравниваемых ал-
rоритмов, т. е. получение функции трудоемкости и функции объема
памяти в явном виде;
сравнительный анализ ресурсных функций с целью выбора ра-
циональноrо алrоритма при реальных оrраничениях на длину входа.
Более подробную информацию по этой проблематике заинтересо
ванный читатель найдет в [4.3,4.4], а пример анализа и рекомендации
по рациональному применению алrоритмов в [4.21].
Поскольку данная rлава посвящена различным классификациям
вычислительных алrоритмов, мы не ПрИБОДИМ зада"i и упражнений, но
lIрои.qлюстрируем некоторые классификации на конкретных алrорит
:v!ax в rлаве 7.
Список литературы к rлаве 4
4.1. Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и ащоритмы:
Пер. с анrл.: М.: Изд. дом «Вильямс», 2001. 384 с.
4.2. Кормен Т, Лейзерсон ч., Ривест Р. А.пrоритмы: построение и анализ.
М.: МЦНМО, 1999. 960 с.
4.3. УЛЬЯ/-Ю8 М.В. Классификация и методы сравнитеJ1ьноrо анаJ1иза вы-
ЧИСJ1ительных алrоритмов. Научное издание. М.: Издво физико-
математической литературы, 2004. 212 с.
4.4. Ульянов М.В. Дополнение к книrе Дж. МакконеЛJ1а Основы COBpeMeH
ных а.пrоритмов. М.: Издво Техносфера, 2004. С. 303366.
4.5. Успенский В-А. Машина Поста. М.: Наука, 1979. 96 с.
4.6. Ахо А., Хоnкрофт Дж., Ульман Дж. Построение и анализ вычислитеJ1Ь
НЫХ алrоритмов: Пер. с aHrJ1.: М.: Мир, 1979. 546 с.
4.7. Лиnаев В.В. Методы обеспечения качества крупномасштабных пpo
['раммных средств. М.: СИНТЕr, 2003. 520 с. (Серия «Управление
качеством!> ).
128 Тл. 4. Элементы теории ресурсной эффективности алzоритмов
4.8. Jlипаев в.в. Обеспечение качсства ПрOl'раММНbJХ средств. М.: СИН
ТП. 2001. 384 с.
4.9. Вирт If. Алrорит:-.1Ы и структуры данных: Пер. с анrл. 2e ИЗД., испр.
СПб.: Невский диалект, 2001. :352 с.
4.10. Ульянов М.В., lоловешкин В.А. Информаl\ионная чувствительность
ФУНКllИИ трудоемкости алrоритмов к входным данным // Новые ин
формационные технолоrии: Сборник трудов YII Всероссийской научно
технической конфереНl!ИИ (Москва, 2125 марта 2004). / Под общ. ред.
A.[I. Хныкина М.: мrАПИ, 2001. с. 1926
4.11. Тасанов Э.Э., Кудрявцев В.Б. Теория хранения и llOиска информации.
М.: Физматлит, 2002. 288 с,
1.12. Хопкрофт Дж.. Мотовани Р.. Ульман Дж. Введение в теорию aBTO
матов, языков и вычислений, 2e изд.: Пер. с aHI'Jl. М.: Изд. дом
(.Вильямс», 2002. 528 с.
4.13. Тудман с.. Хидетниеми С. Введение в разработку и анализ алrорит
мов. М.: Мир, 198[. 368 с.
4.11. Толовешкин В.А. Ульянов М.В. Метод классификации вычислите,1ЫIЫХ
алrоритмов по сложности на основе уrловой :vIсры асимrlТотическоrо
роста функций // Вычислительные технолоrии. 2006. Т. 11, NQ 1. С. 52
62.
4.15. Трэхем Р., Кнут д.. Паташник О. Конкретная математика. Основание
информатики: Пер. с анrл. М.: Мир. 1998. 703 с.
4.16. Чмора А.л. Современная прикладная криптоrрафия. М.: rелиос ЛРБ,
2001. 256 с.
4.17. Бахвалов нс.. Жидков 11.11., Кобельков Т.М. Численные методы. М.:
Лаборатория Базовых Знаний, 2001 r. 6:32 с.
4.18. Кнут Д.Э. Искусство ПрOl'раммирования, том 1. Основные аЛl'ОрИТМbl,
3e изд.: Пер. с анrл. М.: Изд. дом (.ВИJ!ЬЯМС», 2002. 720 с.
4.19. Тмурман В.Е. Теория вероятностей и математическая статистика: Учеб.
пособие для вузов 9e изд., стер. М.: Высш. шк., 2003. 479 с.
4.20. Ульянов М.В. Исследование и классификация вычислительных алrо
ритмов на основе чувствительности ФУНКЦИИ трудоемкости // Системы
управления и ипформаllионные технолоrии. 2004. NQ 4 (16). С. 97 1 04.
4.21. Ульянов М.В.. Турин Ф.Е.. Исаков 1I.с., Будараzин В.Е. Сравнительный
анализ таБЛИЧНОI'О и рекурсивноrо алrоритмов ТОЧllоrо решения задачи
одномерной упаковки // Ехропепtа Pro Математика в ПРИJlожениях. 2004.
NQ2(6). С. 6470.
rлава 5
СПЕЦИАЛЬНЫЕ rЛАВЫ ТЕОРИИ РЕКУРСИИ
Введение. Эта rлава посвящена нетрадиционным методам решения
рекуррентных соотношений и некоторым специальным вопросам, воз
никающим при их исследовании. Мы приводим основную теорему о pe
куррентных соотношениях и примеры ее использования, показываем,
как с помощью аппарата производящих функций и свертки последова
тельностей можно получать решения ряда рекуррентных соотношений.
Рассматриваются также методы исчисления и оценки конечных сумм,
часто применяемые в процессе анализа и исследования алrоритмов,
в частности рекурсивных. Мы даем сведения о некоторых специальных
функциях, возникающих при исследовании рекурсивных алrоритмов,
примеры применения которых читатель найдет в rлаве 7. Рекурсив
вый характер некоторых алrоритмов приводит также к необходимости
исследования комбинаторных соотношений, которые мы также кратко
рассматриваем в данной rлаве.
1. Основная теорема о рекуррентных соотношениях
и некоторые особые случаи
Следующая теорема, доказанная в 1980 [. Дж. Бентли, Д. Хакен
и Дж. Саксом [5.1] является достаточно мощным средством асимпто
тической оценки функциональных рекуррентных соотношений опреде
ленноrо вида. TaKoro рода рекурсивно заданные ФУНКllИИ получаются
при оценке вычислительной сложности рекурсивных алrоритмов, OCHO
ванных на методе декомпозиции задачи.
Теорема (J.L. 8епt1еу, о. Наkеп, J.8. Saxe, 1980).
Пусть а;;::: 1 и Ь> 1 константы, f(n) известная функция, Т(п)
определено при неотрицательных значениях n формулой
Т(n) == аТ ([]) + Лn),
тоrда:
1) если лn) == О (n 1ogb a€) для HeKoToporo Е > О, то Т(n)
в (nlogba);
2) если f(n) == е (n 1og /, а), то Т(n) == е (n 1og /. а 10gb n);
З) если найдутся такие с > О и Е > О, что при достаточно больших n
lIыполнено лn) > cnlogba+€ и найдется положительная константа d < 1
111 ['оловешкин
130
rл. 5. Специальные zлавы теории рекурсии
такая, что при достаточно больших n выполнено а f () d f(n), то
Т(n) == 8 и(n)).
Рассмотрим при меры асимптотической оценки функциональных ре-
куррентных соотношений с использованием данной теоремы.
Пример 5.1. Получить асимптотическую оценку функции:
Т(n) == 8Т ([]) + n.
в этом случае а == 8, Ь == 4, f(n) == n, а nlogba == n!og4 8 == 8 (n). По
скольку f(n) == О (ne) для с ==, то, применяя первое утверждение
теоремы, делаем вывод, что Т(n) == 8 (n).
Пример 5.2. Получить асимптотическую оценку функции
Т(n) == Т ([ з 4 n ]) + 5.
Здесь а == 1, Ь == 4/3, f(n) == 5, а n!ogb a == n!оg4/з 1 == по == 8(1). Вос-
пользуемся вторым утверждением теоремы. Поскольку f(n) == 5 =:
== 8 (n!ogb а) == 8(1), то получаем Т(n) == 8 (log4/3 n).
Пример 5.3. Получить асимптотическую оценку функции
Т(n) == 2Т ([]) + nlog4 n.
в этом случае а == 2, Ь == 4, f(n) == nlog4 n ' а n!ogb a == n!og4 2 == n О ,5 =
== 8 Vп) и, например, при больших n и с == 0,5 f(n) =: nlog4 n ;;::
;?: пО, +10. Остается про верить последнее условие TpeTbero утверждения
теоремы. Для достаточно больших значений n имеем
( n ) n n 1
2! '4 == 2'41og4 '4 '2nlog4 n == df(n),
тоrда Т(n) == 8(nlog4 n).
Пример 5.4. Вычислить а n , rде n целое неотрицательное число.
Последовательность а n можно рассматривать как рекурсивно заданную
последовательность вида
rде
1
d=='2<I,
{ Т(О) == 1,
T(n)==aT(nl) при n;?:1.
В случае подобноrо задания количество операций для вычисления.а"
имеет порядок n. Но рекурсивная последовательность для а n l\'Ibt'
быть задана и друrим способом, а именно:
{ Т(О)==I, Т(I)==а;
Т(n) == Т (liJ) т Uil), n;?: 2.
1. Основная теорема о рекуррентных соотношениях и особые случаи 131
Напомним, что I J и rl обозначают «пол» и «потолою> aprYMeHTa
соответственно. Зададимся вопросом: скольких операций требует такой
алrоритм? Пусть Р(п) обозначает количество операций, требуемых
для вычисления Т(п). Нетрудно заметить, что количество операций,
требуемых для вычисления Т (r 1), на константу отличается от коли
чества операций, необходимых для вычисления Т ( l J). МЫ не будем
конкретизировать значения этой константы, а обозначим ее через с.
Следовательно, для оценки Р(п) мы имеем соотношение
Р(п) ==F(Ш]) +с.
Это соотношение соответствует второму случаю основной теоремы.
Применяя ее, получаем
Р(п) == е (log2 п) .
Пример 5.5. В качестве еще одноrо примера рассмотрим известный
метод половинноrо деления отрезка, применяемый для решения ypaB
нений. Требуется определить с заданной точностью h корень уравнения
лх) == О, rде лх) непрерывная функция.
Предполаrаем, что из какихто соображений известно, что корень
лежит на отрезке [а; Ь]. Кроме Toro, известно, что на этом отрез
ке лежит только один корень данноrо уравнения. Следовательно. на
концах этоrо отрезка значения функции имеют разные знаки. Для
определенности будем считать, что f(a) < О, а ЛЬ) > О. Мы будем
считать также, что корень определен с нужной степенью точности h,
если мы определим такой отрезок [с; d), что лс) < О, f(d) > О и при
этом d с h. Рассмотрим следующий алrоритм.
Обозначим аI == а, ыI == Ь. Поскольку f(aI) < О, f(b I ) > О, И непре
рывная на отрезке функция принимает все промежуточные значения,
то мы можем утверждать, что неизвестный корень х уравнения лх) ==
о лежит на отрезке [al; b 1 ]. Идея алrоритма собственно и состоит
11 построении последовательности отрезков [ai; bi], такой что Ла,) <
< О, f(b i ) > О, И при этом Ь Н1 ai+1 < b i ai, т. е. на каждом шаrе
отрезок, на котором лежит корень уравнения, уменьшается. Возьмем
а'+Ь'
значение с в середине отрезка с == , и вычислим значение Лс).
Возможны два случая лс) < О и лс) > О. (Случай f(c) == О ввиду ero
('лишком малой вероятности для реальных уравнений не рассматрива
«'М). В случае f(c) < О полаrаем ан) == с, Ь Н1 == b i . В противном случае,
при f(c) > О полаrаем аНI == ai, ЬНI == с, И вычисления повторяются.
Условием останова является ЬНI аНI < h.
Рекурсивный характер данноrо алrоритма очевиден, но может воз
III1КНУТЬ вопрос, что в этом алrоритме иrрает роль пара метра п. Па
,ыметр п, несмотря на то, что он явно не проявляется, тем не менее,
132
fл. 5. Спfциальные zлавы теории рекурсии
присутствует в данном алrоритме. Роль пара метра п иrрает то, сколько
раз значение требуемой точности h «укладывается,) на отрезке:
== [ ba ]
п h'
Для оценки количества необходимых операций Р(п) мы снова получа
ем соотношение вида
F(п)==F(Ш])+с,
rде значение с определяется количеством операций, требуемых для BЫ
числения функции и соответствующих операции сравнения и присва
иван ия новых значений концам отрезка. Для значения Р(п) с исполь
зованием основной теоремы получаем следующую асимптотическую
оценку
Р(п) == е (log2 п).
В заключение данноrо раздела приведем метод оценки членов peKYP
сивной последовательности, которая определяется рекуррентным COOT
ношением вида [5.2]
2
а п +\ а п + gn,
(5.1.1)
rде gn медленно возрастающая функция, которая может зависеть
от предыдущих членов последовательности. Более строrие требования
к ней будут сформулированы позднее. Мы заранее будем предполаrать,
что все члены рекурсивной последовательности положительны. Данное
соотношение является нелинейным. Лоrарифмируя (5.1.1), мы получа
ем соотношение (5.1.2), которое является «почти линейным,). Смысл
понятия «почти линейное,) прояснится позднее. Итак:
ь п + 1 == 2Ь п + fЗп,
(5.1.2)
rде
Ь п == ln а п , fЗn == ln (1 + )
Соrласно (5.1.2) и (5.1.1) получаем
Ь 2 п (ь fЗа fЗ! fЗп! )
п == а + 2" + 22 +... + .
Введем величину
00
В п == 2 п Ь а + L 2rIi1 fЗi,
iO
предполаrая, что соответствующий ряд сходится, 01lрделим остаток
00
r n == В п Ь п == L 2rIilJJi.
i=:n
2. Производящие функции
133
Подобная операция имеет смысл только тоrда, коrда полученный ряд
сходится достаточно быстро. Второе допущение, которое раскрывает
смысл понятия, что 9n медленно возрастающая функция, состоит
в предположении, что, начиная с HCKoToporo номера По, последователь
ность ''вnl не возрастает, т. е. I(Jn+ll IfJnl, при n > По. Torдa ряд для
В п сходится, а остаток Т п не превосходит IfJnl, следовательно, решение
исходноrо peKyppeHTHoro соотношения может быть представлено в виде
а п == еВп Tn == k 2ТL ern,
(5.1.3)
rде
k == ао ехр ( f 2i) fJi ) .
to
(5.1.4)
Полученное выражение (5.1.3) не является в прямом смысле pe
шением peKyppeHTHoro соотношения. Оно лишь показывает, что суще
ствует константа k. которая характеризует полученное асимптотиче
ское поведение членов последовательности. Определение точноrо зна
чения этой константы является самостоятельной задачей для каждоrо
KOHKpeTHoro соотношения, и задачей далеко не простой.
2. Производящие функции
Довольно часто объектом исследования является не которая счетная
ПОСЛ€!ll.ОВ€lтельность чисел
(ао, а),..., а п , ...).
АЛы будем rоворить о бесконечных последовательностях чисел. При
этом мы не оrраничиваем общности, поскольку любую конечную после
довательность можно рассматривать как бесконечную, считая, что все
ее члены, начиная с HeKoToporo номера, равны нулю. Использование
производящих функций ставит своей целью рассматривать последова
тельность не как набор чисел, а как единое целое. Указанной выше
последовательности ставится в соответствие степенной ряд
00
L: ak zk ,
kO
!'де z рассматривается как комплексное число. Сумма этоrо ряда, KO
торую мы будем обозначать через O(z), и называется производящей
функцией для данной последовательности. Таким образом, производя
щая функция O(z) для последовательности (ао, al, 00" а п , о..) равна
00
O(z) == L:akzk.
134
rл. 5. Специальные елавы теории рекурсии
Одно преимущество производящей функции уже видно. Вместо беско
нечноrо набора чисел мы будем иметь дело с одной функцией. Конечно,
это достоинство будет действительно таковым, если сама функция
будет иметь не очень сложный вид. Но возникает резонный вопрос,
каким образо;vJ, зная функцию G(z), восстановить последовательность
(ао, al, ... ,а n , ...)? Без ответа на такой вопрос все дальнейшие pac
суждения теряют ВСЯКИй смысл. Мы не будем вдаваться в тонкости
теории функции комплексноrо переменноrо. При не слишком жёстких
оrраничениях степенной ряд для функции G( z) абсолютно сходится
внекотором Kpyre на комплексной плоскости с центром в точке z == О,
а функция G(z) является аналитической в этом Kpyre. Тоrда члены
последовательности (ао, а\,..., а n ,...) являются коэффициентами ряда
Тейлора для этой функции в точке z == О. ДЛЯ вычисления коэффици
ентов ряда Тейлора известна формула
а n == Dn(G(z)) 1 '
n. zo
rде Dn (G(z))lzO есть производная порядка n функции G(z) в точке
z == О.
Сейчас мы установим связь между некоторыми конкретными по
следовательностями и соответствующими производящими функциями.
Пусть
G(z) == (az + ь)n.
Мы надеемся, что читатель помнит простейшие правила вычисления
производных. Получаем:
D((az + ь)n) == n(az + Ь)n\a;
D 2 ((az + ь)n) == n(n l)(az + ь)n2a2;
Dk((az+b)n) ==n(n 1)...(nk+ 1)(az+b)nkak,
Dk((az + ь)n) == О, при k > n.
при k .n;
Так как для членов соответствующей последовательности имеет MeCTQ
формула
1 k I
ak == k! D (G(z)) zo'
то имеем ао == ь n , а} == nabnj, а2 == n(n 1)a2ьn2, и в общем случае
ak== ! n(пI)...(пk+l)akbnk, kn,
2. Проuзводящuе фун.кцuu
135
и все ak == О при k > по Заметим. что
1 ( ) ( ) 1 n( n 1) . .. 2 о 1
k! n n 1 ... nk+ 1 == k! ' (nk)(nk 1)...2.1 ==
n! k
k!(n k)! == Сп'
rде C биномиальные коэффициенты или, что то же самое, число
сочетаний без повторений из n по k. Таким образом, данной произ
водящей функции соответствует последовательность (ао. al, ..., а n . "0)'
rде ak == Cakbnk при k :::;; n; ak == О при k > n. Рассмотрим частные
случаи этой формулы.
Пусть G(z) == (z ь)n, Torдa ak == C( 1 )nkbnk при k :::;; п; ak == О
при k > п.
И очень важный частный случай. KOrдa G(z) == (1 + z)n. В этом
случае ak == C при k :::;; n; ak == О при k > n. То есть функция G(z) ==
== (1 + z)n является производящей функцией для числа сочетаний без
повторений из n по k.
Теперь рассмотрим функцию
1
G(z) == (az + b)m+l ' rде т;;;:: О.
Dk( (Z»==Dk ( 1 ) ==(I)k (m+l)(m+2)...(m+k) ak
9 (az + ь)т+1 (az + b)m+1+k .
тоrда <f.
1 ( l ) k (m+l)(m+2)...(m+k) k
ak k! b m + 1 + k а
k a k
== (1) b m + 1 + k
1
k!
1.2.... .(m+k)
1.2. '" .т
или в окончательном виде
a k
ak == (I)k bm+l+k C(m+k.m).
Рассмотрим частные случаи полученной формулы. Пусть
1
G(z) == (z b)m+l '
тоrда
( l) т+1 1 С т
ak == b m + l + k m+k'
I
Пусть G(z) == +1 ' тоrда ak == (I)k. С:;:н,
(1 + z)m
1
Пусть G(z) == (1 z)m ' тоrда ak == С:;:н,
(5.2.1 )
136
rл. 5. Специальные zлавы теории рекурсии
Отдельно рассмотрим случай для т == О, при этом:
1
O(z) == 1 '
+z
Torдa ak == (I)k, т. е. последовательность состоит из единиц с череду
ющимися знаками. Наконец, для функции
1
O(z) == 1
z
имеем ak == 1, т. е. все члены данной последовательности равны еди
нице. Найдем соответствующую последовательность для производящей
функции вида
1 zn+ 1
O(z)== lz
Мы надеемся, что читатель еще не забыл формулу суммы rеометриче-
ской проrрессии, и он вспомнит, что данная функция есть не что иное,
как сумма вида
O(z) == 1 + z + z2 + ... + zn,
поэтому последовательность, соответствующая данной производящей
функции, имеет вид: ak == 1 при k п; ak == О при k > п. Этот вывод
можно было получить друrим способом, если обратить внимание на
одно очень важное свойство производящих функций.
Пусть производящей функции O(z) соответствует последователь-
ность (ао,а/,...,а п ,...). Тоrда функции OI(Z) == znO(z) (п > О) COOT
ветствует последовательность (Ь о , Ь 1 , .., ,Ь п , ...) и между этими после
довательностями существует следующая связь: b k == О при k < п; b k ==
== akn при k ? п. То есть при умножении производящей функции на
Zn соответствующая последовательность сдвиrается на п шаrов вправо.
С учетом указанноrо замечания полученный результат для
1 zn+l
O(z) ==
1 z
;
становится очевидным.
Отметим также тот факт, что производящие функции обладают
свойством линейности по отношению к порождающим их последова
тельностям. Линейность понимается в следующем плане. Пусть имеют
ся две последовательности (ao,aj,...,a n ,...) и (ЬО,Ь 1 ,...,Ь п ,."), про;
изводящие функции для которых соответственно равны 01 (z) и 02(Z).
Тоrда для последовательности
(сао + dbo, саl + db l , ..., сап + db n ,...)
производящая функция O(z) равна
O(z) == сО! (z) + d02(Z),
в дальнейшем мы рассмотрим методы восстановления последователь-
ности, коrда производящая функция является рациональной дробью.
2. Производящие функции
137
Напомним некоторые факты, касающиеся мноrочленов в комплексной
области. Мноrочленом степени п (будем обозначать ero Pn(Z)) назы
вается выражение вида
Pn(Z) == anZ n + an)Zn1 + .., + a2z2 + alz + ао,
rде ао, а) ,..., а n в общем случае являются комплексными числами,
а n 1- О. Корнем мноrочлена называется число С такое, что Рn(С) == О.
Если число С является корнем мноrочлена, то мноrочлен может быть
представлен в виде Pn(Z) == (z C)Pn)(z), rде pn)(z) мноrочлен
степени (п 1). Число с является корнем мноrочлена кратности Т, если
мноrочлен может быть представлен в виде Pn(Z) == (z сУ PnT(Z). rде
PnT(C) 1- О. Мноrочлен степени п имеет ровно п корней с учетом их
кратности. Последний факт означает, что если мноrочлен
Pn(Z) == anZ n + an)Zn\ +... + a2z2 + a)z + ао
имеет k различных корней C\,C2,...,Ck кратности T\,T2,...,Tk COOTBeT
ственно, при этом 7'\ + 1'2 + .,. + Tk == п, то ero можно представить
в виде
Pn(Z) == an(z С))Т' (z С2)Т2 ... (z CkYk.
Напомним, что рациональной дробью R(z) называется выражение вида
R( ) == Pn(z)
z Pm(z) ,
rде (z) и Pm(z) мноrочлены соответствующих степеней. Раци
ональная дробь называется правильной дробью, если степень MHoro
члена в знаменателе cTporo больше степени мноrочлена в числителе.
В противном случае дробь называется неправильной. Если R(z) яв
ляется неправильной дробью, то она может быть представлена в виде
R(z) == Pnm(z) + R\(z), rде Pnm(z) мноrочлен степени п т, а
HI (z) правильная рациональная дробь.
Элементарной (простейшей) рациональной дробью называется BЫ
ражение вида
А
(z а)т'
Любая правильная рациональная дробь может быть разложена в сумму
элементарных дробей. Этот факт позволяет представить схему нахож
дсния соответствующих последовательностей в случае, коrда произ
водящая функция является рациональной дробью. На первом этапе
для неправильной дроби ее представляют в виде суммы мноrочлена
и правильной дроби. Проблема нахождения соответствующей ПОСJlе
;щвательности для мноrочлена решается просто. Правильная дробь
раскладывается в сумму элементарных дробей. Способ определения
соответствующей последовательности для элементарной дроби мы из
ложили ранее. Схема представления правильной дроби в виде суммы
]
138
rл. 5. Специальные zлавы теории рекурсии
элементарных дробей выrлядит следующим образом. Пусть имеется
правильная дробь вида
R( ) == Pn(Z)
<, Pm(z) ,
(т > n),
при этом мноrочлен в знаменателе
Pm(z) == bmZ m + bmJzm1 +... + b 2 Z 2 + bJZ + Ь О
имеет k различных корней CJ,C2,...,Ck кратности T[,T2,...,Tk COOTBeT
ственно и, значит, ero можно представить в виде
Pm(z) == bm(z C))TI(Z С2)Т2... (z Ck)Tk.
Torдa рациональная дробь R(z) может быть представлена в следующем
виде
R(z Pn(z)
) bm(z Cl)r\ (z С2У2 '" (z Ck)Tk
== А1,т\ r + A1.rJJ +... + +
(ZC1) \ (ZCl)rll ZCl
+ А2,Т2 + A2,T2] +... + + ... +
(z С2)Т2 (z C2)T21 Z С2
+ Ak,Tk + Ak.TkJ +... + .
(z Ck)Tk (z CkYkJ Z Ck
Способ определения коэффициентов мы покажем на примерах.
Пример 5.6. Найти последовательность (ао, а\, ... ,а n , ...), дЛЯ KO
торой производящая функция равна
4z2 z 9
G(z) == (z + 2)(z + 1)(2 1) '
Выражение для производящей функции является правильной рацио,
нальной дробью. Представление этой дроби в виде суммы простейших
дробей ищем в виде
4z2 z 9 А В С
==++.
(z+2)(z+1)(zl) z+2 z+1 z1
Осталось определить неизвестные пока коэффициенты А, В, С. приве
дем правую часть к общему знаменателю, который равен знаменател '
в левой части выражения и приравняем числители в правой и лево
частях. Получим
4 z2 z 9 == А (z + 1) (z 1) + в (z + 2) (z 1) + С (z + 2) (z + 1). :.
(5.2..
2. Проuзводящuе фун.к.цuu
139
в соотношении (5.2.2) приравниваем коэффициенты при одинаковых
степенях z и получаем систему уравнений для определения А. В, с.
{ А + в + с == 4;
В + зс == 1;
А 2В + 2С == 9.
...
.: (1.
Решая эту систему уравнений, находим коэффициенты. Отметим, что
в данном случае нет необходимости решать систему уравнений, по
скольку неизвестные коэффициенты можно определить более простым
путем. Равенство (5.2.2) рассматриваем как равенство мноrочленов.
верное для любых значений z. Подставим в левую и правую части
этоrо равенства z == 2. Получим 9 == 3А. и А == 3. Подставляя z == 1.
имеем 4 == 2B. откуда В == 2. Подстановка z == 1 дает 6 == 6С, и
С == 1. Следовательно,
422 z 9 3 2 1
(z+2)(z+I)(zl) == z+2 + z+1 zl '
Для элементарных дробей 2 ' I ' l ' соrласно (5.2.1). после
z+ z+ z
довательности (Ь О , Ь\. Н.. Ь N . ...). имеют вид
( 1 )n
Ь N == 2"+\ ; Ь N == (1)n и Ь N == I
соответственно. Надеемся, что читатель без особых усилий доведет
решние задачи до конца.
Пример 5.7. Найти последовательность (ао.а\,...,а n ....), для ко-
торой производящая функция равна
4z 8
G(z) == (z 3)(z 1 )2 '
Поскольку дробь правильная. то представим ее в виде суммы элемен
тарных дробей вида
4z 8 А В С
(z 3)(z 1)2 == Z 3 + (z 1)2 + z 1 .
Приводя К общему знаменателю и приравнивая числители в левой
и правой частях. получаем
4z 8 == A(z. 1)2 + B(z 3) + C(z 3)(z 1).
(5.2.3)
Ilриравниваем коэффициенты при одинаковых степенях z и получаем
систему уравнений для определения А. В, с:
{ А + с == о;
2А + в 4С == 4;
А 3В + 3С == 8.
140
Fл. 5. Специальные zлавы теории рекурсии
Решая эту систему уравнений, находим коэффициенты. Отметим, что
в данном случае нет необходимости полностью решать систему ypaBHe
ний, поскольку часть неизвестных коэффициентов можно определить
более простым путем. Равенство (5.2.3) рассматриваем как равенство
мноrочленов, верное для любых значений z. Подставим в левую и пра
вую части этоrо равенства z == 3. Получим 4 == 4А, и А == 1. Подставим
в левую и правую части этоrо равенства z == 1, получим 4 == 2B,
что дает В == 2. Тоrда из пepBoro уравнения находим С == 1, и
4z 8 1 2 1
(z3)(z 1)2 == z3 + (z 1)2 z l '
Для элементарных дробей 3 ' 1 2 ' 1 l ' соrласно (5.2: 1), по-
z (zl) z
следовательности (Ь О , b 1 , ... 'Ь n , ...) имеют вид:
]
Ь N == 3М l ' Ь N == C+ 1 == n + 1, Ь N == 1
соответственно. Получение окончательноrо ответа мы предоставим чи.
тателю.
При мер 5.8. Найти последовательность (aQ,al,...,a n ,...), дЛЯ KO
торой производящая функция равна
4
G(z) == 2 2 2 '
z ""+
Представим G(z) в виде
4
G(z) == ( ( '»( ( '» '
z l+z z ll
Разложение на элементарные дроби ищем в виде
4 А В
(z(I+i»(z(1 i» == z(1+i) + z(1 i)'
Аналоrичным образом, определяя неизвестные коэффициенты, получа
ем А == 2i, В == 2i, Torдa
4
(z(I+i»(z(1i» == z(I+i) + z(Ii)'
Для элементарных дробей
1
z (1 + i) ,
1
z(Ii)'
соrласно (5.2.1), последовательности (рО,Ь 1 ,''',Ь n ,...) И (CO,CI,,,,,Cn,...)
имеют вид:
1
Ь n == (1 + i)n+1 '
1
сп == (1 i)n+l'
9 2. Производящие функции
141
Torдa
а n == 2ibn + 2ic n == 2i ( 1 + )n+l' (1 )n+( ) ==
== 2 (1 i)n+1 (I+i)n+1).
Заметим, что
1 + i == J2 (cos + i sin ) ,
Torдa
1 i == v2 (cos ( ) + i sin ( ) ).
(1 + i)n+l == 2 "'; I (cos(n + 1) + isin(n + I)) ,
(1 i)n+l == 2 (СОБ(n+ 1) () + isin(n + 1) ()),
следовательно,
z ( ( п )) З'" ( п )
а n == 271 2 2 2isill(n + 1) '4 == 2----Т-- sin(n + 1) '4 .
Свертки последовательностей. Производящие функции обладают
еще одним интересным свойством. Пусть даны две последовательно
сти (aO,al,ooo,a n ,...) и (Ьо,Ь(,о..,Ьn,о..), производящие функции для
которых соответственно равны С 1 (z) и G2(Z). Torдa сверткой данных
после.!;!.овательностей называется последовательность (Со, Cl, .0' ,сп, ... )
такая, что
71
СП == L akbnk,
kO
а производящая функция G (z) для этой последовательности равна
G(z) == С( (z)G 2 (z).
Отметим интересный факт. Если последовательность (Ь о , b 1 , ... , Ь n , .. о)
такова, что Ь N == 1 для всех значений п, то свертка представляет после
довательность частичных сумм последовательности (ао, al, ..., а n , о..),
т. е.
71
СП == Lak.
k==O
Поскольку для последовательности, состоящей из единиц, производя
щая функция равна G 2 (z) == 1/(1 z), то производящая функция G(z)
для последовательности частичных сумм равна
G(z) == z: .
Используем этот факт для вычисления сумм.
142
Тл. 5. Специальные zлавы теории рекурсии
Пример 5.9. Вычислить сумму
n
Sn == 2::: k 2 .
kO
.,
Рассмотрим последовательность а n == n 2 . Найдем производящую функ
цию
00
Gi(z) == 2::: n2zn .
nO
Имеем
00 00 d ( OO )
GI(z)==n2zn==zп2zni==z dZ nzn ==
== z.!i ( Z nzni ) == z.!i ( z.!i ( zn ) ) == z.!i ( z.!i ( ) ) ==
dz dz dz dz dz 1 z
nl n!
d ( z ) z + z2
==z dz (1 z)2 == (1 z)3'
n
Torдa для последовательности SN == L k 2 производящая функция име
kO
ет вид
1 z + z2
G(z) == 1 z Gi(Z) == (1 z)4 '
Разложим это выражение на элементарные дроби:
А В С D
G(z) == (z 1)4 + (z 1)3 + (z 1)2 + z l '
получаем
z+z2==A+B(z 1)+C(z 1)2+D(z 1)3.
Система уравнений для определения неизвестных коэффициентов име
ет вид
,:1:
решая эту систему, получаем D == о, с == 1, В == 3, А == 2, и, следов.
тельно,
{ D == о;
с 3D == l'
В 2С + з == 1;
А В + С D == О.
, . ,,<,
t
231
G(z) == (z 1)4 + (z 1)3 + (z 1)2 '
." t!
2. Проuзводящuе фуft1щuu
143
Используя соотношение (5.2.1), получаем
k 2 2C 3 зс 2 C ! n(n+l)(2n+l)
sn 3+" 2+n' !+" 6 .
kO
Использование аппарата производящих функций для решения
некоторых задач комбинаторики. Вначале уточним наше понимание
биномиальных коэффициентов: C число сочетаний по k из n.
В уточненном понимании мы будем использовать для них обозначение
С(n, k). Будем считать, что n О, TOrдa
k n!
С(n, k) == Сп == k!(n k)! :
при О :;;;; k :;;;; n это есть число сочетаний по k из n; С(n, k) == О
при k < О и k > n. Ранее мы показали, что производящая функция
(1 +z)n соответствует последовательности (ао,а!,...,а n ,...), rде ak ==
== С(n, k). Отметим, что при k > n все члены последовательности
равны нулю. Рассмотрим два положительных целых числа т и т таких,
что т + т == n. Производящей функции G1(z) == (1 + z)m COOTBeT
ствует последовательность (Ь о , Ь!, ... , Ь n , ...), rде bk == С(т, k). Произ
водящей функции G2(Z) == (1 + Z)r соответствует последовательность
(со,с!,..., сп,...), rдe Ck ==C(T,k).
Произведению этих функций соответствует функция
G(z) == G j (z)G 2 (z) == (1 + z)m(l + zy == (1 + z)m+r == (1 + z)n.
Этой производящей функции соответствует последовательность
(aO,al,...,a n ,...), rде ak == C(n,k). С друrой стороны, последова
тельность (ао, а!, ... ,а n , ...) является сверткой последовательностей
(Ьо,Ь!....,Ь n ,...) и (Со,С!,..., Сп,.")' следовательно, для любоrо k
имеем k
ak == blCkl'
IO
Следовательно, имеем равенство
k
С(n, k) == L С(т, ОС(т, k О.
IO
Так"как n т + т, то это равенство можно записать в' виде
k
С(т + m, k) == L С{т, ОС{т, k О.
{O
ЭТО соотношение называется правилом свертки Вандермонда.
Рассмотрим еще один пример. Производящей функции G 1 (z) ==
== (1 + z)n соответствует последовательность (Ь о , Ь!, .,. , Ь n , ... ). rде b k ==
]
144
rл. 5. Специальные zлавы теории рекурсии
== С(n, k). Производящей функции G2(Z) ==(1 zln соответствует по
следовательность (ео,с],..., Сп,",), rде Ck (1) C(n,k). Произведе
нию этих функций соответствует функция
G (z) == G 1 (z) G 2 (z) == (1 + z) n (1 z) n == (1 z2) n .
Этой производящей функции соответствует последовательность
(ао, а],..., а n ,...), rде а2т == (1)тc(n, т), а2т+] == О. Поскольку
k
ak == L bICkl,
IO
то получаем следующее свойство биномиальных коэффициентов:
2т 2т
а2т == L blC2m1 == L С(n, [)( 1)2mIC(n, 2т [),
IO IO
которое можно представить в виде
. 2т
(I)тC(п,т) == L(I)IC(п,l)C(п,2ml).
IO
Теперь рассмотрим примеры применения производящих функций для
решения комбинаторных задач.
Пример 5.10. Сколько существует способов выдать сумму 12 KO
пеек, используя монеты достоинством в 1 и 5 копеек?
Число способов выдать сумму в k копеек однокопеечными монетами
образует последовательность (Ь о , Ь\, ... ,ь n , ...), rде bk == 1. Производя
щая функция этой послсдовательности G \ (z) имеет вид
1
G 1 (z) 1 + z + z2 -+ ... + zk + ... == .
lz
Для монет достоинством в 5 копеек соответствующая последователь
ность (Со,с\,..., сп,...), rде Ck == 1, если k кратно 5, и Ck == О В про
тивном случае. Производящая функция этой последовательности G2(Z)
имеет вид:
( ) 5 1 О 5k . 1
С2 z == l+z +z +... +z ... ==.
lz
Тоrда последовательность числа способов для сумм, которые можно
выдать однокопеечными и пятикопеечными монетами, является сверт-
кой данных последовательностей и, значит, ее производящая функция
G(z) равна
1 1
G(z) == G 1 (Z)G 2 (z) == 1 z . 1 z5 '
Torдa число способов, которыми можно выдать сумму в n копеек,
равно коэффициенту при zn. Найдем этот коэффициент для n == 12.
Для нахождения этоrо коэффициента воспользуемся представлением
2. ПРОUЗ80дящие функции
145
функций в виде ряда. Нетрудно заметить, что z12 можно представить
тремя способами:
Z12 == z12. 1, z12 =:: z7 z5, z12 =:: z2 z lO,
следовательно, существуют три способа: 12 монет по 1 копейке, 7 монет
по 1 копейке и 1 монета в 5 копеек, 2 монеты по } копейке и 2 монеты
по 5 копеек.
До этоrо момента мы не использовали аппарат производящих функ
ций для решения друrих задач. Покажем на примерах, как можно
использовать этот аппарат для решения рекуррентных соотношений.
Пример 5.11. Решить рекуррентное соотношение
{ ао=::о;
1 }
а n == 2'anI + 2 n ' n }.
Найдем а n с использованием производящей функции
00
G(z) -== L anz n .
n==о
Для Э1'оrо обе части peKyppeHTHoro соотношения
} 1
а n == 2'anI + 2"
УМНQiКим на Zn И просуммируем при } п 00, получаем
00 100 ОС}
Lan z " == 2' LanIZn + L 2 " zn.
n==1 n==I ,,==1
Поскольку ао == о, то
ос ос
l:anZ n == Lanzn =:: G(z).
7.==1 n==О
ос
Преобразуем L anIZn, имеем
"==!
00 00 00
Lan!Zn =:: Lanzn+1 =:: Z Lanzn == zG(z),
n== 1 ,,o n==о
00 00 1
L dn z" == L () n == . 1 == z 2
n==I ,,==1 2
как сумма rеометрической проrрессии. Torдa для определения G(z)
имеем
} z
G(z) == zG(z) .
2 z2
146
fл. 5. Специальные 2лавы теории рекурсии
Следовательно,
2z
G(z) == (z 2)2 '
1
Для элемента р ной Д р оби 2 ' соrласно ( 5.2.J\' последовательность
(z 2) . " . .. .
(Ьо, b 1 , '" ,Ь n , ...) имеет вид
1 \ n + 1
Ь n == 2n+2 с n + \ == 2n+2 '
Поскольку умно>кение на z сдвиrает последоваtеЛЬНОСfQ на единицу
вправо, то мы получаем при n ;) 1
n
а n == 2Ьn\ == 2 n '
Отметим, что поскольку ао == о, то эта формула верна и при n == о.
Следовательно, при n ;) О
n
а n == 2 n '
Пример 5.12. Решить рекуррентное соотношение
{ ао ==0; а] == 1;
а n == anl aп2 + :2 n +, n;) 2.
Введем производящую функцию
00
G(z) == Lanzn.
n=О
Обе части peKyppeHTHoro соотношения умножим на Zn И просуммируем
при 2 n < 00.
ос з ОО I ОС g()() зОС
L anz r! == 4' L anlZn '8 L an2Zn + З2 L nz n + '8 L zn.
n=2 п=2 n=2 п=2 п=2
Заметим, что
ос ос
L anz n == L anz r! ао a\z == G(z) z;
n=2 п=О
00 ос 00
L anIZr! == L anz n +\ == L anz n + 1 aoz == zG(z);
,,=2 n=1 n=О
ос 00
L an2Zn == L a n z n + 2 == z 2 G(z);
,,=2 n=О
2. ПроиЗ80дящие функции
147
nzn == z nzn} == z (zn) == Z С z ) == (3 Z2 ;
00 2
"Zn ==.
6 1 z
n=о2
Для определения функции G(z) имеем уравнение
3 1 2 9(z3 2z2) 3z2
G(z) z == 4'zG(z) s z G(z) 32(1 z)2 + 8(1 z) '
Torдa
G z) == llz3 34z2 + 32z' == l1z3 34z2 + 32z .
( 4(z 1)2(z2 6z + 8) 4(z 1)2(z 2)(z 4)
Разложим это выражение на элементарные дроби:
l1z3 34z 2 + 32z А В С D
(z 1)2(z2)(z4) == (z 1)2 + z 1 + z2 + z4 .
Определяем коэффициенты:
11z3 34z2 + 32z == A(z 2)(z 4) + B(z l)(z 2)(z 4)+
+ C(z 1)2(z 4) + D(z 1)2(z 2).
Приравнивая коэффициенты при одинаковых степенях z, получаем
...
{ B+O+D== 11;
А 7 В 60 4D == 34;
6А + 15В + 90 + 5D == 32;
8А 12В 40 2D == о.
Часть коэффициентов определим независимым путем. Полаrая после
довательно z == 1, z == 2, и z == 4, получаем 3А == 9, н А == 3; 2C ==
== 16, и О == 8; 18п == 288, следовательно D == 16, Torдa В == 3, Н,
окончательно
3 3 2 4
G(z) == 4(z 1)2 + 4(z 1) z 2 + z 4 '
Используя (5.2.1), получаем
3 3 ( 1 ) n ( I ) n 3 1 1
а n == 4'(n + 1) 4' + 2 4' == 4'n + 2 n 4n .
Пример 5.13. Числа Фибоначчи MorYT быть заданы как рекурсив
нан последовательность вида
{ ао==о, a}==I;
а n == anI + an2, n 2.
148
[Л. 5. Специалы-/.ые zлавы теории рекурсии
Введем производящую функцию
00
G(z) == L anz "
пO
Обе части peKyppeHTHoro соотношения умножим на Zn И просуммируем
при 2 ::( n < 00:
00 00 00
L anz" == L anlZn + L an2Zn,
n2 n2 n2
имеем
00 00
L anz n == L anz n аО a,z == G(z) Z,
n2 nO
00 00 00 00
L anlZn == L a"zn+l == L anz,,+l aoz == z L anz n == zG(z),
n2 nl nO nO
00 00
L an2Zn == L a n z"+2 == z 2 G(z).
,,=2 nO
Получаем
G(z) z == zG(z) + z 2 G(z),
z
G(z) == 2 1
z + z
z
== =:::
(z 11V5 ) (z 12V5 )
Js ( Z + Z )'
тоrда, используя умножение на сопряженное выражение, имеем
1 ( 2" 2 n )
" == /5 (1 + /5)" (1 /5)" ==
== ( 1 + JБ ) " ( 1 JБ ) "
v's 2 J5 2
Пример 5.14. До данноrо момента с помощью аппарата произ
водящих функций мы исследовали линейные рекуррентные COOTHO
шения с постоянными коэффициентами. Покажем, что в отдельных
случаях производящие функции позволяют исследовать рекуррентные
2. Производящие функции
149
соотношения с переменными коэффициентами. Задана рекуррентная
последовательность вида
{ а О ==I;
а n == anl' п;;?: 1.
Введем производящую функцию
00
G(z) == 2:::anzn.
n==О
Обе части peKyppeHTHoro соотношения умножим на zn И просуммируем
при 1 п < 00:
00 00
" n "р n
anz == ;:;:anIZ .
n==l n==1
Имеем
00 00
Lanz n == Lanz n ао == G(z) 1,
n==1 n==О
00 CXJZ OOZ Z
L anIZn == Р L J anltпldt == Р L J antndt == Р J G(t)dt.
n==l n== 10 n==О О О
Для пределения G(z) получаем уравнение
z
G(z) 1 == Р J G(t)dt,
о
которое дифференцированием сводится к линейному однородному диф
ференциальному уравнению первоrо порядка
dG == рС
dz
с начальным условием С(О) == 1. Решая данное дифференциальное
уравнение, получаем G == e PZ . Нетрудно заметить, что
а n == ! Dn(G(z))lz==o == ! Dn(epZ)lz==o
рn
,.
п.
При мер 5.15. Задана рекуррентная последовательность вида
{ ао == О, аl == р;
р2
а n == п(п 1) an2,
п;;?: 2.
150
rл. 5. Специальные zлавы теории рекурсии
Введем производящую функцию
00
G(z) == L anz n .
пO
Обе части peKyppeHTHoro соотношения умножим на Zn И просуммируем
при 2 n < 00:
00 00 2
n р n
anz ==n(nl)an2Z.
n2 n2
Имеем
00 00
L anz n == L anz n аО alz == G(z) pz,
n=2 n=О
р2 n 2 р2 n+2
n(n l)an2Z p (n+2)(n+ l)a n z
n=2 nO
р' f,I n 1 t n + 1 dt р' f,I (l anUndU) dt р' 1 (I G(и)dи) dt
Для определения G(z) получаем уравнение
Дифференцируя это уравнение два раза по z,
альное уравнение
а(,) Р' р' 1 (I G(и)d и ) dt.
получаем дифференцj
d 2 G 2с
dz 2 Р
с начальными условиями
С(О) == О, dG I р
dz z=O .
Полученное уравнение является линейным однородным дифферен l "
альным уравнением BToporo порядка с постоянными коэффициента
Ero общее решение имеет вид
G(z) == Ae Pz + BePz,
rде А и В произвольные постоянные. Используя начальные УСЛОВИ I
определяем значения произвольных постоянных. Выражение для пр
изводящей функции имеет вид
1 1
G(z) == 2ePz 2ePz == sh(pz) ,
2. Производящие функции
151
rде sh(x) == (е"' e"')/2 rиперболический синус. Дифференцируя
полученное выражение, получаем значения членов рекуррентной по
следовательности
рn n
an== 2 ,O(1».
n.
Отметим, что все четные члены последовательности равны нулю.
Пример 5.16. Задана рекуррентная последовательность вида
{ а О =::I;
nI+T
а n == n an 1, n 1.
Введем производящую функцию
.. 1'.
00
G(z) == L anz n .
n==О
Обе чаСТIf'-рекуррентноrо отношения умножим на zn И прос-уммируем
при 1 n < 00, в итоrе получаем:
"
00 ос
""' n ,,", nI+T n
6 anz == 6 n anIZ.
n==1 n==1
Имеем
""
00 00
L anz n == L anz n ао == G(z) 1,
п== I n==О
Z
"пI+T n ""' n ( ) ""' ! n I d
6 п anIZ == 6 anIZ + r 1 6 anlt t ==
"' n==1 п==1 О
(XJ OOZ Z
== Z L anz n + (т 1) L I antndt == zG(z) + (т 1) I G(t)dt.
n пo О
Для определения G(z) получаем уравнение
z
G(z) 1 == zG(z) + (т 1) I G(t)dt,
Q
которое дифференцированием сводится к линейному однородному диф
фсрснциальному уравнению первоrо порядка
dG
(1 z) == тС
dz
152
rл. 5. Специальные zлавы теории рекурсии
с начальным условием С(О) == 1. Решая данное дифференциальное
уравнение методом разделения переменных,
dG r
G == 1 z dz;
G z
f t == f lrtt ; lnG == rln(1 z),
1 О
получаем
1
G(z) == (1 z)r '
Значения членов последовательности предлаrаем читателям найти ca
мостоятельно.
3. Методы исчисления конечных сумм
Понятия и обозначения. Понятие суммы часто встречается в Ma
тематике, практике проrраммирования и анализе алrоритмов, в том
числе рекурсивных. Мы опишем кратко некоторые основные методы,
которые используются при их исследовании и оценке, но вначале Ha
помним некоторые основные понятия и обозначения. Речь будем вести
о конечных суммах общеrо вида:
а1 +а2+...+ а n,
rде ak слаrаемое суммы с номером k есть некоторым образом опре
деленное число. Каждый элемент суммы ak называется ее членом. При
этом предполаrается, что он определяется по не которому достаточно
очевидному правилу, например, вычисляется как некоторая заданная
функция aprYMeHTa k, т. е. ak == f (k). В качестве примера приведем
следующие суммы:
1+4+...+п 2 ,
1 1
1 + '4 + ... + п2 '
для первой суммы f(k) == k 2 , а для второй f(k) == .
k
Запись суммы с использованием мноrоточия распространена в ли.
тературе, она наrлядна, поскольку позволяет при наличии минимально
ro воображения мысленно дополнить недостающие слаrаемые, однако
обладает некоторыми недостатками. Вопервых, эта запись rромоздка,
а BOBTOpЫX, не всеrда допускает однозначное толкование. Поэтому при
3. Методы исчисл.ения конечных сумм
153
более cTporoM подходе используются друrие обозначения, общеприня
тыми являются следующие:
n
Lak,
k=1
или
L ak.
Ikn
(5.3.1)
Данное обозначение суммы введено в математику Жозефом Фурье
в 1820 rоду и называется сиrмаобозначением. Отметим, что коrда мы
пишем сумму вида (5.3.1), то предполаrаются два момента. Первый
существует сравнительно простое правило вычисления членов суммы
ak по известному номеру k. Второй нас интересует достаточно боль
шое множество возможных значений n. Например, если нам требуется
только найти сумму 1 + 2 + 3 + 4 + 5, то нет смысла писать 1 + 2 +
5
+ ... + 5 или тем более :Е k, а необходимо сразу написать 1 + 2 + 3 +
k=1
+4+5 == 15.
Как мы уже отмечали, каждую конечную сумму можно рассматри
вать как рекурсивно заданную последовательность. Поэтому все MeTO
ды, применяемые к исследованию рекурсивно заданных последователь
ностей, MorYT быть перенесены на исследование конечных сумм. С дpy
rой стороны, при исследовании конечных сумм существуют и свои
собственные методы, а само исследование асимптотики рекурсивно
заданных последовательностей приводит к необходимости получения
оценак некоторых сумм.
Прежде чем перейти к дальнейшему материалу, при ведем две «клас
сические» суммы суммы арифметической и rеометрической проrрес
сий. Сумма арифметической проrрессии это сумма вида
n (n1)п
L (а + (k 1) . d) == па + 2 d,
k=1
а сумма rеометрической проrрессии это сумма вида
n n 1
'"' k I q
6aq ==a.
k=1 q
Сами эти формулы мы получим ниже.
Цели, которые ставятся при исследовании конечных сумм, во MHO
rOM аналоrичны целям, возникающим при исследовании рекурсивно
38данных последовательностей. Эти цели сформулированы ранее и нет
lIеобходимости их повторять.
n
Пример 5.11. Исследовать сумму вида S(n) == :Е k 3 .
j,1
154
rл. 5. Специальные zлавы теории рекурсии
n
Получим оценку Обольшое для суммы S(n) == L k 3 . Очевидно,
k1
что для всех 1 k n справедливо k 3 n 3 , Torдa получаем
n n
S(n) == Lk3 L n3 == n 4 .
k\ kl
Этот результат позволяет сделать вывод, что
n
S (n) == L k 3 == О (п 4) .
k1
Используя метод математической индукции, попытаемся доказать, что
функция 9 (n) == n 4 является асимптотически точной оценкой дЛЯ CYM
мы
n
S (n) == L k 3 ,
kl
Т.е. S(n) == е (n 4 ).
Суть метода состоит в том, что мы «уrадываем» решение, проверяем
ero правильность при n == 1, и, считая, что результат верен при n > 1,
доказываем ero для n + 1. Для этоrо, в соответствии с определением
оценки е, требуется найти такое значение константы Сl и такое значе
ние по, что при всех n > по выполнено
n
S(n) == Lk3 Cln 4 .
kl
(5.3.2)
Не будем конкретизировать значение С[. Сам метод позволит дать
оценку этому числу. Пусть для HeKoToporo значения n выполнено
условие (5.3.2). Требуется так подобрать Cl, чтобы для всех n > по
было выполнено неравенство
n+[
S(n+ 1) == Lk3 С[ (n+ 1)4.
kl
Проведем следующую цепочку рассуждений. Имеем
(5.3.3)
'n+l n
S(n+ 1) == Lk3 == L k3 +(n+ 1)3 ==
k1 k1
== S(n) + (n + 1)3 cln 4 + (n + 1)3.
Если нам удастся подобрать такое значение С\, ЧТО
с[п 4 + (n + 1)3 Сl (n + 1)4
(5.3.4 )
3. Методы исчисления конечных сумм
155
при всех значениях n, то заведомо будет выполнено неравенство (5.3.3),
которое нам и требуется доказать. Тоrда для определения Сl имеем
неравенство (5.3.4), преобразуя которое, получаем
3 ( 4 4 ) (n + 1)3
(n+l) Cl (n+l) n , С\"' 4n 3 +бn 2 +4n+l '
Заметим, что для всех n 1 выполнено
(п+ 1)3 n 3 1
>
4n 3 + бn 2 + 4n + 1 4n 3 + бn 3 + 4n 3 + n 3 15'
1 I
тоrда выберем Сl == 15' очевидно, что S (1) == 13 1514, следовательно,
мы можем утверждать, что при всех n 1 выполнено
n
'\;'" 3 1 4
S(n) == k 15n .
k=ol
Ранее мы показали, что при всех n 1 выполнено S (n) п 4 , сле
довательно, при значениях С\ == 1/15, С2 == 1 получаем с\n 4 S (n) :::;
:::; С2n4, что влечет S(n) == е (n 4 ) , и функция g(n) == n 4 является
асимптотически точной оценкой для функции S (n).
Теперь попытаемся найти эквивалентную оценку исследуемой CYM
мы, используя метод сравнения с определенным интеrралом. Заметим,
что при k 1 выполнены очевидные неравенства
k k+l
J х 3 dx < k 3 < J х 3 dx,
kl k
'"
Torдa
n n
S(n) == L k3 > J x 3 dx == n4,
k=ol О
но друrой стороны
n n+l
S(n) == Lk3 < J x 3 dx == (n+ 1)4 1).
k1 1 . ;
I
Покажем, что функция [} (n) == 4n4 эквивалентна S (n) при больших n.
Имеем ( 4 )
S(n) (1/4) (n+I)1
1 :::; (1/4) n 4 :::; (1/4) n4 '
(1/4) (n + 1)4 1) . (1 -+ 1/n)4 1/n4
J!... (1(4) n 4 nl.:. 1 1.
156
rл. 5. Специальные zлавы теории рекурсии
Из полученноrо результата следует, что
. ( s (n) )
nl.:. (1/4) n 4 == 1,
n 1
S (n) == L k 3 rv 4n 4 .
kl
И, наконец, найдем точное значение исследуемой суммы. Для этоrо
воспользуемся методом математической индукции и следующими сооб-
ражениями. Ранее мы показали уже один способ отыскания этой сум-
мы, используя методы решения линейных рекуррентных отношений.
Теперь используем друrой прием. В силу полученных выше оценок по
пытаемся искать значение суммы в виде мноrочлена четвертой степени
от n, т. е. в виде
и, следовательно,
s (n) == Аn 4 + Вn 3 + сn 2 + Dn + Е.
Поскольку S (1) == 1 базис индукции, то имеем
A+B+C+D+E== 1.
Пусть S (n) имеет вид (5.З.5) предположение индукции, Torдa
(5.З.5)
s (n + 1) == А (n + 1)4 + в (n + 1)3 + С (n + 1)2 + D (n + 1) + Е,
с друrой стороны,
В(n+ 1) == В(n) + (n+ 1)3. (5.З.6)
Тоrда, подставляя в (5.З.6) значение S (п) из формулы (5.З.5), имеем
равенство
Ап 4 + Вn 3 + сn 2 + Dn + Е + (n + 1)3 ==
== А(n+ 1)4 +В(n+ 1)3 +С(n+ 1)2 +D(n+ 1) +Е,
которое должно выполняться для всех значений n. Приравнивая KO
эффициенты при одинаковых степенях п, получаем систему уравнений
для определения коэффициентов А, В, С, D:
{ 4А == 1;
6А + ЗВ == з;
4А + ЗВ + 2С == з;
A+B+C+D==I.
1 1 1
Решая эту систему, получаем А == 4' в == 2' С == 2' D == О. Зная коэф-
фициенты А, В, С, D, из уравнения
':T
!
A+B+C+D+E==1
3. Методы исчисления конечных сумм
157
находим, что Е == О, и, подставляя значения коэффициентов в (5.З.5),
имеем
8( ) J... 4 3 2 n2(n+l)2
n L..., k 3 4 n + 2 n + 4 n 4
k1
Теперь напомним некоторые основные свойства конечных сумм.
Первое это то, что конечные суммы допускают любую перестаноl3КУ
слаrаемых. Второй важный факт это свойство линейности конечной
суммы. Математически это записывается следующим образом:
n
n
n
I: (cak + dbk) == с I: ak+dI: b k "
k1 kl k1
Приведем пример вычисления значения суммы с использованием YKa
занных свойств. Отметим, что в математике активно используются три
приема доказательств: 1) тождественное преобразование выражений;
2) прибавление выражения, paBHoro нулю; З) умножение на выражение,
равное единице. Эти приемы мы будем в дальнейшем активно исполь
зовать.
Пример 5.18. Найти функциональную зависимость 8 (n) дЛЯ CYM
мы
n 1
8(n) == I: k(k 2) "
kl +
Нетрудно вычислить первые два значения 8 (n)
1 1 1 11
8(1) == 3; 8(2) == 3 + 8' == 24 "
Перепишем выражение для этой суммы несколько иначе и воспользу
емся свойством линейности, тоrда получаем
n ( 1 1 ) 1 n 1 1 n 1
8(n)==L 2k 2(k+2) ==2Lk2L k+2 "
k1 k1 k1
Введем обозначения для сумм в правой части
n 1
U(n) == L k'
k1
n 1
V(n) == L k+2 '
kJ
и исследуем вторую сумму V (n). Для ее исследования удобно
I I 1 1
прибавить ноль, записанный в следующем виде: О == Т + 2 Т 2'
тоrда имеем
n 111 n 111
V (п) == k + 2 == Т + 2 + k + 2 Т 2 ==
n+2 1 1 1 n 1 1 1 1 1
== k Т 2 == k + n+ 1 + n+2 Т 2'
158
Тл. 5. Специальные zлавы теории рекурсии
следовательно,
1 1 1 1
V(n) == U(n) + + ,
n+l n+2 1 2
тоrда
1 1 ( 1 1 1 1 )
S(n) == (U(n)V(n))== U(n) U(n) + + .
2 2 n+l n+2 1 2
Получаем, что при n 3
311
S(n) == '4 2(n+ 1) 2(n+2) '
Пример 5.19. В качестве еще одноrо примера вычислим сумму
rеометрической проrрессии. Преобразуем ее к виду
ппп
S (n) == L aqkl == а + L aqkl == а + q L aqk2 ==
kl k2 k2
== а + ( q t aqk2 + a qn ) aqn
k2
(мы прибавили ноль, записанный в виде О == aqn aqn), далее получа
ем
S (n) == а + q ( t aqk2 + aqnl ) aqn ==
k2
== а + q ( aqk2 ) aqn == а (1 q) + q ( t aqkl ) .
k2 k1
Так как
n
L aqkl == S (n),
kl
то для определения суммы S (n) мы получили уравнение
:{
S (n) == а (1 qn) + qS (n),
решая которое, получаем искомый результат:
" ,,
n n 1
S(n) == Laqkl == a q 1 .
k1 q
Пример 5.20. Доказать методом математической индукции форм
лу суммы арифметической проrрессии .
;;"\j'
;}
n (n1)n
L (а + (k 1) d) == па + 2 d.
kl
1
j 1
3. Методы исчисления конечных сумм
159
Обозначим через
n
В(п) == L(a+(k l)d).
k\
При п == 1 справедливость данной формулы очевидна. Предположим,
что она верна для HeKoToporo значения п, тоrда для значения (n + 1)
имеем
n+\ n
S (n + 1) == L (а + (k 1) d) == L (а + (k 1) d) + а + nd ==
kl kl
== В(п) +a+nd.
Поскольку
(nl)n
В(n)==nа+ 2 d,
то
'/--1
. (nl)n n(n+l) .
S (n + 1) == па + 2 d + а + nd == (n + 1) а + 2 d,
что и требовалось доказать.
Пример 5.21. Вычислить сумму вида
n
В(n) == Lk3 k .
k\
ИСпользование операции дифференцирования непрерывных функ
ций иноrда также оказывается полезным для вычисления сумм. По
кажем это на предложенном примере. Вначале «усложним,) задачу.
Вместо данной суммы рассмотрим функцию
(5.3.7)
n
f(x) == Lkx k ,
k\
Torдa интересующая нас сумма есть просто значение указанной выше
n
функции В точке х == 3. т. е. I: kз k == f (3).
k\
Проведем некоторые преобразования, которые в конечном итоrе
позволят найти данную сумму.
n d ( n )
f(x) ==xLkxkl ==x dx Lx k .
kl k\
Сумма в скобках является суммой rеометрической проrрессии и может
быть леrко вычислена
ппп 1 n+ 1
'" k '" k 1 Х Х Х
x == x.x ==x == .
k\ k1 Х 1 х 1
160
Fл. 5. Специальные zлавы теории рекурсии
Вычисляя производную, имеем
d (xk)
nхn+l (n+ 1)х n + 1
2
(x 1)
Таким образом,
1 (х) == t kxk == Х nхn+l (n + 12) х n + 1 ,
k I (х 1)
(5.3.8)
и, следовательно, подставляя значение х == 3, окончательно получаем
n
LkЗ k == 1(3) == (nз n + 1 (n+ 1)3 n + 1).
kl
Отметим, что полученный результат позволяет найти точные значения
сумм вида (5.3.7) с разными основаниями степени. Так, например,
сумма
n
s (n) == L k2 k == 1 (2) ',,1
kl ,
, j
которая встречается при анализе трудоемкости некоторых алrО Р ИТМОВ 1
может быть без труда получена на основе формулы (5.3.8).
Пример 5.22. Получить асимптотическую оценку для суммы
n k
И ( п ) == '" 2kl.
k+l .
kl .
Для построения асимптотических оценок сумм бывает полезен метод
почленноrо сравнения. Отметим также, что при построении асимп
тотических оценок мы можем пренебреrать любым конечным числом
слаrаемых. Метод почленных сравнений основан на следующем факте.
Пусть имеются две конечные суммы
n
n
V(n)==Lbk,
kl
U(n) == Lak,
kl
при этом для всех значений k выполнено условие ak b k . Тоrда мож.
но утверждать, что И (n) V (n). Этот факт удобен для построения
асимптотических оценок. При этом для сравнения с заданной суммой
выбирается такая сумма, значение которой или ее асимптотическая
оценка известны.
Для решения данноrо при мера выберем для сравнения rеометриче
скую проrрессию
n
V(n) == L2kl,
kl
сумма которой известна и равна
3. Методы исчисления конечных сумм
161
v (n) == 2 n 1.
k
Поскольку k+ 1 < 1, то И (п) :::; V (n) == 2 n 1, и можно утверждать,
что
U(n)==О(2 n ).
Пример 5.23. Исследовать сумму rармоническоrо ряда с целью
получения асимптотической оценки. rармонический ряд задается фор
мулой
n 1
S(n) == L k.
k=l
Метод сравнения с определенным интеrралом еще один полезный
прием построения асимптотических оценок. Этот прием удобно при
менять для исследования сумм, слаrаемые которых имеют вид ak ==
-== f (k), и при этом функция действительной переменной у == f (х)
неотрицательна и монотонна для положительных значений переменной
:1".
Если функция у == f (х) не убывает, то нетрудно видеть, что
.,.
k+l
ak:::; f f(x)dx
k
k
И ak f f(x)dx,
kl
Torдa для значения суммы имеем следующие оценки:
n+1
S (n):::; f f (х) dx
I
n
И S (п) al + f f (х) dx.
1
Если функция у == f (х) не возрастает, то нетрудно видеть, что
k+1
ak f f(x)dx
k
I! Torдa для функции S (n) имеем
S (n) nJl f (х) dx
1
k
И ak:::; f f (х) (lх,
kl
и
n
S(n):::; аl + f f(x)dx.
I
1
В данном при мере для сравнения рассмотрим функцию f (х) == ,
х
I\IJторая монотонно убывает при положительных значениях aprYMeHTa.
162
rл. 5. СnециалЬНblеела8bl теории pekypcuu
Имеем
n+l n
f dx S (п) 1 + f dx,
1 1
следовательно,
ln (п + 1) S (п) 1 + ln (п) .
Из данноrо неравенства леrко показать, что S (п) '" ln (п). Отметим,
что можно доказать и более сильное утверждение, а именно, что
S (п) == ln ( п) + О ( 1) .
Пример 5.24. Применить метод сравнения с определенным инте-
rралом для исследования суммы
n
В(п) == L1nk.
k=l
Поскольку функция у == ln х монотонно возрастает при положитеJJЬНЫХ
значениях aprYMeHTa. то имеют место следующие оценки ДJJЯ данной
суммы:
n n n+l
J lnxdx < Llnk < J lnxdx,
1 1 1
ПОСКОJJЬКУ J ln х dx == х ln х х, то ПОJJучаем СJJедующую оценку суммы
n
п ln п п < L ln k < (п + 1) ln( п + 1) (п + 1).
k=1
ПОJJученная оценка ПОЗВОJJяет сделать вывод, что
n.
L ln k '" п ln п.
k=l
В качестве ПРИJJожения к полученному соотношению получим оценку
значения п!. Поскольку
п! == е 1n (n!) == ехр { t ln k } ,
k=1
то
п n (п + 1)n+l
< п! < +1
е n е n
Отметим, что в литературе существуют и более точные оценки
значения п!.
Пример 5.25. Доказать, что
n 1
L k 2 == 0(1).
'1
4. Функция fЗl (п) и друеие специальные функции
163
Для этоrо требуется доказать, что найдется значение с такое, что
n 1
L k 2 c
k==1
для всех значений п. Рассмотрим функцию f (х) == , которая MOHO
х
тонно убывает при положительных значениях aprYMeHTa. Torдa
n
n 1 f 1 1 1
L k 2 1 + х 2 dx == 1 ;, + 1 == 2 ;;: 2,
k==1 1
что И требовалось доказать.
Мы рассмотрели некоторые методы оценки и исчисления конечных
сумм, которые MorYT быть полезны для исследования и анализа peKYP
сивных алrоритмов. Отметим, что дальнейшим обобщением исчисле
ния конечных сумм является рассмотрение бесконечных сумм вида
00
Lak,
k==1
которые наЗЪ1ваются рядами, являющимися предметом специальных
разделов классическоrо курса математическоrо анализа.
4. Функция fЗl (n) и друrие специальные функции
Некоторые функции довольно часто встречаются при исследовании
вопросов трудоемкости алrоритмов. Первая, которую мы рассмотрим
функция /31 (n), означающая количество единиц в двоичном представ
лении числа n. Рекурсивное задание такой функции не представляет
существенных трудностей:
{ /31(0) == о; /31(2n) == /31(n);
/31(2n + 1) == /31 (2n) + 1.
Но, с друrой стороны, ее аналитическое представление вряд ли воз
можно какимилибо простым и соотношениями. Отметим, что функ
ция /31 (n) не является монотонно возрастающей функцией, поскольку
/31 (п) == 1 для всех n == 2 k , а для n == 2 k 1 значение функции /31 (п) ==
== k. Точечный rрафик функции /31 (п) для начальных значений п
представлен на рис. 5.1.
Следующая функция /30(п), значением которой является количе
ство нулей в двоичном представлении числа п. Рекурсивное задание
такой функции имеет вид
{ /30(0) == 1; fЗо(2п) == fЗо(п) + 1;
/30(2п + 1) == /30(2п).
164 rл. 5. Специальные zлавы теории рекурсии
3 .
2 . . . .
/31(n) 1 . . . .
о 1 2 3 4 5 6 7 8 9
п
Рис. 5.1. Значения функции (31 (п) для значений п == 1, 2,...,9
Отметим, что функция /30 (п) также не является монотонно возрастаю
щей функцией, так как /30 (п) == о для всех п == 2 k 1.
Следующая функция /3 (п), которая определена для целоrо по
ложительноrо п, и /3 (п) есть количество значащих бит в двоичном
представлении целоrо числа п. Отметим, что функция /3 (п) может быть
задана аналитически в виде
/3 (п) == [log2 (п)] + 1,
rде [z] целая часть z, п > О.
Укажем некоторые соотношения между этими функциями. В силу
определения r-J 1 (п) справедливо неравенство
1 /31 (п) /3(п) ,
а для любоrо п > О справедливо соотношение
/3 (п) == /30 (п) + /3, (п).
в целях анализа рекурсивных алrоритмов представляет та кже ин
терес определение среднеrо значения функции /3, (п) для п == О, 1, N,
rде N == 2 k 1 (т. е. если двоичное представление числа п занимает не
более k двоичных разрядов), обозначим ero через r-J s (N), Torдa
1 N
/3в (N) == N + 1 L /31 (т).
тO
Поскольку количество чисел, имеющих 1 единиц в k разрядах, равно
количеству сочетаний из 1 по k, то
N k k k1
L /31 (т) == L l cL == L 1 Ck-=-11 == k L CL1 == k2kl.
тO [1 [1 [o
Поскольку N == 2 k 1, получаем
1 N k 2k 1
/3в (N) == N + 1 L /31 (т) == 2 k 1 + 1
т()
k log2 (N + 1)
2 2
fЗ (N)
2
4. Функция (3\ (п) и друсие специальные функции
165
Следующая функция, которая достаточно часто используется при aHa
лизе различных алrоритмов это сумма rаР:VlOническоrо ряда, которая
обычно обозначается как Н п , т. е.
п 1
Н п == L k'
k=1
Отметим, что при больших значениях п имеет место асимптотическое
представление
Н п == ln п + 'у + 2 + о ( 2 ) ,
rде 'у == 0,5772... постоянная Эйлера.
При анализе комбинаторных соотношений возникают биномиаль
ные коэффициенты. Хорошо известная формула вычисления биноми
альных коэффициентов
k n!
Сп == k!(n k)!
обобщается на случай не обязательно целых значений п == т выраже
нием
С(т; О) == О,
С ( Т" k ) == тет 1)(7' 2)... (т k + 1)
, k! '
k> 1.
Пос.цедовательность С(т; k) может быть задана рекуррентным COOTHO
шением
{ С(т; О) == 1,
Tk
С(т; k + 1) == С(т; k) k + 1 '
k О.
IIроизводящая функция G(z), соответствующая данной последователь
ности, имеет БИД G(z) == (1 + z)r.
Еще один вид специальных чисел, иноrда возникающих при анализе
алrоритмов это числа Стирлинrа первоrо и BToporo рода. Числа
Стирлинrа пepBoro рода s$,k) представляют собой коэффициенты раз
ложения факториальноrо мноrочлена степени n вида
х(х 1 )(х 2) '" (х п + 1)
110 степеням х, т. е. факториальный мноrочлен представляется Б Биде
суммы
n
x(X'.I)(x2)...(x'n+ 1) -== LSYk)xk.
k=O
Если числа Стирлинrа первоrо рода доопределить соотношением Sk n )
О при k > п и k О, то они MorYT быть заданы рекуррентным
]
166
Fл. 5. Специальные zлавы теории рекурсии
соотношением
{ sf') == 1; Sfk) == О, k =1- 1;
S(k) == S(kl) nS(k)
n+! n n .
Числа Стирлинrа BToporo рода (}'k) представляют собой коэффициенты
разложения мноrочлена х n по факториальным мноrочленам
х(х l)(х 2)... (х k + 1),
то есть имеет место представление вида
n
х n == L.(}'k)x(x l)(х 2)... (х k + 1).
kO
Если числа Стирлинrа BToporo рода доопределить соотношением (}'n) ==
== О при k > n и k О, то они MorYT быть заданы рекуррентным
соотношением
{ (}';I) == 1; (}';k) == О, k =1- 1;
(}'(k) == (}'(kl) + k(}'(k)
n+1 n n .
5. Комбинаторные соотношения и их связь
с рекурсивными алrоритмами
Ряд известных комбинаторных тождеств и соотношений использу
ется при анализе рекурсивных алrоритмов (см. rлаву 7). Мы дeMOH
стрируем эти тождества и соотношения на при мерах.
При мер 5.26. Начнем с простейшеrо комбинаторноrо тождества
для биномиальных коэффициентов
C k C k C kl
n+! == n + n .
Пока мы оrраничиваемся целыми значениями n и k. В дальнейшем мы
будем использовать расширенную трактовку биномиальных коэффици
ентов, поэтому будем их обозначать С(n; k), rде
k n!
С (n; k) == СП == k!(n k)!
при О k n и С(п; k)==O в противном случае. Изначальная TpaK
товка С(п; k) это число подмножеств, содержащих k элементов,
на множестве, состоящем из n элементов. В этой трактовке очевидно,
что С(I; О) == 1, С(I; 1) == 1 и С(п; k) == О для остальных значений k.
Предположим, что для HeKoToporo значения п мы знаем все значения
С(п; k).
Попытаемся теперь определить С(п + 1; k). Будем рассматривать
(,старое,) множество, содержащее п элементов, и (,новое», в котором
добавлен один элемент. Тоrда можно определить С(п + 1; k) как
число подмножеств, содержащих k элементов на ('новом') множестве.
5. Комбинаторные соотношения и рекурсивные алzоритмы 167
Вопервых, остаются все подмножества, содержащие k элементов «CTa
poro» множества, и их число равно С(п; k). BOBTOpЫX, можно образо
вать подмножества, содержащие k элемснтов, если взять подмножества
«cTaporo>} множества, содержащие k 1 элемент и к ним добавить
«новый» элемент. Число таких подмножеств равно С(п; k 1). Таким
образом, для определсния С(п; k) получаем рекуррентное соотношенис
С(п + 1; k) == С(п; k) + С(п; k 1)
при п 1.
При мер 5.27. В условиях предыдущеrо при мера будем считать, что
мы сумели определить все значения C(i; k) для всех k и для всех
значений i < п, rде п 2. Задача состоит в том, чтобы определить
значение С(п; k).
Поступим следующим образом. Разобьем произвольным образом
данное исходное множество на два множества. Причем первое MHO
жество будет содержать т элементов, а второе п т элементов, [де
1 ( тn < п. Тоща подмножество, содержащее k элсментов на исходном
множестве, можно образовать так. Возьмем подмножество, содержащее
j ЭJlементов в первом множестве, их число равно С(-т; Л, и объединим
ero с подмножеством, содержащим k j элементов BToporo множе
ства их число равно С(п т; k Л. Следовательно, число таких
подмножеств равно С(т; ЛС(п т; k Л. Суммируя по j, получаем
рекуррентное соотношение для определения С(п; k):
...
k
С(п; k) == L С(т; ЛС(п т; k Л.
jO
Это соотношение эквивалентно правилу свертки Вандермонда, полу
'JeHHoMY ранее с помощью аппарата теории производящих функций.
Пример 5.28. Рассмотрим следующую схему движения. В единицу
времени частица сдвиrается либо на единицу вверх, либо на единицу
вправо. То есть в каждый момент времени положение точки можно
охарактеризовать парой координат (р; q), rAe р и q целые неотрица
тельные числа. При этом имеются оrраничения на их значения р ( т,
q ( п. Тоща за промежуток времени тn + п, считая, что в начальный
момент р == О, q == О, частица придет в положение р == т, q == п.
Bcero существует С;;+т различных траекторий движения. Попробуем
подсчитать количество траекторий друrим способом. Будем различать
траектории по первому выходу на верхний уровень в точку (i; п), rде
О ( i ( т. Для О (i (т количество таких траекторий равно CI+i'
Тоща получаем следующее равснство:
m
L C J +i == С:;,'+т'
]
168
rл. 5. Специальные zлавы теории рекурсии
Заменяя п на п + 1, получаем известное биномиальное тождество
m
L C+; == С:;'+т+ 1 .
iO
Пример 5.29. Известно биномиальное тождеств<?,
n
LC(k; т) == С(п+ 1; т+ 1).
kO
Покажем простой способ получения этоrо тождества с использованием
аппарата про изводящих функций. Рассмотрим производящую функцию
n
G(z) == L (1 + z)k.
kO
n
Выражение 2: C(k; т) является членом с номером т последователь
kO
ности, соответствующей данной функции, поскольку коэффициенты
C(k; т) являются множителями в каждом слаrаемом при zm. Посколь
ку рассматриваемая сумма является суммой rеометрической проrрес
сии, то получаем
(l+z)n+ll
G(z) == .
z
Рассмотрим F(z) == zG(z) == (1 + z)n+1 1. Умножение на множитель
z сдвиrает соответствующую последовательность на единицу вправо.
Коэффициент при Zm+! леrко вычисляется и равен С (п + 1; т + 1),
следовательно
n
LC(k; т) ==С(п+ 1; т+ 1).
kO
При мер 5.30. Числа Каталана. Числа Катала на возникают в сле
дующей задаче. Рассматривается пространство 2пMepHЫX векторов
(Х!; Х2; ... ; Х2n), координаты которых MorYT принимать значения Xi ==
== :1:: 1. Нетрудно про верить, что общее число таких векторов равно 2 2n .
Среди данных векторов выделяется отдельный класс, удовлетворяю
щий условиям
k
LXi ) О для всех
i1
2n
1 :::; k :::; 2п 1, L Xi == О.
i1
Количество таких векторов, которое обозначается Сп, называется
числом Каталана. По опрсделению положим СО == О. Нетрудно прове
рить, что С 1 == 1, С 2 == 2.
Данной задаче можно дать и друrую интерпретацию. Рассмотрим
схему движения частицы, предложенную в примере 5.28. Положим
т == п и введем дополнительное оrраничение q :::; р. Тоrда количество
5. Комбинаторные соотношения и рекурсивные алzоритМbl 169
таких траекторий и будет равно числу Каталана <771' Попытаемся по
лучить рекуррентное соотношение для определения чисел Катала на.
Введем вспомоrательную величину Dn как число векторов, удовлетво
ряющих более сильным условиям
k
LXi > О для всех
i==]
1 k 2п 1,
271
LXi == О.
i==l
Рассмотрим вектор (х]; Х2; ... ;Х2n), удовлетворяющий условиям
2s1
L Xi > О для всех s, таких что 1 s т, и
i==1
2т
LXi == О.
i==]
Число таких векторов при m == п равно Dn, а для m < п равно
Dm<7nm' Суммируя по всем значениям, получаем
nl
<771 == Dn + L Dm<7nm'
т==1
у любоrо вектора (Х]; Х2; ... ;Х2n), удовлетворяющеrо условиям
k 271
L Xi > О для всех 1 k 2п 1, L Xi == О
i==1 i==]
первая координата обязательно равна + 1, а последняя 1. Если отбро
си1'Ь первую и последнюю координату, то мы обнаружим, что OCTaB
шийся вектор удовлетворяет тем условиям, которые были положены
при определении числа Катала на для пространства размерности 2(п
1). Число таких векторов равно <7n]. Следовательно, Dn == <7n].
Torдa имеем
"] nl
<771 == Dn + L Dm <7nт == <7n 1 + L <7т 1 <7nт ==
т==1 т==1
nl n
== <7nI<70 + L <7ml<7nm == L <7ml<7nm'
т==1 т==1
Мы получили рекуррентное соотношение для определения чисел KaTa
лана, которое запишем в виде
nl
<771 == L <7т <7nт 1.
т==О
Рассмотрим производящую функцию
00
G(z) == L<7 n Z n .
(\
170
rл. 5. Специальные zлавы теории рекурсии
Из peKyppeHTHoro соотношения получаем
cпzn C CmCnml) zn,
заменяя в правой части п 1 на п, имеем
Cnz n Z f; (cт Cnт) . zn.
Последнее соотношение преобразуется к виду
G(z) 1 == zG 2 (z),
решая которое, получаем
G(z) 21z (1 (1 4z)I/2) .
Разлаrая С( z) в ряд с использованием формулы для биномиальных
коэффициентов и выделяя коэффициент при zn, имеем
Сп 4(I)nC (4; п+ 1) .4 n .
После некоторых преобразований (предлаrаем их самостоятельно про
вести читателям) получаем
Сп I C2п'
п+
Задачи и упражнения к rлаве 5
5.1. Найти последовательности, соответствующие данным произво
дящим функциям G (z):
1
а) G(z) ;
4z
z
в) G(z) 2 ;
Z бz + 8
1
б) G(z) ==;
9 + z2
1
r) G(z)
(z 1)2(2z + 1)
5.2. С помощью производящих функций решить следующие peKYP
peHTHb { le аСОТ2?шения:
а) о ,
а n 3an 1 2п + 3, п > О.
{ а о 2' а ' 6'
б) , ,
а n 6an, 8an2 + 3п 2 23п + 36, п> 1.
5.3. Имеются числа 1, 2, 3, 4, 5. Сколькими способами, суммируя
эти числа, можно получить 6, если каждое слаrаемое можно использо-
вать не более одноrо раза? Порядок суммирования не иrрает роли.
Список литературы к zлаве 5
171
n
5.4. Найдите сумму Е (2п 2k).
k==l
n 1
5.5. Найдите сумму Е k (k 1) .
k==l +
n
5.6. Найдите точную асимптотическую оценку для суммы Е д.
k==l
n 1
5.7. Найдите точную асимптотическую оценку для суммы Е /Т .
k==1 У k
n 1
5.8. Покажите, что Е r.o == О (1).
k==1 У k 3
Список литературы к rлаве 5
5.1. Кормен Т, Лейзерсон Ч, Ривест Р. Алrоритмы: построение и анализ.
М.: МЦНМО, 1999. 960 с.
5.2. Трин Д., Кнут Д. Математические методы анализа алrоритмов. М.:
Мир, 1987. 120 с.
5.3. Андерсон Дж. Дискретная математика и комбинаторика: Пер. с анrл.
М.: Изд. дом «Вильяме». 2003. 960 с.
5.4. rрзхем Р., Кнут д., Паташник О. Конкретная математика. Основание
информатики: Пер. с анrл. М.: Мир, 1998. 703 с.
5.5. Хассарти Р. Дискретная математика для проrраммистов. М.: TeXHO
сфера, 2005. 400 с.
5.6. Ландо с.к. Лекции о производящих функциях. 2e изд., испр. М.:
",МЦНМО, 2004. 144 с.
5.7. Сачков В.Н Введение в комбинаторные методы дискретной математики.
М.: Наука. rлавная редакция физикоматематической литературы, 1982.
384 с.
[лава 6
МЕТОДЫ ТЕОРЕТИЧЕскоrо АНАЛИЗА
РЕСУРСНОЙ ЭФФЕКТИВНОСТИ РЕКУРСИВНЫХ
Алrоритмов
Введение. Формально первым этапом теоретическоrо анализа ak
rоритмов является введение модели вычислений, в базовых операциях
которой определяется функция трудоемкости. Предполаrая, что средой
реализации рекурсивных алrоритмов является процедурный язык BЫCO
Koro уровня, мы вводим такие базовые операции, предварительно опре
деляя объектный и алrоритмический базисы. Активное использование
рекурсивными алrоритмами области проrраммноrо стека и MHoroKpaT
ные рекурсивные обращения, порождающие дерево рекурсии, обуслав
ливают ряд специфических отличий анализа временной и емкостной
эффективности рекурсивных алrоритмов в сравнении с методами aHa
лиза итерационных алrоритмов. Мы описываем в этой rлаве в общем
виде два специальных метода анализа метод рекуррентных COOTHO
шений и метод подсчета вершин дерева рекурсии, при меры применения
которых приводятся в rлаве 7. Мы кратко останавливаемся также на
некоторых подходах к повышению ресурсной эффективности рекурсив
ных алrоритмов, основанных на исследовании деревьев рекурсии.
1. Базовые операции процедурноrо языка BbIcoKoro
уровня и методика анализа основных
алrоритмических конструкций
Объектный и алrоритмический базисы. Использование в каче
стве модели вычислений классических алrоритмических формализмов,
таких как машина Тьюринrа, машина Поста, нормальные алrорит
мы (алrорифмы) Маркова или схема алrоритмов Янова сопряжено
с трудностями преодоления «семантическоrо разрыва» между этими
моделями и языком реализации алrоритма. Наиболее близкой к реаль-
ному компьютеру является модель вычислений в виде машины с про
извольным доступом К памяти, для которой, тем не менее, необходим
также формальный переход к процедурному языку BbIcoKoro уровня.
Такой переход может быть основан на введении понятий объектноrо
и алrоритмическоrо базисов.
По отношению к процессу разработки алrоритма решения HeKO
торой задачи мы можем rоворить о существовании следующих трех
компонентов, определяющих базис модели вычислений [6.1]:
1. БаЗО8ые операции nроцедУРНО20 языка 8ЫСОКОсО уровня 173
множество объектов Е, над которыми производятся действия
алrоритма, включающее множество исходных объектов DA, множество
промежуточных объектов Dp и множество результатов D и :
Е==DлUDрUDR;
устройство, производящее действия над объектами (элементами
множества Е), процессор R механизм реализации;
конечное множество элементарных операций процессора R над
элементами множества Е множество С, отражающее из начально за
данную способность процессора R выполнять операции над объектами
в модели вычислений.
Все эти три компонента по отношению к процессу разработки
алrоритма решения задачи являются априорными, что влечет за собой
следующее определение объектноrо базиса [6.1]: объектным базисом
В н будем называть тройку, состоящую из множества объектов, про
цессора и множества выполняемых им элементарных операций:
в R == {Е, R, С}.
Таким образом, объектный базис ассоциирован с выбранной моделью
вычислений в части, определяющей трудоемкость алrоритма. Собствен
но процесс разработки алrоритма, являясь очевидно интеллектуаль
ным, состоит в определении конечной последовательности элементар
ных операций процессора R, приводящих за конечное время к реше
нию поставленной задачи. Необходимость записи алrоритма приводит
к в,ведению двух специальных систем обозначений, а именно:
системы обозначений для элементов множества элементарных
операций процессора R, заданной множеством S, дЛЯ элементов KOTO
poro установлено некоторое соответствие с элементами множества С
или ero оrраниченным подмножеством. Заметим, что для одной и той
же элементарной операции из С можно предложить несколько разных
обозначений. Например, операция «сложить» может быть обозначена
как «+» или «add». Одно из таких обозначений выбирается как преk
почтительное. Принципиально возможно установление соответствия
HeKoToporo обозначения и конечной последовательности операций объ
eKTHoro базиса;
системы обозначений для записи последовательности элементар
ных операций, более корректно для записи основных алrоритми
ческих конструкций (следование, ветвление, цикл) с использованием
операций управления из С, заданной множеством Т. Отметим, что
в реальной а.'Irоритмической практике используются различные систе
Ы обозначения последовательности действий.
Поскольку выбор систем обозначений операций и их последователь
ности не влияет на объектный базис, но определяет запись алrоритма,
нредлаrается следующее определение алrоритмическоrо базиса [6.1]:
llЛ20ритмическим базисом В л для заданноrо объектноrо базиса В р
будем называть двойку, включающую в себя конечное множество обо
174 rл. б. Методы анализа эффективности рекурсивных аморитмов
значений элементарных операций S и конечное множество обозначений
алrоритмических конструкций Т:
БА == { S, Т}.
Отметим, что поскольку алrоритмический базис есть только система
записи, не влияющая на существо (идею) алrоритма, то различные
алrоритмические базисы в этом смысле эквивалентны. Выбор Toro или
иноrо алrоритмическоrо базиса определяется в основном требованиями
наrлядности или удобочитаемости записи алrоритма.
По отнощению к функции трудоемкости понятие эквивалентности
базисов нуждается в уточнении. Это связано с количеством операций
принятой модели вычислений (объектноrо базиса), которому COOTBeT
ствует выбранное обозначение в алrоритмическом базисе. В этом смыс-
ле мы вправе потребовать, чтобы обозначение в алrоритмическом ба
зисе приводило не более чем к О( 1) операций в модели вычислений, не
зависящих от количества и значений входных данных. Будем rоворить,
что алrоритмический и объектный базисы по функции трудоемкости
0(1) эквивалентны, если
{ V S Е S : s с' С C k , k: k 1, k == 0(1) ;
V t Е Т: t с' С C k , k: k 1, k == О ( 1) .
Введенная О( 1) эквивалентность rарантирует, что если элементар
ные операции модели вычислений выполняются за единичное время, то
и операции алrоритмическоrо базиса будут выполняться за единичное
время с точностью до постоянноrо множителя. При этом алrоритм pe
шения некоторой задачи в объектном базисе {L:, R, С} представляет
собой записанную в алrоритмическом базисе {S, Т} конечную по
следовательность элементарных операций процессора R, приводящую
к решению поставленной задачи за конечное время.
Базовые операции в процедурном языке BbIcoKoro уровня. Пе-
реход от алrоритмическоrо базиса машины с произвольным доступом
к памяти к алrоритмическому базису процедурноrо языка BbIcoKoro
уровня связан с тем, что классический процедурный (императивный)
подход остается в настоящее время наиболее широко используемым
при проrраммной реализации алrоритмов. Практически значимые реа-
лизации вычислительных алrоритмов включают в себя обычно следу-
ющие проrраммные фраrменты:
диалоrовый или файловый ввод исходных данных;
про верка исходных данных на допустимость; ,:
собственно решение поставленной задачи;
представление (вывод) полученных результатов.
В рамках сравнительноrо анализа ресурсной эффективности вычис-
лительных алrоритмов мы можем считать, что фраrменты проrраммной
реализации, обслуживающие непосредственный алrоритм решения за
дачи, а именно фраrменты ввода, проверки и вывода, являются общими
/. Базовые операции nроцедурНОёО языка высокою уровня 175
или эквивалентными для разных алrоритмов решения данной задачи.
Такой подход приводит к необходимости сравнительноrо анализа толь
ко алrоритмов непосредственноrо решения задачи. При этом предпо
лаrается размещение исходных данных и результатов в «оперативной»
памяти, включая в это понятие как собственно оперативную память,
так и кэшпамять, реrистры и буферы реальноrо процессора. Таким
образом, множество элементарных операций, учитываемых в функции
трудоемкости, не включает операции ввода/вывода данных на внешние
носители.
Для алrоритмическоrо базиса формальноrо процедурноrо языка BЫ
cOKoro уровня такими базовыми операциями, коррелированными с oc
новными операциями языков процедурноrо проrраммирования, будем
считать следующие [6.2]:
простое присваивание: а (------- Ь;
одномерная индексация: а [i] : (адрес (а) + i. (длина элемента));
арифметические операции: {*, /' , + };
операции сравнения: а { <, >, ==, , } Ь;
лоrические операции: ([1) {or, and, not} ([2);
операции взятия содержимоrо по адресу (штрихоперация) и aд
ресации в сложных типах данных (nатеl.nате2);
операции обслуживания проrраммноrо стека.
По отношению к введенному набору базовых операций для алrорит
мическоrо базиса формальноrо процедурноrо языка BbIcoKoro уровня
необходимо сделать несколько замечаний:
опираясь на идеи CTPYKTypHoro проrраммирования, из набора
элементарных операций исключается команда перехода, поскольку ее
можно считать связанной с операцией сравнения в конструкции BeTB
ления или цикла по условию. Такое исключение оправдано запретом
использования оператора перехода на метку в идеолоrии CTPYKTypHoro
проrраммирования;
операции доступа к простым именованным ячейкам памяти счи
таются связанными с операциями, операнды которых они хранят;
операции индексации элементов массивов и сложной адресации
в типах данных вынесены в отдельные элементарные операции с целью
возможноrо соrласования временных оценок проrраммных реализаций;
конструкции циклов не рассматриваются, т. к. MorYT быть CBeдe
ны к указанному набору элементарных операций.
С учетом этих замечаний можно rоворить, что введенный алrо
ритмический базис является по трудоемкости 0(1) эквивалентным
:VIaшине с произвольным доступом К памяти как выбранной модели
вычислений. Таким образом, полученная в данном алrоритмическом
базисе функция трудоемкости алrоритма будет отличаться от значения
функции нумерации в машине с произвольным доступом К памяти не
более чем на постоянный множитель.
Методика анализа трудоемкости основных алrоритмических
конструкций. Основными алrоритмическими конструкциями в проце
]
176 rл. б. Методы анализа эффективности рекурсивных аморитмов
дурном подходе являются конструкции следования, ветвления и цикла.
Получение функции трудоемкости HeKoToporo алrоритма основано на
учитываемых базовых операциях процедурноrо языка BbIcoKoro уровня
и методике анализа основных алrоритмических конструкций. OTMe
тим, что для получения функций трудоемкости для лучшеrо, среднеrо
и худшеrо случаев при фиксированной размерности задачи, если алrо
ритм не принадлежит классу N, особенности анализа алrоритмических
конструкций, трудоемкость которых зависит от данных (<ветвление»
И «цикл по условию») будут различны. С учетом введенных базовых
операций методика анализа трудоемкости основных алrоритмических
конструкций в процедурной реализации алrоритмов для общеrо случая
сводится к следующим положениям [6.1].
Конструкция «Следование». Трудоемкость конструкции есть сумма
трудоемкости блоков> следующих друr за друrом
1слсдованис == 11 + ... + 1k,
(6.1.1)
rде k количество блоков в конструкции «Следование». Отметим,
что трудоемкость самой конструкции не зависит от данных, при этом
очевидно, что блоки, связанные конструкцией «Следование», MorYT
обладать трудоемкостью, сильно зависящей от данных.
Конструкция «Ветвление». Запишем общий вид конструкции
«Ветвление», характерный для процедурных языков BbIcoKoro уровня:
If(l)
then
блок с трудоемкостью 1и!еn, выполняемый с вероятностью Р
else
блок с трудоемкостью 1else, выполняемый с вероятностью (1 p)
В этой записи (l) обозначает лоrическое выражение, состоящее из
лоrических переменных и/или арифметических, символьных или дpy
rих по типу сравнений с трудоемкостью вычисления 11. Вероятности
перехода на соответствующие блоки MorYT меняться как в зависимости
от данных, так и в зависимости от параметров внешних охватывающих
циклов и/или друrих условий. Достаточно трудно дать какиелибо
общие рекомендации для получения Р вне зависимости от KOHKpeTHoro
алrоритма или особенностей входа. Общая трудоемкость конструкции
«Ветвление» В среднем случае требует анализа для получения вероят
ности Р выполнения переходов на блоки «then» и «else». При известном
значении вероятности Р трудоемкость конструкции определяется как
1вствлснис == 11 + 1tlteпP + 1else (1 р) ,
(6.1.2)
rде 11 трудоемкость вычисления условия (l). В общем случае вероят
ность перехода Р есть функция исходных данных и связанных с ними
промежуточных результатов Р == Р (D). Очевидно, что для анализа
худшеrо случая может быть выбран тот блок ветвления, который имеет
91. Базовые операции nроцедурносо языка высокосо уровня 177
большую трудоемкость, а для лучшеrо случая блок с меньшей
трудоемкостью.
Конструкция «Цикл ПО счетчику'>. Стандартная запись KOHCTPYK
ции и ее эквивалент, записанный в виде цикла с нижним условием,
имеют вид:
i ( 1
тело цикла
i <------- i+l
ипtil i n
После сведения конструкции к введенным базовым
трудоемкость определяется слеДУЮllЩМ образом:
Por i <------- 1 to n
тело цикла
end Por
операциям ее
f цикл == 1 + 3 п + п fTeJlO цикла.
(6.1.3)
Формула (6.1.3) отражает инициализацию счетчика (i <-------1) и три
операции, собственно орrанизующие цикл (i <------- i + 1, until i п).
Анализ вложенных циклов по счетчику с независимыми индексами
не составляет труда и сводится к поrружению трудоемкости цикла
в трудоемкость тела охватывающеrо ero цикла. Для k вложенных
зависимых циклов трудоемкость определяется в виде вложенных сумм
с зависимыми индексами, методика вычисления которых подробно об
суждается, например, в [6.3].
Конструкция «Цикл ПО условию'>. Конкретная реализация цикла
по условию (цикл с верхним или пижним условием) не меняет методи
ку оценки ero трудоемкости. На каждом проходе выполняется оценка
услotlия и, может быть, изменение какихлибо переменных, влияющих
на значение этоrо условия. Для худшеrо случая MorYT быть использо
ваны верхние rраничные оценки. Общие рекомендации по определению
CYMMapHoro количества проходов цикла крайне затруднительны изза
сложных зависимостей от исходных данных. Так, например, для за
дачи решения системы линейных уравнений итерационными методами
количество итераций по точности (сходимость) определяется собствен
ilЫМИ числами исходной матрицы, трудоемкость вычисления которых
сопоставима по трудоемкости с ПОJ1учением caMOI'O решения [6.4].
На основе методики анализа основных алrоритмических KOHCTPYK
ций и введенных базовых операций процедурноrо языка BbIcoKoro
уровня может быть сформулирован общий метод получения функции
трудоемкости, который включает в себя следующие этапы.
1. Декомпозиция алrоритма выделение структурных частей ал
1'()ритма в виде базовых алrоритмических конструкций, связанных сле
;юванием, вплоть до построчной детализации.
2. Построчный анализ трудоемкости по базовым операциям про
ltСДУРНОI'O языка высокоl'O уровня. При этом возможны два варианта
TaKoro построчноrо анализа совокупный анализ, коrда учитывается
общее количество базовых операций, и пооперационный анаJ1ИЗ, при
котором можно получить функции трудоемкости для каждой из базо
IIЫХ операций.
178 rл. 6. Методы анализа эффективности рекурсивных алzоритмов
З. Обратную композицию функции трудоемкости на основе MeTO
дики анализа основных алrоритмических конструкций и известных
методов анализа алrоритмов вероятностноrо анализа, амортизацион
Horo анализа, методов оценки вычислительной сложности алrоритмов,
с учетом типа получаемой функции трудоемкости для лучшеrо,
худшеrо или среднеrо случая.
В простейшем случае композиция функции трудоемкости это
аддитивное объединение трудоемкости структурных частей алrоритма,
связанных конструкцией следования. Ниже мы покажем, что для pe
курсивных алrоритмов такая композиция требует анализа порожденной
цепочки рекурсивных вызовов.
2. Особенности анализа временной и емкостной
эффективности рекурсивных алrоритмов
Основной особенностью анализа ресурсной эффективности peKYP
сивных алrорипюв является необходимость учета дополнительных за-
трат памяти и трудоемкости, связанных с механизмом орrанизации
рекурсии. Получение ресурсных функций вычислительных алrорит
:УlOв в рекурсивной реализации базируется как на методах оценки
вычислительной сложности собственно тела рекурсивноrо алrоритма,
так и на способах учета ресурсных затрат на орrанизацию рекурсии
и детальном анализе цепочки рекурсивных вызовов и возвратов
порожденноrо дерева рекурсии. Трудоемкость рекурсивных реализаций
алrоритмов, очевидно, связана как с количеством операций, выполня
емых при одном вызове рекурсивной функции, так и с количеством
таких вызовов. Должны быть учтены также и затраты на возврат
вычисленных значений и передачу управления в точку вызова. Эти
операции должны быть включены в функцию трудоемкости рекурсив
но реализованноrо алrоритма. Можно заметить, что некоторая ветвь
дерева рекурсивных вызовов обрывается при достижении TaKoro зна
чения передаваемоrо пара метра, при котором функция может быть
вычислена непосредственно. Таким образом, рекурсия в этом смысле
эквивалентна конструкции цикла, в котором каждый проход цикла есть
выполнение рекурсивной функции с заданным пара метром.
Анализ трудоемкости вызова рекурсивной функции. Механизм
вызова функции или процедуры в языке BbIcoKoro уровня существенно
зависит от архитектуры компьютера и операционной системы. В рамках
архитектуры и операционных систем 'ВМ РС совместимых компью
теров этот механизм реализован через проrраммный стек. Как пе-
редаваемые в процедуру или функцию фактические параметры, так
и возвращаемые из них значения помещаются в проrраммный стек
специальными командами процессора мы считаем эти операции
базовыми в нашей модели вычислений (см. параrраф 6.1). Модель
2. Особенности анализа временной и емкостной эффективности 179
механизма вызовавозврата, использующая проrраммный стек, была
подробно описана в rлаве 2.
Для подсчета трудоемкости вызова в базовых операциях обслу
живания стека напомним, что при вызове процедуры или функции
в стек помещается адрес возврата, состояние необходимых реrистров
процессора, состояние локальных ячеек вызывающей процедуры или
функции, адреса возвращаемых значений и передаваемые параметры.
После этоrо выполняется переход по адресу на вызываемую процедуру,
которая извлекает переданные фактические параметры, выполняет BЫ
числения и помещает результаты по указанным в стеке адресам. При
завершении работы вызываемая процедура восстанавливает реrистры,
локальные ячейки, выталкивает из стека адрес возврата и осуществля
ет переход по этому адресу.
Для анализа трудоемкости механизма вызовавозврата для peKYP
сивной процедуры введем СJlедующие обозначения:
р количество передаваемых фактических пара метров ,
r количество сохраняемых в стеке реrистров,
k количество возвращаемых по адресной ссылке значений,
l количество локальных ячеек процедуры.
Поскольку каждый объект в некоторый момент помещается в стек
и в какойто момент выталкивается из Hero, то трудоемкость peKYP
сивной процедуры на один вызоввозврат JR (1) == 2 (р + r + k + l + 1)
в базовых операциях составит:
Ju (1) == 2 (р !' k r' + l + 1) .
(6.2.1 )
Дополнительная единица в формуле (6.2.1) учитывает операции
с адресом возврата. Для рекурсивной функции мы должны дополни
тсльно учесть еще одну локаJ1Ь1-IУlO ячейку, через которую передается
значение функции. Мы обозначим этот пара метр через J, считая, что
('[o значение равно единице, тоrда трудоемкость на один вызоввозврат
рекурсивной функции может быть определена следующим образом:
Ju (1) == 2 (р + k + r + J + l + 1) , J == 1.
(6.2.2)
Анализ трудоемкости рекурсивных алrоритмов в части совокупной
l'рудоемкости caMoro рекурсивноrо вызовавозврата можно выполнять
разными способами в зависимости от Toro, как формируется итоrовая
сумма базовых операций либо отдельно по цепочкам рекурсивных
вызовов и возвратов, либо совокупно по вершинам дерева рекурсии.
Формулы (6.2.1) и (6.2.2) отражают второй способ, заметим также, что
l'СJ1И положить J -'-- о для рекурсивной процедуры в формуле (6.2.2), то
она сводится к (6.2.1).
Учет особенностей рекурсивной реализации в функциях pe
rурсной эффективности nporpaMMHbIx реализаций алrоритмов.
Суммарные ресурсы, требуемые рекурсивной реализацией алrоритма,
м()['ут быть разделены на ресурсы, собственно связанные с решением
,\адачи, и ресурсы, необходимые для орrанизации рекурсии. При cpaB
180 rл. б. Методы анализа эффективности рекурсивных алzорит.мов
нительном анализе итерационной и рекурсивной реализации можно
отметить, что особенность последней состоит как в наличии допол
нительных операций, орrанизующих рекурсию, так и дополнительных
затрат оперативной памяти в области проrраммноrо стека для xpaHe
ния информации о цепочке рекурсивных вызовов. При этом отметим,
что эти затраты в ряде случаев оправданы, например, рекурсивные
алrоритмы, использующие метод декомпозиции, позволяют получить
асимптотически более эффективные алrоритмы для целоrо ряда задач
[6.5, 6.6, 6.7]. Эта эффективность достиrается в частности и за счет
большеrо объема памяти в области проrраммноrо стека, что должно
быть обязательно учтено в комплексном критерии оценки качества
алrоритмов.
Оценка требуемой памяти в стеке может быть получена следую
щим образом: поскольку рекурсивные вызовы обрабатываются после
довательно, то во временной динамике в области стека хранится не
фраrмент дерева рекурсии, а только текущая цепочка рекурсивных
вызовов унарный фраrмент этоrо дерева. Из этоrо следует, что Tpe
буемый объем памяти в области пporpaMMHoro стека определяется не
общим количеством вершин дерева рекурсии, а максимальной rлубиной
ero листьев. Очевидно, что вид и rлубина рекурсивноrо дерева опреде-
ляются как особенностями caMoro алrоритма, так и характеристиками
множества исходных данных. Обозначив через Нп (D) максимальную
rлубину рекурсивноrо дерева, порождаемоrо данным алrоритмом на
данном входе 1J, можно оценить требуемый объем пporpaMMHoro стека,
опираясь на реализацию механизма вызова функции. Предполаrая,
в худшем случае, что пара метры , передаваемые через стек, сохраня
ются в нем, максимальный объем памяти в области стека может быть
определен на основе (6.2.2) следующим образом:
V st (D) 0= Н П (D) (р + r + k + f + 1 + 1) lw,
(6.2.3)
rде lw длина слова в байтах.
Отметим также, что, в отличие от объема памяти в области пpo
rpaMMHoro стека, требуемоrо для ОРI'анизации рекурсии, который за-
висит от макси:vrальной rлубины рекурсивноrо дерева, количество опе-
раций со cTeKo:vr на один вызоввозврат, задаваемое формулой (6.2.2),
должно быть учтено в функции трудоемкости для всех вызовов. Таки:vr
образом, получение функции трудоемкости в рекурсивной реализации
требует определения общеrо количества вершин рекурсивноrо дерева
Если структура дерева такова, что оно является не только rлубоким, но
и «широким», то совокупные затраты на орrанизацию рекурсии MorYT
быть значительны. Трудоемкость тела рекурсивной функции или про
цедуры может быть получена на основе методов анализа итерационных
алrоритмов (см., например, [6.1, 6.2]). Однако общая TpyдoeMKocТt.
определяется числом порожденных вершин дерева рекурсии, KpOMI'
Toro, мы должны учесть, что в общем случае трудоемкость в разных
3. Анализ трудоемкости методом подсчета вершин дерева рекурсии 181
вершинах может различаться и зависеть от данных или пара метров
рекурсии.
3. Анализ трудоемкости методом подсчета вершин
дерева рекурсии
При теоретическом построении ресурсных функций рекурсивноrо
алrоритма необходюю учесть ряд ресурсных затрат и особенностей
рекурсивной реализации, а именно:
ресурсные затраты на обслуживание рекурсивных вызовов
возвратов, передачу пара метров и возврат значений рекурсивных функ
ций (ресурсные затраты обслуживания рекурсии);
специфику фраrмента останова рекурсии, приводящуlO к необхо
ДИМ ости отдельноrо учета ресурсных затрат в листьях дерева рекурсии.
Учет этих особенностей при теоретическом анализе рекурсивных
алrоритмов приводит к необходимости получить функциональные зави
симости общеrо количества вершин дерева рекурсии и количества ero
внутренних вершин и листьев от характеристик множества входных
данных. Если мы можем определить ресурсные затраты в каждой Bep
шине дерева, то, суммируя, мы получим ресурсную функцию алrорит
ма в целом. Такой ПОДХОД мы будем называть в дальнейшем получением
ресурсных функций для рекурсивных реализаций алrоритмов методом
подсчета вершин дерева рекурсии [6.2].
Анализ дерева рекурсии. Первым этапом метода является иссле
дование дерева рекурсии. В предположении, что п длина входа алrо
ритма для классов N, N Р R; т \ , ... ,тk значение пара метров входа
для классов Р R, N Р R (k :;:;; п), а D конкретный вход аJJrоритма,
введем следующие обозначения для характеристик дерева рекурсии,
порожденноrо рекурсивным алrоритмом:
R (D) общее количество вершин дерева рекурсии ДЛЯ входа D;
Rv (D) количество внутренних вершин дерева для входа D;
RL (D) количество листьев дерева рекурсии ДЛЯ входа п;
H R (D) максимальная rлубина дерева рекурсии (максимальное
по всем листьям дерева количество вершин в пути ОТ корня дерева до
листа), тоrда очевидно, что справедливы соотношения
R (D) == R\7 (1) . R[, (D), HR (D) :;:;; Rv (D) + 1.
Рассмотрим более подробно особенности функциональной зависимости
общеrо числа вершин в дереве рекурсии ДЛЯ алrоритмов, принадле
жащих различным трудоемкостным классам по характеристическим
особенностям множества исходных данных. В соответствии с опреде
лением классов (см. rлаву 2) имеем:
1) класс N: R (D) == R (п) I;j D Е Dn;
2) класс Р R: R (п) == R (т],... ,тk);
3) класс N Р П: R (D) == Н (п, т\, ... ,rпk).
]
182 rл. б. Методы анализа эффективности рекурсивных алzоритм-ов
Таким образом, основная задача при использовании этоrо MeTO
да состоит в теоретическом построении функций Rv (D), RIJ (D) и
НН (D) как функций характеристик множества входных данных в за
висимости от принадлежности алrоритма к одному из основных клас
сов. Дополнительный интерес, в смысле анализа дерева рекурсии,
представляет информация об отношении количества листьев к общему
количеству вершин рекурсивноrо дерева. Это характеристика относи
тельной "ширины» нижнеrо уровня (уровня листьев) в дереве рекурсии
B L (D) == J() , 0< BIJ (D) < 1.
Значение B 1J (D) будет минимально для цепочки (YHapHoro дерева)
и будет возрастать при увеличении числа вершин, порожденных БО
внутренних вершинах дерева рекурсии, т. е. с ростом «арности» дерева.
Напомним, что дерево, каждая вершина KOToporo порождает две новых
вершины, называется полным бинарным деревом, а порождение трех
вершин приводит к тернарному дереву.
Рассмотрим более подробно, как на основе функций Rv (D) и
RL (D) возможно теоретическое построение ресурсных функций peKYP
сивных алrоритмов.
(6.3.1)
Получение функции трудоемкости методом подсчета вершин
дерева рекурсии. Для рекурсивных алrоритмов трудоемкость решения
конкретной задачи включает в себя не только трудоемкость непосред
ственной обработки данных в теле рекурсивной функции, но и затраты
на орrанизацию рекурсии. Более точно, трудоемкость f А (D) алrоритма
А на конкретном входе D определяется трудоемкостью обслуживания
дерева рекурсии, зависящей от общеrо количества ero вершин, и TPYДO
емкостью продуктивных вычислений, выполненных во всех вершинах
дерева рекурсии. В связи с этим обозначим через
fR (D) трудоемкость порождения и обслуживания дерева peKYP
сии,
fc (D) трудоемкость продуктивных вычислений алrоритма,
и с учетом введенных обозначений получаем
fA (D) == fR (DH,- fc (D).
(6.3.2)
Трудоемкость обслуживания дерева рекурсии может быть вычислена
достаточно просто, а именно, если функция R (D) известна, и на об
служивание одноrо рекурсивноrо вызова затрачивается фиксированное
количество базовых операций (см. 6.2) fR (1), определяемых, например,
по формуле (6.2.2), то
fR(D) == R(D)fR(I).
(6.3.3)
При подсчете трудоемкости продуктивных вычислений необходимо
учесть, что для листьев рекурсивноrо дерева алrоритм будет выполнять
непосредственное вычисление значений, и эта трудоемкость отлична от
3. Анализ трудоемкости методом подсчета вершин дерева рекурсии 183
трудоемкости во внутренних вершинах, следовательно, трудоемкость
алrоритма при останове рекурсии должна быть учтена отл.ельно. В СВЯ
зи С этим обозначим через
fcv (D) трудоемкость продуктивных вычислений во внутренних
вершинах,
fCL (п) трудоемкость продуктивных вычислении в листьях дe
рева рекурсии, это приводит к определению fc (D) в виде
fc (D) == fcv (D) + fcl_ (D) .
(6.3.4)
Обозначим через f с I" ( 1) трудоемкость алrоритма при останове pe
курсии. Заметим, что, как правило, значение fCL (1) может быть cpaB
нительно леrко получено, т. к. выражается, как правило, фиксирован
ным числом базовых операций. Зная количество листьев рекурсивноrо
дерева, можно определить fCL (D):
fCL (D) == RL (D) fCL (1).
(6.3.5)
Во внутренних вершинах дерева рекурсии выполняются некоторые
действия, связанные с подrотовкой параметров следующих рекурсив
ных вызовов и обработкой возвращаемых результатов. Трудоемкость
такой обработки может зависеть как от обрабатываемых в этой Bep
шине данных, так и от положения вершины в дереве рекурсии. С цe
лью учета этой зависююсти введем нумерацию внутренних вершин,
начиная с корня, по уровням дерева. Заметим, что число уровней
внутренних вершин в дереве на единицу меньше rлуб ины рекурсии
H R (D).. Пусть т есть н омер уро вня, m =-= 1, H R (D) 1, а k номер
нершины на уровне, k == 1, К (т), rде К (т) количество внутренних
вершин на уровне т, заметим, что неполное дерево на уровне k может
содержать как внутренние вершины, так и листья. С учетом такой
нумерации обозначим вершины дерева через
Vmk, т == 1, H R (D) 1; k = 1, К (т).
при этом очевидно, что
[[R(D)1 К(т)
L L 1 ==Лv(D).
тl k='l
Обозначим трудоемкость продуктивных вычислений в вершине Vmk
'iерез fcv (Vmk), Torдa формула для трудоемкости продуктивных BЫ
'{ИСJJений во внутренних вершинах дерева рекурсии имеет вид
Нп([))l К(т)
fcv (D) == L L fcv (-Vтnk). (6.3.6)
m1 k1
Заметим, что в случае, коrда значения функции fcv (Vmk) не за
ВИСЯТ от номера вершины дерева рекурсии, т. е. трудоемкость продук
:'нвных вычислений в вершинах не зависит от данных, то, обозначая
]
184 1л. б. Методы анализа эффективности рекурсивных алоритмов
трудоемкость продуктивных вычислений для любой внутренней верши-
ны дерева через fcv (v), имеем
fcv (D) == Rv (D) fcv (v).
(6.3.7)
Подставляя полученные результаты в формулу (6.3.2), окончательно
получаем формулу для определения трудоемкости рекурсивноrо алrо
ритма на основе метода подсчета вершин дерева рекурсии в общем
случае
IIR(D)l К(т)
fA(D)==R(D)fR(1)+RI(D)!cL(1)+ :L :L fCV(Vmk),
тl k1
(6.3.8)
и в частном случае, КOI'да трудоемкость продуктивных вычислений для
любой внутренней вершины дерева рекурсии одинакова:
fA (D) == R (D) fR (1) + RL (D) fCI (1) + Rv (D)!cv (v).
(6.3.9)
По аналоrии с характеристикой В L (D) можно рассмотреть допол
нительную характеристику трудоемкости рекурсивноrо алrоритма
долю операций обслуживания дерева рекурсии. Обозначая ее через
}н (D), имеем
fR (D)
FH(D)== fл(D) ' O<F H (D)<I.
(6.3.1 О)
Значение р н (D) показывает, насколько трудоемкость обслужива
ния дерева рекурсии значима в общей трудоемкости рекурсивноrо
алrоритма.
Сформулируем этапы анализа трудоемкости рекурсивноrо алrорит
ма методом подсчета вершин дерева рекурсии.
1. Анализ порождаемоrо данным алrоритмом дерева рекурсии
с целью получения теоретических зависимостей для характеристик
дерева R(п,Тnl,...,rrLJJ, RL(п,Тn1,...,Тnk), Rv(n,Тn1,,,,,Тnk),
HH(п,Тnl,,,,,Тnk) как функций длины входа (71) и/или характеристи
ческих особенностей множества входных данных.
2. Определение трудоемкости обслуживания рекурсии на один
Вblзоввозврат fH (1), например, по формуле (6.2.2).
3. Определение трудоемкости алrоритма при останове рекурсии
f с L (1). Если останов происходит при нескол ьких значениях aprYMeHT3,
и трудое:YlКОСТЬ вычисления в разных листьях различна, то необходим
более детальный подсчет, но уже с учетом типов листьев в дерев('
рекурсии.
4. Исследование трудоемкости продуктивных вычислений во ВНУТ'
ренних вершинах дерева рекурсии получение функции fcv (Vmk).
5. Получение функции трудоемкости рекурсивноrо алrоритма по
формулам (6.3.8) или (6.3.9) в зависимости от поведения функции
fcv (Vmk). ,1
4. Анализ трудоемкости методом рекуррентных соотношений 185
Некоторые замечания по поводу этоrо метода касаются особенно
стей анализа дерева рекурсии и функции fcv (Vmk). Если анализируе
мое дерево является реrулярным, то выполнение первоrо пункта метода
не представляет особых трудностей. Однако для алrоритмов с сильной
параметрической зависимостью структура дерева плохо поддается фор
мализации, и одним из подходов к анаJIИЗУ таких деревьев является
введение обобщающеrо пара метра, приводящеrо к оценке характери
стик дерева в среднем случае. Друrая серьезная проблема анализа
получение функции fcv (Vmk) в случае, если трудоемкость в вершине
сильно зависит от данных. Ряд примеров анализа рекурсивных алrо
ритмов показывает, что для прююrо определения fcv (Vтk) приходится
прибеrать к достаточно тонким методам или специальной параметри
зации задачи. Одно из альтернативных решений состоит в том, чтобы,
используя идеи амортизационноrо анализа [6. 7J, попытаться вместо
аналитическоrо задания функции fcv (1J m k) получить ее сумму либо по
уровням дерева, либо по всем внутренним вершинам. При меры анализа
трудоемкости рекурсивных алrоритмов с использованием этоrо метода
и некоторых ero модификаций мы приведем в rлаве 7.
4. Анализ трудоемкости методом рекуррентных
соотношений
Еще один специальный метод анализа трудоемкости рекурсивных
алrОРИ-iМОВ основан на очевидном предположении о том, что если сам
алrоритм имеет рекурсивную структуру, то и функция ero TpyдoeM
кости может быть описана аппаратом тсории рекурсии. Идея :vIетода
состоит в получении peKYPpCHTHoro соотношения, oCHoBaHHoro на pc
зультатах анализа алrоритма и задающеrо функцию ero ТРУДОС:vIкости,
и решения этоrо соотношения с помощью известных методов, напримср
тех, которые мы изложили в rлавах 1 и 5. Мы не можем прсдложить
универсальной формулы для этоrо метода, поскольку в каждо:vI KOH
кретном случае рекуррентное соотношенис для функции трудое:vIКОСТИ
отражает специфику рекурсивноrо алrоритма. Опредслснные обобще
ния MorYT быть сделаны для рекурсивных алrоритмов, разработанных
110 методу декомпозиции, и в ряде друrих частных случаев.
Рассмотрим вначале этот метод в приложении к анализу TPYДO
l'!I1КОСТИ рекурсивных алrоритмов, построенных на основе мстода дe
IШМПОЗИЦИИ. Напомним, что идея метода состоит в разделении задачи
на части меньшей размерности, получении решений ДJlЯ выдсленных
'Iастей и объединении решений при возврате из рекурсивных вызовов.
Если в алrоритме при решении задачи размерности п происходит такое
l'C разделение, которое при водит к необходимости решения а подзадач
размерности njb (Ь является делителем п), то функция трудоемкости
I1меет вид
fA (п) == afA (njb) + d(n) + и (п),
(6.4.1)
]
186 Тл. 6. Методы анализа эффективности рекурсивных алzоритмов
rде d(n) трудоемкость алrоритма разделения задачи на подзадачи,
а И (n) трудоемкость дополнительноrо алrоритма, объединяющеrо
полученные решения. При этом для некоторой малой размерности
задачи, т. е. при п == по, возможно ее прямое (не рекурсивное) реше
ние. Обозначив трудоемкость получения этоrо прямоrо решения через
fA (по), мы получаем общую форму peKyppeHTHoro соотношения для
функции трудое:l1КОСТИ алrоритмов, разработанных методом декомпо
зиции задачи:
{ fл (по), n == по;
fл (п) == afA (njb) + d(n) + U(n), n > по.
(6.4.2)
Дополнительное уточнение касается трудоемкости орrанизации pe
курсии, которая должна быть учтена на каждом рекурсивном вызове.
Эта трудоемкость может быть получена по формуле (6.2.1), и, сохраняя
обозначение fR (1), получае:l1
{ f л (по) + f R (1 ) , n == по;
fА(n)==аfл(njЬ)+d(n)+U(n)+fп(I), n>по. (6.4.3)
Еще один нюанс, серьёзно усложняющий получение решения, co
стоит в том, что размерность решаемой задачи должна быть целой.
Поэтому в общем случае вместо njb в качестве aprYMeHTa функции в
(6.4.3) должна фиrурировать целая часть частноrо с окруrлением вниз
или вверх, т. е. lnjb или injbl.
Рассмотрим в качестве при мера известный алrоритм сортировки
слиянием [6.7]. На каждом рекурсивном вызове переданный массив дe
лится пополам, что дает оценку для функции d (n) == е (1) == CI, далее
рекурсивно вызывается сортировка полученных массивов половинной
длины до тех пор, пока длина массива не станет равной единице. Mac
сив единичной длины очевидно сортирован, и наши затраты состоят
только в распознавании длины массива мы затрачиваем на это С2
базовых операций. Возвращенные отсортированные массивы объеди
няются с трудоемкостью а п + Ь, rде коэффициенты определяются на
основе анализа алrоритма слияния. Орrанизация рекурсии на один
вызов требует фиксированноrо числа операций fп (1) == С3, и, используя
(6.4.3), мы получае:l1 рекуррентное соотношение для функции TpyдoeM
кости алrоритма сортировки слиянием: ( I
{ С2+С3' п==l;
fА(п)==fл(lпjьJ)+fл(injыl+сI +аn+Ь+сз, п> 1.
Детальный анализ этоrо алrОРИТ:I1а мы проведем в rлаве 7, rде и полу-
чим явную функцию ero трудоемкости.
РаССМОТРИ:l1 еще одно обобщение для рекурсивных алrоритмов, по-
нижающих размерность задачи на единицу при каждой рекурсии. При
этом трудоемкость фраrмента алrоритма, сводящеrо задачу размерно-
сти п к задаче размерности п 1 будем обозначать через fcv (п) .
в терминолоrии деревьев рекурсии это есть трудоемкость обрабОТКIi
5. Способы повышения ресурсной эффективности алеоритмов 187
во внутренней вершине. Как и в предыдущем примере, будем пред
полаrать, что останов рекурсии происходит при размерности п == по.
достаточно часто при по == 1. Сохраняя обозначения, введенные в
6.3 fCL (1) для трудоемкости останова рекурсии (fCL (1) == fл (по»
и fR (1) для трудоемкости обслуживания рекурсии, получаем peKYP
рентное соотношение для fA (п):
{ fл(п о )==fR(I)+fСL{l), п==по;
f А (п) == f А (п 1) + f R (1) + f cv (п) . п > по.
(6.4.4)
Приведем пример использования (6.4.4) для построения peKyppeHT
Horo соотношения, задающеrо функцию трудоемкости алrоритма BЫ
числен ия определителя квадратной матрицы (см. параrраф 2.1). OCTa
нов рекурсии происходит при п == 2 и требует фиксированноrо числа
базовых операций обозначим это число через С(. Трудоемкость
орrанизации рекурсии на один вызов также требует фиксированноrо
числа операций f R (1) == С2. Трудоемкость сведения задачи вычисления
определителя матрицы размерности п к задаче размерности п 1
определяется числом элементов матрицы и может быть представлена
в виде
fcv (п) == ап 2 + Ьп "t' d,
rде коэффициенты определяются путем анализа трудоемкости фраr
:\1ента сведения матрицы по методике из параrрафа 6.1. ПодстаВ_1ЯЯ
полученные результаты в (6.4.4), получаем рекуррентное соотношение,
задающее функцию трудоемкости данноrо алrоритма:
'"
{ fA (2) == С( + С2;
fA(n) ==fA(n 1)+an 2 +lJn+d+C2,
п> 2.
Решение может быть получено методами, ИЗ_10женными в rлаве 1, и мы
оставляем ero получение в качестве упражнения для наших читателей.
Ниже, в rлаве 7, мы продемонстрируем применение этоrо метода
для анализа трудоемкости рекурсивных алrоритмов. Сравнивая оба
изложенных метода анализа рекурсивных алrоритмов, :\10ЖНО сказать,
что метод подсчета вершин дерева рекурсии позволяет ПОЛУЧИТЬ более
детальную информацию о ресурсных затратах, в частности выделить
общие затраты на орrанизацию рекурсии и трудоемкость в листьях
рекурсивноrо дерева.
5. Способы повышения ресурсной эффективности
рекурсивных алrоритмов
Мы возвращаемся к вопросу, который обсуждали кратко еще во
введении к этой книrе коrда и при каких условиях рационально
:lрименять рекурсивные алrоритмы? Теперь мы можем поставить этот
вопрос боле корректно какова ресурсная эффективность рекурсив
!loro алrоритма в сравнении с ресурсной эффективностью друrоrо
188
Тл. б. Методы анализа эффективности рекурсивных алzоритмов
t
итерационноrо алrоритма решения данной задачи? Рассматривая ПОk
ную функцию ресурсной эффективности, т. е. ее временную и eMKOCT
ную составляющие, мы, в самом общем случае, можем сказать, что
рекурсивный алrоритм требует значительно больших затрат памяти
в области проrраммноrо стека и дополнительных базовых операций на
обслуживание механизма рекурсии. В обозначениях, введенных в пара
rрафах 6.2 и 6.3, эти затраты задаются функцией f R (D), которая про
порциональна общему числу вершин дерева рекурсии R (D), и функ
цией V,t (1J), значение которой зависит от rлубины дерева рекурсии
II R (D), rде D конкретный вход ащоритма. Мы также специально
ввели характеристику удельноrо веса обслуживания рекурсии Р н (D).
Улучшение ресурсной эффективности решения некоторой задачи
с использованием рекурсивнО!'о алrоритма обуславливается самим ме-
тодом ero разработки. Уже известный читателям метод декомпозиции
позволяет в целом ряде случаев достичь rраницы теоретическоrо ниж-
Hero предела трудоемкости (в асимптотическом понимании). Примера
ми MorYT служить алrоритм сортировки слиянием и алrоритм быстроrо
преобразования Фурье [6.7]. Значительные улучшения асимптотиче
ских оценок трудоеYIКОСТИ позволяют получить как алrоритм Карацубы
при умножении ДЛИННЫХ целых чисел [6.8], так и алrоритм IlITpac
сена при умножении квадратных матриц [6.7]. Естественно, получа
емые этим методом рекурсивные алrоритмы, как правило, асимпто
тически лучше прямых итерационных методов, но за счет больших
коэффициентов у КОYIпонента rлавноrо порядка функции трудоемкости
рациональны в применении только для больших размерностей. Для
метода динамическоrо проrраммирования (ДП) сравнение ресурсной
эффективности рекурсивноrо и итерационноrо (эта реализация в Me
тоде ДП носит название табличноrо алrоритма) подхода не столь
очевидна изза сложной параметрической зависимости трудое:v!кости от
особенностей входа, и требует специальноrо анализа (см., например,
[6.9]). Непосредственная рекурсивная реализация функциональноrо
уравнения Беллмана для решаемой задачи порождает, в большинстве
случаев, не только rлубокое, но и широкое (за счет цикла поиска
максимума) дерево рекурсии, что влечет, очевидно, рост затрат на ero
обслуживание.
Если мы хотим, оставаясь в рамках рекурсивноrо подхода, улуч
шить ресурсные характеристики данноrо алrоритма, то поскольку
и трудоеYIКОСТЬ и емкостная эффективность непосредственно зависят
от характеристик дерева рекурсии, то основной путь это сокраще
ние числа вершин дерева. В ра:\1ках конкретной задачи MorYT быТ!,
предложены специальные подходы, однако рекомендации общеrо ВИД;l
сводятся Bcero к несколькиYI способам, два из которых :v!bl И хотим
кратко изложить.
Динамическое сохранение результатов. Этот способ состоит
в том, что в динамике llOрождения дерева рекурсии при рекурсивных
возвратах мы сохраняем вычисленные значения, предполаrая, что в 110
5. Способы повышения ресурсной эффективности аморитмов 189
следующих цепочках рекурсии эти значения MorYT быть использованы
для останова в некоторой ветви, если результат для данноrо aprYMeHTa
был уже ранее получен [6.7]. Посмотрите внимательно на дерево pe
курсии, порождаемое алrоритмом вычисления чисел Фибоначчи чем
ниже уровень рекурсии, тем чаще встречаются вызовы с одинаковым
aprYMeHToM. Если мы заведем специальный массив, в котором будем
хранить уже вычисленные значения, то общее дерево рекурсии будет
значительно сокращено. Увы, этот способ не всеrда приводит к жела
емому результату. Если дерево рекурсии широкое и содержит MHoro
вершин с редко повторяющимися арrументами вызова, то мы полу
чим значительное увеличение требуемой дополнительной памяти при
незначительном сокращении трудоемкости. Вообще емкостные затраты
этоrо способа MorYT быть значительны, если мы используем прямые
индексные массивы. Один из путей улучшения емкостной эффектив
ности создание хэштаблиц и динамическое выделение памяти.
Рекомендации по применению этоrо подхода должны основываться на
тщательном анализе порождаемоrо дерева в аспекте вероятности по
вторения рекурсивноrо вызова с данными арrументами и обязательной
оценкой емкостной эффективности предлаrаемой структуры данных
для динамическоrо хранения результатов.
Предвычисления в листьнх. Для широкоrо дерева рекурсии, Ha
при мер TepHapHoro, количество листьев в общем количестве вершин
дерева превышает половину. Если мы можем так орrанизовать peKYP
сивны4 процесс вычислений, что останов рекурсии будет происходить
на один или несколько уровней выше, то трудоемкость TaKoro алrо
ритма будет, скорее Bcero, меньше, чем при полном дереве рекурсии.
Классический при мер алrоритм сортировки слиянием. Если останов
рекурсии происходит при длине массива, равной двум или трём, то
:v!bI как минимум вдвое сокращаем число вершин дерева рекурсии,
затрачивая некоторое количество операций на сортировку коротких
массивов в листьях дерева. Нахождение оптимальной ['раницы длины
для останова рекурсии на основе анализа трудоемкости TaKoro комби
I!ированноrо алrоритма является хорошей исследовательской задачей
для студентов. Проблемы этоrо способа начинаются там, rдe мы за
ранее не знаем aprYMeHToB. с которыми будут выполнены конкретные
остановы рекурсии в листьях. Типичный при мер задача одномерной
Оl!тимальной упаковки, которую мы будем рассматривать в rлаве 7. Мы
:v!ожем заранее вычислить все возможные результаты для aprYMeHToB
останова рекурсии, но в этом случае полученный массив может иметь
;юстаточно большую размерность. Мы снова сталкиваемся с классиче
екой дилеммой сокращение трудоемкости за счет увеличения объе:\1а
дополнительной памяти. Анализ ресурсной эффективности комбиниро
BaHHoro алrоритма с целью определения уровня рекурсии, до Koтoporo
рационально проводить предвычисления в листьях, также является ин
тересной исследовательской задачей. Заметим, что такой способ часто
]
190 rл. б. Методы анализа эффективности рекурсивных аморитмов
используется для алrоритмов, основанных на методе динамическоrо
проrраммирования.
Ряд полезных сведений о подходах к совершенствованию рекурсив
ных алrоритмов читатели MorYT найти также в [6.6] и [6.7].
Задачи и упражнения к r лаве 6
6.1. Мы считаем, что все локально описанные ячейки и массивы
должны быть сохранены в проrраммном стеке при рекурсивном вызове.
Как изменится формула (6.2.1), если одномерный массив из n элемен
тов описан внекоторой процедуре как локальный?
6.2. Какое дерево рекурсии является более предпочтительным
в смысле ресурсной эффективности рекурсивноrо алrоритма унарное
дерево, содержащее n вершин на n уровнях, или (n 1 )-арное дерево,
содержащее корень и n 1 вершину на втором уровне?
6.3. Будем рассматривать полные тapHыe деревья. Получите фор
мулу зависимости относительной ширины уровня листьев m-арноrо
дерева rлубиной n, т. е. получите функцию BL (n, т) в явном виде,
опираясь на ее определение формулу (6.3.1).
6.4. Как Вы считаете, доля операций обслуживания дерева рекур-
сии, задаваемая формулой (6.3.1 О), будет расти или падать, если мы,
зафиксировав общее количество вершин, будем менять ширину дерева,
т. е., число ero уровней?
6.5. Мы получили в параrрафе 6.4 два рекуррентных соотношения,
задающих, с точностью до коэффициентов, функции трудоемкости для
алrоритма сортировки слиянием и алrоритма вычисления определителя
квадратной матрицы. Используя основную теорему о рекуррентных co
отношениях, изложенную в rлаве 5, получите асимптотические оценки
их трудоемкости.
6.6. Разработайте алrорИТМ сортировки двух и трех чисел, и на их
основе постройте рекурсивный алrоритм сортировки слиянием с оста-
новом при длине массива, равной двум или трем. Одной из задач
анализа рекурсивноrо алrоритма является анализ порожденноrо дe
рева рекурсии. Нарисуйте несколько деревьев, порожденных Вашим
алrоритмом для произвольных длин исходноrо массива. Попробуйте
получить теоретические функциональные зависимости характеристик
TaKoro дерева от длины исходноrо массива.
Список литературы к rлаве 6
6.1. Ульянов М.В. Классификация и методы сравнительноrо анализа вы-
числительных алrоритмов. Научное издание. М.: Издво физико-
математической литературы, 2004. 212 с.
6.2. Ульянов М.В. Дополнение к книrе Дж. Макконелла Основы современ.
ных алrоритмов. М.: Издво Техносфера, 2004. С. 303366.
6.3. rрэхем Р., Кнут Д, Паташник О. Конкретная математика. Основание'
информатики: Пер. с анrл. М.: Мир, 1998. 703 с.
Список литературы к zлаве б
191
6.4. Бахвалов нс., Жидков нп., Кобельков Т.М. Численные методы. М.:
Лаборатория БаЗОВblХ Знаний, 2001 r. 632 с.
6.5. Ахо А., Хопкрофт Дж., Уль.ман Дж. Построение и анализ Вblчислитель
ных аJJrОРИТМОВ: Пер. с анrл.: М.: Мир, 1979. 546 с.
6.6. Ахо А., Хопкрофт Дж., Уль.ман ДЖ. СТРУКТУРь! данных и аJJrОрИТМЫ:
Пер. с анrл.: М.: Изд. дом «Вильямс», 2001. 384 с.
6.7. Кор.мен Т., Лейзерсон ч., Ривест Р., Штайн К. АлrОРИТМbI: построение
и анализ, 2-е издание: Пер. с анrл. М.: Изд. дом «Вильяме», 2005.
1296 с.
6.8. http:jwww.ccas.ru
6.9. Ульянов М.В., Турин Ф.Е., Исаков А.с., Будараин В.Е. Сравнительный
анализ табличноrо и рекурсивноrо аJJrОРИТМОВ точноrо решения задачи
одномерной упаковки // Exponenta Pro Математика в приложениях. 2004.
М2(6). С. 6470.
rлава 7
РЕКУРСИВНЫЕ Алrоритмы РЕШЕНИЯ
НЕКОТОРЫХ ЗАДАЧ И ИХ ТЕОРЕТИЧЕСКИЙ
АНАЛИЗ
Введение. В предыдущих rлавах были описаны некоторые подхо
ды и методы анализа и получения ресурсных функций рекурсивных
алrоритмов. Цель настоящей rлавы показать, как они MorYT быть
применены для исследования рекурсивных алrоритмов, относящихся
к различным трудоемкостным и емкостным классам. Приведенные ни
же примеры рекурсивных алrоритмов не ставят своей целью продемон
стрировать наиболее ресурсноэффективные реализации. Мы ставим
несколько иную задачу продемонстрировать возможности различных
методов анализа рекурсивных алrоритмов, и на этой основе сформули
ровать некоторые пути модификации этих алrоритмов для улучшения
их ресурсных характеристик.
Мы начнем с очевидных и подробных примеров, чтобы на их oc
нове продемонстрировать особенности применения различных методов
для получения ресурсных функций рекурсивных алrоритмов. Переходя
далее к более сложным алrоритмам, разработанным на основе MeTO
дов декомпозиции и динамическоrо проrраммирования и требующим
специальных подходов к их анализу, мы хотим обсудить возможности
повышения временной эффективности рекурсивных алrоритмов. OДHO
временно на этих примерах мы хотим показать, как методы решения
рекуррентных соотношений применимы к решению задачи анализа
трудоемкости рекурсивных алrоритмов.
9 1. Алrоритм вычисления факториала
Рекурсивный алrоритм. Рекуррентное соотношение, определяю
щее рекурсивно заданную функцию факториала от целочисленноrо
aprYMeHTa т, имеет вид
{ f (О) == 1; f (1) == 1;
f(т)o=тпf(тI), т>l.
Рассмотрим рекурсивный алrоритм, вычисляющий значение факто
риала, в виде процедурно реализованной рекурсивной функции F(m)
с остановом при значении т == 1 (справа указано количество базовых
операций в строке).
(7.1.1)
1. Алzоритм. вычисления факториала
193
F(m)
If (m==О (про верка останова рекурсии)
then
F (останов рекурсии)
else
F m * F(ml) (рекурсивный вызов)
Return (F)
End.
3
Сложностной класс алrоритма. Алrоритм относится к классу
р R, поскольку, имея на входе только одно числовое значение, задает
различное количество базовых опера
ций, зависящее от значения параметра
т. Подход к определению ero принаk
лежности к подклассу класса Р R co
стоит в том, что мы рассматриваем дей
ствительную длину входа алrоритма
количество значащих бит п == {J (т).
предназначенных для двоичноrо пред
ставления числа -тп. В этом случае, как
леrко видеть, 2n I т 2 " 1, и TPy
доемкость алrоритма определяется не
количеством n бит числа nl, а ero зна
чением: fA (п) == е (2"), и, следователь
но, алrоритм принадлежит подклассу
ExPR.
'$'
Анализ алrоритма методом под
счета вершин дерева рекурсии. Дepe
во рекурсии, f10рождаемое данным ak
J'ОрИТМОМ, представляет собой, очсвид
но, унарное дерево цепочку с т
вершинами (см. рис. 7.1) и с одним
листом, таким образом. вызов данноrо
<lлrоритма со значением т порождает дерево рекурсии со следующими
характеристиками:
Рис. 7.1. Дерево рекурсии, по
рожденное алrоритмом вычис
ления факториала при m == 4
R (т) == -тп, Rv (rп) == т 1, RL (rп) ::.-:-- 1,
1 (7.1.2)
Н п (т) =" m, В/, (rп) == .
rп
Временная эффективность функция трудоемкости. В COOTBeT
L'твии с методом подсчета вершин дерева рекурсии определим вначале
трудоемкость функции F(m) на один вызов/возврат fп (1). Напомним
результат, полученный в rлаве 6 трудоемкость механизма ВЫЗО
ва/возврата функции или процедуры в базовых операциях обслужива
IВIЯ проrраммноrо стека составляет
fп (1) == 2 (р + Т' + f + l + 1) .
(7.1.3)
'/! 7 I'оловсшкин
]
194 rл. 7. Рекурсивные алzоритмы решения некоторых задач
Поскольку функция F(m) передает один пара метр (р == 1), мы пред
полаrаем, что в стеке сохраняются значения четырех реrистров (т == 4),
одно значение возвращается через имя функции (f == 1), и функция
F(m) не имеет локальных переменных (l "'" О), то на основании форму
лы (7.1.3) имеем (в базовых операциях)
fR(l) ==2(1 +4+ 1 +0+ 1) == 14,
и, следовательно, с учетом (7.1.2)
fR (т) == R (т) fR (1) == т. 14.
Трудоемкость останова рекурсии включает в себя одно сравнение и oд
но присваивание, таким образом, fCI (1) ::::: 2, следовательно:
fCL (т) == R L (т) fCL (1) == 1 .2== 2,
во всех внутренних вершинах дерева (фраrмент рекурсивноrо вызова)
выполняется одинаковое количество операций fcv (v) == 4, и
fcv (т) == Rv (т) fcv (v) == (т 1).4 == 4т 4.
Объединяя все компоненты, получаем
fл(т)== 14т+4т4+2== 18т2,
(7.1.4)
и доля операций обслуживания дерева рекурсии составляет
fR (т) 14т 7
Рп (т) "" == т -----+ 00.
f л (т) 18т 2 9 '
Полученные результаты rоворят о том, что более 77% трудоемкости
тратится на орrанизацию рекурсии, и можно rоворить о крайней неэф
фективности рекурсивной реализации (что, впрочем, было и так оче
видно тем не менее, мы получили количественную оценку). Заметим,
что трудоемкость процедурной реализации в принятой методике счета
базовых операций составляет f А (т) == 5 т + 5, что в три с лишним
раза меньше.
Емкостная эффективность функция объема памяти. Для
получения оценки емкостной эффективности нам нужна функция
Ни (т), определяющая наибольшую rлубину дерева рекурсии. Напом
ним, что мы оцениваем объем оперативной памяти в условных ячейках,
размер которых достаточен для хранения используемых простых пере
менных. Поскольку, в соответствии с описанным в rлаве 2 механизмом
рекурсивноrо вызова, функция перед передачей управления сохраняет
в проrраммном стеке значения параметров, локальных переменных
и реrистров общеrо назначения в точке cBoero вызова, а также адрес
возврата, то наибольший объем памяти в области стека будет задей
ствован в конце самой rлубокой ветви дерева рекурсии и составит
(7.1.5)
V,t (т) == Н п (т)(р + r + f + l + 1).
2. Алzоритм вычисления чисел Фи60наччи
195
Поскольку данный алrоритм не требует локальных переменных и не
использует rлобальных ячеек и массивов, то
V (т) == V st (т) == Ни (т)(1 + 4 + 1 + О + 1) == 7HR (т) == 7т. (7.1.6)
На основе (7.1.4) и (7.1.6) мы можем определить ресурсную слож
ность алrоритма
c (т) == (е (т), е (т)).
Анализ трудоемкости алrоритма методом рекуррентных COOT
ношений. Воспользуемся уже известными значениями fCL (1) == 2,
f R (1) == 14 и f cv (1) == 4 для получения функции трудоемкости MeTO
дом рекуррентных соотношений. На основании общей формулы этоrо
метода для случая фиксированных значений трудоемкости в вершинах
дерева имеем
{ fA (1) == fR (1) + fCL (1);
f А (т) == f А (т 1) + f R ( 1) + f cv (11) , m > 1.
Подставляя числовые значения, получаем рекуррентное соотношение
для определения функции трудоемкости fA (т):
{ f А (1) == 16;
f А (т) == f А (т 1) + 18, т > 1,
и решение в замкнутой форме является очевидным
fA (т) == 18(т 1) + 16 == 18т 2.
Отме'им, что, хотя мы и получили результат, аналоrичный (7.1.4),
метод подсчета вершин дерева рекурсии позволяет получить более
детальную информацию о рекурсивном алrоритме.
2. Алrоритм вычисления чисел Фибоначчи
Рекурсивный алrоритм. Рекуррентное соотношение, определяю
щее рекурсивно заданную функцию, значениями которой являются
числа Фибоначчи (для aprYMeHTa т), имеет вид
{ fu (1) == 1; fЪ (2) == 1;
fЪ(т)==fЪ(тI)+fЪ(т2), т3.
(7.2.1 )
Рассмотрим рекурсивный алrоритм, вычисляющий числа Фибонач-
чи. в виде рекурсивной функции Fb(m) с остановом при значении
11/. == 1 или тп == 2.
(-'Ь(т)
If (т==l) or (т==2)
then
Fb r- 1
else
Fb < Fb(m 1)+Fb(m2)
(проверка останова рекурсии) 3
(останов рекурсии)
(рекурсия)
4
196 rл. 7. Рекурсивные аЛёоритм.ы решения некоторых задач
Return (Fb)
End.
Ero принадлежность к сложностному классу мы определим после
анализа трудоемкости алrоритма.
Анализ алrоритма методом подсчета вершин рекурсивноrо дe
рева. Дерево рекурсии, порождаемое данным алrоритмом, представ
ляет собой несимметричное бинарное дерево, вид KOToporo для rп == 5
приведен на рисунке 7.2. Поскольку вычисляемое число Фибоначчи
получается данным алrоритмом путем нарастающеrо суммирования
единичных значений в листьях, то, очевидно, что количество листьев
дерева равно значению числа Фибоначчи fb(rп). Замкнутая форма
для вычисления fb(rп) имеет вид (см. rлаву 1)
fu(m) )s с \;5 )'" )s с 2;5 ) '"
Для определения количества внутренних вершин в дереве рекурсии
заметим, что Rv (1) == о, Rv (2) == о, и увеличение значения rп на еди
ницу порождает объединение двух деревьев с добавлением корневой
вершины (см. рис.7.2).
Эти рассуждения позволяют записать рекуррентное соотношение
для вычисления Rv (rп):
{ Rv (1) == о; Rv (2) == о;
Rv(rп)==Rv(rпI)+Rv(rn2)+I, rп3.
Это линейное неоднородное рекуррентное соотношение с постоянными
коэффициентами и функцией 9 (rп) == 1. Используя метод решения из
rлавы 1, получаем
Rv(rп) == fb(rп). 1.
Поскольку в силу (7.2.1) рекурсия останавливается при rп == 1 или rп ==
== 2, то вызов данноrо алrоритма со значением rп порождает дерево
FЪ(l)
Рис. 7.2. Дерево рекурсии, порожденное алrоритмом вычисления чисел Фибо
наччи при т == 5
2. Алzоритм вычисления чисел Фи60наччи
197
рекурсии со следующими характеристиками при т 3:
R(m) == 2fЪ(т) 1, Rv (т) == fЪ(т) 1,
1
HR (т) == т 1, BL (т) ;:::: 2'
RL (т) == fЪ (т) ,
т 00 (7.2.2)
Временная эффективность функция трудоемкости. В COOTBeT
ствии с методом подсчета вершин дерева рекурсии определим вначале
трудоемкость fR (1) на один вызов/возврат функции Fb(m). Поскольку
функция Fb(m) передает один пара метр (р == 1), мы предполаrаем, что
в стеке сохраняются значения четырех реrистров (Т == 4), одно значение
возвращается через имя функции (f == 1) и функция Fb(m) не имеет
локальных переменных (l == О), то имеем
fR(I) == 2(1 +4 + 1 +0+ 1) == 14,
и, следовательно, с учетом (7.2.2)
fu (т) == R (т) fR (1) == (2 fb (т) 1) . 14 == 28 {Ъ (т) 14.
Трудоемкость останова рекурсии включает в себя два сравнения, одну
лоrическую операцию и одно присваивание, таким образом fCL (1) == 4,
следовательно:
fCL (т) == R L (т) fCL (1) == fb (т). 4,
во всех внутренних вершинах дерева (фраrмент рекурсивноrо вызова)
выполняется одинаковое количество операций fcv (v) == 3 + 4 == 7, и
...
fcv (т) == Rv (т) fcv (v) == (fl> (т) 1) . 7 == 7 fb (т) 7.
Объединяя все компоненты, получаем
fA (т) == 39fЪ (т) 21,
(7.2.3)
и доля операций обслуживания дерева рекурсии составляет
F R (т) == fR (пi) == 28 fЪ (т) 14 ;:::: 28
f А (т) 39 fЪ (т) 21 39 '
тп 00.
(7.2.4)
Емкостная эффективность функция объема памяти. Получе
ние оценки емкостной эффективности для данноrо алrоритма аналоrич
но оценке алrоритма вычисления факториала и определяется функцией
HR (т) наибольшей rлубиной дерева рекурсии. Поскольку данный
алrоритм также не требует локальных переменных и не использует
rлобальных ячеек, то требуемая память составит
V (т) == 'V.t (т) == н R (т)( 1 + 4 + 1 --т- 0-+-1) == 7 Н R (т) == 7 т 7,
(7.2.5)
и ресурсная сложность алrоритма с учетом (7.2.3) имеет вид
c (т) == (е (fb (т)), е (т)).
7 rоловешкин
198 Тл. 7. Рекурсивные алzоритмы решения некоторых задач
Сложностной класс алrоритма. Алrоритм, очевидно, относится
к классу Р R, поскольку, имея на входе только одно числовое значе
ние т, задает различное количество базовых операций, зависящее
от значения этоrо пара метра. Заметим, что поскольку числа Фибоначчи
растут экспоненциально, то в силу формулы (7.2.3) анализируемый
алrоритм принадлежит подклассу ЕхР R, т. е. трудоемкость является
экспоненциальной по т в силу формулы для общеrо вида чисел Фи
боначчи и дважды экспоненциальной по количеству битов в двоичном
представлении числа т.
Анализ трудоемкости алrоритма методом рекуррентных соот-
ношений. Воспользуемся уже известными значениями fCL (1) == 4,
f R (1) == 14 и f cv (v) == 7 для получения функции трудоемкости MeTO
дом рекуррентных соотношений. На основании общей формулы этоrо
метода для случая фиксированных значений имеем
{ fA (1) == fR (1) + fCL (1);
fA (2) == fR (1) + fCL (1);
fA (т) == fA (т 1) + fA (т 2) + fR (1) + fcv (1), т 3.
Подставляя числовые значения, получаем рекуррентное соотношение
для определения функции трудоемкости f А (т)
{ fA (1) == 18; fA (2) == 18;
fA(m)==fA(mI)+fA(m2)+21, т3,
решение в замкнутой форме будем искать в виде f А (т) == а fb (т) + Ь,
и, подставляя в рекуррентное соотношение, имеем
а fb (т) + ь == а fb (т 1) + ь + а fb (т 2) + ь + 21,
но fb (т) == fb (т 1) + fb (т 2), следовательно, Ь == 21, подставляя
в условие останова рекурсии, получаем а fb ( 1) 21 == 18, откуда а ==
== 39, и, окончательно
о
f А (т) == 39 fb (т) 21,
rде fb (т) тoe число Фибоначчи.
. .\
3. Алrоритм вычисления квадратноrо корня
Математическое обоснование рекурсивноrо алrоритма. Рекур-
рентное соотношение, определяющее рекурсивную последовательность
с начальным значением ХI == 1, пределом которой при n ....... 00 является:
значение va, мы уже рассматривали в rлаве 1. Оно имеет вид
Х п +1 == (х п + х а п ) . (7.3.1)
Однако в реальных компьютерных вычислениях нам необходимо полу
чить это значение с некоторой точностью 1::, которая зависит от нужд
3. Алzоритм вычисления квадратноао корня
199
применения и оrраничена точностью представления чисел с плавающей
точкой в используемом компьютере. Как правило, и это соrласуется
с форматами данных языков проrраммирования, значение с == 1O20
является вполне достаточным. Таким образом, возникает задача оценки
количества членов последовательности (7.3.1), позволяющих достичь
заданной точности. В общем случае значение Х n , доставляющее за
данную точность, равно как и значение ero номера n, зависит как от
требуемой точности с, так и от значения числа а, т. е. n == n (а, с).
Попробуем оценить, как абсолютная ошибка для следующеrо члена
последовательности (7.3.1) зависит от ошибки предыдущеrо члена.
Введем следующие обозначения:
Сn+1 == Хn+1 ...;а, сп == Х N ...;а,
и после подстановки в (7.3.1) инесложных преобразований получим
Сn+ I == 4 ( уа C сп ) . (7.3.2)
В целях дальнейшеrо анализа и, как это станет ясно ниже, для
повышения временной эффективности алrоритма, целесообразно так
орrанизовать процесс вычислений, чтобы зависимость n (а, с) была aд
дитивной по а и С. Тем самым мы хотим разделить процесс вычисления
квадратноrо корня на две фазы, трудоемкость каждой из которых
определялась бы только одним значением а или с, что приводит
К представлению n (а, с) в виде
",,'
п (а, с) == h (а) + 9 (с) .
(7.3.3)
Основная идея выделения таких фаз заключается в следующем
на первой фазе мы последовательным делением уменьшаем (при а
1) значение а до некоторой величины а', выполняя '(a) операций
деления, а на второй фазе получаем значение квадратноrо корня из
а', вычисляя 9 (с) значений последовательности (7.3.1). После этоrо
остается только скорректировать полученный результат с учетом пред
шествовавших операций деления.
Рассмотрим вначале вторую фазу. Отметим, !-!то если в формуле
(7.3.2) значения а оrраничены сверху, то при условиях, что уа
1 и V n Icn I < уа, формула (7.3.2) приобретает вид peKyppeHTHO
ro соотношения, зависящеrо только от начальноrо значения cl. Этот
путь является конструктивным, поскольку он позволяет выбрать такой
cerMeHT значений а, при котором значение сl удовлетворяет условию
!EII 0,5, что обеспечивает быструю квадратичную сходимость значе
IIИЙ сП К нулю. Выбор rраницы ICII 0,5 обусловлен как значением
коэффициента в формуле (7.3.2), так и принятой двоичной системой
счисления. Определим cerMeHT значений а, при котором IEII 0,5.
Лля этоrо вначале оrраничим область допустимых значений а: а 1.
Если мы фиксируем начальное приближение корня XI == 1,5, то в силу
определения CI и условия IEII 0,5, значение корня лежит в пределах
200 rл. 7. Рекурсивные алzоритмы решения некоторых задач
1 va 2, и, следовательно, значения а оrраничены cerMeHTOM 1
а 4. При этом, поскольку 1 va 2 и Vn > 2 О < Е п < 0,5, то
va + Е п > 1, и имеет место соотношение
1 ( Е; ) 1 2
Еп+l == 2' va + Е п < 2'Е п .
Тем самым, если мы, переходя к абсолютным значениям Е п для оценки
ошибки между истинным значением va и Х п , выбираем значения а,
максимизирующие Еl Еl == 0,5, то в результате получаем следующее
рекуррентное соотнощение:
{ 01 ; 1 2 (7.3.4)
Е п +1 == 2'Е п , n> 1.
Рекуррентное соотношение (7.3.4) может быть решено методом nOk
становки
Е2 == EI' Ез == (EIY == Et, Е4 == (Et)2 == 18 E,
что позволяет получить общий вид для Е п :
1 2n1
Е п == 22nll EIn1 ==2( ) ,
а поскольку начальное значение Еl == 0,5, то окончательная формула
имеет вид
2п1
Е п == 2 ( )
(7.3.5)
Если мы задаем Е точность вычислений (абсолютную ошибку), то
необходимое число членов последовательности (7.3.1) n == 9 (Е) опре
деляется из уравнения Е == Е п на OCHO Т а б л и ц а 7.1
ве (7.3.5). Дважды лоrарифмируя это
уравнение, получаем:
У(Е) ==log2(1 log2E). (7.3.6)
Некоторые значения функции 9 (Е)
приведены в таблице 7.1. Поскольку
значение 9 (Е) должно быть целым,
то нам необходимо вычислить n ==
== fg(E)l члеНОВ'последовательности.
Напомним, что мы получили oцeH
КУ сверху, а вычислительные экспери
менты показывают, что при 1 а 4
и начальном значении Хl == 1,5 уже шестой член последовательности
(7.3.1) дает точность порядка 1 025, тем самым для большинства
применений 9 (Е) == 6.
Е 9 (Е)
1,00E10 5,09673754
1 ,OOE 15 5,66757771
1 ,00E20 6,07550187
1 ,00E25 6,39314506
1 ,00E30 6,65331578
9 3. Алzoритм вычисления квадратносо корня
201
На второй фазе мы используем значение а' : 1 а' 4 как резуль
тат, полученный последовательными операциями деления на первой
фазе. Теперь, коrда cerMeHT для а' определен, становится ясно, что
делителем в первой фазе является число 4, и вычисления первой фазы
MorYT быть описаны в виде следующеrо peKyppeHTHoro соотношения,
задающеrо последовательность Yk:
{ Уl == а; (7.3.7)
Yk+l == Yk/ 4 , Yk > 4.
Для HeKoToporo значения k == т, при котором Ут 4, рекурсия
останавливается и выполняется вторая фаза с а' == Ут. По полученному
значению .,jO! искомый корень может быть восстановлен по формуле
va == 2т I ,;;;; . (7.3.8)
Особо отметим, что практически формула (7.3.8) может быть реализо
вана путем сложения порядка числа .jQ! с числом m 1.
Определим количество членов последовательности (7.3.7), необхо
димых для получения а' : 1 а' 4. С этой целью рассмотрим pe
курсивно заданную целую функцию fL (а), значением которой является
необходимое количество операций деления на 4 для получения а'.
Рекуррентное соотношение, задающее h (а), имеет вид:
{ fL (а) == О, 1 а 4;
fL(a) == fL(a/4) + 1, а> 4.
(7.3.9)
'"
Использование метода подстановки позволяет получить HepaBeH
ство, на основе KOToporo функция h (а) может быть определена в явном
виде:
а
1 4 h (a) 4,
откуда, лоrарифмируя и учитывая целочисленность функции fl (а),
получаем
fl (а) == l1og4 а 1 1_
(7.3.10)
Таким образом, мы имеем математическое обоснование для разработки
двухфазноrо рекурсивноrо алrоритма вычисления квадратноrо корня.
Рекурсивный алrоритм. Рассмотрим двухфазный рекурсивный
алrоритм, вычисляющий значение квадратноrо корня, в виде двух
процедурно реализованных рекурсивных функций.
Функция Sqrt(a) реализация первой фазы аJIrоритма при а> 1.
Sqrt(a)
If (а<4) (проверка останова рекурсии)
then
Sqrt +------ Sq(а,б) (останов рекурсии вызов второй фазы)
else
Sqrt +------ 2 * Sqrt(a/4) (рекурсивный вызов) 3
202 Fл. 7. Рекурсивные алсоритмы решения некоторых задач
Return (Sqrt)
End.
Мы рассмотрели для определенности случай, коrда а > 1, если
же значение а < 1, то первая фаза сводится к умножению на 4 при
рекурсивном вызове и последующему делению на 2 при рекурсивном
возврате.
Функция Sq(a,n) реализация второй фазы алrоритма.
Сложностной класс аЛrоритма. Алrоритм относится к классу
Р R, поскольку, имея на входе только одно числовое значение а (мы
зафиксировали е == 1020 и g (е) == 6),
задает различное количество базовых
операций, зависящее от значения пара
метра а. Обращаем внимание на oco
бен нос:уь, связанную с определением
ero принадлежности к подклассу класса
р R если мы рассматриваем обыч
ное двоичное представление числа а, то
в соответствии с формулой (7.3.1 О) дЛЯ
h (а) он относится к подклассу PlPR.
Однако для реальноrо представления
действительных чисел в виде мантиссы
и порядка функция h (а) линейна по KO
личеству бит порядка и, следовательно,
алrоритм относится к подклассу ЕхР R.
Анализ алrоритма методом под-
счета вершин дерева рекурсии По
скольку необходимое число членов двух
последовательностей, задающих дерево
рекурсии, мы уже определили выше,
то полное дерево, порождаемое данным
алrоритмом это унарное дерево с
' (а) + 7 вершинами, т. к. число вершин в первой фазе на единицу
больше ' (а), и с одним листом (см. рис. 7.3).
Sq(а,П)
If (п==1)
then
Sq 1,5
else
у Sq(a,n 1)
Sq 0,5 * (у+а/у)
Return (Sq)
End.
:/4
h(a)
а'
Sq(a', б)
6.
6 Sq(a', 1) == 1,5
Рис. 7.3. Дерево рекурсии, пo
рожденное алrоритмами Sqrt и
Sq при вычислении KBaдpaTHO
ro корня из а
(проверка останова рекурсии)
(останов рекурсии)
(рекурсивный вызов)
(результат)
2
4
3. АЛ20ритм вычисления квадратносо корня
203
Характеристики дерева рекурсии при вызове алrоритма со значени
ем а имеют вид:
R (а) == '! (а) + 7, R\I (а) == '! (а) -+ 6, RL (а) == 1,
1
HR (а) == h (а) -+ 7, В/, (а) == h(a) + 7 ' (7.3.11)
Временная эффективность функция трудоемкости. При aHa
лизе временной эффективности мы будем рассматривать только первую
фазу алrоритма функцию Sqrt(a), считая, что трудоемкость второй
фазы вычисление Sq(a,6), является трудоемкостью останова peKYP
сии в первой фазе алrоритма. Определим трудоемкость второй фазы,
при вычислении которой мы вначале определим трудоемкость обслужи
вания рекурсии. Поскольку функция Sq(a,n) передает два пара метра
(р == 2), мы предполаrаем, что в стеке сохраняются значения четырех
реrистров (Т == 4), одно значение возвращается через имя функции (f ==
== 1) и функция Sq(a,n) имеет одну локальную ячейку у (l == 1), то
на основании общей формулы имеем fH ВЧ (1) == 2 (2 -+ 4 -+ 1 -+ 1 -+ 1) ==
== 18. Общая трудоемкость второй фазы, которая включает в себя 5
рекурсивных вызовов и один останов, по уже освоенной читателем
методике (мы надеемся на это), с учетом трудоемкости обслуживания
рекурсии, одной операции присваивания и сравнения во фраrменте
останова рекурсии для функции Sqrt(a), составляет
fCL (а) == 6fH ВЧ (1) + 5 (1 -+ 2 -+ 4) + 1.2 -+ 2 == 147.
TpY.l\0eMKocTb функции Sqrt(a) первой фазы нашеrо алrоритма на
обслуживание рекурсии (один передаваемый пара метр без локальных
переменных fп (1) == 14) составляет
f R (а) == (h (а) + 1) f R (l) == rlog4 а 1 . 14,
во всех внутренних вершинах дерева рекурсии длн функции Sqrt(a)
(фраrмент рекурсивноrо вызова) выполняется одинаковое количество
операций fcv (v) == 1 + 3 == 4, и
fc\T (а) == h (а) fcv (v) == (!log4 01 1) .4.
Объединяя все компоненты, получаем трудоемкость двухфазноrо a"'1ro
ритма
fA (а) == 18 pog4al -+ 143,
(7.3.12)
и доля операций обслуживания дерева рекурсии по обеим фазам co
ставляет
F" R ( а ) == f R (а) == 14 :log4 а 1 -+ 6 . 18 !.. т 00.
fA (а) 18 pog4 a l -+ 143 9' (7.3.13)
Отметим, что в силу формулы (7.3.2) при больших значениях о
HecKoJ'IbKO первых членов рекурсивной последовательности (7.3.1) бу
дут иметь только вдвое меньшую абсолютную ошибку. Это означает,
что описанный двухфазный алrоритм обладает в силу (7.3.12) лучшей
204 Fл. 7. Рекурсивные алzоритмы решения некоторых задач
временной эффективностью по сравнению с непосредственной реали
зацией peKyppeHTHoro соотношения (7.3.1), требующей 6 продуктивных
операций на каждом рекурсивном вызове.
Емк.остн.ая эффек.тивность фун.к.ция объема памяти. При
оценке объема памяти, требуемоrо данным двухфазным алrоритмом,
обратим внимание, что во второй фазе помимо сохранения реrистров
в области стека туда же будет помещаться текущее значение локальной
переменной в точке ВbIзова [2 == 1. Это приводит К отдельному учету
rлуБИНbI дерева рекурсии для первой и второй фаз, и соответствующая
формула имеет вид
V st (т) == (h (а) + l)(р + r + f + [1 + 1) + 6 (р + r + f + [2 + 1) .
и, следовательно, при отсутствии rлобаЛЬНbIХ ячеек и массивов
V (т) == V st (т) == (h (а) + 1)( 1 + 4 + 1 + о + 1) +
+ 6 (2 + 4 + 1 + 1 + 1) == 7 Поg4 а 1 + 54.
Таким образом, ресурсная сложность алrоритма имеет вид
эt с (а) == (е (pog4 а 1 ) , е (pog4 а 1 )) .
Мы оставляем получение функции трудоемкости методом peKyppeHT
ных соотношений для этоrо алrоритма в качестве упражнения для
заинтересованных читателей.
4. Алrоритм быстроrо возведения числа
в целую степень
Математическое обоснование рекурсивноrо алrоритма. Задача
о быстром возведении числа в целую степень, т. е. вычисление значения
у == х17! для целоrо значения т, лежит в основе алrоритмическоrо
обеспечения мноrих криптосистем, например RSA [7.3]. Отметим, что
в этом аспекте применения значения т достаточно велики, что дe
лает неприемлемым обычный алrоритм последовательноrо умножения,
а вычисления производятся с целым значением х в мультипликативной
rруппе вычетов Z. в этом случае используется быстрый алrоритм
возведения в степень методом последовательноrо возведения в квадрат
[7.1], детальный анализ KOToporo представляет определенный интерес.
Идея быстроrо алrоритма возведения в степень состоит в использо
вании двоичноrо представления числа т и вычисления четных степе
ней х путем повторноrо возведения в квадрат [7.1]. Пусть, например,
т == 11, тоrда вычисления идут по схеме:
х 11 == Х . х 5 . х 5 , х 5 == х . х 2 . х 2 , х 2 == Х . х, х == х . 1,
4. АЛ20ритм быстрою возведения числа в целую степень 205
а рекуррентное соотношение, определяющее степень m числа х, имеет
вид:
{ 1'
хт == (хт/2)2,
х (x(mI)/2)2 ,
m ==0;
m == 2k;
m == 2k + 1.
Это позволяет записать рекуррентное соотношение, определяющее pe
курсиво заданную функцию j'(x, т) == х т :
{ I'
, 2
-f (х, т) == (f (х, '(п/2» , 2
х (f (х, (т 1)/2» ,
m ==0;
m == 2k;
m == 2k + 1.
(7.4.1 )
Рекурсивный алrоритм. Используя соотношение (7.4.1), построим
рекурсивный алrоритм, вычисляющий значение степени, в виде про
цедурно реализованной рекурсивной функции F(x,m) с остановом при
значении m == О (справа, как обычно, указано количество базовых опе
раций в строке). Особо отметим, что для нечетных чисел стандартная
операция целочисленноrо деления отбрасывает остаток, т. е.
mdiv2==(rпl) div2==k, m==2k+l, kO,
что позволяет избежать вычитания единицы из m для нечетных чисел.
F(x,m)
11 (т == О) (про верка останова рекурсии)
then
F +------ (останов рекурсии)
else
If (т mod 2)==0 (про верка четности) 2
then (т четно)
z +------ F(x, m div 2) (рекурсия) 2
F +------ z * Z (квадрат результата) 2
else (т нечетно)
z <------- F(x, m div 2) (рекурсия) 2
F<-------x*z*z 3
(умноженный на х квадрат результата)
end If
end If
Return (F)
End.
Сложностной класс алrоритма. Алrоритм относится к классу
р R, поскольку, имея на входе два числовых значения х и т,
206 rл. 7. Рекурсивные алzоритмы решения некоторых задач
задает различное количество базовых операций, зависящее от значения
параметра т. Отметим, что поскольку операция умножения является
базовой, значение х не влияет на трудоемкость алrоритма. Определим
ero принадлежность к подклассу класса Р R. Вначале напомним чита
телям, что в rлаве 5 были введены специальные функции, которые мы
будем использовать в целях анализа этоrо алrоритма: fJ (т), значением
которой является общее количество разрядов в двоичном представле
нии числа т, и функции fЗ! (т) и fЗа (т), задающие, соответственно,
количество единиц и нулей в этом представ
лен ии. Рассмотрим действительную длину
входа алrоритма количество значащих бит
п, предназначенных для двоичноrо представ
ления числа rп, п == fJ (т). Поскольку каж
дый рекурсивный вызов уменьшает на еди
ницу количество бит степени (при делении
на два), то трудоемкость алrоритма опреде
ляется количеством бит п на входе, fл (п) ==
== е (п) == е (llog2 т J), и, следовательно, ak
rоритм принадлежит подклассу PlP R.
Анализ алrоритма методом подсчета
вершин рекурсивноrо дерева. Дерево pe
курсии, порождаемое данным алrоритмом,
представляет собой унарное дерево цепоч
ку с одним листом, и количеством BHYTpeH
них вершин равным fJ (т). Вид дерева peKYP
сии показан на рисунке 7.4. Таким образом,
вызов данноrо алrоритма со значением т порождает дерево рекурсии
со следующими характеристиками:
: div 2
{3(т)
:
Рис. 7.4. Дерево peKYP
сии, порожденное алrо
ритмом возведения в CTe
пень для показателя m
R (т) == fJ (т) + 1 == llog2 mJ + 2, Rv(m) == fJ (т) == fЗl (т) + fЗа (т),
1
R L (m)==I, HR(rп) ==fЗ(rп) + 1, B L (rп)== ll J 2 ' (7.4.2)
ogz m +
Временная эффективность функция трудоемкости. В COOTBeT
ствии с методом подсчета вершин дерева рекурсии определим вначале
трудоемкость функции Р(х,т) на один вызов/возврат fR (1). По
скольку функция Р(х,т) передает два параметра (р == 2), мы предпо
лаrаем, что в стеке сохраняются значения четырех реrистров (т == 4),
одно значение возвращается через имя функции (f == 1) и функция
Р(х,т) имеет одну локальную переменную z (l == 1), то
fR(I) ==2(2+4+ 1 -+ 1 + 1) == 18,
и, следовательно, с учетом (7.4.2)
fR (т) == R (т)fп (1) == (fЗ (т) -+ 1) . 18.
4. Алzоритм быстроzо возведения числа в целую степень 207
Трудоемкость останова рекурсии включает в себя одно сравнение и oд
но присваивание, таким образом f с I, О) == 2, и
fCI, (т) == RI, (т) fCL (1) == 1 .2 == 2,
во внутренних вершинах дерева (фраrмент рекурсивноrо вызова) BЫ
полняется fcv (v) == 7 или fcv (v) == 8 операций, в зависимости от TO
ro, четным или нечетным является текущий aprYMeHT функции (млаk
ший бит равен О или 1), следовательно,
Jcv (т) == 813] (т) + 7130 (т).
Объединяя все компоненты, на основании общей формулы метода,
получаем
fл (т) == 18/3 (т) + 8/3\ (т) + 7130 (т) + 20,
(7.4.3)
и доля операций обслуживания дерева рекурсии составляет
fR (т) 18/3 (т) + 18 9
р н (т) == fA (т) == 18/3 (т) + 8/3\ (т) + 7/30 (т) + 20 ТЗ'
m 00. (7.4.4)
Определим трудоемкость алrоритма для лучшеrо и худшеrо слу
чаев. При этом мы должны рассматривать фиксированную битовую
длину входа алrоритма, т. е. те значения т, при которых функция
,8 (т) == const. Обозначим /3 (т) == n и рассмотрим значения т, которые
доставляют минимальное и максимальное значение фУНКIlИИ 131 (т)
при /3 (т) =--о n. Точкам экстремума функции /3\ (т) соответствуют зна
ченfiя aprYMeHTa m == 2" \ И m == 2" 1. В случае, если m == 2n \
(только старший бит двоичноrо представления числа rп равен единице),
/3\ (т) == 1, то
fA (т : /3 (т) == n) == 18n + 81 + 7 (n 1) + 20 == 25n + 21.
а в случае, если m == 2" 1 (все биты числа т равны единице),
/3] (n) == n, то
f (т : /3 (т) == n) == 18n + 8n + 20 == 26n + 20. (7.4.5)
Заметим, что для данноrо алrоритма функция трудоемкости не
является монотонно возрастающей. Рассмотрим rп == 2 " 1 и т + 1 ==
== 2", в этом случае
13(т)==n, (i(m.J...l)==n+l, 13\ (т)==n, /31(т+l)==l,
и, следовательно,
fA (т) == 26п + 20, fA (т + 1) == 25 (т + 1) + 21 == 25п + 46,
что влечет fA (т) > fл (т + 1) при m 227.
Если показатель степени заранее не известен, то можно получить
среднюю оценку в предположении, что представление числа т зани
мает п значащих двоичных разрядов, т. е.
2n\ rп < 2 n , n 1 log2 (т) < n, [log2 (m)J= п 1,
208 rл. 7. Рекурсивные алzоритмы решения некоторых задач
тоrда, используя результат, полученный в rлаве 5 для (35 (т), имеем
у А (т) == 18(3 (rп) + 8(35 (т) + 7 «(3 (т) (3.. (rп» + 20 ==
== 25(3 (т) + (3.. (т) + 20 == 25,5(3 (т) + 20,5, (7.4.6)
и переходя в (7.4.6) от (3 (т) к п, получаем
УА (т : fЗ (т) == п) == 25,5п + 20,5.
(7.4.7)
Таким образом, трудоемкость быстроrо алrоритма возведения в CTe
пень в среднем линейно зависит от количества бит в двоичном пред
ставлении показателя степени. Введение специальных функций fЗI (т)
и fЗ (т) позволяет получить точное значение трудоемкости анализиру
eMoro алrоритма как функции показателя степени.
Емкостная эффективность функция объема памяти. Для
получения оценки емкостной эффективности используем функцию
HR (т). Данный алrоритм использует одну локальную ячейку для xpa
нения значения z, и, в соответствии с принятой методикой, наибольший
объем памяти в области стека составит
V.. t (т) == НН (т) (2 + 4 + 1 + 1 + 1) == 9HR (т),
подставляя H R (т) из (7.4.2), получаем емкостную эффективность
алrоритма
V (т) == V,t (т) == 9Н (т) == 9l1og 2 mJ + 18,
(7.4.8)
что позволяет, на основе формул (7.4.5) и (7.4.8), определить ресурсную
сложность алrоритма в худшем случае:
(rп) == (9 (log2 т), 9 (log2 т»).
Анализ трудоемкости алrоритма методом рекуррентных COOT
ношений. Получим трудоемкость алrоритма в среднем. Для этоrо
используем уже известные значения fCL (1) == 2, fR (1) == 18 и среднее
значение У CV (1) == 7,5. На основании общей формулы этоrо метода
для случая фиксированных значений имеем
{ fA (О) == fR (1) + fCIJ (1);
f А (rп) == f А (l ; J) + f R (1) + У cv (v) , т;?: 1.
Подставляя числовые значения, получаем рекуррентное соотношение
для определения функции трудоемкости в среднем У А (т):
{ УА (О) == 20;
УА(т)==УА а т; л +25,5, т;?: 1,
(7.4.9)
9 Б. Алеоритм Карацубы умножения длинных целых чисел 209
решение в замкнутой форме может быть получено решением peKYP
peHTHoro соотношения (7.4.9) методами, изложенными в rлаве 5, и,
переходя к функции {3 (т), получаем
7 А (т : (3 (т) == n) == 25,5{3 (т) + 20.
что практически соrласуется с (7.4.7).
5. Алrоритм Карацубы умножения
длинных целых чисел
Математическое обоснование алrоритма. Метод декомпозиции
позволяет в целом ряде случаев, получить достаточно эффективные
по асимптотической оценке рекурсивные алrоритмы. Для задачи YMHO
жения длинных целых чисел использование этоrо метода позволило
А.А. Карацубе [7.2] впервые получить в 1962 [. алrоритм умножения
двух n битовых чисел, имеющий асимптотическую оценку, лучшую,
чем е (n 2 ). Изложим основные идеи этоrо алrоритма. Пусть u и Ь
два nбитовых числа в обычном двоичном представлении, т. е. старший
бит расположен слева. Количество разрядов п таково, что п == 2 k
это обеспечивает деление n пополам без остатка на всех рекурсивных
вызовах. Обозначим через nh значение n/2. Поскольку метод декомпо
зиции предполаrает разделение задачи, в данном случае на две равные
части на любом уровне рекурсии, то представим числа u и Ь в виде
u == 2пhU2 + а(, Ь == 2 nh b 2 + Ь],
[де ar.a2,b],b2 числа, имеющие длину в nh == n/2 бит (разрядов),
причем а2, Ь 2 старшие nh разрядов чисел u и Ь. Произведение аЬ
может быть записанО в следующем виде (и это есть основная идея.
предложенная А.А. Карацубой):
аЬ == 2nа2Ь2 + 2 nh «а] + а2) (Ь] + Ь 2 ) (а]Ь( + а2Ь2» + а(Ь(. (7.5.1)
Произведения в (7.5.1) MorYT быть вычислены рекурсивно, но мы
должны обеспечить умножение чисел, имеющих длину nh, это очевид
но для чисел а(, а2, Ь], Ь 2 они получены делением двух nбитовых
чисел пополам. Однако числа а] + а2 и Ь 1 + Ь 2 MorYT иметь nh + I
двоичных разрядов. В этом случае мы можем представить их в виде
суммы чисел длиной nh аз, Ь з , и однобитовых чисел а4, Ь4:
а] + а2 == 2uз + а4. Ь] + Ь 2 == 2Ьз + Ь 4 ,
тоrда
(и( + а2) (Ь( + Ь 2 ) == 4uзЬз + 2U4ЬЗ + 2UЗЬ4 + щЬ 4 , (7.5.2)
те uзЬз есть произведение чисел длиной nh. Слаrаемое а4Ь4 в (7.5.2)
имеет длину один бит, а остальные слаrаемые представляют собой
произведения nhбитовоrо и однобитовоrо чисел, вычисление которых
также не требует рекурсивных вызовов. Таким образом, мы свели
21 О rл. 7. Рекурсивные алzоритмы решения некоторых задач
задачу умножения двух n-битовых чисел к умножению трех пар чисел,
имеющих ровно nh == n/2 разрядов.
Вычислительная сложность алrоритма. Найдем вычислительную
сложность алrоритма Карацубы, т. е. асимптотическую оценку функ-
ции трудоемкости, на основе следующих рассуждений. Очевидно, что
пять сложений, одно вычитание и операции сдвиrа на n и n/2 разря-
дов, заданные формулой (7.5.1), требуют не более чем е (n) базовых
операций, равно как и операции умножения на однобитовые числа,
сложения и сдвиrи на четыре и два разряда в формуле (7.5.2). В данном
случае мы предполаrаем, что числа настолько велики, что они хра-
нятся в массивах, каждый элемент KOToporo содержит один бит числа.
Мы останавливаем рекурсию при значении 11 == 1, коrда произведение
аЬ вычисляется элементарно и требует не более чем фиксированноrо
числа базовых операций, которое мы обозначим через с. Поскольку
мы рекурсивно перемножаем три пары чисел половинной длины, то
приведенные выше рассуждения позволяют записать рекуррентное co
отношение для функции трудоемкости исследуемоrо алrоритма:
{ f А (1) == с;
fA (n) == 3fA (п/2) + е (n).
Используя основную теорему о рекуррентных соотношениях (Бент
ли, Хакен, Сакс), мы немедленно получаем оценку
(7.5.3)
fA (n) == е (nlоg2З), n!оg2 З n 1 ,5849, (7.5.4)
что асимптотически лучше умножения «в столбик» с оценкой е (n 2 ).
В случае если n -1- 2 k , мы определяем k из неравенства 2k! < n :::;
:::; 2 k , т. е. k == lIog2 n l, и дополняем числа а и Ь до k разрядов нулями
слева, получая следующую асимптотическую оценку:
n!оg2 З == зlоg2n fA (n) == е (3IIog2nl).
Существует возможность улучшения полученной асимптотической
оценки этоrо алrоритма, связанная с разбиением чисел а и Ь на
большее, чем два, количество слаrаемых. Однако такой подход
приводит к увеличению коэффициента, cKpbIBaeMoro е оценкой,
и рассмотрение этих модификаций выходит за рамки данной книrи.
Укажем для любознательных читателей, что асимптотически лучший
(с доказанной нижней rраницей задачи) алrоритм умножения длинных
целых чисел, основанный на использовании БЫСТРО1'0 преобразования
Фурье, принадлежит Штрассену и Шенrаrе [7.3] и имеет оценку
f А (п) == е (п ln n ln ln n).
Сложение и вычитание длинных битовых чисел. Реализация ал
rоритма Карацубы предполаrает наличие дополнительных алrоритмов
для сложения и вычитания двух двоичных чисел, заданных пора зря дно
битовыми массивами. Рассмотрим вариант алrоритма сложения, ис.
5. Алеоритм Карацубы умножения длинных целых чисел 211
пользующий специальную ячейку для хранения переноса в следующий
разряд. В этой же ячейке мы формируем текущую сумму. Массивы
р и Q содержат исходные lразрядные двоичные числа, а результат
формируется в l + 1 ячейках массива S.
Sum (1, Р, Q, 5)
(Р, Q исходные числа массивы длиной 1)
(5 массив результата длины 1+1)
sm +------ О (начальный перенос в следующий разряд)
For i +------ 1 downto 1
sm +------ P[i]+Q[i]+sm
5[i] +------ sm mod 2
sm +------ sm div 2
end For
5[0] +------ sm
End.
Получим трудоемкость алrоритма Sum относительно длины исход
ных массивов l. Трудоемкость не зависит от значений бит, хранящихся
в ячейках массивов, и на основании количества базовых операций
в строках имеем
1
1+3 * 1
5 * 1
3 * 1
2 * 1
2
fsиm (l) == 1 + 1 + l(3 + 5 + 3 + 2) + 2 == 131 + 4.
(7.5.5)
Алrоритм вычитания может быть построен на основании сведения
операции вычитания к сложению на основании следующих рассужде
ний. Пусть числа р и q имеют длину l бит, Torдa очевидно, что сумма
чис.ца q и ero инвертированноrо значения q равна 21 1, и разность
р q может быть записана в виде
р q == р (21 1 ч) == р + q + 1 21. (7.5.6)
Мы предполаrаем, что р q, что очевидно из (7.5.1). Torдa, поскольку
инверсия выполняется побитно, а операция вычитания числа 21, име
ющеrо длину l + 1, сводится к обнулению старшеrо (l + 1)ro разряда
суммы, то, алrоритм вычитания на основе (7.5.6) может быть записан
следующим образом.
Sub (1, Р, Q, 5)
(Р, Q исходные числа массивы длиной 1)
(5 массив результата длины 1+1, результат в 5[1..1])
sm +------ 1 (начальный перенос в следующий разряд) 1
For i +------ 1 downto 1 1 +3 * 1
sm +------ P[i]+(lQ[i])+sm 6 * 1
5[i] +------ sm mod 2 3 * I
sm r--- sm div 2 2 * 1
end For
5[0] r--- О 2
End.
Обратите внимание на то, что цикл не затраrивает старшеrо (l + 1)
ro разряда, и мы просто ero обнуляем в последней строке. Получим
212 rл. 7. Рекурсивные алzоритмы решения некоторых задач
n==4
Уровни
О (п)
1 ()
2 == log2 4 == К и1< )
Рис. 7.5. Полное тернарное дерево рекурсии, порожденное алrоритмом Kapaцy
бы при n == 4
трудоемкость алrоритма Sub относительно длины исходных массивов
1:
fsuь (l) == 1 + 1 + 1 (3 + 6 + 3 + 2) + 2 == 141 + 4.
(7.5.7)
Копирование и заполнение массивов. Еще два дополнительных
алrоритма, которые нам будут необходимы это копирование массива
и обнуление массива. Ниже мы приводим запись этих алrоритмов
с целью получения их функций трудоемкости.
Move (Р, Q, 1)
(Копирование 1 элементов из массива Р в массив Q)
For i 1 to 1
Q[i] P[i]
end For
End.
1+3 * 1
3 * 1
Трудоемкость алrоритма Move составляет
fmove (1) == 1 + 1 (3 + 3) == 61 + 1.
(7.5.8)
Fil1 (Р, 1, s)
(Заполнение 1 элементов массива Р числом s)
For i 1 to 1
P[i] s
end For
End.
Трудоемкость алrоритма Fil1 составляет
fpill (l) == 1 + 1 (3 + 2) == 5l + 1.
1+3 * 1
2 * 1
(7.5.9)
Структура данных. Исследуемый рекурсивный алrоритм порожда
ет полное тернарное дерево (см. рис. 7.5), содержащее k + 1 уровней,
rде k == log2 п, п длина сомножителей.
Поскольку операнды и результаты передаются из уровня в уровень,
и первый рекурсивный вызов порождает цепочку рекурсий, вплоть до
чисел единичной длины, то мы должны обеспечить структуру данных,
имеющую k + 1 уровней. Выбор между структурой, оптимальной по
емкостной эффективности, и структурой, обеспечивающей простоту
понимания и изложения материала, мы решаем в пользу последней.
5. Алzоритм Карацу6ы умножения длинных целых чисел 213
На каждом уровне должно храниться произведение, сомножители, три
результата умножения чисел половинной длины и две суммы а) +
+ а2, Ь з + Ь4. Мы предлаrаем структуру данных для этоrо алrоритма
в виде массива записей D[I..k+l].name[O..M], [де первый индекс есть
номер рекурсивноrо уровня, name одно из имен восьми массивов
данноrо уровня, а М длина результата M==2*n. Эта структура
данных показана на рисунке 7.6.
n п+1
м
АВ
А
В
AlВl
А2В2
А3В3
AlpA2
ВlpB2
результат умножения А*В в ячейках I..M
первый операнд А а2 I аl
второй операнд В Ь 2 I Ь)
al* Ь)
а2* Ь 2
аз* а2 Ь З
(аl +а2)==2*аз+ а 4 I аз I а4
(ы +Ь2)==2*Ь З +Ь 4 I ЬЗ I Ь 4
Рис. 7.6. Структура данных для алrоритма Карацубы
Исходные числа размещаются в D[I].A[n+l..M] и D[I].В[п+l..М],
а результат их умножения возвращается в D[I].AB[I..M]. Очередное
упражнение, которое мы предлаrаем читателям, состоит в разработке
структуры данных, оптимальной по емкостной эффективности. Заме
тим, TO идея динамическоrо выделения и освобождения памяти при
каждом рекурсивном вызове неконструктивна изза резко возрастаю
щеrо времени выполнения проrраммной реализации за счет обращения
к модулям операционной системы.
Алrоритм умножения длинных целых чисел. Рекурсивный алrо
ритм процедура КМиl получает на вход два длинных целых числа,
размещенных в компонентах А и В структуры О, представленных
в виде двух массивов длиной N. Элементы этих массивов биты чисел
а и Ь, которые расположены, начиная с правой rраницы компонента,
имеющеrо индекс М. Таким образом, числа а и Ь размещены как
обычные двоичные числа крайний левый значащий бит является
старшим. Уровень рекурсии, передаваемый как параметр процедуры,
необходим для праВИJlЬНОЙ индексации в выбранной структуре данных.
KMul(N, L)
(Умножение длинных целых:
(N длина чисел, L уровень рекурсии)
(Значение М количество разрядов окончательноrо результата)
If N == 1 (проверка останова рекурсии) 1
then
D[Ц.АВ[М] D[Lj.A[M] * D[Ц.В[М] 11
else
Nh N div 2 (половина длины) 2
214 fл. 7. Рекурсивные алzоритмы решения некоторых задач
NextL f------ L+ 1 HOMep следующеrо уровня)
il f------ M-Nh+l индекс правой половины)
i2 f------ MN+ 1 индекс левой половины)
(П f оизведение правых половин АIВ1==Аl*Вl)
Move(D[L).A[il],D NextL).A[il],Nh) 6
6(п/2)+1 [Move] + 16 [СаН]
Моvе(D[L].В[i1],D[NехtL) .В[il] ,Nh) 6
6(п/2)+1 [Move] + 16 [Са11]
KMul(Nh,NextL) (loe рекурсивное умножение)
(возврат результата)
Move(D[NextL) .AB[i2],D[L] .АIВl [i2],N)
2
З
З
6
6(п)+1 [Моуе] + 16 [СаН]
(произведение левых половин А2В2==А2 * В2)
Move(D[L) .A[i2] ,D[NextL) .A[il],Nh) 6
6(п/2)+1 [Move] + 16 [СаН]
Move(D[L) .В[i2],D[NехtL).В[i 1],Nh) 6
6(п/2)+1 [Моуе] + 16 [Са11]
KMul(Nh, NextL) (2oe рекурсивное умножение)
(возврат результата)
Move(D[NextL) .AB[i2] ,D[L) .A2B2[i2] ,N)
6
6(п)+1 [Move] + 16 [СаН]
(вычисление суммы АlрА2==Аl+А2)
KSum(Nh, D[L).A[ilI], D[L).A[i21],D[L).AlpA2[ilI]) 12
lЗ(п/2)+4 [Ksum] + 18 [СаН]
(вычисление суммы Bl f B2==B1+B2)
КSum(Nh,D[L).В[ilI],D[L).В[i21], D[L .BlpB2[ilI]) 12
lЗ(п/2)+4 [Ksum] + 18 [СаН]
(вычисление произведения АЗВЗ==АЗ * ВЗ)
А4 f------ D[L).AlpA2[M] (а4 младший бит суммы) 4
D[L).Al f A2[M] f------ О (АЗ * 2) 4
В4 f------ D Ц.ВlрВ2[М] (Ь4 младший бит суммы) 4
D[L).BlpB2[M] f------ О (ВЗ * 2) 4
(произведение АЗВЗ==АЗ * ВЗ)
Move(D[L) .Аl pA2[il 1 ],D[NextL) .A[i 1],Nh) 7
6(п/2)+1 [Move] + 16 [Са11]
Move(D[L] .В1 pB2[i 1 1] ,D[NextL) .В[i 1] ,l\'h) 7
6(п/2)+1 [Move] + 16 [Са11]
KMul(Nh, NextL) (Зое рекурсивное умножение)
(возврат результата с умножением на 4 влево на два бита)
Move(D[NextL] .AB[i2] ,D[L) .АЗВЗ[i22],N) 7
6(п)+1 [Move] + 16 [Са11]
(обнуление младших битов справа от произведения)
D[L).АЗВЗ[М] f------ О 4
D[L).АЗВЗ[МI] f------ О 5
If А4==1 1
then
(обнулить старшие разряды в В 1 рВ2 выравнивание длин)
Fill(D[L) .Вl рВ2[i2З] ,Nh+2,O)
5
5(2+п/2)+1 [Fc] + 16 [СаН]
(сложение: ЛЗВЗ f------ АЗВЗ+2 * ВЗ)
KSum(N +2,D[L).ЛЗВЗ[i2З],D[L).В 1 рВ2[i2З] ,D[L).АЗВЗ[i2З]) 1 З
5. Алzоритм Карацубы умножения длинных целых чисел 215
end If
If В4== 1
then
(обнУ.лить старшие разряды в АlрА2 выравнивание длин)
Fi11(D1L].AlpA2[i23],Nh+2,O) 5
5(2+п/2)+1 (Fc] + 16 (Саll]
(П f Ибавить А4В4 к А3)
D(L .АlрА2[М] t------ А4 4
(сложение: А3В3 t------ А3В3+2 * А3)
KSum(N+2,D(L].A3B3(i23] ,D(L].A 1 pA2(i23] ,D(L].A3B3[i23]) 13
13(2+п)+4 [Ksum] + 18 [Саll]
(Вычитание: А3В3 t------ А3В3 A18l)
end If
D(L].A18l (i21] t------ О 5
D(L].A 181 [i22] t------ О 5
KSub(N+2,D(L].A3B3[i23],D(L].A18l [i23],D(L].A3B3[i23]) 13
14(2+п)+4 [Ksub] + 18 [Саll]
(Вычитание: А3В3 t------ A3B3 А2В2)
D(L].A2B2[i21] t------ О 5
D[L].A2B2[i22] t------ О 5
KSub(N+2,D[L] .А3В3 [i23],D[L] .A2B2[i23] ,D[L] .A3B3[i23]) 13
14(2+п)+4 [Ksub] + 18 [Саll]
(формирование результата)
(в старшую половину компоненты Аl Вl занести А2В2)
Move(D(Lj.A2B2[i2],D(L].A18l [M2 * N+l],N) 9
6(п)+1 [Моуе] + 16 [Саll]
... (предварительно обнулясм результат компонент АВ)
Fill(D(L].АВ[М2 * N],2 * N+l,O) 7
5(2 * п+l)+1 [Fc] + lб [Саll]
(в середину компонснты АВ занести А3В3)
Move(D[L] .A3B3[i2 1] ,D[L] .АВ[МNNh],N+ l) 10
6(п+l)+1 [Моуе] + 16 [Саll]
(окончательный результат АВ+------АВ+ А 1 В 1; АВ+------ А 1 В I+А2В2+А3В3)
КSum(2*N,D[L]'лВ[М 2*N],D(L].A 1 Вl [М 2*NJ,D[L].АВ[М 2*NJ) 16
13(2 * п)+4 [KsumJ + 18 [Саll]
13(2+п)+4 [Ksum] + 18 [Саll]
1
end If
End.
Обращаем внимание на трудоемкости, которые мы указали в CTpO
ках после вызова внутренних процедур значение п является текущсй
ДЛИНОЙ обрабатываемоrо фраrмента и сокращается вдвое на каждом
рекурсивном вызове. Обозначение [Саll] относится к трудоемкости BЫ
зова/возврата процедуры, и зависит, что очевидно, от числа передава
емых параметров. Трудоемкости, указанные непосредственно в строке
вызова процедур, отражают опсрации, включая индексацию в массиве
и структуре, необходимые ДJIЯ вычисления передаваемых параметров.
Заметьте, что трудоемкость алrоритма может быть улучшена за счет за
мены каждоrо вызова вспомоrательных процедур на соответствующее
тело это приведет к увеличению длины текста алrоритма и потери
216 rл. 7. Рекурсивные алzорuтмы решения некоторых задач
ясности, но любые улучшения ресурсной эффективности должны чем
то оплачиваться.
Анализ дерева рекурсии. Выполним подсчет вершин в дереве,
порождаемым данным алrоритмом. Для этоrо алrоритма мы paCCMOT
рим только случай, коrда разрядность чисел а и Ь одинакова и равна
степени двойки: n == 2 k , k == log2 n. Ллrоритм, получая на входе два
массива из n элементов (двоичные разряды исходных чисел), делит
ero ровно пополам при каждом вызове, и это деление продолжается
рекурсивно вплоть до единичной длины. Поскольку каждое половинное
деление при водит к трем рекурсивным вызовам, то мы имеем дерево
рекурсии, представляющее собой полное тернарное дерево, содержа
щее k + 1 уровней; такое дерево для n == 4 показано на рисунке 7.5.
Определим характеристики полноrо TepHapHoro дерева rлубины k + 1.
используя рекурсивное задание функции R (n). Формула для общеrо
количества вершин может быть записана в виде следующеrо peKYP
peHTHoro соотношения, при условии, что значение k == log2 п есть целое
число:
{ R(1)==I;
R(n) =со 3R(nj2) + 1.
Нумеруя уровни дерева от О до k, можно определить R (n),
формулу для суммы rеометрической проrрессии
используя
k ЗН I 1 3 k 1
R(n)==1+3+9+...-+3 == 31 ==2'3 2' k==log2 n '
В этом дереве на уровне с номером k расположено 3 k вершин, что
доставляет решение для числа листьев дерева
RL (n) == 3 k == зlоg2n == nlog23.
Количество внутренних вершин, порождающих рекурсию, может БЫТI,
определено как разность Rv (n) == R (п) Rf (n). В результате ВЫЗOlI
данноrо алrоритма для умножения двух празрядных двоичных чисе;1
порождает дерево рекурсии со следующими характеристиками:
3 1 3 1 R ( ) 1 10['; 3 1
R (п) == 2 п 0[';2 2' v п == 2 п 2 2'
2nlog23
HR (n) == 1 -+ log2 п, B L (n) == 3 1 3 1
no g 2
R L (п) == nlog23,
2
3'
(7.5.1 О)
Анализ трудоемкости методом рекуррентных соотношений. По.
кажем, как можно получить функцию трудоемкости данноrо алrо.
ритма, опираясь на результаты анализа дерева рекурсии и решени!'
peKyppeHTHoro соотношения. Метод подсчета вершин дерева реКУрСИI'
включает три компонента для fA (n): fR (п), fCfJ (п) и fcv (n), KOTOPbl 1 '
мы и хотим получить в виде функций с неизвестными коэффициентаМI'
на основе результатов анализа дерева рекурсии. Трудоемкость обслу
5. АЛ20ритм Карацу6ы умножения длинных целых чисел 217
живания рекурсии определяется общи:\-! числом вершин и значением
fR (1), которое мы обозначим через т:
fR (п) =--= R (п) fп (1) == r (n)Og2 3 4) .
Обозначая fCL (1) == CI, получим общую трудоемкость в листьях
дерева
(7.5.11)
fCI, (п) == HI_ (п) fCI, (1) == с) (nlog23) . (7.5.12)
Функцию трудоемкости во внутренних вершинах fcv (п) мы полу
чим, заменяя в рекуррентном соотношении (7.5.3) функцию е (п) на
линейную функцию с неизвестными коэффициентами:
fcv (п) == 3Jcv (п/2) + сп + d. (7.5.13)
Общий вид fcv (п) получим суммированием функции сп + d по
всем вызовам во внутренних вершинах дерева рекурсии, т. е. по всем
уровням от О до k 1. Поскольку ЧИСJJO п есть полная степень двойки,
то последовательные деления на два дают нулевые остатки, TpyдoeM
кость во всех внутренних вершинах одноrо уровня одинакова:
fcv (п) == 1 (сп + d) + 3 (c + d) + ... + зk1 (c 2:1 + d) ==
( 3 ( 3 ) kl ) ( 3k )
==Rv(n)d+cn 1+2+".+ 2 =--=R v (n)d+2cn 2k 1 ,
но т."к. 2 k == 2)og2 п == п, с учетом формулы (7.5.10) для Rv (п) получаем
fcv (п) == (2С +) n)og2:{ 2сп ... (7.5.14)
Объединяя все компоненты, заданные формула:\1И (7.5.11), (7.5.12)
11 (7.5.13), окончательно получаем общую фОр:\1УЛУ трудоемкости для
,Iыоритма Карацубы:
l л (п) == n)og2 3 (2С+ +с) + T) 2cп С 1 ;т ). (7.5.15)
Неизвестные коэффициенты в (7.5.15) мы можем получить на oc
I!()ве анализа текста алrоритма. Определим значение r == f R (1). По
,'I<ОЛЬКУ процедура Kmul(N,L) передает два параметра (р == 2) и имеет
'll'lыеe локальных переменных, то
r == f R (1) == 2 (2 + 4 + о + 4 + 1) == 22,
:';'удоемкость останова рекурсии сравнение и 11 операций, таким
,,(jразом,
С) ==JcL(I) == 12.
['рудоемкость в среднем для внутренней вершины дерева определим
,,;'I!осительно корня на основе анализа трудоемкости в строках текста
218 Тл. 7. Рекурсивные алzоритмы решения некоторых задач
алrоритма. Мы предполаrаем по вероятности, что р(а4 == 1) == 1/2,
и равноположено р (Ь 4 == 1) == 1/2. Суммируя количество базовых опе
раций в строках фраrмента порождения рекурсии, получаем
1 cv (n) == 140,5 n + 683.
Подставляя полученные коэффициенты в (7.5.15), получаем оконча
тельный вид функции трудоемкости в среднем для алrоритма YMHO
жения длинных целых чисел в случае, коrда исходные числа имеют
длину n == 2k:
1 А (n) == 667,5n 1og2 3 281 n 352,5,
(7.5.16)
и доля операций обслуживания дерева рекурсии составляет
f R (n) 33n log2 3 11
F R (n) == fA (n) == 667,5n 1og2 3 281п 352,5 ::::: 0,0494,
noo.
(7.5.17)
Отметим, что для данноrо алrоритма доля обслуживания рекурсии
для реальных размерностей вполне приемлема и не превышает 5%.
Лучший и худший случай трудоемкости данноrо алrоритма MorYT быть
леrко оценены ИСХОДЯ из Toro, что на каждом рекурсивном вызове
алrоритма во внутренних вершинах дерева младшие биты сумм а, + а2,
Ь, + Ь2 а4, Ь 4 всеrда равны или нулю (лучший случай) или единице
(худший случай). Несложные выкладки показывают, что
л (п) == 589n 1og2 3 250n 305,0,
f (п) == 744,5n'og2 3 312п 398,5.
(7.5.18)
Сложностной класс алrоритма. Полученные формулы для лучше
ro и худшеrо случаев трудоемкости свидетельствуют, что параметриче
ский компонент влияет только на коэффициент при rлавном порядке,
и, следовательно, алrоритм принадлежит к классу N Р RL и облада
ет хорошей временной устойчивостью. СЛОЖНОСТНОЙ класс алrоритма
леrко определяется на основе (7.5.18) мы имеем полиномиальную,
с показателем log23' зависимость трудоемкости от длины входа, что
позволяет отнести алrоритм к классу 7r Р.
Решение по рациональному выбору между алrоритмом Карацубы
и простым умножением в столбик может быть принято на основе их
детальноrо анализа и коррекции коэффициентов с учетом эксперимен
тальноrо времени выполнения базовой операции. Данные ряда пуб
ликаций показывают, что алrоритм Карацубы эффективнее, начиная
с длины сомножителей порядка 15002000 битов [7.4]. Отметим, что
асимптотически оптимальный алrоритм ШтрассенаШенхаrе реально
эффективен, начиная с еще больших длин входа. ,.'
б. АЛiюритм фон Неймана сортировки массива чисел слиянием 219
Емкостная эффективность функция объема памяти. Оценим
требуемый объе:v! памяти в области стека, используя функцию Н Н (п).
Формула оценки памяти в области проrраммноrо стека известна:
V st (п) == н R (п)(р + r + f + l + 1) ,
данный алrоритм передает два параметра и использует четыре локаль
ных переменных, что при водит к
v"t (п) == н R (п) (2 + 4 + о + 4 + 1) == 111og 2 п + 11,
объем памяти используемой структуры данных может быть леrко по
лучен фактически мы имеем трех:v!ерный массив, количество ДBY
мерных слоев KOToporo равно rлубине рекурсии, таким образом,
v rпт (п) == 8 (1 + 2n)(1 + log2 п) == 16nlog2 n + 16n + 81og 2 п + 8,
V(n) == 16пlog2n+27n+ 81og 2 rL + 19. (7.5.19)
На основе (7.5.16) и (7.5.19) определяется ресурсная сложность
алrоритма
c (n) == (е (n 10g2 3) ,е (nlog2 п»).
6. Алrоритм фон Неймана сортировки массива
чисел слиянием
Разработка рекурсивноrо алrоритма. Покажем, как метод дe
композиции может быть применен для решения задачи сортировки,
исторически эта идея приписывается Дж. фон Нейману (информация
из [7.3J). Напомним, что метод декомпозиции предписывает разделение
задачи на части, решение подзадач и объединение решений. В приме
нении к задаче сортировки этот метод приводит к разделению входноrо
массива на две части для четной длины они будут одинаковые,
а для нечетной длины одна из частей массива будет на единицу
больше. Затем мы рекурсивно вызываем алrоритм для сортировки
полученных частей и объединяем возвращенные из двух рекурсивных
вызовов отсортированные фраrменты массива в один сортированный
массив. В классической реализации останов рекурсии происходит при
единичной длине массива [7.3J. Существует целый ряд различных
модификаций этоrо алrоритма, связанных с более ранним остановом
рекурсии на основе сортировки фраrментов небольшой длины алrорит
мом, более эффективным в этом диапазоне размерности. Рассмотрение
этих :v!одификаций выходит за рамки данной книrи, мы рекомендуем
заинтересованным читателям обратиться, например, к [7.4. 7.5].
Слияние отсортированных массивов. Собственно продуктивной
частью данноrо алrоритма является слияние двух отсортированных
массивов в один. Идея этоrо алrоритма состоит в том, что мы YCTa
навливаем два указателя на первые элементы массивов, и, сравнивая
элементы, заданные этими указателями, заносим в результирующий
220 rл. 7. Рекурсивные алzоритмы решения некоторых задач
массив меньшее значение (при сортировке по возрастанию). Указа
тель перемещенноrо элемента сдвиrается на единицу вправо, и цикл
повторяется. Есть различные способы останова указателя на rранице
массива, мы выбрали для реализации способ «концевых заrлушек»
в конец двух массивов записывается заведомо большее значение, ra
рантирующее, что основной цикл выберет при слиянии все числа двух
массивов, за исключением заrлушек. Отметим, что массивы для сли
яния являются фраrментами OCHoBHoro сортируемоrо массива, в связи
с чем нам необходимо переместить их вначале в два вспомоrательных
массива, т. к. результат должен быть помещен обратно в основной
массив. Альтернативой является более трудоемкий алrоритм, реали
зующий слияние по месту, т. е. в основном массиве, и не требующий
дополнительной памяти [7.3]. Заметим, что проблема выбора между
этими алrоритмами является иллюстрацией классической дилеммы BЫ
бора между временной и емкостной эффективностью.
Рассмотрим алrоритYI слияния (Merge) отсортированных фраrмен
тов массива А, расположенных в позициях между р и r, и r+l и
q. Алrоритм использует дополнитеЛЫ1Ые массивы Вр и Bq, в конец
которых, с целью остановки указателей, помещаются заrлушки. BHa
чале выполняется копирование отсортированных частей в Вр и Bq,
а затем объединенный массив формируется непосредственно в массиве
А между индексами р и q. Для удобства анализа в записи алrоритма
справа указано количество базовых операций в данной строке.
Merge (А, р, r, q)
(формирование заrлушки)
тах +------ A[r]
If Мах < A[q]
then
тах +------ A[q]
2
2
2
(копирование в массивы Вр, Bq)
kp +------ rp+l
р 1 +------ p 1
For i +------ 1 to kp
Bp[i] +------ A[pl+i]
Bp[kp+l] +------ тах
kq +------ qr
For i +------ 1 to kq
Bq[i] +------A[r+i]
Bq[kq+l] +------ тах
(заrлушка)
3
2
1 +kp * 3
4
3
2
1 +kq * 3
4
3
(заrлушка)
(слияние частей)
рр +------ 1
pq +------ 1
For i +------ р to q
If Вр[рр] < Bq[pq]
then
A[i] +------ Вр[рр]
(инициализация указателей)
1
, 1
1+т * 3
3
3
6. АЛ20ритм фон Неймана сортировки массива чисел слиянием 221
рр рр + 1 2
else
A[i] Bq[pq] 3
pq pq + 1 2
end If
End.
Найдем трудоемкость данноrо алrоритма для объединенноrо масси
ва, имеющеrо длину т. Пусть m == kp + kq == q р -+ 1 есть длина объ
единенноrо массива. На основании указанноrо в строках количества
операций и прсдположения о том, что строка тах A[q] выполняется
в среднем для половины обращений, можно получить трудоемкость
алrоритма слияния отсортированных массивов как функцию длины
массива результата:
7 тетуе (т) == 2 -+ 2 + 1 + 3 + 2 -+ 1 + 3kp + 4 kp + 3 -+ 2 -+ 1 -+ 3 kq +
--т- 4 kq + 3 + 1 -+ 1 +- 1 -+ 3т +- m (3 -+ 5) ==
== 11 m + 7 (kp-+ kq) +- 23 == 18т -+ 23. (7.6.1)
Заметим, что трудоемкость алrоритма слияния отсортированных
массивов практически не зависит от данных, этот парадокс объясня
ется тем, что блоки в конструкции if Вр[рр] < Bq[pq] содержат оди
наковое количество операций, и, следовательно, вероятности выбора
блоков then и else, очевидно зависящие от данных. не влияют на
трудоемкость конструкции ветвления в целом. Разница между худшим
и лучшим случаями равна двум операциям строка тах A[q]
либо'" выполняется, либо обходится. В теории алrоритм принадлсжит
классу N Р R, подклассу N Р RL, но практичсски ero можно считать
алrоритмом класса N.
Алrоритм сортировки слиянием. Рекурсивный алrоритм MSort
получает на вход массив А, и два индекса р и q, указывающис на ту
часть массива, которая будет сортироваться при данном вызове. Запись
этоrо алrоритма в виде рекурсивной процсдуры на языке BblcoKoro
уровня имеет вид
MSort (А, р ,q)
Ifpi-q
then
r(p+q) div 2
MergeSort(A,p,r)
MergeSort(A,r+ 1 ,q)
Меrgе(Л, р, r,q)
Return (А)
End.
Первоначальный вызов данной процедуры для сортировки Bcero
массива А, содержащеrо п элементов MSort(A,l,n). ПРИllадлеж
ность этоrо алrоритма к одному из трудоемкостных классов мы опре
делим после ero анализа.
(провсрка на останов рекурсии)
(середина массива)
(сортировка левой части массива)
(сортировка правой части массива)
(слияние отсортированных частей)
3
222 rл. 7. Рекурсивные алсоритмы решения некоторых задач
Анализ алrоритма методом подсчета вершин дерева рекурсий.
В соответствии с методом детальноrо анализа дерева рекурсий выпол
ним подсчет вершин в дереве рекурсивных вызовов алrоритма сорти
ровки слиянием. Вначале рассмотрим случай, коrда длина сортируемо
ro массива есть степень двойки.
С л у чай 1. Длина входа п == 2 k , k == log2 п. Ллrоритм, получая
на входе массив из п элементов, делит ero ровно пополам при первом
вызове, и это деление продолжается рекурсивно вплоть до единичных
элементов массива. В этом случае мы имеем дерево рекурсии, пред
ставляющее собой полное бинарное дерево, содержащее k уровней и п
листьев; такое дерево для п == 4 показано на рисунке 7.7.
Определим характеристики полноrо бинарноrо дерева rлубины k,
содержащеrо п листьев. Общее количество вершин R (п) может быть
определено с использованием формулы для суммы rеометрической про
rрессии
R (п) == 1 + 2 + ... + 2 k == 2 . 2 k 1 == 2п 1.
Поскольку полное бинарное дерево содержит п == 2 k листьев, то
R[, (п) == п, количество внутренних вершин, порождающих рекурсию,
равно Rv (п) == п 1. Тем самым вызов данноrо алrоритма для cop
тировки массива длины п порождает дерево рекурсии со следующими
характеристиками:
R(n)==2nl, Rv(n)==nl, R[,(n)==n,
п
HR (п) == 1 + log2 п, В[, (п) == 2п 1 .
(7.6.2)
Временная эффективность функция трудоемкости. В COOTBeT
ствии с методом подсчета вершин дерева рекурсии определим вначале
трудоемкость процедуры MSort(A,p,q) на один вызов/возврат fR (1).
Поскольку процедура MSort(A,p,q) передает три параметра (р == 3),
в стеке сохраняются значения четырех реrистров (r == 4), ни одно
Уровни k Высота HR(n)
о 1
..i; 2
.' .< .
.!
2 3
';:1)
Рис. 7.7. Полное бинарное дерево рекурсии, порожденное аЩQРИТМОМ COpT,
ровки слиянием при п == 22 == 4 <
'.
6. Алzоритм фОН Неймана сортировки массива чисел слиянием 223
значение не возвращается через имя процедуры (f == О), обращаем
на это внимание, и процедура MSort(A,p,q) имеет одну локальную
переменную r (l == 1), то в результате имеем
fR(I) ос"" 2(3+4+0+ 1 + 1) == 18,
и, следовательно, с учетом (7.6.2)
fR (п) == R (пНи (1) == (2п 1) 18 == 36п 18.
(7.6.3)
Трудоемкость останова рекурсии включает в себя одно сравнение,
таким образом fCL (1) == 1, следовательно,
fCL (п) == RL (п) fCIJ (1) == п. 1 == п.
(7.6.4)
Во всех внутренних вершинах дерева (фраrмент рекурсивноrо BЫ
зова) трудоемкость включает в себя подrотовку двух рекурсивных
вызовов, вызов и возврат из процедуры Merge(A,p,r,q) fMsort Си),
и трудоемкость выполнения процедуры Merge(A,p,r,q) fMerge (v).
В связи с этим представим трудоемкость во внутренней вершине
fcv (v) и суммарную трудоемкость внутренних вершин fcv (п) в виде
следующих сумм:
fcv (v) == fMsort (v) + fMerge (v),
fcv (п) == fcv Msort (п) + fcv Merge (п).
Вычислим значение f,'v/ sort Си) мы выполняем сравнение, вычисление
середины длины, прибавление единицы (r+l) и, сохраняя значение пе
ремен-tlой r (l == 1), передаем управление на процедуру Merge(A,p,r,q),
имеющую четыре параметра, и получаем управление обратно, таким
образом
fMsort (v) == 1 + 3 -т 1 + 2 (474 + о + 1 + 1) == 25,
и сумма fMsort (v) по всем внутренним вершинам составляет
fcv M..ort (п) == Rv (п) fMsort (v) == (п 1) . 25 == 25п 25. (7.6.5)
Для анализируемоrо алrоритма сортировки функция 9 (щ), фиrу
рирующая в формуле для метода подсчета вершин, в данном случае
есть трудоемкость слияния в вершине щ: 9 (Vj) == fMerge (щ). Для pac
сматриваемоrо СJlучая на фиксированном уровне рекурсивноrо дерева
слиянию подверrаются массивы одинаковой длины. Это значительно
упрощает вычисление суммы
Rv(n)
L 9 (1lj),
j1
поскольку одинаковые слаrаемые, связанные с одним уровнем, мосут
быть объединены. Поскольку трудоемкость алrоритма слияния для
массива длины m составляет в соответствии с формулой (7.6.1) 18т +
+ 23 и алrоритм вызывается Rv (п) == п 1 раз с разными длинами
224 Fл. 7. Рекурсивные алzоритмы решения некоторых задач
объединяемых фраrментов массива на каждом уровне дерева, то зна
чения 9 (щ) имеют вид
{ 9 (V1) == 18п +- 23;
9 (V2) == 9 (vз) == 18 (nj2) +- 23;
.4) ==g(vs) ==g(Vб) ==g(V7) == 18(nj4) +-23;
Суммируя 9 (щ) по всем внутренним вершинам дерева, имеем
Rv(n)
fcv м erge (n) == L 9 ( щ) ==-
j1
== 23Rv (n) +- 18n +- 2.18 (nj2) +- 4.18 (nj4) +-...,
учитывая, что таким образом обрабатываются все уровни дерева, кроме
последнеrо, который не содержит внутренних вершин, т. е. k уровней
рекурсивноrо дерева с номерами от О до k 1 (см. рис. 7.6), получаем
fcv Merge (n) == 18n k +- 23 (п 1) == 18п log2 п +- 23n 23. (7.6.6)
Учитывая все компоненты (Cvl. формулы (7.6.3)(7.6.6)), получаем
окончательный вид функции трудоекости для алrоритма сортировки
слиянием в случае n == 2k:
7 А (n) == fп (п) +- fCL (п) +- fcv Msort (n) +- fcv Merge (п) ==
== 36n 18 +- n -+ 25п 25 +- 18п log2 п +- 23п 23 ==
== 18nlog2n+-85n66, (7.6.7)
и доля операций обслуживанин дерева рекурсии составляет
f R (п) 36п .... 1 8
F п (п) == fA (Т ' ) == 8 1 85 . (7.6.8)
, 1 п og2 п +- п 66
Значения FH (n) мед.ленно убывают с ростом длины массива, так
при n == 1024 FR (п) :::::: 0,135, а при п == 1048576 FR (п) :::::: 0,08, но
для данноrо алrоритма доля обслуживания рекурсии для реа.льных
размерностей уже находится в пределах 8 15%.
Мы получили функцию трудоемкости в среднем (7.6.7), очевидно
соrласующуюся с результатом оценки rлавноrо порядка е (nlog2 п),
по.лученным по теореме Бентли, Хакен, Сакса. На основе этоrо резуль
тата мы можем rоворить, что алrоритм относится к классу 7r Р, т. е. яв
ляется полиномиальным по длине входа. Заметим, что асимптотически
он лучше, чем простые квадратичные алrорит:vrы сортировки, а область
ero рациональноrо применения по отношению к друrим алrоритмам
сортировки можно получить на основе методики сравнительноrо aHa
лиза, из.ложенной в [7.9].
Лучший и худший случай трудоемкости данноrо алrоритма MorYT
быть леrко оценены исходя из Toro, что каждый вызов процедуры
9 6. АЛ20ритм фон Неймана сортировки массива чисел слиянием 225
слияния при вычислении заrлушки либо выполняет, либо пропускает
2 операuии. Поскольку процедура слияния выполняется для каждой
внутренней вершины дерева, то имеем
fX (п) == 1 л (п) 1 . Rv (п) == 18nlog2rL +- 84п 67.
1:4 (п) == 1 л (п) +- 1 . Rv (п) == 18nlog2 п +- 86п 65.
Полученные результаты позволяют rоворить об очень слабой зависимо
сти трудоемкости от данных, алrоритм принадлежит к классу N Р RL
и обладает очень хорошей временной устойчивостью.
Емкостная эффективность функция объема памяти. Оценим
требуемый объем памяти в области стека, используя функцию H R (п).
Формула оценки памяти стека известна:
v"t (п) == НН (п) (р +- r + 1 +- l +- 1) .
Данный алrоритм требует в процедуре слияния двух дополнительных
массивов длиной. 1 +- п/2, передает три параметра, использует одну
локальную переменную и семь в процедуре слияния, таким образо:\'!,
требуемая память составляет
V (п) == 2 (1 +- п/2) +- 8 +- V st (п) ==
== п +- 10 +- HR (п)(З +- 4 +- 0+-1 +- 1) == п +- 91og 2 п +- 19, (7.6.9)
а ero ресурсная сложность в худшем случае имеет вид
!}( (А) == (0 (п log2 п) , е (п) .
С л у чай 2. Длина входа 2k--1 < п < 2 k , k == pog2 п 1. Ллrоритм,
получая на входе массив из п элементов, делит ero на две равные
части при четном п, и части, отличающиеся друr от друrа на единицу,
при нечетном значении п. Такое деление продолжается рекурсивно
вплоть до единичных элементов массива. В этом случае мы имеем
дерево рекурсии, представляющее собой бинарное дерево, содержащее
k уровней, из которых только k 1 уровней являются полными; такое
дерево для значения п == 11 показано на рисунке 7.8.
Определим характеристики этоrо бинарноrо дерева. Для этоrо,
пользуясь методом математической индукции, докажем, что формулы
R (п) == 2п 1, Rv (п) == п 1, RL (п) ::-:: п,
(7.6.1 О)
остаются верными и для случая неполноrо дерева. Базис индукции
если п == 2, то дерево содержит одну внутреннюю вершину и два
листа R (2) == З, Rv (2) =: 1, RL (2) == 2, что соrласуется с (7.6.1O).
Пусть формулы (7.6.IO) верны для п, докажем, что они верны и для
п +- 1. Нетрудно заметить, что увеличение п на единицу приводит
к замене одноrо листа на внутреннюю вершину с двумя листья:\'!и,
таким образом, Rv (п +- 1) == п 1 +- 1 == п, а R L (п +- 1) == п 1 +- 2 ==
== п +- 1, что и доказывает правильность формулы (7.б.l0) для про
извольноrо значения п. Поскольку высота дерева на единицу больше
226 Тл. 7. Рекурсивные алzоритм.ы решения некоторых задач
номера последнеrо уровня (напомним, что уровни нумеруются, начиная
с нуля), то
n
HR(n) == 1 + k == 1 + ilog2 n l, BL (n) == 2n l ' (7.6.11)
Поскольку формулы для характеристик дерева рекурсии не изме
нились, то связанные с ними формулы для компонентов трудоемкости
(7.6.3)(7.6.5) также остаются в силе. Изменения в рассматриваемом
случае касаются только трудоемкости слияния во внутренних верщи
нах Rv(n)
fcv Merge (n) == L: 9 (щ).
jl
Введем нумерацию внутренних верщин по уровням дерева и обозначим
через n)k) длину фраrмента массива, обрабатываемоrо в jой BHYT
ренней вершине kro уровня, а через v?) саму эту вершину (см.
рис. 7.8). С учетом Toro, что 9 (vY)) == 18nУ) + 23, искомая сумма
может быть записана следующим образом:
Rv(n) Rv(n)
fcv Merge (n) == L: (18n)k) + 23) == 23Rv (n) + L: 18n)k).
jl jl
(7.6.12)
Для нас представляет интерес последняя сумма в (7.6.12). Мы
уже отмечали, что дерево рекурсии в рассматриваемом случае явля
ется полным, за исключением последнеrо уровня. Обозначим через
т номер последнеrо полноrо уровня т == llog2 n J, Torдa rаранти
рованно предыдущий уровень с номером т 1 не содержит листьев,
Уровни k
о
'..\
2 (т 1)
1'(') V (4 ) 4 (т + ])
n ! l n2 1 nз l n 4 l '5n\4)l 6n4)1
Рис. 7.8. Дерево рекурсии, порожденное алrоритмом сортировки слиянием при
n == 11 ,"
9 б. АЛ80ритм фон Неймана сортировки массива чисел слиянием 227
а последний (т + l)й уровень содержит только листья. На уровне
т MorYT находиться как листья, так и внутренние вершины (см.
рис. 7.8). Нас интересует количество внутренних вершин на уровне т,
заметим, что поскольку дерево является бинарным, а на уровне т +
+ 1 находятся только листья, то nэт) == 2. Поскольку увеличение n
на единицу при водит к созданию новой внутренней вершины, а для
полноrо бинарноrо дерева все вершины последнеrо уровня являются
листьями, то на уровне т будет находиться n 2т внутренних Bep
шин. Эти рассуждения позволяют записать последнюю сумму в (7.6.12)
в виде двух сумм: суммы по всем т 1 уровням, содержащим только
внутренние вершины, и суммы по внутренним вершинам уровня т:
Rv(n) m1 2 k n2т
L 18n)k) == L L 18n)k) + L 18n)т).
j==1 k==O j==1 j==1
Поскольку сумма объединяемых фраrментов массива на полных ypOB
нях рекурсивноrо дерева всеrда равна полной длине массива n (Haдe
емся, что это утверждение не вызовет сомнений у наших читателей), а
n)т) == 2, то результат имеет вид
Rv(n)
L 18nJk) == 18nт + 18 (n 2т) . 2,
j==1
И В итоrе мы получаем
'"
fcv Merge (п) == 23Rv (n) + 18nт + 18 (n 2т) . 2, :
поскольку т == llog2 n J. а Rv (n) == n 1. то окончательно
fcv Merge (n) == 18n llog2 nJ + 59n 36. 2Llog2nJ 23.
Учитывая компоненты трудоемкости, задаваемые формулами (7.6.3)
(7.6.5), получим трудоемкость алrоритма сортировки слиянием в cpeд
нем для случая n -=1=- 2k:
7 А (n) == fR (n) + fCL (n) + fcv Msort (п) + fcv Merge (n) ==
== 36n 18 + п + 25n 25 + fcv' Merge (п) ==
== 18nLlog2nJ + 121n36.2Llog2nJ 66. (7.6.13)
Как и в случае 1, разница между полученной трудоемкостью в cpeд
нем, и худшим и лучшем случаями равна n 1.
Для данноrо алrоритма мы не будем приводить детальноrо реше
ния для получения трудоемкости методом рекуррентных соотношений,
отметим только, что полученная формула (7.6.13) является решением
соотношения
{ f А ( 1) == а;
fA (n) == fA (ln/2J) + fA crn/21) + Ьп + с
228 Тл. 7. Рекурсивные алоритмы решения некоторых задач
с конкретными коэффициентами а, Ь, с, определение значений которых
в соответствии с методом рекуррентных соотношений мы оставляем
читателю, и напоминаем, что общий случай решения рекуррентных
соотношений TaKoro типа был рассмотрен в rлаве 5.
7. fенетический алrоритм эвристическоrо поиска
экстремума функции нескольких переменных
Введение в rенетические алrоритмы. Практическая необходи
мость решения целоrо ряда N Р-полных задач в оптимизационной
постановке и задач поиска экстремума целевых функций при про
ектировании и исследовании сложных систем привела разработчиков
алrоритмическоrо обеспечения к использованию биолоrических Mexa
низмов для эвристическоrо поиска наилучших решений. В настоящее
время результаты, полученные в рамках научноrо направления, которое
можно назвать (,природные вычисления» [7.6], позволяют разрабаты
вать алrоритмы, достаточно эффективные как по качеству получаемых
решений, так и по временным оценкам их получения. Это направление
объединяет такие разделы, как rенетические алrоритмы, эволюцион
ное проrраммирование, нейросетевые вычисления, клеточные автоматы
и ДНКвычисления [7.6], муравьиные алrоритмы [7.7]. Исследователи
обращаются к природным механизмам, которые миллионы лет обеспе
чивают адаптацию биоценозов к окружающей среде. Одним из таких
механизмов, имеющих фундаментальный характер, является механизм
наследственности. Ero использование для решения задач оптимизации
привело к появлению rенстических алrоритмов. В живой природе особи
в биоценозе конкурируют друr с друrом за различные ресурсы. Те
особи, которые более приспособлены к окружающим условиям, -будут
иметь больше шансов на создание потомства. Слабо приспособленные
либо не произведут потомства, либо их потомство будет очень немнс
rочисленным. Это означает, что reHb! от более приспособленных особей
будут распространяться в последующих поколениях. Комбинация xopo
ших характеристик от различных родителей иноrда может приводить
к появлению потомка, приспособленность KOToporo в данном биоце
нозе больше, чем приспособленность ero родителей. Таким образом,
популяция в целом развивается, все лучше и лучше приспосабливаясь
к среде обитания. Алrоритм решения задач оптимизации, основанный
на идеях наследственности в биолоrических популяциях, был впервые
предложен Джоном Холландом (I975 r.). Он получил название pe
продуктивноrо плана Холланда и широко использовался как базовый
алrоритм в эволюционных вычислениях. Дальнейшее развитие, как,
собственно, и свое название rенетические алrоритмы, эти идеи по
лучили в работах fольдберrа и Де Йонrа [7.6, 7.8]. Цель rенетическоrо
алrоритма при решении задачи оптимизации состоит в том, чтобы
найти лучшее возможное, но не rарантированно оптимальное решение.
Для реализации rенетическоrо алrоритма необходимо выбрать подхо
7. rенетический аЛi10рит-м поиска экстре-му-ма функции 229
дящую структуру данных для представления решений. В постановке
задачи поиска экстремума экземпляр этой структуры должен coдep
жать информацию о некоторой точке в пространстве решений.
Терминолоrия и структура данных. Структура данных rенетиче
cKoro алrоритма состоит из набора хромосом. Хромосома, как правило,
представляет собой битовую строку, так что термин строка часто за
меняет понятие «хромосома». Вообще rоворя, хромосомы rенетических
алrоритмов не оrраничены только бинарным представлением, извест
ны друrие реализации, построенные на векторах вещественных чисел
[7.8]. Несмотря на то, что для мноrих реальных задач, видимо, больше
подходят строки переменной длины, в настоящее время структуры
фиксированной длины наиболее распространены и изучены. Для иллю
страции идеи оrраничимся битовыми строками. В этом случае каждая
хромосома (строка) представляет собой последовательное объединение
ряда подкомпонентов, которые называются 2енами. reHbI расположены
в различных позициях или локусах хромосомы и принимают значения,
называемые аллелями это биолоrическая терминолоrия. В представ
лении хромосомы бинарной строкой reH является битом этой строки,
локус есть позиция бита в строке, а аллель это значение reHa, О или
1. Биолоrический термин 2енотип относится к полной rенетической
модели особи и соответствует структуре в rенетическом алrоритме.
Термин фенотип относится к внешним наблюдаемым признакам и co
ответствует вектору в пространстве пара метров задачи. В rенетике
под мутацией пони мается преобразование хромосомы, случайно изме
няющее один или несколько reHOB. Наиболее распространенный вид
мутаций случайное изменение только одноrо из reHoB хромосомы.
Термин КрОССИН20вер обозначает порождение из двух хромосом двух
новых путем обмена rенами. В литературе по rенетическим алrоритмам
употребляются также термины скрещивание, кроссовер или рекомби
нация. В простейшем случае кроссинrовер в rенетическом алrоритме
реализуется так же, как и в биолоrии. При скрещивании хромосомы
разрезаются в случайной точке и обмениваются частями между собой.
Например, если хромосомы (11, 12, 13, 14) и (О, О, О, О) разрезать
между вторым и третьим rенами и обменять их части, то получатся
следующие потомки (О, О, 13, 14) и (11, 12, О, О).
Проблемы и особенности применения. Основная проблема, свя
занная с применением rенетических алrоритмов, обусловлена их эври
стическим характером. rоворя более cTporo, какова вероятность дости
жения популяцией rлобальноrо оптимума в заданной области при дaH
ных настройках алrоритма? В настоящее время на этот вопрос не суще
ствует cTpororo ответа и теоретически обоснованных оцеНОК.'Имеются
предположения, что rенетический алrоритм может стать эффективной
процедурой для поиска оптимальноrо решения задачи при условиях,
если пространство поиска достаточно велико, и предполаrается, что
целевая функция не является rладкой и унимодальной в области поис
ка; а также в случаях, если задача не требует нахождения rлобальноrо
230 rл. 7. Рекурсивные алzoритмы решения некоторых задач
оптимума, поиск KOToporo влечет значительные вычислительные затра
ты, а состоит в необходимости достаточно быстро найти приемлемое
«хорошее» решение условие, которое довольно часто встречается
в реальных задачах.
Если целевая функция обладает свойствами rладкости и унимо
дальности, то любой rрадиентный метод, такой, например, как метод
наискорейшеrо спуска, будет более эффективен. fенетический алrо
ритм является в определенном смысле универсальным методом, т. е.
он явно не учитывает специфику задачи или должен быть какимто
образом специально на нее настроен. Поэтому, если мы имеем HeKOTO
рую дополнительную информацию о целевой функции и пространстве
поиска (как, например, для хорошо известной задачи коммивояжера),
то методы поиска, использующие эвристики, определяемые задачей,
часто превосходят любой универсальный метод. С друrой стороны,
при достаточно сложном рельефе целевой функции rрадиентные Me
тоды с единственным решением MorYT останавливаться в локальном
экстремуме. Наличие у rенетических алrоритмов целой «популяции»
решений, совместно с вероятностным механизмом мутации, позволяют
предполаrать меньшую вероятность блуждания в окрестности локаль
Horo оптимума и большую эффективность работы на мноrоэкстремаль
ном ландшафте.
Сеrодня rенетические алrоритмы успешно применяются для полу
чения эвристических решений классических NРтРУДНЫХ задач, задач
оптимизации в пространствах с большим количеством измерений, ряда
экономических задач оптимальноrо характера [7.6, 7.8, 7.9]. Практика
их применения показывает, что в ряде случаев решения, получаемые
rенетическими алrоритмами, достаточно близки к оптимальным или
иноrда даже совпадают с ними [7.8].
Базовый rенетический алrоритм поиска оптимальных реше
ний. Приведем простой иллюстративный пример [7.8] задачу макси
мизации некоторой функции двух переменных f (Xj, Х2), при оrрани
чениях: О Хl 1 и О Х2 1. Обычно, методика кодирования веще
ственных переменных ХI и Х2 состоит в преобразовании их в двоичные
целочисленные строки определенной длины, достаточной для Toro,
чтобы обеспечить желаемую точность. Предположим, что lOразрядное
кодирование достаточно дЛЯ Х! и Х2. Установить соответствие между
rенотипом и фенотипом можно, разделив соответствующее двоичное
целое число на 210 1. Например, 0000000000 соответствует О, а
1111111111 соответствует 1023/1023 или 1. Оптимизируемая CTPYKTY
ра данных есть 20битовая строка, представляющая собой KOHKaTeHa
цию (объединение) кодировок для Хl И Х2. Пусть переменная Х! раз
мещается в крайних левых 1 О битах строки, тоrда как Х2 размещается
в правой части rенотипа особи. Таким образом, rенотип представляет
собой одну точку в 20MepHOM целочисленном пространстве (вершину
единичноrо rиперкуба), точки KOToporo и исследуются rенетическим
7. l''енетический аЛi!оритм. поиска экстрем.ум.а функции 23 I
алrоритмом. Для этой задачи фенотип будет представлять собой точку
х в двумерном пространстве aprYMeHToB х == (х\, Х2).
Чтобы решить задачу оптимизации, нужно задать некоторую меру
качества для каждой структуры в пространстве поиска. Для этой
цели используется функция приспособленности. При максимизации
целевая функция часто сама выступает в качестве функuии приспо
собленности, для задач минимизации целевая функция инвертируется
и смещается в область положительных значений. Рассмотрим фазы
работы базовOI'О rенетическоrо алrоритма [7.9]. Вначале случайным
образом rенерируется начальная популяция (набор хромосом). Работа
алrоритма представляет собой итерационный процесс, который про
должается до тех пор, пока не будет смоделировано заданное число
поколений или выполнен некоторый критерий останова. В каждом
поколении реализуется пропорциональный отбор приспособленности,
одноточечная рекомбинация и вероятностная мутация. Пропорциональ
ный отбор реализуется путем назначения каждой особи (хромосоме)
i, i == 1, п вероятности Р (i), равной отношению ее приспособлешюсти
к суммарной приспособленности популяции (по целевой функции):
Р (i) == J ii) ,
n
S=o'LJ(i).
i\
Затем происходит отбор (с замещением) всех п особей для даль
нейшей rенетической обработки, соrласно убыванию величины Р (i).
Простейший пропорциональный отбор реализуется с помощью рулет
ки случайноrо пропорциональноrо выбора (rольдберr, ] 989 r.). При
этом «колесо» рулетки содержит по одному сектору для каждоrо члена
популяции, а длина iro сектора пропорциональна значению Р (i). При
таком отборе члены популяции, обладающие более высокой приспо
собленностью, будут чаще выбираться по вероятности. После этоrо
выбранные п особей подверrаются рекомбинании с заданной вероят
ностью Ре' при этом п хромосом случайным образом разбиваются на
пj2 пар. Для каждой пары с вероятностью Р(' может быть ВblIlОЛllена
рекомбинация. Если рекомбинация происходит, то полученные потомки
заменяют собой родителей. Одноточечная рекомбинаIlИЯ работает сле
дующим образом. Случайным образом выбирается точка разрыва, т. е.
участок между соседними битами в строке. Обе родительские CTPYK
туры разрываются на два cerMeHT8 по этому участку. Затем COOTBeT
ствующие cerMeHTbl различных родителей склеиваются и получаются
два rенотипа потомков. После стадии рекомбинации выполняется фаза
мутации. В каждой строке, которая подверrается мутации, каждый
бит инвертируется с вероятностью Рт. Популяция, полученная после
мутации, записывается поверх старой и на этом завершается цикл
одноrо поколения в rенетическом алrоритме.
Полученное новое поколение обладает (по вероятности) более BЫCO
кой приспособленностью, наследованной от «хороших'> представителей
предыдущеrо поколения. Таким образом, из поколения в поколение, xo
232 rл. 7. Рекурсивные алzоритмы решения некоторых задач
рошие характеристики распространяются по всей популяции. Скрещи
вание наиболее приспособленных особей приводит к тому, что исследу
ются наиболее перспективные участки пространства поиска. В резуль
тате популяция будет сходиться к локально оптимальному решению
задачи, а иноrда, блаrодаря мутации, может быть, и к rлобальному
оптимуму. Базовый rенетический алrоритм может быть представлен
в виде последовательности следующих шаrов:
1. Создать начальную популяцию
2. Цикл по поколениям, пока не выполнено условие останова
(цикл жизни одноrо поколения)
2.1. Оценить приспособленность каждой особи
2.2. Выполнить отбор по приспособленности
2.3. Случайным образом разбить популяцию на две rруппы пар
2.4. Выполнить фазу вероятностной рекомбинации (кроссинrовера)
для пар популяции и заменить родителей
2.5. Выполнить фазу вероятностной мутации
2.6. Оценить приспособленность новой популяции и вычислить
условие останова
2.7. Объявить потомков новым поколением
3. Конец цикла по поколениям
Практическая реализация AaHHoro алrоритма требует ответа, по
крайней мере, на два вопроса какова начальная численность попу
ляции, и как может быть сформулировано условие останова? Второй
вопрос требует тщательноrо анализа, т. к. «слабое,> условие быстро
приведет к ближайшему локальному экстремуму, а «сильное,> К по
рождению значительноrо числа поколений, вплоть до цикла с непред
сказуемым временем выполнения.
Варианты rенетических алrоритмов. Очевидно, что тонкая Ha
стройка базовоrо rенетическоrо алrоритма может быть выполнена пу
тем изменения значений вероятностей рекомбинации и мутации, cy
ществует MHoro исследований и предложений в данной области, (см.,
например, [7.6, 7.8, 7.1 О]). в настоящее время предлаrаются разнооб
разные модификации rенетических алrоритмов в части методов отбора
по приспособленности, рекомбинации и мутации [7.8, 7.10]. Приве
дем несколько примеров. Метод турнирноrо отбора (Бриндел, 1981 r.;
fольдберr и Деб, 1991 r. [7.8]) реализуется в виде п турниров для
выборки п особей. Каждый турнир состоит в выборе k элементов из
популяции и отбора лучшей особи среди них. Элитные методы отбора
(Де Йонr, 1975 r.) rарантируют, что при отборе обязательно будут
выживать лучший или лучшие члены популяции. Наиболее распро
странена процедура обязательноrо сохранения только одной лучшей
особи. Двухточечная рекомбинация (fольдберr, 1989 [.) и paBHOMep
ная рекомбинация (Сисверда, 1989 r.) являются вполне достойными
альтернативами одноточечному оператору. При двухточечной peKOM
бинации выбираются две точки разрыва, и родительские XpOMOCO
мы обмениваются cerMeHToM, который находится между двумя этими
точками. Равномерная рекомбинация предполаrает, что каждый бит
7. rенеmический алсориmм поиска зксmремума функции 233
первоrо родителя наследуется первым потомком с заданной вероят
ностью; в противном случае этот бит передается второму потомку.
Механизмы мутаций MorYT быть так же заимствованы из молекулярной
биолоrии, например. обмен концевых участков хромосомы (механизм
транслокации), обмен смежных cerMeHToB (транспозиция) [7.10]. По
мнению автора, интерес представляет также механизм инверсии, т. е.
перестановки reHoB в хромосоме, управляющим пара метром при этом
может выступать инверсионное расстояние минимальное количество
единичных инверсий reHoB, преобразующих исходную хромосому в MY
тированную [7.10].
Математическое описание алrоритма. При разработке рекурсив
Horo rенетическоrо алrоритма будем опираться на изложенные выше
принципы одноточечной рекомбинации (кроссинrовера) со случайно
выбранной точкой разрыва и одноточечной мутации со случайным
выбором локуса. Под хромосомой будем понимать вектор вещественных
чисел, тем самым, предлаrаемый аJlrоритм является rенетическим алrо
ритмом без битовоrо кодирования. Будем считать для определенности,
что задача поиска экстремума функции формулируется как задача
поиска минимума вещественнозначной функции нескольких перемен
ных в оrраниченной области. <Рормально: пусть в некоторой области
G rпMepHoro евклидова пространства Ет задана функция 9 (х), х Е
Е Ет, х == (XJ,...,X т ) со значениями в R g(x) : G Е т ....... R.
Будем считать, что возможные значения aprYMeHTa х оrраничены в
Ет единичным кубом с начало:vr в нуле. Таки:vr образом, область С.
в которой ищется минимум функции 9 (х), задана следующим образом:
G == { х 1 х Е Е?п, V i == 1, rп о::::; Xi ::::; 1 } .
Введем в рассмотрение следующие функции Rl1d, значением
которой является случайное вещественное число из полуинтервала
[0,1) и Rl1d (k), значением которой является случайное целое число из
cerMeHTa [1, k], при этом числа, rенерируемые этими функциями, имеют
равномерное распределение. На их основе определим при 1 ::::; k ::::; rп
функцию <: (k, rп) со значениями в Ет следующим образом: вначале
зададим множество
.1 == {ji 1 ji == Rl1d (rп), ji # j{, i # l}, 1.11 == k,
которое будем рассматривать как множество случайных несовпадаю
щих индексов координат точки, тоrда точка х == <: (k, rп) в пространстве
Ет имеет координаты: х == (XJ,...,Xi,...,X m ), определяемые в COOT
ветствии с формулой
{ О, i rt .J
Xi == Rl1d, i Е .1 .
Содержательно функция <: (k, rп) rенерирует точку в единичном кубе
пространства Ет с началом в нуле, у которой k случайно выбранных
координат являются случайными вещественными числами из полу
8 rоловешкиН
234 Тл. 7. Рекурсивные аморитмы решения некоторых задач
интервала [О, 1), а остальные равны нулю. Отметим, что точка Х ==
== ((т, т), полученная обращением к функции ( с первым пара метром
равным т, есть точка единичноrо куба, все координаты которой яв
ляются случайными вещественными числами. Определим следующие
операции над точками Х пространства вт, которые являются rенети
ческими преобразованиями этих точек. При этом точка, имеющая т
координат, рассматривается как хромосома, имеющая т локусов, reHbI
в которых являются вещественными числами. Операция одноточечной
мутации:
м (х): Х....... Х,
rде x==(x+((l,т))modl,
мы используем обозначение у mod 1 для дробной части вещественно-
ro числа при покомпонентном сложении координат точки Х и точки
( (1, т). Очевидно, что kточечная мутация определяется аналоrично
с использованием функции ((k, т), определяющей как номера локусов,
подверrаемых мутации, так и случайные значения, добавляемые (по
modl) к соответствующим reHaM (координатам точки х). Операция
левоrо (CL) кроссинrовера:
C L (Xl,X2): (Xl,X2).......XL,
при этом
Xl,X2,XL Е вт,
XL: k==Rnd(тI),\li== l,k XLi==X2i, \li==k+l.т Хи==Хli,
и операция правоrо (C R ) кроссинrовера:
CR (Хl,Х2): (Хl,Х2)....... XR..
при этом
Xl,X2,XR Е вт,
XR: k==Rnd(тI),\li== l,k xRi==xli, \li==k+l,т XRi==x2i'
Таким образом, две новые хромосомы получаются перекрещиванием
(кроссинrовером) двух исходных с разрезом в случайной точке (индек
се координаты). Вполне возможно, что, унаследовав разные «хорошие»
половины хромосом родителей, эти потомки окажутся более «приспо-
собленными».
Общая идея предлаrаемоrо алrоритма состоит в том, что, используя
рекурсию для порождения бинарноrо дерева популяции исследуемых
точек, на шаrах рекурсивноrо возврата по известным точкам Хl, Х2
с использованием операций мутации и кроссинrовера строятся 6 до-
полнительных точек
XL, XR, М (Хl), м (Х2) , м (XL) , м (XR) ,
7. Тенеmический алеориmм поиска эксmрем-ума функции 235
и вверх по дереву рекурсии возвращается та точка х*, в которой
функция 9 имеет минимальное значение:
* . { g(X 1 ),g(X 2 ),9(x L ),9(X R ), 1.
х ==argmlll g(М(Хl»,g(М(Х2»,g(М(ХL»,g(М(ХR»f. (7.7.1)
Начальные особи популяции, т. е. точки в листьях бинарноrо дерева
рекурсии, MorYT быть получены с использованием функции ((т, т).
Схема rенетическоrо алrоритма. На основе сформулированных
выше предложений рекурсивный rенетический алrоритм поиска экс
тремума (минимума) функции 9 (х) может быть построен следующим
образом рекурсивная функция F (n, х) возвращает в F значение
экстремума (минимума) функции 9 (х), определяемое рекурсивно по
всем n уровням дерева популяции, а в х координаты точки, в KO
торой функция 9 (х) имеет минимальное из всех исследованных точек
значение, т. е. координаты точки эвристическоrо минимума, найденноrо
с использованием формулы (7.7.1). Значение n число уровней би
HapHoro дерева популяции задается пользователем. Это значение опре
деляет rлубину дерева рекурсии, листьями KOToporo являются точки
х Е Ет со случайными координатами х == ((т, т), при надлежащие
единичному кубу с началом в нуле. При ведем схему данноrо алrоритма
в виде рекурсивной функции:
F(п,х)
(Рекурсивный rенетический алrоритм поиска минимума функции,)
(п rлубина дерева рекурсии, х эвристическое решение,)
(I;:==g(x) значение функции в точке х)
If п== 1
then
x==Rnd (Точка со случайными координатами в листе дерева)
else
gхl==F(пI,х) (Рекурсивный вызов левое поддерево)
хl==х (Наилучшая точка левоrо поддерева)
gх2==F(пl,х) j рекурсивный вызов правое поддерево)
х2==х Наилучшая точка npaBoro поддерева)
xL==CL(x l,х2) Левый кроссинrовер х l,х2)
xR==CR(x 1 ,х2) Правый кроссинrовер х l,х2)
Мхl==М(х1) Одноточечные мутации возвращенных точек)
Мх2==М(х2)
MxL==M(xL) (Мутации точек, полученных кроссинrовером)
MxR==M(xR)
х==аrgmiп(g(х 1 ),g(x2),g(xL),g(xR),
g( Мх 1) ,g(Mx2) ,g(MxL) ,g( MxR»
(Оптимальная точка х та, в которой значение g(x»
(является наименьшим из восьми исследованных точек)
end If
F==g(x) (Значение функции в точке х)
(наилучшей для этой вершины рекурсивноrо дерева)
Return(F,x)
(Возврат в точку вызова координат точки х и значения F)
End.
236 rл. 7. Рекурсивные алzоритмы решения некоторых задач
Рассмотрим вызов этой функции с n == 3. Вызов Р(3,х) порождает
два вызова Р(2,х), которые, в свою очередь, порождают по два вызова
Р(1,х). Обращение к рекурсивной функции Р(n,х) с первым парамет
ром, равным единице, приводит к rенерации точки со случайными
координатами. Возврат двух точек из обращений к Р( 1 ,х) в тело Р(2,х)
приводит к выполнению операций кроссинrовера и мутаций на
основе двух полученных точек порождается дополнительно еще шесть.
Наилучшая точка, в смысле минимума целевой функции, возвращается
в тело вызова Р(3,х) по левой ветви дерева рекурсии. Аналоrично
формируется результат, возвращаемый Р(2,х) по правой ветви дерева
(второе обращение). В теле функции Р(3,х) две наилучшие точки, по
лученные двумя вызовами Р(2,х), подверrаются кроссинrоверу и MYTa
ции, и функция возвращает координаты точки, в которой исследуемая
функция имеет наименьшее значение.
Отметим, что различные вызовы данноrо алrоритма приведут, воз
можно, к получению различных результатов алrоритм не rapaH
тирует rлобальноrо оптимума, а rенерируемые при каждом вызове
случайные совокупности начальных точек будут различны. Аналоrия
с популяцией выrлядит следующим образом цепочка рекурсивных
вызовов порождает реrулярную структуру популяций, в которой ypo
вень листьев является начальной популяцией, а каждая следующая
образуется из лучших особей предыдущей популяции и новых особей,
полученных путем кроссинrовера и мутаций. Цепочка рекурсивных
возвратов реализует отбор лучших особей предыдущих популяций, при
этом в каждой внутренней вершине дерева выбирается одна лучшая
особь.
Возможные модификации алrоритма. Этот рекурсивный алrо
ритм допускает простые модификации, среди которых, помимо очеВИk
ных модификаций rенетических операций, можно выделить следую
щие:
построение рекурсивноrо дерева популяции в виде napHoro дepe
ва, что может быть реализовано путем добавления строк рекурсивноrо
вызова;
выбор в каждой вершине, за исключением корневой, нескольких
лучших особей (точек) из популяции, порожденной данной верши
ной, что реализуется передачей вверх по дереву рекурсии координат
нескольких точек в окрестности локальноrо экстремума (в смысле
точек данной вершины дерева популяции);
использование направленной rенерации начальных точек попу
ляции в листьях рекурсивноrо дерева, учитывающей определенным
образом специфику локализаций экстремума в конкретной задаче.
Вычислительная сложность алrоритма. Найдем вычислитель
ную сложность, т. е. асимптотическую оценку функции трудоемкости
предложенноrо алrоритма, Очевидно, что эта оценка определяется об
щим количеством точек (особей популяций), исследуемых алrоритмом
и трудоемкостью их обработки. Для каждой точки алrоритм вычисляет
9 7. Fенеmический алzориmм поиска эксmремума функции 237
значение функции g(x) и выполняет одну из rенетических операций,
включая случайное порождение. Введем обозначения:
Р (п) количество точек, порожденных во всех п уровнях дерева;
fg (т) трудоемкость вычисления функции 9 (х);
fgen (т) трудоемкость rенетических операций.
В результате получаем
fл (n, т) ,,; е (Р (n) иу (т) + fqen (т»),
(7.7.2)
rде fл (n, т) трудоемкость исследуемоrо алrоритма. Отметим, что
в данном случае трудоемкость обслуживания дерева рекурсии не опре
деляет rлавный порядок в оценке трудоемкости вычислений, и поэтому
не учитывается, равно как и вычисление х по фОР:vIуле (7.7.1), требую
щее фиксированноrо числа операций. Фиксируем значение размерности
пространства т, замечая, что все rенетические операции не более
чем однократно обрабатывают все координаты точки х, и, считая, что
трудоемкость функции Пшl составляет е (1), что справедливо для
линейных конrруэнтных I'eHepaTopoB [7.1], получаем оценку
fg"n (т) == е (т).
(7.7.3)
Для определения количества точек, исследуемых алrоритмом, BBe
дем в рассмотрение рекурсивно заданную функцию Р (п). Поскольку
в листе дерева порождается только одна точка, само дерево является
бинарным и в каждой внутренней вершине исследуется дополнитель
но 6 точек, имеем линейное неоднородное рекуррентное соотношение
первоrо порядка
....
{ 1
P(n)' ,
2P(пI)+6,
п == 1;
n 2.
(7.7.4)
В соответствии с теорией, изложенной в rлаве 1, будем искать
решение этоrо peKyppeHTHoro соотношения в виде Р (п) == а . 2 п + Ь.
Подставляя это решение в (7.7.4), имеем а . 2 п 'т Ь == 2 (а . 2n I + Ь) + 6,
откуда Ь == 6, а начальное значение Р (1) ,;'0 1 позволяет определить а
т а б л и ц а 7.2 из уравнения а. 21 .6'; 1, откуда
а == 7/2. -=.;. Р (n)-' 7 . 2пl 6. (7.7.5)
КОJ1ичество точек, исследуемых алrорит
мом, в зависимости от пара метра п, приведено
в таблице 7.2. Отметим, что этот пара метр
задается пользователем и определяет общее
число точек, исследуемых алrоритмом в задан
ной области.
Подставляя (7.7.3) и (7.7.5) в (7.7.2), OKOH
чательно получаем искомую оценку трудоемкости (сложность) peKYP
сивноrо rенетическоrо алrоритма
п Р(п)
18 917 498
19 1 835 002
20 3 670 010
21 7 340 026
22 14 680058
fл (п, т) == е ((7. 2 n ' I 6) иу (т) + е (т)) ==,
== е (2 n иу (т) + т», (7.7.6)
238 rл. 7. Рекурсивные алzорит-м,ы решения некоторых задач
таким образом, трудоемкость данноrо алrоритма не зависит от oco
бенностей локализации экстремумов исследуемой функции в области
определения, и, следовательно, предлаrаемый алrоритм обладает свой
ством временной устойчивости. Отличительной особенностью данноrо
алrоритма является зависимость ero трудоемкости только от размерно
сти пространства, в котором задана исследуемая функция, и количе
ства уровней (поколений) в рекурсивном дереве популяции, заданных
пользователем.
Сложностной класс алrоритма. Алrоритм относится к классу
Р R, поскольку, имея на входе только одно числовое значение, задает
различное количество базовых операций, которое при фиксированной
размерности пространства т зависит только от значения параметра n,
заданноrо пользователем. Трудоемкость алrоритма определяется, в со-
ответствии с (7.7.6), значением n fA (п) == е (2 n ), а не количеством
бит в ero представлении, и, следовательно, алrоритм принадлежит ПОk
классу ЕхР R. Если мы рассматриваем битовую длину входа алrоритма
т : 2т 1 п < 2т, то в этом аспекте он принадлежит сложностному
классу 7r Р, т. к. является дважды экспоненциальным по т.
Структура данных. Исследуемый рекурсивный алrоритм порожда-
ет полное бинарное дерево, содержащее п уровней, rде п задаваемый
пользователем параметр. Значение n определяет также и количество
точек, исследуемых алrоритмом их будет Р (п). Но мы уже знаем,
что дерево рекурсии порождается левым обходом, и, следовательно,
в каждый момент времени на не котором уровне дерева будет активна
только одна вершина. Мы предлаrаем следующую структуру данных
для этоrо алrоритма, основанную на том, что алrоритм ищет экс-
тремум функции т переменных, т. е. точка Х есть точка m-мерноrо
пространства, и в каждой BHYTpeH
ней вершине дерева обрабатывает
ся 8 точек. Структура данных преk
ставляет собой трехмерную матрицу
Vx[1..n,1..8,O..m], первый индекс KO
торой соответствует текущему ypOB
ню дерева рекурсии, второй номеру
исследуемой точки (i == п) в дан-
ной вершине дерева, а третий пробе
raeT значения координат точки Xi ==
== (Xil"", Xim), И по нулевому зна
чению TpeTbero индекса мы храним
значение целевой функции g (Xi). Об-
ращаем внимание наших читателей на
то, что в конкретной реализации значение т является константой. Эта
структура данных показана на рисунке 7.9.
Используемая структура не является оптимальной по затратам па
мяти, мы используем ее, прежде Bcero, для простоты понимания алrо
о
м
Хl
Х2
Х3
Х4
Х5
Хб
Х7
Х8
g Хl Хl Х т
g Х2
g "-3
g Х4
g Х5
g Хб
g Х7
g "-8
Рис. 7.9. Структура данных для
рекурсивноrо rенетическоrо ak
rоритма поиска экстремума
7. rенетический аморитм поиска экстремума функции 239
ритма. Насколько можно сократить используемую память, и как может
быть построена оптимальная структура хранения данных для этоrо
алrоритма? эти вопросы мы оставляем в качестве упражнений для
наших читателей.
[енератор случайных чисел. В целях анализа трудоемкости ис
следуемоrо алrоритма необходимо знать трудоемкость rенерации псев
дослучайноrо числа. Мы при водим наиболее распространенный reHe
ратор, использующий линейный конrруэнтный метод [7.1), без указа
ния конкретных настроечных коэффициентов. Заметим, что качество
получаемой псевдослучайной последовательности существенно опре
деляется значениями а, Ь, N и запускающим значение!\1 zo. Функция
возвращает псевдослучайное число в полуинтервале [О, 1).
Rnd (z rлобальная переменная)
Z t------- (z * а+Ь) mod N 4
Rnd t------- z/N 2
Елd.
Трудоемкость этоrо алrоритма (как функции, возвращающей значе
ние по имени), в базовых операциях принятой нами модели вычисле
ний, на один вызов/возврат составляет
f Rnd == 2(0 + 4 ---r 1 + О + 1) + 4 + 2 == 18.
Рекурсивный алrоритм. Рассмотрим рекурсивный алrоритм, pe
ализующий идеи rенетическоrо поиска минимума мноrомерной функ
iщи,r в виде рекурсивной процедуры F(л). Выше, в общем случае, мы
рассматривали рекурсивную функцию, однако предложенная структура
данных позволяет хранить значения целевой функции, и реализация
в виде процедуры представляется нам более целесообразной. Останов
рекурсии в этой процедуре происходит при значении п == 1 и сводится
к rенерации случайной точки в TпMepHOM пространстве. Некоторых
пояснений требует расположение результатов процедура на уровне
k возвращает значение целевой функции в Vx[k,t,O], координаты
найденной оптимальной точки в Vx[k,t,t..m], это первая строка
двумерной матрицы уровня k, а окончательный реЗУJlьтат возвращается
в Vx[n,t,O] и Vx[n,t,l..m].
F(n)
If (п==1)
then
For i t------- 1 to т
Vx[n,l,i) <----- Rnd
Vx[n,I,O) f------ g(n,l)
else
F(n 1)
I+Зт
(4+18)m
4+f(g)
(1 ый рекурсивный ВЫ30врезультат в Vx[n,l ,О..т)
For i f------ О to т I+З(т+1)
Vx[n,l,i) f------ Vx[nI,I,i) 8(т+1)
F(nl) 1
240 Тл. 7. Рекурсивные алzоритмы решения некоторых задач
(2ой рекурсивный вызоврезультат в Ух[п,2,О..т])
For i О to m I+З(m+l)
Vx(n,2,i] Vx(nI,I,i] 8(т+l)
(кроссинrовер координат полученных точек)
k 2+Rnd(m2)
(k точка разрыва)
For i 1 to k
Vx[n,3,i] Vx(n,2,i]
Vx[n,4,i] Vx(n,1,i]
For i k+1 to m
Vх[п,З,i] Vx[n,1,i]
Vx[n,4,i] Vx[n,2,i]
(копирование для последующей мутации)
For j 1 to 4
For i 1 to m
Vx[n,j+4,i] < Vx[n,j,i]
(мутации хромосом 58)
For j <- 5 to 8
k 1 +Rnd(m)
Vx[n,j,k] Vx(n,j,k]+Rnd
Н Vx(n,j,k] > 1
then
Vx[n,j,k] f----- Vx[n,j,k]1
(расчет значений функции для точек 38)
For j f-- з to 8
Vx[n,j,O] g(n,j)
(поиск минимума)
k < 1
Gmin Vx[n,I,O]
For j < 2 to 8
If Vx(n,j,O] < Gmin
then
k f----- j
Gmin f----- Vx[n,j,O]
(формирование результата)
For i О to m
Vx[n,l,i] f--- Vx(n,k,i]
end Н
End.
3+18
1+3k
7k
7k
2+3(mk)
7(mk)
7(mk)
1+3 * 4
О+3т) * 4
8 * 4т
1 +3 * 4
(2+18)*4
(8+18) * 4
4 * 4
8 * 4 * 0,5
1+3 * 6
(4+f(G)) * 6
1
4
1+3 * 7
4 * 7
1
4
1 +3 * (т+ 1)
7 * (т+l)
Анализ трудоемкости алrоритма методом рекуррентных COOT
ношений. Для данноrо алrоритма мы получим функцию трудоемкости
методом рекуррентных соотношений и надеемся, что читатели CMorYT
получить аналоrичный результат методом подсчета вершин дерева pe
курсии, что мы И оставляем в качестве упражнения. Тем не менее, xa
рактеристики дерева рекурсии представляют для нас интерес. Данный
алrоритм с пара метром п порождает, очевидно, полное бинарное дерево
рекурсии с п уровнями (см. рис. 7.10), которое имеет следующие
7. rенетический аЛ20ритм поиска экстремума функции 241
характеристики:
R (п) == 2 n 1, Rv (п) == 2n1 - 1, RL (п) 0= 2nI,
2n I (7.7.7)
HR (п) == п, BI, (п) == 2n l '
Общая трудоемкость данноrо алrоритма включает в себя и затраты
на вычисление целевой функции, однако, поскольку эти затраты опре
деляются только в конкретном применении, мы их учтем в общем виде
в результирующей формуле. Заметим, что при конкретном применении
размерность пространства фиксирована, и, следовательно, мы можем
использовать общую формулу метода рекуррентных соотношений для
случая фиксированных значений трудоемкости, поскольку Jcv (1') не
зависит от п. Для исследуемоrо алrоритма общая формула имеет вид
{ JA (1) == Jп (1) + JCI, (1);
JA(u)==2JA(U 1)+Jп(I)+Jcv(v), п> 1.
(7.7.8)
Определим трудоемкость процедуры Р(п) на один вызов/возврат
J R (1). Поскольку передается один параметр (р == 1), в стеке сохраняют
ся значения четырех реrистров (т == 4), процедура имеет 4 локальных
переменных (i,j,k,Gmin), и, следовательно, 1 == 4, то
JR (1) == 2 (1 + 4 + 0+ 4 + 1) == 20.
Трудоемкость останова рекурсии JCL (1) включает в себя одно cpaBHe
ние, rенерацию т случайных координат точки х, и вычисление целевой
функции, в итоrе
JcL (1) == 1 + 1 + 3т + т (4 + 18) + 4 == 25т + 6.
Трудоемкость во всех внутренних вершинах дерева не зависит от
номера уровня, и, чтобы не утруждать читателей расписыванием KOM
понентов суммы, мы, ссылаясь на указанное в строках процедуры
11 пl п1 пl
Рис. 7.10. Полное бинарное дерево рекурсии, порожденное рекурсивным reHe
1ическим алrоритмом при п == 3
242 rл. 7. Рекурсивные алzоритмы решения некоторых задач
F(n) число базовых операций, приводим окончательный результат для
fcv (v) в среднем:
1 cv (v) == 93т + 401 + 5Н (8) 93т + 414,59.
Слаrаемое 5Н (8) отражает трудоемкость фраrмента присваивания при
поиске минимума целевой функции, поскольку в среднем общее коли
чество переприсваиваний определяется значением rармоническоrо чис
ла от количества элементов массива [7.3] Н (k). Мы ищем минимум
из 8 чисел, значение Н (8) 2,718, а трудоемкость фраrмента равна 5
операциям.
Решение ДЛЯ peKyppeHTHoro соотношения
{ fA(1) ==g;
fA(n)==2fA(nI)+h, n>1,
rде g, h константы, не зависящие от aprYMeHTa n, может быть
получено методами, изложенными в rлаве 1:
g+h
fA (п) == 2' 2 " h,
так как в соответствии с (7.7.8)
9 == 20 + 25т + 6 == 25т + 26,
h == 20 + 93т + 414,59 == 93т + 434,59,
то получаем ФУНКЦИЮ трудоемкости данноrо алrоритма в среднем
1 А (n, т) == 59т. 2" + 230,295 . 2 " 93т 434,59.
(7.7.9)
Поскольку для каждой исследуемой точки, а Bcero их будет Р (п),
алrоритм вычисляет значение целевой функции, то, обозначая TPy
доемкость вычисления 9 (х) через fg (rп), можно получить ПОЛНУЮ
трудоемкость данноrо алrоритма в среднем:
7 AL; (n, т) == 1 А (п, т) + Р (п) fg (rп),
rде Р (п) определяется по формуле (7.7.5).
Емкостная эффективность функция объема памяти. Для
получения оценки емкостной эффективности используем ФУНКЦИЮ
Н п (т), определяющую наибольшую rлубину дерева рекурсии. Общая
формула для оценки памяти стека имеет вид
V st (п) == Нп (п) (р + r + f + l + 1).
Поскольку данный алrоритм требует 4 локальных переменных, то
V.t(п)==Н п (n)(1 +4+0+4+1)== 10Н п (п)== 10п.
(7.7.10)
Объем rлобальной трехмерной матрицы определяется элементарно
V. (n, т) == п. 8 (т + 1) == 8тп + 8п,
8. Алzоритм Тарьяна поиска остовноео дерева в zрафе 243
таким образом, общие затраты памяти с учетом (7.7.10) составят
V (n, т) == 8тn + 18n,
а ресурсная сложность алrоритма имеет вид
c (n, т) == (8 (2 n (т + J 9 (т))), 8 (тn)).
8. Алrоритм Тарьяна поиска OCToBHoro дерева
в rрафе
Идея рекурсивноrо алrоритма. При решении целоrо ряда задач,
моделируемых с использованием rрафов, необходимо найти остовное
дерево rрафа С. Наиболее характерный пример проверка связно
сти rрафа. Друrая характерная подзадача, возникающая во мноrих
алrоритмах обработки rрафов проверка всех ребер хотя бы по
одному разу. Простое решение этих задач, основанное на рекурсии,
было предложено Р. Тарьяном в 1972 r. Алrоритм получил название
«поиск В rлубину» (DFS) за счет Toro, что он пытается построить
наиболее rлубокое остовное дерево rрафа, в отличие от друrоrо под
хода, строящеrо наиболее широкое остовное дерево. За подробностями
и нюансами мы рекомендуе:vI читателям обратиться к ориrинальной
статье Тарьяна [7.11] и мноroчисленным изложениям этоrо алrоритма,
например, в [7.3, 7.12, 7.13].
Идея алrоритма достаточно проста она состоит в том, чтобы
ИСCl1lедовать все ребра исходноrо rрафа, помечая при этом те вершины,
которые уже обработаны. Поясним это более подробно, основываясь
на представлении неориентированноrо rрафа матрицей смежности. Bы
зов данноrо алrоритма с не которой вершиной в качестве начальной
приводит к пометке этой вершины и ее последующей обработке. OTHO
сительно текущей в данный момент вершины rрафа алrоритм, прежде
Bcero, проверяет, какие вершины являются смежными с текущей, об
рабатывая тем самым все, инuидентные данной вершине, ребра. Для
каждой смежной вершины проверяется, была ли она ранее помечена,
и если нет, то соответствующее ребро включается в остов ное дерево,
и происходит рекурсивный вызов алrоритма с найденной смежной Bep
шиной в качестве параметра. И:vIенно этот вызов и послужил поводом
для названия алrоритма Тарьяна «поиск В rлубину'). Мы еще не
обработали все вершины, смежные с данной, а вызываем алrоритм
рекурсивно для первой непомеченной смежной вершины. Для полноrо
rрафа на п вершинах (все вершины полноrо rрафа являются смежны
ми) алrоритм Тарьяна построит остов, представляющий собой унарное
дерево rлубины n, в то время как алrоритм поиска в ширину (n
1 )apHoe дерево rлубиной 2. Эта ситуаuия проиллюстрирована на
рисунке 7.11.
Схема алrоритма. Реализация изложенной выше идеи достаточно
проста нам, помимо исходной матрицы смежности, необходим Mac
244 rл. 7. Рекурсивные алzоритм.ы решения некоторых задач
::::}
2
4\
1
3
а)
4
Ь)
с)
Рис. 7.11. Полный rраф на четырех вершинах (а) и ero остовные деревья,
полученные алrоритмом поиска в rлубину (Ь) и в ширину (с)
сив пометок вершин и структура, в которой будет формироваться pe
зультат остов ное дерево исходноrо rрафа. Приведем схематическую
запись данноrо алrоритма в виде рекурсивной процедуры DFS(V).
Мы предполаrаем, что изначалыю структура Т, хранящая остовное
дерево, пуста, массив пометок обнулен, а rраф G представлен матрицей
смежности G[l..n,l..n].
DFS(V)
Visit [У] <--- 1
For W <-------- 1 to n
If (G[V,W]==l)
then
If (Visit[W]==O)
(проверка непомечеНlIOЙ вершины)
(пометка вершины)
(цикл по строке матрицы смежности)
(проверка смежности вершины W)
end If
end If
end For
End.
Обращаем внимание читателей на то, что мы впервые в этом ak
rоритме сталкиваемся с рекурсивным вызовом, расположенным внутри
цикла, что создает определенные трудности при ero анализе.
Доказательство правильности алrоритма DFS. Построение дo
казательства правильнасти этоrо алrоритма может быть основано на
следующих замечаниях. Мы приводим эти замечания, имея ввиду, что
rраф G является связным. Вообще rоворя, алrоритм Тарьяна строит
некоторый rраф Т, добавляя к нему некоторые ребра из rрафа С. Мы
только предполаrаем, что результат работы алrоритма представляет
собой остовное дерево rрафа С. Алrоритм добавляет очередное ребро
then
Т <-------- Т + Edge(V,W)
(добавление ребра к т)
DFS(W)
(рекурсивный вызов для проверки вершины W)
8. Алzориmм Тарьяна поиска OCmOBHOi!O дерева в zрафе 245
к формируемому rрафу Т, тоrда и только тоrда, если одна из вершин
этоrо ребра еще не просмотрена. Это замечание rарантирует, что фор
мируемый алrоритмом rраф Т не может содержать циклов. Обратим
внимание на то, что первая вершина будет помечена этим алrоритмом
сразу, на первом вызове. Добавление ребра в Т происходит для каждой
непомеченной вершины, а последующий рекурсивный вызов алrоритма
rарантирует пометку этой вершины. На основании этоrо можно сделать
вывод, что ни одно ребро не будет добавлено в Т дважды. Если
каждая из n 1 вершин rрафа С, отличных от начальной вершины,
действительно проверена, то алrоритм добавляет в Т ровно n 1 ребер.
Осталось указать, что, по определению, ОСТОВНОй подrраф rрафа С,
не имеющий циклов и содержаший н 1 ребер, является остовным
деревом rрафа С.
Вычислительная сложность алrоритма. Найдем вычислительную
сложность алrоритма Тарьяна, используя следующие рассуждения. Вне
зависимости от структуры rрафа, при условии ero связности, общее
количество вызовов алrоритма будет равно количеству вершин rрафа
Н, ИЗ которых н 1 вызовов будут рекурсивными. Это объясняется тем
фактом, что алrоритм будет работать до тех пор, пока останется хотя
бы одна непомеченная вершина, и для каждой непомеченной вершины
будет выполнен рекурсивный вызов. Заметим, что в данном случае
rлубина рекурсии определяется структурой rрафа и может меняться от
2 до п. Тем не менее, на каждом вызове мы выполняем цикл поиска
смежных вершин 110 строке матрицы смежности с очевидной оценкой
в е'(п) базовых операций. Поскольку мы имеем n вызовов, то оценка
трудоемкости имеет вид
fл (н) = не (п) "', е (п 2 ). (7.8.1)
Сравнение If (Visit[W]==O) будет выполнено дважды для всех ребер
(v, ш) исходнОrо rрафа в первый раз, коrда текущей вершиной алrо
ритма будет первая вершина ребра 'и, а во второй раз, коrда текущей
будет вершина ш. Поскольку в ПОJIНОМ rрафе КОJIИчество ребер имеет
оценку е (п 2 ) , то мы не ухудшае:\! (7.8.1), тем более, мы не ухудша
ем эту оценку и во фраrменте добавления ребра в остов ное дерево,
имеющеl'О, очевидно, оценку е (п) по все:\! вызовам. Таким образом,
при задании rрафа матрицей смежности вычислительная сложность
алrоритма Тарьяна составляет е (п 2 ), т. е. он является квадратичным
по числу вершин ('рафа. Отметим, что в данном случае для анали
за вычисJlителыlйй СJ10ЖНОСТИ мы использовали подход, при котором
рассматривается COl-JОКУl1110е поведение алrоритма на всех вызовах,
а не ero трудоемкость ДJIЯ конкретной вершины. Такой подход носит
название амортизационноrо ана.иза и достаточно подробно описан в
[7.3J.
Структура данных. Исследуемый рекурсивный алrоритм требует
трех rлоба.%ных массивов ABYMepHoro массива G[l..n,l..n], xpa
246 rл. 7. Рекурсивные алzоритмы решения некоторых задач
нящеrо матрицу стоимости, одномерноrо массива Visit[l..n], coдep
жащеrо пометки вершин, и структуры, хранящей остовное дерево
мы будем использовать для этоrо массив, состоящий из двух столб
цов Т[1..п,1..2]. Очевидно, что массив пометок вершин должен
быть обнулен при запуске алrоритма, также как и счетчик ребер
OCToBHoro дерева. Конечно, для неориентированноrо rрафа матрица
стоимости является симметричной и содержит нулевые элементы на
rлавной диаrонали. Можно орrанизовать хранение верхней диаrона
ли в виде одномерноrо массива с пересчетом индексов, но в этом
случае, что очевидно, экономия порядка п 2 /2 ячеек памяти приведет
к увеличению трудоемкости алrоритма. Выбор в пользу Toro или иноrо
решения связан с конкретными ресурсными требованиями, и ресурсная
эффективность каждоrо варианта может быть в данном случае леrко
оценена.
Рекурсивный алrоритм. Рассмотрим рекурсивный алrоритм Ta
рьяна, находящий остовное дерево rрафа в виде рекурсивной процеду
ры DFS(V) (справа указано количество базовых операций в строке).
Вызов из основной проrраммы имеет вид DFS(l).
DFS(V)
(G[I..п,l..п] матрица смежности)
(Visit[l..n] !\1ассив пометок вершин, 1 вершина помечена)
(Т[l..п.l..2] найденное остовное дерево, m счетчик ребер)
Visit[V] +------ 1 2
For W +------ 1 to N 1 +3 * n
If (G[V,W] == 1) 3
then
If (Visit[W] == О) 2 * п
then
М +------ М+l 2
T[M,l] +------ V 3
Т[М,2) +------ W 3
DFS(W)
end If
end If
end For
End.
Сложностной класс алrоритма. Если мы считаем, что длина входа
алrоритма это количество вершин п, то число задаваемых алrорит
мом операций зависит не только от количества вершин, но и от коли
чества ребер исходноrо rрафа, которое очевидно может варьироваться
от О для rрафа без ребер до п(п 1)/2 у полноrо rрафа. Поэтому
в общем случае, т. е. без оrраничений на матрицу стоимости, в лучшем
случае алrоритм останавливается на первом вызове, выполняя е (п)
операций. Заметим, что для этоrо достаточно, чтобы первая вершина
rрафа была изолирована. Понятно также, что в случае несвязноrо
rрафа алrоритм находит остов ное дерево Toro ero компонента, который
включает первую веJ;ШИНУ. В худшем случае для полноrо rрафа мы
имеем оценку е (п ), равно как и для всех связных rрафов. Таким
8. Алzоритм Тарьяна поиска остовносо дерева в zрафе 247
образом, алrоритм относится к сложностному классу пР, а по xapaK
теристическим особенностям в общем случае к подклассу N Р RH,
а в случае связных rрафов к подклассу N Р RL. Далее, анализируя
алrоритм Тарьяна, мы будем предполаrать, что матрица смежности на
входе алrоритма описывает связный rраф.
Анализ алrоритма методом подсчета вершин дерева рекурсии.
При анализе дерева рекурсии, порождаемоrо данным алrоритмом, мы
впервые сталкиваемся с ситуацией, коrда это дерево сильно зависит
от данных. Знание о том, что мы ищем остовное дерево для rрафа
на n вершинах, оказывается недостаточным для Toro, чтобы построить
дерево рекурсии. Мы надеемся, что внимательный читатель уже понял,
что это дерево просто совпадает с остовным деревом rрафа, которое яв
ляется результатом работы алrоритма. Выход из этой ситуации связан
с использованием метода амортизационноrо анализа мы рассматри
ваем поведение алrоритма на всех вызовах, а не в конкретной вершине
дерева рекурсии. Для связноrо rрафа остовное дерево содержит п 1
ребер, и алrоритм помечает все n вершин rрафа отсюда следует, что
R(n) == n.
(7.8.2)
Количество листьев определяется остовным деревом, и, в смысле aHa
лиза трудоемкости, для нас важным является то, что в листьях дepe
ва рекурсии все равно выполняется цикл просмотра строки матрицы
смежности, но без добавления ребра в остовное дерево, и, следователь
но, без рекурсивноrо вызова.
j3ременная эффективность функция трудоемкости. Итак, Ha
ша цель получить трудоемкость алrоритма Тарьяна, опираясь на
знание общеrо количества вершин и идеи амортизационноrо анализа.
Определим трудоемкость процедуры DFS(V) на один вызов/возврат
fR (1). Мы передаем один пара метр, не возвращаем значений, они
хранятся в rлобальных массивах, и процедура имеет одну локальную
переменную, следовательно,
fп (1) ==2 (1 +4+0+ 1 + 1) == 14, fR (п) ==R (п)fп (1) == 14n.
(7.8.3)
Опираясь на !vIетод амортизационноrо анализа, найдем TpyдoeM
кость в вершинах дерева в предположении, что количество ребер rрафа
заранее известно и равно т. Трудоемкость во всех вершинах дерева
рекурсии представи!vl как сумму трудоемкости цикла fFor (n), про верки
пометок fif (т) и добавления ребра в остовное дерево fT (п) 110 всем
вызовам алrоритма
fA (n, т) "" fп (n) + fPor (п) + fif (rп) + fT (п).
(7.8.4)
На каждом вызове всеrда выполняется цикл и про верка смежности,
что позволяет получить функцию fI'or (n):
f/'or (n) == R (n) (2 + 1 + 3n + 3п) == п (бп + 3) == бп 2 + 3п.
Мы уже знаем, что аJ1["ОрИТМ проверяет каждое ребро дважды и за
248 rл. 7. Рекурсивные алzоритмы решения некоторых задач
трачивает две операции на проверку метки вершины, что позволяет
определить функцию fif (т)
fif (т) == 2 . 2т == 4rп,
за все время работы для связноrо rрафа в остов ное дерево будет
добавлено п 1 ребер, что позволяет определить fT (п):
fT (п) == (п 1) (2 +- 3 +- 3) == 8п 8.
Объединяя все полученные компоненты, на основе (7.8.4) получаем
f л (п, т) == 6п 2 +- 25п +- 4т 8. (7.8.5)
Рассмотрим лучший и худший случаи трудоемкости для связноrо
rрафа. Минимальный связный rраф на п вершинах содержит m == п
1 ребер, что при водит к
п (п) == 6п 2 +- 29п 12, (7.8.6)
в худшем случае для полноrо rрафа m с.'" п (п 1 )/2, и
fX (п) == 8п 2 +- 23п 8. (7.8.7)
Отметим, что для этоrо алrоритма доля операций обслуживания дe
рева рекурсии падает с ростом числа вершин rрафа и составляет для
худшеrо случая
r'R (п) == fR (п) == 14п 2.. п» 1. (7.8.8)
fл(п) 8п2+-23п8 4п'
что позволяет rоворить об эффективности ero применения.
Емкостная эффективность функция объема памяти. Для по
лучения оценки емкостной эффективности нам нужна функция Ни (п),
определяющая наибольшую rлубину дерева рекурсии. Для этоrо ak
rоритма мы впервые сталкиваемся с ситуацией, коrда rлубина дерева
зависит от данных, и для связноrо rрафа может варьироваться от 2
до п, в зависимости от вида OCTOBHoro дерева (см. рис. 7.11). Поэтому
получим оценку памяти стека в худшем случае
vs (п) == Нп (п)(1 +- 4 +- О+-1 +- 1)--= 7п.
Объем памяти, занимаемой матрицей смежности, массивом пометок
и структурой дерева может быть леrко получен, и общие затраты
с учетом стека составляют
v; (п) =-ос n 2 +- 10п 2, (7.8.9)
заметим, что оценка rлавноrо порядка функции емкостной эффективно
сти справедлива и в лучшем случ?е, поскольку определяется объемом
матрицы стоимости, и на основе (7.8.7) и (7.8.9) мы У.10жем определить
ресурсную сложность алrоритма
c (п) == \ е (п 2 ) ,е (п 2 )) ,
которая справедлива для любых связных rрафов на п вершинах.
9. Алеоритм Беллмана оптимальной одномерной упаковки 249
9. Алrоритм Беллмана оптимальной одномерной
упаковки
Введение. Начиная с конца 50x rодов ХХ века, коrда Р. Беллман
предложил и обосновал основные идеи метода динамическоrо IIporpaM
мирования, задача ОПТЮ1aJIЬНОЙ по стоимости одномерной упаковки
привлекает внимание проrраммистов и ученых, занимающихся разра
боткой и анализо:vr алrоритмов. Повышенный интерес к этой задаче,
равно как и к ее мноrочисленным модификациям, связан с разнообраз
ными практически ми областями применения. Заметим в этой связи, что
метод динамическоrо проrраммирования хотя и позволил существенно
сократить полный перебор вариантов, но реализующие этот метод
алrоритмы не являются ПО_1И1lОмиальны:vrи относительно длины входа.
В настоящее время рост производительности и, прежде Bcero, дo
ступ ной оперативной памяти современных компьютеров обеспечивает
приемлемое вре:v!я решения ДJ1Я ряда Ilрактических задач, сводящихся
к одномерной ОIIТИ:vIалыIOЙ по стоимости упаковке, с применением
точных классических алrорит:vIОВ, реализующих метод динамическоrо
проrраммирования.
Изложение применения метода динамическоrо проrраммирования
для решения задачи одномерной оптимальной по стоимости упаковки
основано на классической Кllиrе Р. Беллмана и С. Дрейфуса [7.14]
и статье [7.15], посвященной анализу трудоемкости классических ak
rоритмов, реализующих идеи Р. Беллмана. Мы хотим не только про
ИЛЛЮ,l;:трировать метод динамическоrо ПРОI'раммирования, но получить
оценку вычислительной сложности и функцию трудоемкости рекурсив
Horo алrоритма, используя методы дискретной математики и теории
рекурсии, изложенные в rлаве 5.
Содержательная постановка задачи упаковки. Представим себе,
что у нас есть рюкзак с пря:v!оуrольным дном и нсрастяжимыми CTeH
ками определенной высоты. У нас есть т,и,же несколько l'рУПП коробок,
с таким же дном, как у рюкзака. В любой rруппе количество коробок
достаточно для упаковки Bcero рюкзака, каждая коробка в rруппе
одинакова по высоте и имеет определенную стоимость. Наша задача
состоит в том, чтобы упаковать рюкзак так, чтобы он закрывался,
и сумма стоимостей упакованных коробок была бы наибольшей. Xo
тя содержательно :v!bI имеем дело с объе:vIОМ, но в реалыlOСТИ мы
рассматриваем TOjlbKO высоту рюкзака и высоты коробок в ЭТО:v!
смысле задача является одномерной. Поскольку у нас нет оrраниче
ний на состав коробок в рюкзаке. то интуитивное решение состоит
в том, чтобы выбрать коробки из rруппы, обладающей максимальной
удельной (на единицу высоты) стоимостью. Но, к сожалению, мы не
можем разрезать коробки по высоте задача является целочисленной,
и интуитивное решение не всеrда оптимально. Например, из двух
rрупп коробок с высотами 5 и 7 и стоимостями 10 и 18, в рюкзак
высотой 1 О лучше ПQjlОЖИТЬ две коробки из первой rруппы, чем одну
250 Fл. 7. PeKypcuBHDte алzоритмы решения некоторых задач
из второй, хотя удельная стоимость коробок второй rруппы больше,
чем в первой. Друrая идея состоит в том, что можно рассмотреть все
возможные варианты упаковки рюкзака и выбрать наилучший, но если
рюкзак очень высокий, и у нас MHoro разных rрупп коробок, то такой
полный перебор может потребовать значительноrо времени. Ниже мы
получим оценку сложности алrоритма, реализующеrо полный перебор
вариантов.
Эта задача, известная, как задача об упаковке рюкзака, более
корректно задача оптимальной по стоимости одномерной упаковки,
имеет разнообразные практические применения, для которых сеrодня
актуальным является получение именно точных решений. К такой
постановке сводится задача одномерноrо раскроя материала, формиро
вания оптимальноrо пакета акций на фиксированную сумму. На основе
полученных оптимальных решений при значительном количестве rрупп
коробок можно даже построить достаточно надежную криптосистему.
Эта задача относится к rруппе задач целочисленноrо проrраммиро
вания, которые формулируются как задачи поиска экстремума функ
ции нескольких переменных, арrументами которой являются координа
ты точек оrраниченноrо подмножества целочисленноrо пространства.
В связи с этим мы позволим себе напомнить читателю некоторые
сведения о целочисленных пространствах.
Понятие rпMepHoro евклидова целочисленноrо пространства.
При изложении задач целочисленноrо проrраммирования удобно ис
пользовать rеометрическую терминолоrию, обобщающую наше пред
ставление о трехмерном пространстве. Поскольку в рассматриваемых
задачах решение представляется в виде набора целых, как прави
ло, неотрицательных чисел, то нас будет интересовать MHoroMepHoe
целочисленное пространство, которое является подмножеством клас
сическоrо rпMepHoro евклидова пространства [7.16]. Будем назвать
тMepHЫM координатным пространством множество упорядоченных
совокупностей (Xl, Х2, ... ,х т ), состоящих из rп вещественных чисел
Xl,X2,,,, ,Х т , И обозначать это пространство символом Ат. Каж
дую такую упорядоченную совокупность будем называть точкой т
MepHoro координатноrо пространства, обозначая ее через х, а числа
Xl, Х2, .,. ,Х т будем называть координатами точки х. Координатное
пространство Ат называется тMepн.ЫM евклидовым простран.ством,
если между любыми двумя точками х и у т-мерноrо пространства Ат
определено расстояние, обозначаемое символом р (х, у) и выражающе
еся соотношением
р(х, у) == V (Xl Yl)2 + (Х2 У2)2 +... + (Х п Уп)2.
(7.9.1 )
Общеупотребительным для rпMepHoro евклидовоrо пространства
является обозначение Ет. Пространство, в котором указано правило,
ставящее в соответствие любым двум элементам х и у вещественное
число, называемое расстоянием между этими элементами р (х, у),
и удовлетворяющее следующим аксиомам:
9. АЛ20ритм Беллмана оптимальной одномерной упаковки 251
1) р(х, у) == р(у, х);
2) р(х, у) р(х, z) + p(z, х);
3) р (х, у) О, р (х, у) == О {::} х == у,
называется метрическим пространством. Леrко проверить, что pac
стояние, введенное формулой (7.9.1), удовлетворяет этим аксиомам, и,
следовательно, пространство E Тn является метрическим пространством.
Подробные сведения по общей тополоrии и аксиоматике линейных,
нормированных и метрических пространств содержатся, например, в
[7.16, 7.17]. Пространство Ет содержит точки, координаты которых
являются вещественными числами. В целях формализации задач цe
лочисленноrо проrраммирования нам необходимо такое подмножество
пространства Ет, которое содержит только точки с целочисленными
координатами. Будем называть это подмножество тMepHЫM евклидо
вым целочисленным пространством [7.18] и обозначать ero через E:
Е;' == {х I х Е Ет,х == (XI,X2,,,, ,Х т ), Xi Е Z Vi == 1,т },
rде Z множество целых чисел.
Оrраничения, возникающее в задачах целочисленноrо проrрамми
рования, приводят к тому, что мы рассматриваем не всё множество E,
а некоторую оrраниченную совокупность ero точек в общем случае,
некоторый мноrоrранник с вершинами, имеющими целочисленные KO
ординаты. В связи с этим введем понятие mMepHoro координатноrо
куба. Множество У всех точек у из En, координаты (YI, У2, ... ,Ут)
которых удовлетворяют неравенствам
УI ХI k, У2 Х2 k, Ут Х т k. Yi Xi
Vi == 1, щ k Е N,
(7.9.2)
будем называть тMepHЫM координатным кубом с ребром k с началом
в точке х == (XI, Х2, .,. ,Х т ). Х Е Eп, и обозначать ero через СиЬТ;' (х, k)
[7.18].
Поскольку мноrие задачи целочисленноrо проrраммирования приво
дят к перебору точек mMepHoro КООРДИllатноrо куба с началом в точке
О == (О...., О), Т.е. куба СиЬ':' (О, k), то представляется целесообразным
ввести специальное обозначение: kТ;' == Cиbп (О, k) [7.18]. Таким об
разом, например, 1 Т;' это mмерный координатный куб с началом
в нуле, все точки KOToporo имеют целочисленные координаты О или
1. Сколько целочисленных точек содержит mмерный координатный
куб? Ответ на этот вопрос является важным, т. к. позволяет указать
верхнюю оценку rраницы размерности задачи целочисленноrо проrрам
мирования, если мы пытаемся решить ее путем полноrо перебора точек.
Поскольку в силу условия (7.9.2) каждая координата точки куба может
принимать не более чем k + 1 целочисленных значений, и мы имеем
m независимых координат для точки в пространстве En, то приходи м
К выводу, что IСuЬТ;' (х, k)1 == (k + 1)т вне зависимости от начальной
точки куба. В частности, даже куб 1':' содержит 2т точек.
252 rл. 7. Рекурсивные алzоритмы решен.ия н-екоторых зада'i
Математическая постановка задачи. Рассмотрим общую поста
новку задачи одномерной оптимальной по стоимости упаковки. Пусть
задано множество типов rрузов
Y=={Yi}, Yi=={Vi,Ci}, i==l,n,
rде каждый элемент Yi, соотнесенный с типом rруза, обладает цело
численным линейным размером Vi, или «объемом» в общепринятых
терминах зада4И упаковки, и ценовой характеристикой Ci, которая
содержательно отражает практически значимые предпочтения для за
rрузки объектов данноrо типа. Также целочисленным значением задан
основной объем упаковки V. В классической постановке элементы У;
называются типами rрузов. Для описания количества заrружаемых
в объем V элементов Yi введем в рассмотрение следующий характери
стический вектор:
X=={Xi},
Х == 1, п ,
rде Xi неотрицательное целое, т. е. Х Е Er;, Xi О. Значение KOM
понента вектора Xi == k соответствует заrрузке k элементов типа Yi
в объем V. Таким образом, описание некоторой упаковки rрузов пред
ставляет собой целочисленную точку в nMepHOM пространстве Er;.
Среди всех возможных упаковок объема V rрузами из У должна
существовать, по крайней мере, одна, максимизирующая суммарную
стоимость, что при водит К следующей постановке задачи упаковки как
задачи линейноrо целочисленноrо проrраммирования.
Максимизировать линейный Функционал:
n п
Рn(Х) == L C i (Xi) == LXiCi -------> шах,
il il
n
LXiVi V
il
(7.9.3)
Содержательно оrраничение в (7.9.3) означает, что суммарный объ
ем, занимаемый rрузами всех типов в количествах, указанных xa
рактеристическим вектором Х, не должен превышать общеrо объема
упаковки.
Вычислительная сложность полноrо перебора. Поскольку число
возможных решений задачи упаковки, в силу (7.9.3), оrраничено CBep
ху, то мы можем rараllтировать, что существует координатный куб,
в который вписан мноrоrранник, формируемый этими оrраничениями.
В этой связи очевидным методом решения является полный перебор
всех возможных вариантов точек целочисленноrо пространства. За
метим, что в анrлоязычной литературе этот метод называется British
museum technique техника Британскоrо музея. При всей простоте
метода нас останавливает проблема размерности как только раз
мерность целочисленноrо пространства становится большой перебор
требует хотя и конечноrо, но астрономическоrо времени. Попробуем
получить некоторые оценки для рассматриваемой задачи одномерной
упаковки. Из всех n типов rрузов по крайней мере один имеет мини
мальный объем. Обозначим через т максимальное количество rрузов
этоrо типа, размещающихся в объеме V, тоrда весь объем пере бора
9. АЛiюритм Беллмана оптимальной одномерной упаковки 253
оrраничен кубом т, который содержит (т + 1/' точек. Если задача
состоит в упаковке 20 типов rрузов (n =- 20), и rруз каждоrо типа
размещается в объемс V не более 9 раз, то мы имеем задачу пере бора
1020 точек в 20MepHOM пространстве. Попробуйте оцснить требуемое
время в предположении, что анализ одной точки занимает на Вашем
компьютере не более 1000 тактов.
Более точную оценку можно получить, если рассматривать прямо
уrольный параллелепипед в пространстве E, размеры сторон KOToporo
определяются типами rрузов. Это приводит к верхней оценкс количе
ства точек перебора в видс
n
п (lV/Vij +- 1) (т + I)n,
i==1
т == !Пах {V/Vi} .
.==I,rt
При значительном разбросе значений Vi эта оценка значительно лучше,
чем (т + 1)n, но все равно неприемлема для практически значимых
постановок задачи упаковки, Этот неутешительный результат и за
ставляет искать эффективные алrоритмы решения задачи одномерной
оптимальной упаковки, существенно сокращающие перебор. Отметим
в этой связи, что рассматриваемая задача упаковки является N p
трудной, и для нее в общей постановке отсутствуют сеrодня полино
миальные по п точные алrоритмы решения.
q)ункциональное уравнение Беллмана для задачи упаковки.
Опираясь на терминолоrию метода динамическоrо проrраммирования
(см. fлаву 3), будем считать, что в рассматриваемой задаче распре
деляемым ресурсом является объем упаковки V, а функции дохода
линейны: 9i (Xi) == CiXi. Наша задача максимизировать доход (стои
мость упаковки), заданный линейным функционалом Р п (х) (см. 7.9.3),
путем распределения оrраниченноrо ресурса объема упаковки между
rрузами указанных типов. В этих условиях мы можем непосредственно
использовать идею метода динамическоrо проrраммирования. С учетом
обозначений, введенных в математической постановке задачи упаковки,
основное функциональное уравнение БеЛЛМШIa имеет вид [7.14]:
{ fo(v) с, о;
fm(v) == шах {ХтС т + fm1 (1) X тn 1J m )} ,
X rn
l v J
rп == 1, n, 1) == о, V, Х щ == о, 1, .. ., V m .
(7.9.4)
Таким образом. :vJстод предполаl'ает последовательное решение oд
номерных задач целочисленной оптимизации с использованием ин
формации об оптимаJIЫIOЙ упаковке объема V предыдущими типами
rрузов. Решением поставленной задачи является значение fn (V). По
скольку значения I1 (-и) MorYT быть элементарно вычислены на основе
(7.9.4), то в дальнейшем мы будем рассматривать следующее основное
функциональное уравнение для задачи одномерной оптимальной упа
254 rл. 7. Рекурсивные алzоритмы решения некоторых задач
ковки, записанное в виде peKyppeHTHoro соотношения, определяющеrо
рекурсивно заданную Функцию1m (v):
11 (v) == l :k J . с 1, т == 1;
frп(v) == r::{XmCm + fmI(V XmV m )}" (7.9.5)
т ;?: 2, Х т == о, 1, ..., l V: J .
Схема алrоритма. Рекурсивная реализация OCHoBHoro Функцио
нальноrо уравнения Беллмана (7.9.5) для задачи одномерной упаковки
(7.9.3) достаточно проста. Рекурсивный алrоритм, напрямую реали
зующий рекуррентные соотношения (7.9.5), останавливается при зна
чении т == 1, коrда значение функции 11 (v) может быть вычислено
непосредственно. При т ;?: 2 рекурсия выполняется для вычисления
оптимальной стоимости упаковки текущеrо объема v, rрузами типа m
совместно с rрузами предыдущих m 1 типов в том же или меньшем
объеме. Ниже мы приводим схему данноrо алrоритма в виде рекурсив
ной функции F(V,x), не детализируя структуру данных для хранения
вектора упаковки.
F(V, х)
(У текущий объем упаковки)
(х номер текущеrо типа rруза)
(ЬохV[I..п],ЬохС[I..п] массивы исходных данных)
If х== 1
then (Останов рекурсии прямое вычисление при х== 1)
k , V div ЬохУ[I]
F +------- k * ЬохС[I]
(оптимальная стоимость в V для 1 ro типа)
(Рекурсивные вызовы для определения тах F)
else
Мах +------- о;
k +------- V div ЬохУ[х]
For i +------- О to k
(цикл поиска максимума)
Cost +------- i * boxC[x]+F«V boxY[x] * i),xl)
If Cost > Мах
then
Мах ;------ Cost
Optx +------- i
end For
F +------- Мах (функция возвращает оптимальную стоимость)
(количество rрузов типа х в объеме V равно Optx)
end If
Return (F)
End.
,.:,
9 9. АЛёоритм Беллмана оптимальной одномерной упаковки 255
Пример дерева рекурсии. Рассмотрим пример решения задачи
одномерной упаковки с использованием данноrо алrоритма нас ин
тересует порожденное дерево peKYP
сии. Мы решаем задачу с тремя типа
ми rрузов, при общем объе:vIе упаков
ки V == 10. Информация об объемах Vi
и стоимостях Ci для трех типов rрузов
приведена в табл. 7.3.
Решение:vI поставленной задачи
будет значение функции Беллмана
fз (10), при этом алrоритм порождает дерево рекурсии, показанное на
рис. 7.12.
т а б л и ц а 7.З
Описание типов rрузов
i Vi Ci
1 2 3
2 3 5
3 4 7
Fj (10)
1)( 10) 1)(7)
1)(4)
1)( \)
Рис. 7.12. Дерево рекурсии, порождаемое алrоритмом упаковки
f2(2)
1';(6)
fJ(O)
1)(2)
1';(3)
Параметризация задачи. Исследуемый рекурсивный алrоритм
упаковки является количественно пара метрическим. Напомним, что
в этом случае число элементарных операций, задавае:о.lЫХ алrоритмом,
зависит не только от количества данных на входе, но и от их значений.
Из (7.9.5) очевидно, что оценка вычислительной сложности будет за
висеть как от значения п, так и от значений пара метров V, V\,'" ,v n ,
учет которых существенно затрудняет анализ. С целью упрощения
анализа рекурсивноI'O алrоритма мы вводим параметр
1 n
v == ;;: L Vi,
il
k == v
v'
показывающий, сколько rрузов среднеrо объема размещается в объеме
упаковки V. Очевидно, что в реальности количество любых rрузов,
размещенных в объеме V, является целым числом, но для оценки
вычислительной сложности в среднем необходимо учитывать, что па
раметр k может быть и действительным (вещественным) числом.
256 Тл. 7. Рекурсивные алzоритмы решения некоторых задач
Структура данных. Исследуемый рекурсивный алrоритм требует
двух rлобальных одномерных массивов, хранящих описание стоимости
и объема типов rрузов ЬохС[l..п] и boxV[l..n]. Для хранения
конечноrо и промежуточных результатов мы будем использовать ДBY
мерный массив XArr[l..n,O..n], первый индекс KOToporo соответствует
номеру типа rруза, по второму индексу в XArr[x,l..n] хранится оп
тимальный вектор, а в XArr[x,O] значение оптимальной упаковки.
В этой же ячейке XArr[x,O] мы будем хранить текущий макси
мум. Таким образом, при вызове алrоритма для типа rруза с номером
х результаты непосредственных рекурсивных вызовов располаrаются
в строке XArr[xl,O..n], а результат формируется в XArr[x,O..n].
Рекурсивный алrоритм. Рассмотрим рекурсивный алrоритм, Haxo
дящий оптимальную одномерную упаковку, в виде рекурсивной проце
дуры F(V,x) (справа указано количество базовых операций в строке).
Р(У, х)
(У текущий объем упаковки)
(х номер текущеrо типа rруза)
(ЬохУ[I..п],ЬохС[I..п] массивы исходных данных)
(ХАп[ l..п,О..п] массив результатов)
If х== 1
then (Останов рекурсии)
k V div ЬохУ[I]
ХАпр,О] <-- k * ЬохС[I]
(формирование вектора при х== 1)
For j 2 to n
ХАп[ l ,п О
ХАп[I,I] k
else (Рекурсия для определения тах F)
(Обнуление оптимальноrо вектора)
For j О to n
XArr[x,j] +---- О
k +---- V div ЬохУ[х]
(цикл поиска максимума)
For i О to k
P((YboxY[x] * i),xl)
Cost +---- i * ЬохС[х]+ХАп[х 1 ,О]
If Cost >== ХАп[х,О]
then
(копирование вектора от xl)
For j 1 to n
ХАп[х,п ХАп[х 1 ,п
ХАп[х,х] +---- i
ХАп[х,О] +---- Cost
end For
end If
End.
3
5
l+(nl) * 3
3 * (n-l)
3
1+(п+l) * 3
3*(n+l)
3
l+(k+l) * 3
4 * k
7 * k
3 * k
1 +п * 3
6 * n
3
3
99. Алеоритм Беллмана оптимальной одномерной упаковки 257
Анализ алrоритма методом подсчета вершин дерева рекурсии.
Дерево рекурсии, порождаемое данным алrоритмом, является парамет
рически зависимым количество порожденных вершин опредсляется
переменной цикла, И, слсдовательно, парамстром k, при этом на каж
дом рекурсивном вызове меняется еще и текущий объем упаковки.
Наша задаqа попытаться получить явную формулу для количества
вершин дерева рекурсий в условиях введенной параметризации. Обо
значим через R (n, k) функцию, задающую общее количество вершин
дерева в зависимости от значсний п и k. Рассмотрим структуру дерева
рекурсии при некоторых значениях п и k. Фраrменты дерева для
значений k == 1 и k == 2 и соответствующие значения функции R (n, k)
показаны на рис. 7.13 и 7.14.
R(I,I)1
R (2, 1)3
R(3,1)б
R(4,1)IO
R(5,I)15
....
Рис. 7.13. Фраrмент дерева рекурсий при k == I
Для Toro чтобы найти закономерность для знаqений R (n, k), по
строим треуrольник Паскаля, пеРВblС восемь строк KOTOporO показаны
на рис. 7.15.
Теперь видно, что значения R (n, k) это элементы треуrольни
ка Паскаля биномиальные коэффициенты. Напомним читателям,
что в rлаве 5 описаны методы решения рекуррентных соотношений,
приводящих к биномиальным коэффициентам, в частности, обращаем
R(I,2)1
R(2,2)=4
R(3,2)1 О
R( 4,2)020
R(5,2}J5
Рис. 7.14. Фраrмент дерева рекурсий при k == 2
258
rл. 7. Рекурсивные алzоритмы решения некоторых задач
т == о
т == 1
т == 2
т == 3
rп==4
т == 5
т == 6
т == 7
2
3 3
4 6 4
5 10 10 5
6 15 20 15 6
7 21 35 35 21 7
Рис. 7.15. Треуrольник Паскаля биномиальные коэффициенты
внимание на результаты исследования «биномиальноrо» рекурсивноrо
дерева, на основе которых можно теоретически доказать ФОРМУЛУ дЛЯ
общеrо числа вершин данноrо дерева. Устанавливая соответствие меж
ду номерами строк треуrольника и значениями n и k, окончательно
получаем
R (n, k) == C=k'
(7.9.6)
Проводя аналоrичные рассуждения для количества внутренних вершин
и листьев порожденноrо дерева (заметьте, например, что Rv (5.2) ==
== R (4,2)), получаем, с учетом введенной параметризации, аналоrич
ные формулы для Rv (n, k) и R L (n, k). Поскольку все эти значения
являются биномиальными коэффициентами, мы, в целях дальнейшеrо
удобства анализа, приведем также коэффициенты для их сведения к
R (n, k)
R ( k) C п 1 R ( k) k ---'--- 1
1" n, == n+k I == n,' n +- k '
n2 n 1
Rv (n, k) == СNН == R (n, k) 71 +- k '
Однако, в отличие от алrоритма Тарьяна, любая ветвь рекурсии
требует рассмотрения всех типов rрузов, вне зависимости от пара метра
k, что позволяет леrко определить rлубину дерева, которая равна 71.
Таким образом, на основе (7.9.6) и (7.9.7) мы можем получить все
формулы для дерева рекурсии, порождаемоrо алrоритмом Беллмана
в рамках принятой параметризации:
(7.9.7)
R (71, k) == C+k, R L (71, k) == C+k l' Rv (71, k) == C+,
k + 1
НП(71) ==71, BL(71,k)== k ' (7.9.8)
п+
Временная эффективность функция трудоемкости. TpyдoeM
кость данноrо алrоритма мы найдем, учитывая предложенную пара
метризацию, т. е. f л == f А (71, k). в соответствии с методом подсчета
9. Алсоритм Беллмана оптимальной одномерной упаковки 259
вершин дерева рекурсии определим вначале трудоемкость процедуры
на один вызов/возврат fR (1). Поскольку процедура F(V,x) передает
два пара метра (р == 2). в стеке сохраняются значения четырех реrи
стров (т == 4) и процедура имеет четыре локальных перемепных (l == 4)
(напомним, что результаты возвращаются через rлобальный массив),
то
fп (1) == 2 (2 -+- 4 + о + 4 + 1) == 22,
и, следовательно,
fR (n, k) == 22R (п, k) == 22C+1,.
(7.9.9)
Трудоемкость останова рекурсии включает в себя ОДН0 сравнение
для входа в блок останова и 6п + 6 операций формирования вектора,
таким образом, fCL (1) == 6п + 7, следовательно,
fCL (п, k) 0-': R L (п, k)fCL (1) == (6п + 7) C:;l,l'
в целях удобства получения общей формулы введем обозначения для
двух коэффициентов, показывающих долю внутренних вершин и ли
стьев в общем количестве вершин дерева рекурсии:
k+l
RL(H,k)==CY.LR(n,k), CY.L== n+k '
п1
Rv(n,k)==CY.vR(n,k), CY.v== n+k '
зметим, что CY.L + CY.v == 1, таким образом,
(7.9.10)
....
fCL (п, k) == (6п + 7) CY.LR (п, k).
(7.9.11)
Трудоt!МКОСТЬ во внутренних вершинах дерева представим в виде
суммы трудоемкости оБНУJlения вектора и трудоемкости цикла
fcv (п, k) == fcvvee (п, k) + fCvJor (п, k),
при этом в трудоемкость обнуления вектора включим операцию иници
ализации цикла поиска максимума. и, суммируя операции, получаем
fcvvec (п, k) == Rv (п, k) fCVvec (v) == (6п + 12) av R (п, k). (7.9.12)
Наибольший интерес представляет трудоемкость цикла поиска мак-
симума. Заметим, что 17 операций, выполняемых в первых трех CTpO
ках цикла, включая три операции на ero обслуживание, выполняются
для каждоrо рекурсивноrо обращения к процедуре, включая вызовы
листьев, за исключением одноrо OCHoBHoro вызова, что определяет одно
слаrаемое трудоемкости цикла 17 (R (п, k) 1).
Трудоемкость копирования оптимальноrо вектора внутри цикла по
иска максимума составляет 9п + 7 операций. Однако количество пере
присваиваний в блоке then определяется данными, даже при фиксиро
ванном пара метре k. Мы снова обращаемся к методу амортизационноrо
анализа, т. к. можем указать общее количество выполнений это['о блока
по всем рекурсивным вызовам, в то время как анализ в отдельно взятой
вершине затруднен. В лучшем случае, а именно коrда для любоrо
260 fл. 7. Рекурсивные алzоритмы решения некоторых задач
объема оптимальной является упаковка nepBoro типа rруза, этот блок
будет выполнен однократно в каждой внутренней вершине дерева.
Худшим случаем, коrда блок then будет выполняться каждый раз
на проходе цикла, является ситуация, при которой упаковка каждоrо
следующеrо по номеру типа rруза является предпочтительной. Это
означает, что возврат из каждоrо рекурсивноrо вызова, включая ли
стья, будет при водить к выполнению этоrо блока, что совокупно равно
общему числу вершин. Анализ в среднем связан с суммированием
rармонических чисел, умноженных на биномиальные коэффициенты,
и выходит за рамки данной Кllиrи, однако обычное усреднение дает
также вполне приемлемые результаты. Для учета этих случаев мы
вводим специальный коэффициент относительно общеrо количества
вершин дерева, значения KOToporo определяются приведенными выше
рассуждениями:
л v п 1 1 +- av k: +- 1
aj==l, aj==av== n+-k ' (Ч== 2 ==1 2(n+-k) ' (7.9.13)
Теперь мы можем записать общую формулу для лучшеrо, худшеrо
и среднеrо случаев fcv jor (11" k), ИСПОЛЬЗУЯ введенный коэффициент:
fCVjor(n,k)== 17(R(n,k)' 1)+-(9п+-7)щR(п,k).
(7.9.14)
Объединяя все компоненты в соответствии с методом подсчета
вершин дерева рекурсии (7.9.9)(7.9.14), и учитывая, что aL +- av == 1,
окончательно получаем формулу трудоемкости алrоритма Беллмана
в предположении, что все типы rрузов обладают одинаковым значением
пара метра k, а различные случаи трудоемкости различаются выбором
коэффициента а! в соответствии с (7.9.13):
f А (п, k) == (6п +- 9пщ) R (11" k) +-
+-(46+-5аv+7аj)R(n,k) 17. (7.9.15)
Доля операций обслуживания дерева рекурсии составляет
FR (п k) == f R (п, k) 22
, fA(п,k) 6n+91Юj+-46+-5аv+-7Сlj'
F R (п, k) -------> О, n -------> ос.
Для реальных входов значение параметра k не обязательно одинаково
для всех типов rрузов и является действительным число:v!. В этом
случае, как показывают проведенные исследования [7.15], мы можем
перейти от классической формулы для количества сочетаний к фор
муле, использующей rаммафункцию Эйлера r (8), как вещественному
аналоrу факториала
r(n+-k+-l)
R(n,k) == r(n)r(k+-2) '
9 9. Алzоритм Беллмана оптимальной одномерной упаковки 261
Емкостная эффективность функция объема памяти. Для полу
чения оценки емкостной эффективности в области памяти стека нам
нужна функция H R (п), поскольку
V.t (-т) == н R (т)(р + r + f + 1 + 1) .
а алrоритм Беллмана требует четыре локальные ячейки, то
Vst(n) -== HR(n)(2+4 +0+4+ 1) -== l1HR(n) -== 11п,
rлобальная память представлена массивами стоимостей и объемов ти
пов rрузов и двумерным массивом XArr[l..n,O..n] и не зависит от
параметра k. Объем rлобальной памяти вычисляется элементарно, и
V (п) == v.'(lm (п) + V.t (п) == п 2 + 3п + 11 п == п 2 + 14п.
На основе полученных результатов мы можем определить ресурсную
сложность алrоритма при введенной параметризации задачи
iRc (п, k) == (е (пC;::+) ,е (п 2 )) ,
при фиксированном значении п ресурсная сложность алrоритма явля
ется наихудшей при k == п 2, в силу свойств биномиальных коэффи
циентов.
Сложностной класс алrоритма. Полученные результаты rоворят
о том, что трудоемкость алrоритма Беллмана очень сильно зависит от
данных пара метр k определяет rлавный порядок функции TpyдoeMKO
сти, алrоритм принадлежит подклассу NPRH. При фиксированном
количестве типов rрузов дерево рекурсии может быть как унарным
(при k == О), так и достаточно широким. Наихудшая ситуация возни
кает если k == п 2 мы имеем максимально возможный при данном
значении п биномиальный коэффициент, имеющий экспоненциальную
оценку. В связи с этим, в теории алrоритм принадлежит (по оценке
худшеrо случая при разных значениях параметра k) к сложностному
классу 7iE.
Некоторые рекомендации по ero рациональному применению можно
дать на основе следующих рассуждений. В силу свойств биномиальных
коэффициентов
C п1 C k+l C k+l е ( + k) k+l ) k ././ п,
n+k п+k' п+k п , --...--...
поэтому при небольших и фиксированных значениях k мы будем иметь
полиномиальную по п трудоемкость. Малые k содержательно означа
ют, что размеры типов rрузов Bcero в несколько раз меньше объема
упаковки, и алrоритм lIорождает не очень широкое дерево рекурсии
с приемлемой трудоемкостью. Более интересные и содержательные
результаты можно получить на основе сравнительноrо анализа peKYP
сивноrо и табличноrо алrоритмов решения задачи одномерной упаков
ки. Такой детальный сравнительный анализ, особенно при получении
временных характеристик проrраммных реализаций алrоритмов, дает
262 rл. 7. Рекурсивные алеоритмы решения некоторых задач
возможность обоснования их рациональноrо выбора. Предварительные
результаты TaKoro анализа опубликованы в [7.15].
Задачи и упражнения к rлаве 7
7.1. Напишите итерационный алrоритм вычисления факториала
и про ведите анализ ero трудоемкости. Совпадает ли полученный Вами
результат с функцией трудоемкости, приведенной в параrрафе 7.1
f А (т) == 5т + 5?
7.2. Разработайте итерационный алrоритм вычисления чисел Фи
боначчи со сложностью е (т) и получите ero теоретическую функцию
трудоемкости. Если не хранить все предыдущие числа в массиве,
каково минимальное количество необходимых дополнительных ячеек
памяти?
7.3. Модифицируйте алrоритм вычисления квадратноrо корня так,
что бы он работал при всех значениях а ;:: О.
7.4. Получите функцию трудоемкости двухфазноrо алrоритма BЫ
числения квадратноrо корня методом рекуррентных соотношений, счи
тая, что трудоемкость второй фазы является трудоемкостью останова
первой.
7.5. Напишите проrрамму, которая непосредственно вычисляет зна
чение квадратноrо корня, используя рекуррентное соотношение (7.3.1).
Расставьте счетчик базовых операций и проведите вычислительные
эксперименты при разных значениях а с целью определения TPYДO
емкости при фиксированной точности. Начиная с каких значений а
предложенный в параrрафе 7.3 двухфазный алrоритм будет обладать
лучшей трудоемкостью?
7.6. Трудоемкость алrоритма быстроrо возведения в степень не
зависит от значения х умножение есть базовая операция, но время
выполнения машинноrо алrоритма умножения зависит от значений бит
числа. Определите, насколько различаются времена выполнения про
rраммной реализации для различных х? Для ответа на этот вопрос Вам
будет необходим доступ к тактовому счетчику Вашеrо компьютера.
7.7. Является ли алrоритм, описанный в 7.4, асимптотически оп
тимальным, и в каких случаях? На сколько мы можем уменьшить
количество умножений, необходимых для возведения числа в данную
степень? Это достаточно серьезный вопрос, и мы советуем, если Вы не
обосновали ответ самостоятельно, обратиться к специальной литерату
ре.
7.8. Разработайте алrоритм умножения «в столбик» двух длинных
двоичных чисел, заданных массивом бит. Вы можете использовать
дополнительный алrоритм сложения из параrрафа 7.5. Получите функ
цию трудоемкости этоrо алrоритма, и, пользуясь методикой сравни
тельноrо анализа, определите рациональный диапазон ero применения
относительно алrоритма Карацубы.
7.9. Если Вы внимательно посмотрите на трудоемкости строк алrо
ритма Карацубы, то наверняка заметите, что «проrраммирование В про
Задачи и упражнения к; елаве 7
263
цедурах)} при водит к лишним вычислительным затратам. Попробуйте
заменить вызовы процедур сложения, вычитания и пересылки на их
непосредственные тексты. Будьте внимательны с индексами массивов.
Если у Вас хватит терпения проанализировать полученный алrоритм,
то Вы ответите на вопрос, на сколько Вам удалось улучшить
коэффициенты функции трудоемкости, и чем Вам пришлось за это
заплатить?
7.10. Предложенная в этой rлаве структура данных для алrоритма
Карацубы, очевидно, не является оптимальной. Попробуйте предло
жить структуру, обладающую хорошей емкостной эффективностью.
Приведет ли такая структура к росту трудоемкости, или Вам удастся
сохранить коэффициенты fA (n), а может быть, даже и улучшить их?
7.11. Разработайте алrоритм слияния двух отсортированных Mac
сивов, работающий «по месту)}, и требующий не более чем фиксиро
BaHHoro числа дополнительных ячеек памяти. Это хорошая алrорит
мическая задача известный авторам алrоритм достаточно «хитрый)},
И выполняет ряд неочевидных пересылок, чтобы освободить ячейку
и не потерять сортированный порядок. Как Вы считаете, оправдано
ли увеличение трудоемкости алrоритма полученной экономией двух
дополнительных массивов? Какой из алrоритмов слияния Вы будете
использовать на практике?
7.12. Проанализируйте любой известный Вам «квадратичный)} ak
rоритм сортировки, например, алrоритм сортировки вставками. На oc
нове полученной функции трудоемкости и трудоемкости алrоритма cop
ТИрОВ)<И слиянием определите рациональный диапазон их применения.
Определите, насколько различаются времена выполнения обобщенных
базовых операций у этих алrоритмов? Для ответа на этот вопрос
необходим вычислительный эксперимент.
7.13. Разработайте более эффективную, чем это предложено в па
раrрафе 7.7, структуру данных для рекурсивноrо rенетическоrо алrо
ритма поиска экстремума. На сколько Вам удалось уменьшить коэф
фициент у rлавноrо порядка функции объема памяти?
7.14. Попробуйте получить функцию трудоемкости рекурсивноrо
rенетическоrо алrоритма методом подсчета вершин дерева рекурсии.
Сравните полученный Вами результат с формулой (7.7.9).
7.15. Определите, какие ситуации с данными приводят к лучшему
и худшему случаям трудоемкости рекурсивноrо rенетическоrо алrорит
ма. На основании этих рассуждений Вы можете получить формулы
трудоемкости для этих случаев и тем самым явно установить xapaK
теристики временной устойчивости данноrо алrоритма при фиксиро
ванном значении n. Естественно, в этой задаче мы предполаrаем, что
трудоемкость вычисления целевой функции не зависит от значений
aprYMeHTa.
7.16. Предложите модифицированный алrоритм Тарьяна, который
находит все связные компоненты данноrо rрафа. при очевидном усло
вии, что исходный rраф не является связным, и состоит, по крайней
мере, из двух компонентов.
264 Fл. 7. Рекурсивные алzоритмы решения некоторых задач
7.17. Предложите друrую структуру хранения информации о rрафе,
которая позволила бы улучшить временную эффективность алrоритма
Тарьяна. Какими особенностями должен обладать rраф, чтобы Ваша
структура давала ощутимый эффект? Какую структуру Вы предложили
бы для сильно связных rрафов, количество ребер которых близко
к полному?
7.18. Мы можем строить оптимальную упаковку «снизу вверх»,
начиная с оптимальной упаковки rрузами первоrо типа (табличный ak
rоритм Беллмана). Предложите комбинированный алrоритм, использу
ющий табличный и рекурсивный метод, позволяющий сократить дерево
рекурсии и обладающий оптимальной трудоемкостью это, на наш
взrляд, серьезная исследовательская задача.
Список литературы к rлаве 7
7.1. Ноден П, Китте К. Алrебраическая алrоритмика: Пер. с франц. М.:
Мир, 1999. 720 с.
7.2. http:/www.ccas.ru
7.3. Кормен т., Лейзерсон ч., Ривест Р., Штайн К. Алrоритмы: построение
и анализ, 2e изд.: Пер. с анrл. М.: Изд. дом «Вильямс'>, 2005.
1296 с.
7.4. Ахо А., Хопкрофт Дж., J!льман Дж. Структуры данных и алrоритмы:
Пер. с анrл.: М.: Изд. дом «Вильямс'>, 2001. 384 с.
7.5. Кнут дэ. Искусство проrраммирования, том 3. Сортировка и поиск, 2e
изд.: Пер. с анrл.: Уч. пас. М.: Изд. дом «Вильяме,>, 2000. 832 с.
7.6. Рутковский Л, Пилиньский М., Рутковская Д Нейронные сети, reHe
тические алrоритмы и нечеткие системы. М.: rорячая линияТелеком,
2004 r. 452 с.
7.7. Штовба С.Д Муравьиные алrоритмы // Ехропепtа Pro Математика
в приложениях. 2003. М4. c.7075.
7.8. Fладков ЛА., Курейчик В.В., Курейчик В.М. rенетические алrоритмы /
Под ред. В.М. Курейчика. 2e изд., испр. и доп. М.: ФИЗМАТЛИТ,
2006. 320 с.
7.9. Макконелл Дж. Основы современных алrоритмов. 2e доп. изд. М.:
Техносфера, 2004. 368 с.
7.10. Fасфилд Д Строки, деревья и последовательности в алrоритмах: Инфор
матика и вычислительная биолоrия / Пер. с анrл. И.В. Романовскоro.
СПб.: Невский диалект; БХВПетербурr, 2003 r. 654 с.
7.11. Tarjan R.E. Еffiсiепсу of а good but not linear graph algorithms // Siam
jоurпа! оп Соmрutiпg, 1972, 1(2), рр. 215225.
7.12. ryaMaH С, Хидетниемu С Введение в разработку и анализ алrорит
мов. М.: Мир, 1981. 368 с.
7.13. Евстиснеев В.А., Касьянов В.Н Теория rрафов: алrоритмы обработки
деревьев. Новосибирск: Наука, 1994.
7.14. Беллман Р.. Дрейфус Р. Прикладные задачи динамическоrо проrрамми
рования: Пер. с анrл. М.: Наука, 1965, 457 с.
7.15. Ульянов М.В., rypUH Ф.Е., Исаков А.С, Бударащн В.Е. Сравнительный
анализ табличноrо и рекурсивноrо алrоритмов точноrо решения задачи
Список литературы к елаве 7
265
одномерной упаковки // Ехропепtа Pro Математика в приложениях. 2004.
М2(6}. С. 6470.
7.16. ИЛЬИН В.А., Садовничий В.А., Сендов Бл.К Математический aHa
лиз. М.: Наука. rлавная редакция физикоматематической литературы,
1979. 720 с.
7.17. Юдин ДБ., rоряшко А.п.. Немировский А.С Математические методы
оптимизации устройств и алrоритмов АСУ / Под ред. Ю.В. Асафьева.
В.А. Шабалина. М.: Радио и связь. 1982. 288 с.
7.18. Хаееарти Р. Дискретная математика для проrраммистов. М.: TeXHO
сфера, 2005. 400 с.
9 rоловешкин
Приложение
проrРАММНЫЕ РЕАЛИЗАЦИИ РЕКУРСИВНЫХ
АлrоРитмов И ИХ ЭКСПЕРИМЕНТАЛЬНОЕ
ИССЛЕДОВАНИЕ
(А.Д. Брейм.uн, r.П. Рябов)
1. Цели и задачи экспериментальноrо исследования
рекурсивных алrоритмов
В основе сравнительноrо анализа алrоритмов лежат теоретические
и экспериментальные оценки требуемой памяти и количества базовых
операций, задаваемых алrоритмом в выбранной модели вычислений
функции трудоемкости для лучшеrо, среднеrо и худшеrо случаев при
фиксированной размерности. Для рекурсивных алrоритмов дополни
тельными характеристиками являются функции оценки числа вершин
в дереве рекурсии. Теоретические функции обычно базируются на
определенных предположениях о входах алrоритма и, вообще rоворя,
требуют экспериментальных подтверждений. В связи с этим экспери
ментальное исследование проrраммных реализаций рекурсивных ak
rоритмов, как составная часть анализа их ресурсной эффективности,
связано с необходимостью решения следующих задач:
экспериментальное подтверждение теоретически полученной
функции трудоемкости, как правило, для трудоемкости в среднем,
с учетом принадлежности алrоритма к одному из классов по влиянию
характеристических особенностей исходных данных на функцию
трудоемкости алrоритма;
экспериментальное подтверждение теоретически полученных
функций для ;:арактеристик дерева рекурсии на исследуемом диапа
зоне размерности входа.
2. Методика проведения экспериментов и обработки
результатов
Получение достоверных результатов для этих задач сопряжено с op
rанизацией следующих этапов экспериментальноrо исследования:
модификация исходноrо текста проrраммной реализации алrо
ритма для определения характеристик дерева рекурсии и получения KO
личества выполненных базовых операций при данном входе, связанная
с расстановкой счетчиков базовых операций и счетчиков порожденных
вершин дерева рекурсии;
2. Методика про ведения экспериментов и обработки результатов 267
орrанизация rенерации входов алrоритма, обеспечивающей pe
презентативность выборки, т. е. входов, соответствующих особенностям
применения исследуемоrо алrоритма в данной проrраммной системе,
значения функции трудоемкости алrоритма для этоrо множества BXO
ДОВ и составляют в данном случае rенеральную совокупность;
планирование эксперимента, состоящее в определении необходи
Moro (минимальноrо) объема выборки для фиксированной размерности
задачи, определение исследуемоrо cerMeHTa и шаrа изменения размер
ности;
собственно проведение вычислительноrо эксперимента, в ходе
KOToporo MorYT быть получены каи экспериментальные значения функ
ции трудоемкости, так и экспериментальные времена выполнения;
обработка результатов эксперимента и проверка rипотезы о co
ответствии теоретической функции трудоемкости в среднем и экспери
ментально полученных выборочных средних значений.
Для всех экспериментов с проrраммными реализациями peKYP
сивных алrоритмов переменные счетчиков были назначены следую
щим образом: для подсчета Rv(D) используется переменная rv, дЛЯ
R[J(D) rl, для fR (D) fr, для fCL (D) fcl, для fcv (D) fcv,
для fA (D) {а. Перед обращением к функции Power все счетчики
обнуляются. Продемонстрируем расстановку счетчиков вершин дерева
рекурсии и счетчиков базовых операций на примере nporpaMMbl возве
дения числа в целую степень (см. П.3.3.3).
var rv, rl, fr, fcl, fcv, fa: Integer;
fUllction Power( х: Extended; т: lnteger ): Extended;
begin
f а : == f а + 18; / / количество операций
f r :== f r + 18; / / трудоемкость орrанизации рекурсии
i f т=0 then begin
r 1 : == r 1 + 1; / / количество листьев дерева
Power :== 1;
f а : == f а + 2; / / количество операций
f с 1 : == f с 1 + 2; / / трудоемкость останова рекурсии
end
else begin
i f m тod 2==0 then begin
rv:== rv + 1; / / иоличество внутр. вершин дерева
z :== Power(x ,т Div 2);
f :== z*z;
f а : == f а + 7; / / количество операций
f с v : == f с v + 7; / / трудоемкость порождения рекурсии
end
else begin
rv:== rv + 1; / / КОJIичес,во внутр. вершин дерева
z :== Power(x, m Div 2);
Power :== z*z*x;
268
Приложение
f а : == f а +8; / / количество операций
f с v : == f с v +8; / / трудоемкость порождения рекурсии
end;
end;
end;
3. Проrраммиые реализации рекурсивных алrоритмов
Проrраммные реализации алrоритмов были выполнены на языке
Delphi, компилировались и запускались в среде Borland Delphi 7.
3.1. Классический при мер задача вычисления факториала
Для решения мноrих комбинаторных задач нужно уметь Вj,IЧИСЛЯТЬ
количество всех возможных различных перестановок п элементов
факториал n! целоrо числа n. Один элемент можно разместить един
ственным способом, 1! == 1. Если элементов больше одноrо, любую их
перестановку можно получить, последовательно выбирая элементы для
заполнения п мест. В качестве первоrо элемента можно выбрать любой
элемент из п, в качестве BToporo любой элемент из п ! остаВIlJИХ
ся, и т. д. Тоrда число перестановок п элементов равно произведению
n на число перестановок п 1 оставшихся элементов: n! == п (n 1)!.
3.1.1. Проrраммная реализация рекурсивноrо алrоритма
/ / фукция Factorial вычисляет п!
function Factorial ( п: Extended ): Extended;
begin
i f n == 1 then
Factorial
else
Factoria! n*Factoria! (nl);
end;
3.1.2. Результаты экспериментальных исследований
На основании экспериментов, проведенных с проrраммной реализа
цией рекурсивноrо алrоритма вычисления факториала, были получены
следующие результаты по анализу дерева рекурсии и трудоемкости
проrраммной реализации. Мы приводим их В сравнении с теоретиче
скими значениями, рассчитанными по формулам (7.1.2)(7.1.4), в таб
лицах П.l и П.2 соответственно.
Мы не приводим значения абсолютных и относительных ошибок,
поскольку в данном случае экспериментальные результаты полностью
совпадают с теоретическими значениями.
3.2. Задача о кроликах вычисление чисел Фибоначчи
Знаменитый итальянский математик Леонардо из Пизы, известный
больше по своему прозвищу Фибоначчи, в сочинении «Книrа об абаке»
3. Просраммные реализации рекурсивных алсориmмов 269
Таблица П.l
Результаты анализа дерева рекурсии
R(m) Ry(m) RL(m) HR (т)
rn
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
1 1 1 О О 1 1 1 1
5 5 5 4 4 1 1 5 5
10 10 10 9 9 1 1 10 10
15 15 15 14 14 1 1 15 15
Таблица П.2
Результаты анализа трудоемкости алrоритма
т fR (-т) fCL (т) fcy (т) fA (т)
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
1 14 14 2 2 О О 16 16
5 70 70 2 2 16 16 88 88
10 140 140 2 2 36 36 178 178
15 210 210 2 2 56 56 268 268
(дошедший до наших времен вариант датируется 1228 [одом) при
водит следующую задачу: «Некто поместил пару кроликов в некое м
MeTe, оrороженном со всех сторон стеной, чтобы узнать, сколько пар
кроликов родится при этом в течение rода, если природа кроликов
такова, что через месяц пара кроликов производит на свет друrую пару,
а рожают крольчихи со BToporo месяца после cBoero рождения». Далее
Фибоначчи при водит помесячный расчет числа пар кроликов: на первом
месяце имеется одна пара, на втором месяце они производят еще одну
(Bcero 1 + 1 == 2), на третьем месяце первая пара производит еще одну
(Bcero 2 + 1 == 3), на четвертом месяце уже две пары производят потом
ство (Bcero 3 + 2 == 5) и Т.д. Поскольку кролики начинают размно
жаться со BToporo месяца, на каждом шаrе прирост составляет ровно
столько пар кроликов, сколько пар кроликов было два месяца назад.
Прирост же этот добавляется к тому количеству кроликов, которое бbJ
ло в предыдущем месяце. Если выписать 1I0лучаюиеся числа подряд.
то окажется, что каждое СJlедующее число, начиная с TpeTbero, paB
но сумме двух предыдущих: 1,1,2,3,5,8,13,21,34,55,89,144,233,377
и т. д. Эта последовательность называется числами Фибоначчи.
3.2.1. Проrраммная реализация рекурсивноrо алrоритма
/ / функция Fibonacci вычисляет пе число Фибоначчи
function Fibonacci( п: Extended ): Extended;
begin
if n < 3 then
Fibonacci .
270
Приложенuе
else
Fibonacci :== FiЬопассi(п2) + FiЬопассi(п1);
end;
3.2.2. Результаты экспериментальных исследований
Эксперименты, проведенные с проrраммной реализацией рекурсив
Horo алrоритма вычисления чисел Фибоначчи, позволили получить
следующие результаты по анализу дерева рекурсии и трудоемкости
проrраммной реализации. Эти результаты приводятся, в сравнении
с теоретическими значениями, рассчитанными по формулам (7.2.2)
(7.2.3), в таблицах П.3 и ПА соответственно.
т а б л и ц а П.3
Результаты анализа дерева рекурсии
т R(m) Rv(m) RL(m) HR (т)
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
1 1 1 О О 1 1 1 О
3 3 3 1 1 2 2 2 2
10 109 109 54 54 55 55 9 9
14 753 753 376 376 377 377 13 13
18 5 167 5 167 2583 2583 2584 2584 17 17
т а б л и ц а ПА
Результаты анализа трудоемкости алrоритма
т fR (т) fCL (т) fcv (т) fл (т)
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
1 14 14 4 4 О О 18 18
3 42 42 8 8 7 7 57 57
10 1 526 I 526 220 220 378 378 2 124 2 124
14 10542 10542 1 508 1 508 2632 2632 14682 14 682
18 72 338 72 ЗЗ8 10 ЗЗ6 10 ЗЗ6 18 081 18 081 100 755 100755
А.налоrично с таблицами П.1 и П.2 значения ошибок не приводятся,
т. К. И В данном случае результаты экспериментов полностью совпадают
с теоретическими значениями.
3.3. Стандартные математические функции вычисление
квадратноrо корня
Нахождение корней квадратных уравнений одна из pacnpOCTpa
ненных подзадач, встречающихся в процессе решения мноrих проблем.
Для вычисления корней квадратноrо уравнения, помимо основных
3. Проераммные реализации рекурсивных алеоритМО8 271
арифметических операций, требуется операция вычисления KBaдpaTHO
ro корня.
3.3.1. Проrраммная реализация рекурсивноrо алrоритма
/ / функция Sq вычисляет квадратный корень из а<4 '
/ / за n шаrов рекурсии "".f
iunction Sq( а: Ехtепdеd; 11: 1I1teger ): Extel1ded;
begin
i i 11==1 then
Sq :== 1.5
.... else begin
у :== Sq(a, п1);
Sq О . 5 * ( у+а / у ) ;
end;
end;
/ / функция Sqrt2 вычисляет квадратный корень из ПрОИЗВОJ1ьноrо а,
/ / рекурсивно вызывая себя с aprYMeHToM а/4, пока не выполнится а<4,
/ / затем вызывает Sq с rJ1убиной 6
iunction Sqrt2 ( а: Extel1ded ): Extended;
begin
if а<4 then
S q r t 2 : == Sq (а , б )
else begin
Sqrt2 . 2*Sqrt2(a/4);
end;
eifd;
3.3.2. Результаты экспериментальных исследований
С проrраммной реализацией рекурсивноrо алrоритма вычисления
квадратноrо корня были проведены эксперименты, в результате ко-
торых были получены значения характеристик для дерева рекурсии
и трудоемкости проrраммной реализации, ПРИ8еденные 8 соответству-
ющих таб.'1ицах. Полученные исследуемым алrоритмом значения K8aд
ратных корней не ПРИ80ДЯТСЯ, т. К. полностью совпадают со значе-
ниями стандартной функции языка Delphi. Результаты в таблице П.Б
приводятся в сравнении с теоретическими значениями, рассчитанными
по формулам (7.3.11), т. е. д.'1Я ПОЛl-lоrо дерева рекурсии, включая
фраrмент дерева. порождаемый функцией Sq.
При теоретическом анализе данноrо алrоритма трудоемкость оста-
нова рекурсии в первой фазе ашоритма функции Sqrt2(a), бы-
ла принята ранной полной трудоемкости второй фаЗbl алrоритма
функции Sq(a.6). Поэтому в таблице П.б для компонента fCJJ (а)
приводится, полученное в параrрафе 7.3 теоретическое значение об-
щей трудое:vIКОСТИ второй фазы при n == б fC/J (а) == 145, а для
fл (а) и fcv (а) соответствующие трудоемкости только для функции
Sqrt2(a). Мы также не при водим значения ошибок, т. к. для данноrо
алrоритма результаты, полученные в ходе экспериментов с проrрамм
ной реализацией, полностью совпадают с теоретическими значениями.
272
Приложенuе
т а б л и ц а П.5
Результаты анализа дерева рекурсии
а R(a) Rv(a) RL(a) НН (а)
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
2,0 7 7 6 6 1 1 7 7
7,5 8 8 7 7 1 1 8 8
146,8 10 10 9 9 1 1 10 10
512,0 11 11 10 10 1 1 11 11
1 000,0 11 11 10 10 1 1 11 11
10000,0 13 13 12 12 1 1 13 13
1000000,0 16 16 15 15 1 1 16 16
fR (а) fcL (а) fcv (а) fл (а)
а
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
2,0 14 14 147 147 О О 161 161
7,5 28 28 147 147 4 4 179 179
146,8 56 56 147 147 12 12 215 215
512,0 70 70 147 147 16 16 233 233
1 000,0 70 70 147 147 16 16 233 233
10000,0 98 98 147 147 24 24 269 269
1 000 000,0 140 140 147 147 36 36 323 323
т а б л и ц а П.6
Результаты анализа трудоемкости алrоритма
3.4. Проrраммное обеспечение современных криптосистем
возведение числа в целую степень
Система асимметричноrо шифрования RSA разработана в 1977 ro
ду исследователями из ассачусетскоrо Технолоrическоrо Института
Рональдом Ривестом, Ади Шамиром и Леонардом Адлеманом. Как
шифрование, так и дешифрование сообщения выполняется по одному
и тому же алrоритму: сообщение (последовательность битов, paCCMaT
риваемая, как большое целое число) возводится в целую степень и бе
рется остаток от деления результата на друrое целое число (модуль).
Ключ при этом состоит из двух чисел: показателя степени \i модуля.
Алrоритм RSA позволяет подобрать такое значение модуля и пару
показателей степени, что сообщение, зашифрованное одним ключом,
расшифровывается друrим. Соответственно, один из ключей может
быть сделан открытым, публично доступным. Все, что будет зашифро
вано открытым ключоYl, сможет расшифровать только владелец BToporo
(ceKpeTHoro) ключа из пары. Второе применение системы асиммет
3. Просраммные реализации рекурсивных алсоритмов 273
ричноrо шифрования цифровая подпись, подтверждение авторства
сообщения. Если зашифрованное сообщение удалось расшифровать
открытым ключом, значит, оно было зашифровано парным секретным
ключом, а сделать это м 01' только ero владелец. Надежность системы
асимметричноrо шифрования зависит от Toro, насколько сложно, зная
открытый ключ, подобрать парный ему секретный. Криптостойкость
алrоритма RSA опирается на то, что в настоящее время неизвестен
достаточно быстрый аш'оритм для разложения больших чисел на про
стые множители. Таким образом, основой мноrих современных проце
дур шифрованин и дешифрования является возведение 'шсел в целую
степень.
3.4.1. Проrраммная реализация рекурсивноrо алrоритма
/ / функция Power возводит х в степень т
function Power( х: Extended; т: 1 n teger ): Extended;
var z: Extended;
begin
i f т==0 then
Power :==
else begin
i f т тod 2==0 then begin
z:== Power(x,mDiv 2);
Power :== z*z;
end
else begin
... z :== Power (х ,т Div 2);
Power . z*z*x;
end;
end;
end;
3.4.2. Результаты экспериментальных исследований
Эксперименты, проведенные с проrраммной реализацией рекурсив
Horo алrоритма возведения числа в целую степень позволили получить
значения характеристик для дерева рекурсии и трудоемкости про.
rраммной реализации, которые мы приводим в таблицах П.7, ll.8 и П.9.
Поскольку значение числа х не влияет на трудоемкость lLaHl-IOI"О алrо
ритма, то оно было зафиксировано во всех экспериментах значением
х == 1,000001. РеЗУJ1ьтаты экспериментов по анализу дерева рекурсии
в таблице П.7 приводятся в сравнении с теоретическими значепия
ми, рассчитанными по формуле (7.4.2). При теоретическом анализе
данното алrоритма были получены две формулы длн трудоемкости
точная (7.4.3), использующая функции (30 (т) и {-J 1 (т), и формула
для средней трудоемкости (7.4.6) на основе функции {3 (т). В связи
с этим в таблице П.8 приводятся, в сравнении с экспериментальными
результатами, теоретические значения трудоемкости, полученные на
основе точной формулы (в скобках указано двоичное представление
числа т). В таблице ll.9 среднее значение трудоемкости, полученное
274
Приложение
на основе усреднения результатов при фиксированном значении п,
соответствующий диапазон для т приведен в скобках.
Таблица П.7
Результаты анализа дерева рекурсии
т R(m) Rv(m) RL(m) HR (т)
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
1 2 2 1 1 1 1 2 2
2 3 3 2 2 1 1 3 3
1023 11 11 10 10 1 1 11 11
1024 12 12 11 11 1 1 12 12
1327 12 12 11 11 1 1 12 12
100 000 18 18 17 17 1 1 18 18
1 000 000 21 21 20 20 1 1 21 21
т fR (т) fCL (т) fcv (т) fл (т)
ЭКСТl. теор. эксп. теор. эксп. теор. эксп. теор.
1 36 36 2 2 8 8 46 46
(1)
2 54 54 2 2 15 15 71 71
(10)
1023 198 198 2 2 80 80 280 280
(11 1111 1111)
1024 216 216 2 2 78 78 296 296
( 100 0000 0000)
1327 216 216 2 2 84 84 302 302
(10100101111) -
1 00 000 324 324 2 2 125 125 451 451
(11000011010100000)
1 000 000 378 378 2 2 147 147 527 527
(11110100001 О 01000000)
Т а б л и ц а П.8
Результаты анализа трудоемкости алrоритма
3.5. Проrраммное обеспечение современных криптосистем
умножение длинных целых чисел
Рассмотрим чуть подробнее процесс rенерации ключей в системе
RSA, описанной в предыдуще:vr пункте. На первом шаrе выбираются
3. Проzраммные реализации рекурсивных аморитмов 275
т а б л и ц а П.9
Результаты анализа трудоемкости алrоритма в среднем
1 А (п) llf
n эксп. теор. абс. отн.
6 (32 т 63) 173,5 173,5 О О
8 (128 т 255) 224,5 224,5 О О
10 (512 :( т 1023) 275,5 275,5 О О
два больших простых числа р и q. Эти числа, ломимо простоты,
должны иметь длину в сотни бит (в настоящее вре:\1Я достаточно
надежным выбором считаются числа от 512 бит), а числа (р 1)
и (С] 1) иметь хотя бы один большой простой множитель. Для
проверки простоты числа известен целый ряд быстрых алrоритмов,
в частности, алrоритм МиллераРабина. На втором шаrе вычисляются
произведение простых чисел N == pq, которое будет служить модулем,
и функция Эйлера <р (N) == (р 1) (q 1). Затем выбирается число
е, взаимно простое с <р (N) и подбирается число d, такое, что e(l ==
== 1 mod <р (N). ДЛЯ вычисления d обычно используется расширенный
алrоритм Евклида. Открытый ключ состаВ.1яет пара (е, N), а секретный
ключ пара (d, N). Шифрование сообшения х выполняется Вblчисле
нием у == x€ nlOd N, а дешифрование сообщения у вычислением
х == уС ПlOд N. Итак, для rенерации ключей в системе RSA нужно
уметь rенерировать БОJ1ьшие простые числа и быстро перемножать их.
Один из быстрых алrоритмов умножения длинных целых чисел был
предложен А.А. Карацубой в 1962 rоду.
3.5. {. Проrраммная реализация рекурсивноrо алrоритма
cons t
М == 1024; 11 длина произведения в битах
l\1h == М div 2; 11 длина множителя в битах
LogMh == 1 о; 11 rлубина дерева рекурсии
type
11 TNum - тип массива, в котором хранится длинное число
11 один бит в каждом байте массива, от старшеrо к младше1У,
11 младший бит в последней ячейке
TNum == array [О. .М] of Byte;
/ / PNum тип указателя на 1аССI1В. в котором хранится длинное число
PNum == T\lum;
var
11 D массив записей про;\н'жуточных результатов
11 ВЫЧИСJ1ений для всей текущей ветви дерева рекурсии
о: анау [ 1 .. LogMh] of record
АВ,А,В,АIВI,Л2В2,А3В3.ЛlрА2,ВlрВ2:
end;
1/ Процедура KSum складывает два длинных числа P и Q'
1/ РеЗУJ1ьтат помещается в S'
TNum;
276
Прuложен-uе
11 Длина aprYMeHToB в битах Nbit
procedure К5ит( Nbit: Word; P,Q,5: PNum );
var sm: word; 11 перенос
i: integer;
begin
sm :== О;
for i :== Nbit downto 1 do begin
sm :== Р' [ j )+Q' 1 i J+sm; 11 плюс перенос из sm
5 ' [ i J sm mod 2;
sm : == sm d i v 2;
end;
5 ' [ о ] : == sm;
end;
11 Процедура KSub вычитает длинное число Q' из Р'
11 Результат помещается в S'
11 Длина aprYMeHToB в битах Nbit
procedure К5иЬ( Nbit: Word; P,Q,S: PNum );
var sm: word;
i: integer;
begin
sm :== 1;
for i :== Nbit downto 1 do begin
sm :== Р' [ i J+(1 Q' [ i J)+sm;
5 ' [ i J : == sm mod 2;
sm :== sm div 2;
end;
5'[0] :== о;
end;
11 Процедура KMul перемножает длинные числа О[Ц.А и О[Ц.В
11 Результат помещается в D[L] .АВ
11 Длина aprYMeиroB в битах N
11 Текуший уровень рекурсии L
11 Промежуточные результаты хранятся в D[L]
procedure KMul( N, L: Word );
var Nh, NextL, il, i2, А4, 84: word;
begin
i f N == 1 then
D[L] .А8[М] :== D[L] .A[M]*D[L] .8[М]
else begin
Nh :== N div 2;
NextL :== L+l;
i 1 :== M--Nh+l;
i 2 :== М----N+ 1;
11 АIВI AI*BI
Move (О [ L ] . А [ i 1 ) ,О [ N е х t L ] . А [ i 1 ) ,Nh) ;
Move(D[L].8[il) ,D[NextL].8[il] ,Nh);
3. Проера-м--м-ные реализации рекурсивных алеориm-м-ов 27;
KMul(Nh, L+ 1);
Move(D[ NextL] .АВ[ i2] ,D[L]. AlВI [i2] ,N);
/ / А2В2 А2*В2
Move (О [ L ] . А [ i 2 ] ,Щ N ех t L ] . А [ i 1 ] , Nh ) ;
Моvе(D[L].В[i2] ,D[NextL].B[il] ,Nh);
КМиl (Nh , L + 1 );
Move (О [ N ех t L ] . АВ [ i 2 ] ,О [ L ] . А2В2 [ i 2 ] , N) ;
/ / АlрА2 Лl+А2
KSum(Nh,@D[I-] .A[il l],@D[L] .A[i2 1],
@D[ L] . А 1 рА2 [ i 1 1 ] ) ;
/ / BlpB2 "" Вl+В2
KSum(Nh,@D[L].B[ i 1 .1] ,@D[L] .В[ i2 1],
@D[ L] . в 1 рВ2 [ i 1 1 ]);
/ / А3В3 А3*В3
А4 :=: D[L] .АlрА2[М];
D[L] .АlрА2[М] :== о;
В4 :== D[L].BlpB2[M);
D[L].BlpB2[M] :== о;
Move(D[L].AlpA2[il "1],D[NextL].A[il] ,Nh);
Move(D[L] .BlpB2[il l],D[NextL] .B[il] ,Nh);
KMul (Nh, L+ 1);
Move(D[ :\IextL] .АВ[ i2 ] ,D[L] . А3В3 [i2 2] ,N);
/ / i22 для *1
О[1_] . АЗВ3[М] :== о;
... D[L] .Азвз(м---.l) :== о;
i f А4==1 then begin
FilIChar (D[L] . ВlрВ2 [i2 3] ,Nh+2 ,о);
/ / А3В3 == А3В3+2*В3
KSum(N+2,@D[I.] . АЗВ3 [i2 3], ,
@D[L]. ВlрВ2 [i2 3] ,@D[L] . А3В3 [ i2 3]);
end;
if В4==1 then begin
FiI1Char (О[ 1.] . АI рА2 [ i2 ..3] ,Nh+2 ,о);
О[1_]. АlрА2 [М] :== М; / / A3B3+A4B4
/ / А3В3 0= А3В3+2* А3
KSum(N+2,@D[ L] . АЗВ3 [i2 3] ,@D[L] . АlрА2[ i2 3],
@D[ L ] . А3В3 [ i 2 З] ) ;
end;
/ / А3В3 == A3B3A1Вl
D[L].AlВl[i21] :== о;
D[L].AlВl[i22] :== о;
KSub (N+2 ,@D[ С] . А3ВЗ [i2 ..3] ,@D[ С] . AlВl [i2 3),
@D[ L ] . АЗ ВЗ I i 2 З ] ) ;
/ / А3В3 A3B3A2B2
D[L] . А2В2 [ i2 I] :== о;
278
Прuложеl-ше
D[L].A2B2[i22] о;
KSub(N+2,@D[L]. А3В3 [i2 3] ,@D[L]. А2В2 [i2 3],
@D[L] .A3B3[i2 3]);
11 А2В2 > старшая половина AlВ 1
Move(D[L]. А2В2[ i2] ,D[L]. АIВl [M2*N+ 1] ,N);
11 А3В3 > середина АВ
FillChar (D[ L] . AB[2*N] ,2*N+ 1 ,о);
Move (D [ L ] . А3В3 [ i 2 1 ] ,D [ L] . АВ [MNh] ,N + 1 ) ;
11 АВ AB+AI81
KSum(2*N,@D[L] .AB[2*N] ,@D[L] .AlВl [2*N],
@D[L] .AB(2*N]);
,.
end;
end;
11 Для перемножения длинных целых чисел А и В (длиной до Mh битов),
11 их нужно поместить в D[l].A и D[I].8
11 и вызвать процедуру KMul(Mh, 1)
11 результат (длиной до М битов) взять в D[I].AB
3.5.2. Результаты экспериментальных исследований
Мы приводим в таблицах П.I0, П.ll результаты, полученные в ходе
экспериментов с проrраммной реализацией рекурсивноrо алrоритма
умножения длинных целых чисел. Результаты вычислительных ЭКСllе
риментов по анализу дерева рекурсии в таблице П.l О даны в сравнении
с теоретическими значениями, рассчитанными в соответствии с фор
мулами (7.5.8).
k R(n) Rv(n) R1_(n) Ни (п)
п ==log2 п
эксп. теор. эксп. тсор. эксп. теор. эксп. теор.
32 5 364 364 121 121 243 243 6 6
64 6 1093 1093 364 364 729 729 7 7
128 7 3280 3280 1093 1093 2 187 2 187 8 8
256 8 9841 9841 3280 3280 6561 6561 9 9
512 9 29 524 29 524 9841 9841 19 683 19683 10 10
Таблица П.IО
Результаты анализа дерева рекурсии
Теоретический анализ трудоемкости данноrо алrоритма был прове-
ден для среднеrо случая, в соответствии с этим мы приводим В таблице
П .11 экспериментальные результаты, усредненные по N е == 1 О 000 экс
периментам. В каждом таком эксперименте исходные массивы длины
п, соответствующие умножаемым числам, заполнялись значениями О
или 1 с использованием reHepaTopa случайных чисел. Трудоемкость
одноrо вычислительноrо эксперимента определялась на основе счетчи
ка базовых операций, а среднее значение вычислялось усреднением по
N е эксперимента1. Теоретические значения трудоемкости рассчитаны
3. Проераммн.ые реализации рекурсивн.ых алеоритмов 279
по формуле (7.5.16). В последнем столбце мы приводим абсолютную
и относительную поrрешности для теоретической трудоемкости OTHO
сительно экспериментальных результатов.
Таблица П.ll
Результаты анализа трудоемкости алrоритма в среднем
j л (п) поrрешность 6.]
n
эксперимент теория абсолютная относительная
32 156 779,70 152 858,00 3921,70 2,57%
64 480 141,90 468271,00 II 870,90 2,54%
128 1 459 317,30 1 423 502,00 35815,30 2,52%
256 4 414 525,80 4 307 179,00 107 346,80 2,49%
512 13 316996,00 12 994 178,00 322 818,00 2,48%
3.6. Алrоритмическое обеспечение общеrо назначения
сортировка массива чисел слиянием
Алrоритм сортировки слиянием (Дж. фон Нейман, 1945 [.) делит
массив на две части, рекурсивно сортирует каждую часть, а затем
сливает их воедино. Для слияния двух частей используется дополни
тельная буферная па:\1ЯТЬ. На каждой итерации цикла слияния в буфер
пере носится наименьший из двух элементов, стоящих в начале частей.
Сортиррвка слиянием хорошо приспособлена к обработке внешних
файлов, чей размер превышает размер доступной памяти, а также
потоков данных, которые нужно сортировать по мере их поступле
ния. В этом случае каждая поступающая порция данных сортируется,
а затем сливается с отсортированным массивом данных, накоплен
ных к этому времени. Мноrопутевая сортировка слиянием позволяет
эффективно использовать возможности кластерных и параллельных
систем.
3.6.1. Проrраммная реализация рекурсивноrо алrоритма
const maxN == 2500; / / ДJ1ина массива
var
/ / А сортируемый массив
А: ассау [1. .maxN] of Ехtепdеd:
/ / Вр, Bq служебные массивы
Вр, Bq: ассау [ 1 . . (maxN div 2)+2] of Ехtепdеd;
/ / процедура Merge вьшолннет С.1ияние двух 1I0дмассивов
/ / A[p..r] и A[r+l..q] в подмассив A[p..q]
procedure Merge(p, r, q: Iпtеgеr);
var АМах: Extended; / / текуший максимум
i, kp, kq, рl, рр, pq: Integer;
begin
АМах :== A[r];
280
Прuложение
if АМах < A[q] then
АМАХ. :== A[q];
/ / перенос A[p..r] в Bp[l..rp+l]
kp :== [p+1;
рl :== pl;
for i :== 1 to kp do
Вр[ i] :== A[pl+i];
/ / устанавливаем оrраничитель в конце Вр
Bp[kp+l] :== АМах;
/ / перенос A[r+l..q] в Bq[l..qr]
kq :== qr;
for i :== 1 to kq do
Bq [ i] : == А [ r+ i ] ;
/ / устанавливаем оrраничитель в конце Bq
Bq[kq+l] :== АМах;
/ / выбираем максимальные элементы из начала массивов Вр и Bq
/ / и переносим их в А
рр :== 1;
pq:== 1;
for i :== р to q do
i f Вр [рр] < Bq [pq] then begin
A[i] :== Вр[рр];
рр :== рр+l;
end
eIse begin
A[i] :== Bq[pq];
pq . pq + 1;
end;
end;
end;
/ / процедура MergeSort выполняет сортировку слиянием
/ / подмассива A[p..q]
procedure MergeSort(p, q: Integer);
var r: Integer;
begin
i f р <> q then begin
r : == (p+q) d i v 2; / / точка разделения массива А
MergeSort (р, r);
MergeSort ( r + 1, q ) ;
Merge (р , r , q ) ;
end;
end;
/ / Для сортировки массива длиной N ero нужно поместить в A[I..N]
/ / и вызвать процедуру MergeSort(l ,N)
/ / Результат будет размешен на том же месте (A[I..N])
3. Проzраммные реализации рекурсивных аморитмов 281
3.6.2. Результаты экспериментальных исследований
Мы приводим В таблицах П.12, П.13 и П.14 рзультаты экспери
ментальных исследований для проrраммной реализации рекурсивноrо
алrоритма сортировки слиянием по характеристикам дерева рекурсии
и трудоемкости данноrо алrоритма. Результаты экспериментов по aHa
лизу дерева рекурсии в таблице П.12 приводятся в сравнении с Teope
тическими значениями, которые рассчитаны в соответствии с форму
лами (7.6.2). Напомним, что в теории формулы для количества вершин
дерева справедливы как в случае n == 2 k , так и в случае n i- 2 k мы
явно демонстрируем это в таблице. Значения Ни (п) рассчитаны для
первоrо случая по формуле (7.6.2), для BToporo по (7.6.] 1).
R(n) Rv(n) RL(n) H R (n)
n
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
8 15 15 7 7 8 8 4 4
256 51] 511 255 255 256 256 9 9
]024 2047 2047 1 023 1 023 1024 ] 024 ] 1 1 ]
2048 4095 4095 2047 2047 2048 2048 ]2 ]2
3 185 185 92 92 93 93 8 8
827 1 653 1 653 826 826 827 827 1l 1l
]324 2647 2647 1 323 1 323 1 324 1 324 12 ]2
]778 3555 3555 1 777 1 777 1 778 1 778 12 ]2
Т а б л и ц а П.12
Результаты анализа дерева рекурсии
Теоретический анализ трудоемкости данноrо алrоритма был прове
ден для двух случаев, в соответствии с этим мы приводим экспери
ментальные результаты в двух таблицах П.13 дЛЯ случая 1 (n == 2 k ,
формула для трудоемкости (7.6.7)), и П.14 для случая 2 (n i- 2 k ,
формула для трудоемкости (7.6.13)). Отметим, что формула (7.6.13) при
n == 2 k совпадает с формулой (7.6.7). В теории расхождение реальной
трудоемкости от среДllеrо значения 6.! не превышает п ], экспе
риментальные значения 6.! IIриведены в последнем столбце таблицы.
Целью данных экспериментов была про верка максимальноrо расхож
дения теоретической функции трудоемкости в среднем и полученных
экспериментальных значений. В связи с этим в таблицах П.13 и П.]4
мы приводим экспериментальную трудоемкость, имеющую наибольшее
расхождение с теоретической формулой по 1000 экспериментов со
случайными массивами данной размерности.
282
Прuложение
Таблица П.13
Результаты анализа трудоемкости алrоритма случай 1
п fл (п) bfmax (п)
эксп. теор. эксп. теор.
8 1 041 1046 5 7
256 58 503 58 558 55 255
1024 271 225 271 294 69 1023
2048 579 447 579 518 71 2047
Таблица П.14
Результаты анализа трудоемкости алrоритма случай 2
n fA (п) bfmax (п)
эксп. теор. эксп. теор.
93 18 897 18927 30 92
827 215413 215 543 130 826
1324 361 363 361 594 231 1323
1778 498 005 498 248 243 1777
3.7. Современные методы оптимизации rенетический поиск
экстремума функции нескольких переменных
fенетические алrоритмы это rpyппa методов поиска решений
в MHoroMepHoM пространстве. Решение должно быть представлено
в виде вектора (хромосомы), в котором каждый элемент (reH) при
нимает значения из соответствующей области определения. Функция
приспособленности сопоставляет каждому возможному решению ero
оценку числовое значение. На каждом шаrе алrоритма оценивается
приспособленность популяции, после чеrо часть хромосом подверrа
ется мутации (в хромосоме случайно изменяются отдельные reHbI)
и кроссинrоверу (пара хромосом обменивается своими частями). Если
приспособленность новой популяции улучшилась, она становится HO
вым поколением, иначе нет. Традиционно rенетические алrоритмы
реализуются в виде цикла, однако с такой реализацией связана TPYД
ность априорной оценки количества шаrов, требуемых для нахождения
решения приемлемой точности.
Рекурсивный rенетический алrоритм заменяет циклическое повто
рение развертыванием дерева рекурсии, в листьях KOToporo находят
ся случайные хромосомы, а по дереву вверх передаются лучшие из
них. В каждом промежуточном узле при этом сравниваются восемь
хромосом: две, пришедшие от потомков, две, полученные путем их
кроссинrовера, и четыре, полученные мутацией. Результатом работы
алrоритма является хромосома, доставляющая наилучшее значение
функции приспособленности.
3. ПрОi!ра-М-М1tые реализации рекурсивных аЛi!орит-м-ов 283
3.7.1. Проrраммная реализация рекурсивноrо алrоритма
const
maxN == зо; / / максимальная rлубина рекурсии
М == 1 2; / / размерность вектора
var
/ / Ух массив reHOMOB для текущей ветви дерева рекурсии
/ / первый индекс текушая rлубина рекурсии
/ / второй индекс номер хромосомы
/ / третий индекс значение функции (О) и координаты BeKTopa(l..M)
Ух: ассау [] .. тах:\!, I ..8 ,о. .М] of Extended;
/ / функция G, миниму которой ищется алrоритмом
/ / параметр n текушая rJlубина рекурсии
/ / параметр j номер хромосомы
/ / значение функции G для хромосомы Vx[n,j,I..M]
/ / записывается в Vx[n,j,O] и возврашается функцией
function G( n,j: Integer ): Extended;
var i: Integer;
s, z: Extended;
begin
S :== о;
for i :== ] to М do begin
Z:"'" Vх[п,j,i]О.З;
S :== s+z*z;
end;
Vx[n,j ,о] . s;
Result . s;
end;
/ / функция F ищет минимум функции G на rлубине n дерева рекурсии
/ / результат помешается в Ух[п,I,О] (значение функции G)
/ / Vх[л,I,I..М} - хромосома, доставляюшая минимум функции G
procedure F( п: Integer );
var i,j,k: Integer;
GMin: Extended;
begin
i f n == 1 then begin
/ / на уровне 1 rенерируе1 с.учайную хромосому
for i :== 1 to М do
V х [ n , 1 , i] : == Random;
Ух [ n , I ,о] G ( 11 , 1 ); / / значение целевой функции
end
else begin
/ / рекурсия к одному ребенку, результат переносим в Vx[n,l,*]
284
Приложение
F(nI);
for i :== О to М do
Vx[n,l,i] :== Vx[nI,I,i];
/ / рекурсия ко второму ребенку, результат переносим в Ух[п,2,*]
F(nl);
for i :== О to М do
Vx[n,2,i] :== Vx[nI,I,i];
/ / кроссинrоверы Ух[п,3] и Ух[п,4] из Ух[п,1] и Ух[п,2]
/ / k точка разрыва; кроссируются reHbI с 1 по k включительно
k :== 2+Random(M2);
/ / 2<==k<==ml, Random(m2) возвращает O..т3
for i :== 1 to k do begin
Ух [п, 3, i] :== Ух [п, 2 , i ] ;
Vx[n,4,i] :== Vx[n,l ,i];
end;
for i :== k+l to М do begin
Vх[п,З,i) :== Vx[n,l,i];
Vx[n,4,i] :== Vx[n,2,i);
end;
/ / Ух[п,5..8] копируются из Vx[n,I..4]
for j :== 1 to 4 do
for i :== 1 to М do
Vx[n,j+4,i] :== Vx[n,j,i];
/ / мутация случайных reHoB в Ух[п,5..8]
for j :== 5 to 8 do begin
k :== l+Random(m); / / 1<==k<==m
V х [ n ,j ,k] : == V х [ n ,j ,k] + Random ;
if Ух [п ,j ,k] >== 1 then
Vx[n,j ,k] :== Vx[n,j ,kll;
end;
/ / расчет значений функции G для хромосом 3..8
for j :== 3 to 8 do
Ух[п, j ,0] :==G(n, j ); / / Vx!n,j,O] :== G(Vx!n,j,I..M])
/ / выбор наилучшей из восьми хромосом
/ / k номер наилучшей хромосомы
k :== 1;
GMin :== Ух [п , 1 ,О];
for j :== 2 to 8 do begin
i f Ух [п ,j ,О] < GMin then begin
k :== j;
GMin :== Vx[n,j ,О];
end;
end;
/ / перенос наилучшей хромосомы в Ух!п, 1, *]
for i :== О to М do
Vx[n,l,i] :== Vx[n,k,i];
3. Проераммные реализации рекурсивных алеоритмов 285
end;
end;
/ / Для нахождения минимума функции G вызывается F(I)
/ / Результат в Vx[I,I,*]
3.7.2. Результаты экспериментальных исследований
В таблицах П.15 и П.16 показаны результаты проведенных экспе
риментальных исследований с проrраммной реализацией рекурсивноrо
rенетическоrо алrоритма поиска минимума мноrомерной функции. По
скольку для каждой точки алrоритм однократно вычисляет значение
целевой функции, то количество точек определялось счетчиком обра
щений к функции 9 (х). Результаты по анализу дерева рекурсии и KO
личеству порожденных точек приведены в таблице П.l5 в сравнении
с теоретическими значениями, рассчитанными по формулам (7.7.5) и
(7.7.7).
Таблица П.15
Результаты анализа дерева рекурсии
п R(n) Rv(n) HR (п) Р(п)
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
14 16 383 16383 8192 8192 14 14 57 338 57338
16 65535 65 535 32 768 32768 16 16 229370 229370
18 "-262 143 262 143 131072 131 072 18 18 917498 917498
20 1048575 1048575 524 288 524 288 20 20 3670010 3670010
Теоретический анализ трудоемкости данноrо алrоритма был про
веден для трудоемкости в среднем (см. формулу (7.7.8». Поскольку
фраrмент поиска минимума из 8 чисел вызывается в каждой BHYT
ренней вершине дерева рекурсии, то при однократном выполнении
проrраммной реализации мы имеем усреднение по Rv(n) обращениям
к этому фраrменту, что при тестовых значениях п является вполне дo
статочным. Тестовая функция была определена в 12MepHoM простран
стве, т. е. значение m == 12, в соответствии с этим и была рассчитана
теоретическая трудоемкость. Мы не ставили явной целью исследова
ние предложенноrо rенетическоrо алrОРИТ:\1а на качество получаемых
решений, тем не менее, данные, полученные в экспериментах, показали
вполне приемлемые результаты. Внушительные значения трудоемкости
на самом деле становятся вполне допустимыми при переходе к Bpe
менным оценкам. Среднее время на одну базовую операцию для про
цессора PIV имеет порядок 5 тактов для смеси операций индексации
и обработки целых и действительных чисел, что приводит при п ==
== 20, m == 12 и тактовой частоте в 3 rfц к оценке времени выполнения
порядка 1,5 сек.
286
Приложение
Таблица П.16
Результаты анализа трудоемкости алrоритма в среднем при m == 12
п j А (п) поrрешность Д!
эксперимент теория абсолютная относительная
14 15351 887,08 15 371 468,8 19 581,76 0,1274%
16 61 412 829,05 61 490527,1 77 698,08 0,1264%
18 245655061,92 245 966 760,2 311 698,35 0,1267%
20 982 624 823,46 983 871 692,8 1 246 869,38 0,1267%
3.8. Классические алrоритмы на rрафах нахождение
OCToBHoro дерева
fрафы позволяют естественным образом описывать множество за
дач от поиска путей между rородами до синтаксическоrо разбора
текстов. Так, например, локальные компьютерные сети в настоящее
время обычно строят на коммутаторах, работающих по алrоритму про
зрачноrо моста. В таких сетях нельзя допускать появления циклов,
иначе возможно лавинообразное размножение каждоrо пакета. С дpy
rой стороны, для повышения надежности сети часто желательно иметь
резервные или дублирующие каналы связи между коммутаторами, что
приводит к появлению циклов. Современные коммутаторы решают это
противоречие с помощью протокола построения OCToBHoro дерева, Т.е.
TaKoro ациклическоrо связноrо подrрафа, который содержит все узлы
исходноrо rрафа. Все каналы, не вошедшие в остовное дерево, не
используются. Остовное дерево реrулярно перестраивается, что поз
воляет исключать из Hero неработоспособные каналы и задействовать
резервные. Протокол построения OCToBHoro дерева STP выполняется
всеми коммутаторами, причем ни один из них не обладает полной
информацией о тополоrии сети.
Мы рассматриваем более простую задачу нахождения OCToBHoro дe
рева при известной тополоrии сети (например, при известной матрице.
смежности rрафа), решаемую алrоритмом поиска в rлубину, предло
женным Тарьяном.
3.8.1. Проrраммная реализация рекурсивноrо алrоритма
const
Nvertex == 100; / / максимальное количество вершин rрафа
var
/ / G матрица смежности
G: array [1.. Nvertex , 1 .. Nvertex] of Byte;
/ / Visit вектор посешений узлов
Visit: array[I..Nvertex] of Byte;
/ / т остовное дерево
/ / ie ребро остова соединяет вершины T[i,l] и T[i,2]
Т: array [1..100,1..2] of Word;
N: W ord ; / / количество вершин rрафа
3. Проzраммные реализации рекурсивных алzоритмов 287
М: Word ; / / количество ребер в остове
/ / процедура поиска в rлубину от вершины V
procedure DepthFirstSearch ( У: Word );
var W: word;
begin
/ / отмечаем посещение вершины V
Visit [У] :== 1;
/ / заходим во все смежные непосещенные вершины W
for W :== 1 to N do begin
if (G[V,W] == 1) then begin
if (Visit [W] == О) then begin
/ / добавляем ребро (V,W) в остов
М :== М+l;
Т [М, 1] :== У;
Т[М,2] :== W;
DepthFirstSearch (w);
end;
end;
end;
end;
/ / Для построения OCTOBHoro дерева установить N==количество вершин,
/ / занести матрицу смежности в G, обнулить вектор Visit и массив Т,
/ / вызвать DepthFirstSearch(l)
/ / Результат (список ребер OCToBHoro дерева) в массиве Т
3.8.2. Результаты экспериментальных исследований
Результаты экспериментов с проrра:vtмной реализацией алrоритма
Тарьяна приведены в таблицах П.I7 и П.18. Поскольку для этоrо
алrоритма количество листьев и BHYTpeH
них вершин не определялось в теории из
за сильной пара:vtетрической зависимости, то
в таблице П.17 приведены значения только
для общеrо числа вершин дерева рекурсии
в сравнении с теорстическими значениями,
рассчитанны:vtи по формуле (7.8.2). В экспе
рименте rснерировались случайные матрицы
стоимости на основе стандартноrо paBHOMep
Horo reHepaTopa, что обеспечивало в среднем
(п 1) /2 ребср у каждой вершины и оче
видную связность rрафа.
Точная фОр:vtула теоретической TpyдoeM
кости данноrо алrоритма была получена при
условии, что количество ребер rрафа известно. В связи с этим была
проведена серия экспериментов, в которой для каждоrо фиксированно
ro числа вершин rенерировались случайные rрафы, содержащие зара
нее определенное количество ребер. Учитывались только те результа
ты, в которых сrенерированный rраф оказывался связным. Количество
Т а б л и ц а П.17
Результаты анализа
дерева рекурсии
п R(n)
эксп. теор.
10 10 10
25 25 25
50 50 50
100 100 100
288
Прuложение
Таблица П.18
Результаты анализа трудоемкости алrоритма
Число вершин n Число ребер m fA(n,m)
эксперимент теория
10 14 898 898
10 18 914 914
10 23 934 934
10 27 950 950
25 90 4727 4 727
25 120 4847 4847
25 150 4967 4967
25 180 5087 5087
50 368 17 714 17 714
50 490 18202 18202
50 613 18 694 18694
50 735 19 182 19 182
100 1485 68 432 68 432
100 1980 70412 70 412
100 2475 72 392 72 392
100 2970 74 372 74 372
ребер задавалось равным ближайшему целому к 30%, 40%, 50%, 60%
от количества ребер соответствующеrо полноrо неориентированноrо
rрафа на n вершинах n (n 1)/2. Полученные результаты приведены
в таблице П.18 в столбце экспериментальных данных, теоретические
значения были рассчитаны по формуле (7.8.5).
3.9. Оптимальные экономические решения пакет акций
с максимальной доходностью одномерная оптимальная
упаковка
Задача одномерной оптимальной упаковки описывает ситуацию, KO
rда имеется оrраниченный объем, который можно заполнить rрузами
разных типов (каждому типу соответствует объем и стоимость rруза)
в разных комбинациях. Uелью является определение набора rрузов,
помещающихся в заданный объем, совокупная стоимость которых MaK
симальна.
Например, имеется фиксированное количество денеr, на которые
можно купить акции различных предприятий. Пусть все акции одноrо
3. Проzраммные реализации рекурсивных алzоритмов 289
предприятия имеют одинаковую стоимость и фиксированную заранее
известную доходность. Акции разных предприятий MorYT иметь разную
стоимость и доходность. Тоrда нужно определить, сколько акций каких
предприятий нужно купить, чтобы в последующем совокупный доход
с них был как можно больше.
Задача одномерной упаковки решается с помощью метода динами
ческоrо проrраммирования Беллмана.
3.9.1. Проrраммная реализация рекурсивноrо алrоритма
const
Nmax == 100; / / максимальное количество типов rрузов
var
ЬохС: array[I..l\max] of Word; //стоимостиrрузов
ЬохУ: array[I..Nmax] of Word; //объемыrрузов
/ / оптимальные стоимости
ХАп: array [ 1 . . Nmax, О . . Nmax] of Word;
N: W ord ; / / количество типов rрузов
/ / процедура F получает оптимаJlЬНУЮ упаковку
/ / Х типов rрузов в объеме V
/ / результат: стоимость в ХАп[Х,О]
/ / количество rрузов i-ro типа в ХЛrr[Х,i]
procedure F( У, Х: Word );
var Cost, k, i, j: Word;
begin
if XI then begin
/ / Останов рекурсии прямое вычисление при x 1
k :== V div ЬохУ [ 1 ] ;
ХАп [1 ,О] :== k*boxC [ 1 ] ;
/ / функция возврашает оптимальную стоимость
for j :==2 to N do
ХАп [ 1 , j] :== о; / / все XjO кроме XI==k
ХАп [1 ,1] :== k;
end
else begin / / Рекурсивные вызовы для опреде,1ения mах F
for j :==0 to N do
ХАп [Х, j] : == о; / / начальный mах: функцияО. все Xj==O
k :== V div ЬохУ[х];
/ / перебираем все возможные количества rруза типа Х
for i :==0 to k do begin
/ / рекурсивно размещаем Х I тип rрузов в оставшемся пространстве
F (( Ybox V [ х ] * i ) ,Х 1 ) ;
Cost :== i*ЬохС[Х]+ХАп[Х1 ,О];
if Cost >== XArr[X,O] then begin
/ / копирование максимума от Х-l
for j:==1 to N do
XArr[X,j] :== XArr[Xl,j];
290
Прuложение
ХАп [Х,Х]
ХАп[Х,О]
end;
end;
end;
end;
i;
Cost;
3.9.2. Результаты экспериментальных исследований
В таблицах П.19 и П.20 мы приводим результаты экспериментов
с проrраммной реализацией алrоритма Беллмана. Поскольку для этоrо
алrоритма характеристики дерева рекурсии зависят не только от коли
Таблица П.19
Результаты анализа дерева рекурсии
k R(n, k) Rv(п, k) RL(n, k) HR (п)
n
эксп. теор. эксп. теор. эксп. теор. эксп. теор.
8 3 330 330 210 210 120 120 8 8
8 4 792 792 462 462 330 330 8 8
8 5 1 716 1 716 924 924 792 792 8 8
10 3 715 715 495 495 220 220 10 10
10 4 2002 2002 1 287 1 287 715 715 10 10
10 5 5005 5005 3003 3003 2002 2002 10 10
12 3 1 365 1 365 1 001 1 001 364 364 12 12
12 4 4 368 4368 3003 3003 1 365 1 365 12 12
12 5 12 376 12376 8008 8008 4368 4368 12 12
чества типов rрузов, но и от пара метра k, то в таблице П.19 приведены
экспериментальные характеристики дерева рекурсии для различных
значений k при фиксированном n в сравнении с теоретическими зна
чениями, рассчитанными по формулам (7.9.8). В эксперименте rенери
ровались случайные входные массивы на основе стандартноrо равно-
MepHoro [енератора языка проrраммирования Delphi. Значение объема
упаковки было фиксировано и равно V == 100, а объемы типов rрузов
выбирались случайно из диапазона, rарантирующеrо фиксированное
и одинаковое для всех типов rрузов значение k, следующим образом:
k == 3: 26 (: Vi (: 33, k == 4 : 21 (:Vi (: 25, k == 5 : 17 (: 1Ji (: 20.
Поскольку стоимости типов rрузов не влияют на характеристики дe
рева рекурсии, то они, для определенности, выбирались случайно из
диапазона от 50 до 100.
При анализе трудоемкости проверялась формула для среднеrо зна
чения. В эксперименте подсчитывалось количество базовых операций
для KOHKpeTHoro входа, обладающеrо заданной параметризацией. Для
каждой пары n, k было проведено 10000 экспериментов, их ycpeДHeH
4. Обсуждение результатов u выводы
т а б .1 И Ц а П.20
Результаты анализа трудоемкости алrоритма
291
п k 1 А (п, k)
эксперимент теория 6f%
8 3 51 916,40 53 383 2,75%
8 4 123024,80 126 274 2,57%
8 5 263 581,40 270 187 2,44%
10 3 133 124,40 136 933 2,78%
10 4 367 103,30 378 147 2,92%
10 5 906 313,50 933 916 2,96%
12 3 293 371,20 302 103 2,89%
12 4 926 885,60 954 255 2,87%
12 5 2 587 106,90 2 672 471 3,19%
ные результаты приведены в таблице П.20 в столбце эксперименталь
ных данных, теоретические значения были рассчитаны по формуле
(7.9.15) при соответствующем выборе коэффициента а.! для средней
трудоемкости.
:
4. Обсуждение результатов и выводы
4.1. Характеристики дерева рекурсии
Экспериментальные значения характеристик дерева рекурсии, по
лученные при исследовании проrраммных реаJ1Изаций всех алrоритмы,
точно совпали с теоретическими оценками, приведенными авторами
книrи в r лаве 7.
4.2. Функции трудоемкости
Для проrраммных реализаций алrоритмов вычисления факториала,
нахождения чисел Фибоначчи, вычисления квадратноrо корня, нахож
дения ОСТОВНOI'О дерева экспериментальные значения функций TPYДO
емкости точно совпали с теоретическими оценками.
Л1аксимальная относительная поrреUIНОСТЬ теоретической оценки
трудоемкости сортировки слиянием составила по экспериментальным
данным для массивов длины кратной степени двойки (п == 2k) 0,012%,
а для массивов прочих длин (п -=1- 2k) 0,05% при том, что теоретически
максимальная относительная поrрешность может достиrать COOTBeT
ственно 0,35% и 0,36%.
ДJJЯ OCTaJJbHbIX аJJrоритмов исследовалась только средняя TpyдoeM
кость.
292
Приложенuе
4.3. Средняя трудоемкость
Для проrраммной реализации алrоритма возведения в целую CTe
пень экспериментальные значения средней трудоемкости точно совпали
с теоретическими оценками.
Относительная поrрешность теоретической оценки средней TPYДO
емкости проrраммной реализации алrоритма умножения длинных чи
сел лежит в пределах 2,482,57%. Наличие этой поrрешности связано
с тем, что теоретические оценки основываются на предположении
о равномерном распределении нулей и единиц не только в исходных
перемножаемых числах, но и в перемножаемых фраr;vtентах этих чисел
на всех уровнях рекурсии. Экспериментальные результаты показывают,
что это предположение не вполне оправдано.
Относительная поrрешность теоретической оценки средней TPy
доем кости проrраммной реализации алrоритма rенетическоrо поиска
экстремума функции мноrих переменных лежит в пределах О, 1264
0,1274%. Наличие этой поrрешности можно объяснить тем, что коrда
наилучшая хромосома лежит достаточно близко к экстремуму, только
друrая хромосома или два кроссинrовера MorYT улучшить ее резуль
тат, а четыре мутации дают заведомо худшие значения. В результате
фактически выбор осуществляется не из восьми, а лишь из четырех
вариантов, и экспериментальные средние меньше теоретических.
Относительная поrрешность теоретической оценки средней TPYДO
емкости проrраммной реализации алrоритма одномерной оптимальной
упаковки составляет 2,44.. .3,19%. В параrрафе 7.9 указано, что pe
альная зависимость среднеrо числа переприсваиваний в цикле поиска
максимума, как функция от количества типов rрузов и пара метра ,
носит более сложный характер, чем та, которая была использована
авторами в формулах (7.9.13) и (7.9.14). Полученные экспериментально
относительные поrрешности можно считать приемлемыми для проrно
зирования времени выполнения алrоритма.
4.4. Выводы
Проведенные экспериментальные исследования nporpaMMHbIx pea
лизаций рекурсивных алrоритмов подтверждают полученные в rлаве 7
теоретические оценки их трудоемкости и характеристики порождаемых
деревьев рекурсии.
Учебное издание
rОЛОВЕШКИН Василий Адамович
УЛЬЯНОВ Михаил Васильевич
ТЕОРИЯ РЕКУРСИИ дЛЯ проrРАММИСТОВ
Редактор В.В. Панюхин
Ориrинаkмакет: НВ. Дядичев
ОфОРМJIение переплета: А.Ю. Алехина
Подписано в печать 30.05.06. Формат 60 х 90/1 6. Бумаrа офсетн.".
Печать офсетная. Уел. печ. л. 18.5. Уч.изд. л. 19,86. Тираж 1500 8111,
Заказ NQ 3693
Издательская фирма «Физико-математичеекан лнтор.'ура.
МАИК Наука/ИнтеРП('РИОДИI\Р,
117997, Москва. ул. Профt'ОЮ3llIlА. 90
Email: fizmat@maik.ru.fmlsale(tVm.lk.rUI
http://www.fml./.u
Отпечатано с rOTO/lIX диаПОSНТНIЮl1
в ППП .ТИIIIII'РРфИА '''lIyK/I.
121099, r. Москв'. Шубински/-! IIt'p., 6
МАТЕМАТИКА. ПРИКIIАДНАЯ МАТЕМАТ
В,Д, rопОВЕШКИН
М.В. vпьянов
Доктор технических
наук. специапист
по механике
деформируемоrо
твердоrо тепа.
Доктор технических
наук. обпасть научных
интересов анапиз
и разработка эффек-
тивных вычиспитепьных
апrоритмов.
Теория рекурсии это, наверное, скучн
Ничеrо подобноrо это интересный
полезный математический аппарат д
разработки эффективных вычислитеЛЬНI
алrоритмов.
..
:-f'П."У.{I_IIr.Тi1.,' ..
М,кква ясницкая б 1ел 928.З5.б!
:l:tp:ffwww.blbIio.globus.ru i:ig:g
8. J.;\\!l!I;J!!!II!1