Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Математическая логика и теория алгоритмов. Анализ алгоритмов

.pdf
Скачиваний:
3
Добавлен:
12.11.2023
Размер:
8.87 Mб
Скачать

Задача 2. Решить рекуррентное уравнение:

 

xn 4xn 1 4xn 2, x0 0,x1 2.

(6)

Решение. Данное уравнение является линейным рекуррентным уравнением с постоянными коэффициентами. Глубина уравнения равна 2. Уравнение является однородным (свободный член отсутствует). Будем действовать в соответствии с алгоритмом решения однородных рекуррентных уравнений.

Составим характеристическое уравнение, заменив xn на n, получим:

n 4 n 1 4 n 2 .

Разделив обе части уравнения на n–2 ( 0), получим квадратное уравнение:

2 4 4 0.

Решая уравнение, находим корни 1 2 2.

Получили один корень кратности 2, поэтому общий вид решения исходного уравнения будет таким:

x (C

C

n) n (C

C n) 2n.

(7)

n

1

2

1

2

 

Для нахождения констант C1, C2 подставим начальные условия, то есть подставим n = 0 и n = 1:

n 0:x

(C

C

2

0)

20

0

 

C

0

0

1

 

 

 

 

(C

1

 

) 2 2.

n 1:x

(C C

2

1) 21

2

C

1

1

 

 

 

 

1

 

2

 

Подставляя C1 = 0 во второе уравнение, находим C2 = 1. Получаем окончательный ответ:

xn n 2n.

Выполним проверку, подставив найденное выражение в исходноеуравнение (6):

111

 

2

n

4 (n 1) 2

n 1

4

(n 2) 2

n 2

|:2

n

,

n

 

 

 

 

 

 

 

 

0 20 0,

1 21 2,

 

 

 

 

n

2 (n 1) (n 2),

 

 

 

 

 

 

 

 

0 0,

2 2,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

(2n n) 2 2,

 

 

 

 

 

 

 

 

0 0,

2 2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получили тождественные равенства, значит, уравнение

решено верно.

 

 

 

 

 

 

 

 

 

 

 

 

Задача 3. Решить рекуррентное уравнение:

 

 

 

 

 

 

x

4x 24 2n

, x

1,x 0.

 

 

(8)

 

 

 

n 2

n

 

 

0

1

 

 

 

 

Решение. Данное уравнение является линейным рекуррентным уравнением с постоянными коэффициентами. Глубина уравнения равна 2. Уравнение является неоднородным в силу наличия слагаемого «24 2n». Будем действовать в соответствии

салгоритмом решения неоднородных рекуррентных уравнений.

1.Составимоднородноеуравнение,отбросивнеоднородность:

xn 2 4xn .

Составим характеристическое уравнение, заменив xn на n, получим:

n 2 4 n.

Разделив обе части уравнения на n ( 0), получим уравнение:

2 4,

имеющее решение 1 2, 2 2.

Получили два различных корня, поэтому общий вид решения однородного уравнения будет таким:

112

xо.о. C

n C

2

n

C ( 2)n C

2

2n .

(9)

n

1

1

2

1

 

 

2. Найдем частное решение неоднородного уравнения. Неоднородность имеет вид экспоненты, умноженной на константу. Основание экспоненты – число 2, является корнем характеристического уравнения 1-й степени, поэтому в данном примере имеется резонанс. Таким образом, частное решение неоднородного уравнения будем искать в следующем виде:

xч.н. A 2n n .

(10)

n

 

Неизвестный коэффициент A найдём путём подстановки выражения (10) в исходное уравнение (8):

A 2n 2 (n 2) 4 A 2n n 24 2n |:2n , 4A (n 2) 4A n 24 |:4,

An 2A An 6,

A 3.

Подставим найденный коэффициент в (10), получим

xч.н. 3n 2n .

(11)

n

 

3. Составим общее решение неоднородного уравнения как сумму общего решения однородного (9) и частного решения неоднородного уравнения (11):

x

xо.н. xо.о. xч.н. C ( 2)n C

2

2n 3n 2n .

(12)

n

n

n

n

1

 

 

Наконец, для нахождения констант C1, C2 подставим начальные условия, то есть подставим n = 0 и n = 1:

n 0:x0 C1 ( 2)0 C2 20 3 0 20 1, n 1:x1 C1 ( 2)1 C2 21 3 1 21 0,

 

 

C C 1

 

C C 1

C 1,

 

 

1

2

 

1

2

 

 

1

 

2C

2C

6 0|:2

 

 

C

3

C

 

2.

 

C

 

2

1

2

 

 

1

2

 

 

 

113

Получаем окончательный ответ:

xn ( 2)n 2 2n 3n 2n .

Задача 4. Найти функцию сложности для функции, реализующей некоторый вычислительный алгоритм. Текст функции приведен ниже:

function R(N, direct : integer):integer; begin

if N>2

then R := R(N-1,0)+R(N-2,1)+direct*R(N-2,-1) else R := 1

end;

Решение. Для удобства запишем операторы в таблицу

Строка программы

Кол-во операций

строки

 

1

1

if N>2

2

then R := R(N-1,0)+R(N-2,1)

7 + tR(N–1) + 2 tR(N–2)

 

+direct*R(N-2,-1)

1

3

else R := 1

Достаточно очевидно, что сложность функции зависит только от значения параметра N, так как значение direct никак не влияет на количество выполняемых операций. Обозначим tR (N) – сложность рассматриваемой рекурсивной функции.

Общая часть в этой функции фактически отсутствует – сразу начинается ветвление на рекурсивную и нерекурсивную (тривиальную) ветки. Условие проверяется в строке 1, его сложность равна 1. В рекурсивной ветке (строка 2) вычисляется выражение, в котором присутствуют 3 рекурсивных вызова. Соответственно, для вычисления аргументов этих вызовов требуются 3 операции (3 вычитания). Кроме этого выполняются ещё 4 операции (два сложения, одно умножение и одно присваивание).

114

В соответствии с общим видом рекуррентного уравнения для нахождения сложности рекурсивной функции получаем для рекурсивной ветки:

tR (N) = 0 + 1 + 3 + 4 + tR (N–1) + tR (N–2) + tR (N–2).

Условие продолжения рекурсии не будет выполнено, когда параметр N станет равным 2 или 1. В таком тривиальном случае будет выполнена строка 3, сложность которой равна 1. Таким образом, для тривиальной ветки получим условия:

tR (2) = tR (1) = 0 + 1 + 1 = 2.

Обозначим tR (N) = xN и получим рекуррентное уравнение:

xN 8 xN 1 2 xN 2, x2 2,x1 2.

(13)

Уравнение является линейным рекуррентным уравнением с постоянными коэффициентами. Глубина уравнения равна 2. Уравнение является неоднородным. Решим это уравнение.

1.Составимоднородноеуравнение,отбросивнеоднородность: xN xN 1 2 xN 2 .

Составим характеристическое уравнение:

λN λN 1 N 2

λN λN 1 N 2 0

λN λN 1 N 2

0

λN 2

 

λ2 λ1 2 0

 

2 2 0.

Решение уравнения: 1 1, 2 2.

Получили два различных корня, поэтому общий вид решения однородного уравнения будет таким:

xо.о. C

N C

2

N C ( 1)N C

2

2N.

(14)

N

1

1

2

1

 

 

115

2. Найдем частное решение неоднородного уравнения. Неоднородность имеет вид константы. Число «1» не является корнем характеристического уравнения, поэтому в данном примере резонанса нет, и частное решение неоднородного уравнения нужно искать в виде просто константы:

xNч.н. A.

Подставим в исходное уравнение (13):

A 8 A 2A,

8 2A,

A 4.

Получим: xNч.н. 4.

3. Составим общее решение неоднородного уравнения:

x

N

xо.н. xо.о. xч.н. C ( 1)N C

2

2N 4.

(15)

 

N

N

N

1

 

 

Подставим начальные условия:

 

 

 

 

 

N 1:x C ( 1)1 C 21 4 2,

 

 

 

 

 

 

 

1

 

1

 

2

 

 

 

 

 

 

 

 

N

2:x

 

C

( 1)2 C

22

4 2,

 

 

 

 

 

 

2

1

 

2

 

 

 

 

 

 

C 2C 6

 

 

C 2C 6

 

C 2,

 

C

1

 

2

 

1

2

 

6

 

1

 

2.

 

4C

6

 

2C 6

4C

 

C

2

1

 

2

 

 

 

2

2

 

 

 

 

Получаем

 

решение

рекуррентного

 

уравнения:

xN 2 ( 1)N 2 2N 4.

Вспоминая о введенном ранее обозначении, получаем следующую функцию сложности рекурсивной функции:

tR (N) 2 2N 2 ( 1)N 4.

Такая функция имеет порядок роста O (2N).

116

Задачи для коллективного решения у доски

9. Решить рекуррентное уравнение:

xn 2 9xn 3 2n , x0 0,x1 3.

10. Решить рекуррентное уравнение:

xn 2 2xn 1 xn 12n, x0 1,x1 1.

11. Ниже приведен фрагмент программы, содержащий функцию поиска в бинарном упорядоченном дереве:

type tree = record inf : integer; l, r : ^tree;

end;

function find (h : ^tree, s : integer) begin

if (h=nil) then find := nil

else if (h^.inf = s) then find := h

else if s < h^.inf then find := find(h^.l, s) else find := find(h^.r,s)

end;

Найти верхнюю оценку функции сложности процедуры find.

Указания. 1. За параметр функции сложности принять высоту дерева.

2. Ищем верхнюю оценку, то есть разбираем худший случай. Значит, во-первых, рассматриваем случай, когда искомого элемента нет (пройдем до концевой вершины), и, во-вторых, нужно считать, что поддерево, куда мы пошли, имеет наибольшую из возможныхвысот,тоестьна1меньшеисходногодерева.

Задачи для самостоятельной работы на занятии

12. Решить рекуррентное уравнение: xn 1 4xn 9n, x0 2.

117

13. Определить порядок роста функции сложности для функции нахождения N-го числа Фибоначчи с помощью рекурсивного алгоритма. Сравнить со сложностью итерационного алгоритма.

Задачи для самостоятельной работы дома

14. Решить рекуррентное уравнение:

xn 2 4xn 1 4xn 2, x0 2,x1 4 .

15. Найти функцию сложности для функции, реализующей некоторый вычислительный алгоритм (предполагается, что N – натуральное, d – целое). Текст функции приведен ниже:

function F(N, d : integer):integer; begin

if N>2

then F := d * (F(N-1,0) + F(N-1,1)) + F(N-2,0) + F(N-2,1) + F(N-2,2)

else F := 2 * d end;

ОТВЕТЫ ИСОВЕТЫ

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 2 АНАЛИЗ СЛОЖНОСТИ РЕКУРСИВНЫХ АЛГОРИТМОВ

1. Рекуррентное уравнение – это уравнение, задающее числовую последовательность {x1, x2, …}, в котором очередной элемент последовательности xn выражен через один или несколько предыдущих элементов xn–1, xn–2, …, xnk, а кроме того указаны значения начальных элементов последовательности

x1, x2, …, xk.

В линейном рекуррентном уравнении все элементы последовательности присутствуют линейно, поэтому общий вид можно представить следующим образом:

118

a0xn + a1xn–1 + … + akxnk = f (n),

где xi – элементы задаваемой числовой последовательности, ai – коэффициенты (в общем случае могут зависеть от n), f (n) – свободный член.

2. Если все коэффициенты ai в общем виде рекуррентного уравнения (см. ответ на вопрос 1) являются константами (не зависят от n), то уравнение называется уравнением с постоянными коэффициентами.

Если при этом свободный член отсутствует (f (n) 0), то уравнение называется однородным, иначе – неоднородным.

3.Решить рекуррентное уравнение значит найти формулу

для n-го члена последовательности xn в явном виде, то есть такую формулу, в которой отсутствуют другие члены последовательно-

сти. Такая формула позволит быстро вычислять значение xn, зная только n, не вычисляя других членов последовательности.

4.Алгоритм решения линейного однородного рекуррентного уравнения с постоянными коэффициентами глубины 2.

1.Составить характеристическое уравнение, заменив xn на n (соответственно xn–1 на n–1 и т.д.).

2.Разделить обе части уравнения на наименьшую степень . Получим квадратное уравнение относительно .

3.Решить полученное уравнение.

4.Если получилось два разных корня 1 и 2, то записать

общее решение в виде xn C1 1n C2 n2. Если получился один корень (кратности 2), то записать общее решение в виде xn (C1 C2 n) n .

5. Подставить начальные условия в общее решение, решить получившуюся систему линейных уравнений и найти зна-

чения С1, С2.

6. Записать ответ, подставив найденные С1, С2 в общее решение.

5. Алгоритм решения линейного неоднородного рекуррентного уравнения с постоянными коэффициентами, в котором

119

свободный член имеет вид f (n) Pk (n) qn , где Pk (n) – многочлен степени k.

1.Составить однородное уравнение, отбросив свободный член.

2.Найти общее решение однородного уравнения xnо.о. в со-

ответствии с алгоритмом, описанным в ответе на предыдущий вопрос.Нужнолишьобщеерешение,подставлятьначальныеусловия

инаходитьзначениянеизвестныхкоэффициентовненужно.

3.Найти частное решение неоднородного уравнения xnч.н..

Его вид зависит от того, есть ли в рассматриваемом примере так называемый резонанс.

а) Если q не является корнем характеристического уравнения, составленного на шаге 2, то резонанса нет, и xnч.н. Rk (n) qn ,

где Rk(n) – многочленстепениk снеизвестнымикоэффициентами. б) Если q является корнем кратности s характеристического уравнения, то резонанс есть, и xnч.н. Rk (n) qn ns , где Rk(n) –

многочлен степени k с неизвестными коэффициентами.

В обоих случаях коэффициенты многочлена Rk(n) необходимо найти, подставив xnч.н. в исходное уравнение и приравняв

коэффициенты при равных степенях n.

4. Записать общее решение исходного неоднородного уравнения как сумму найденного на шаге 2 общего решения однородного уравнения и найденного на шаге 3 частного решения неоднородного уравнения xn xnо.н. xnо.о. xnч.н..

5.Подставить начальные условия в найденное решение, решить получившуюся систему линейных уравнений и найти значения констант, присутствующих в общем решении.

6.Записать ответ, подставив найденные значения в общее решение.

6.Рекурсивная процедура (функция) – это такая процедура (функция), которая в процессе выполнения явно или косвенно (через другие процедуры или функции) вызывает сама себя.

120