книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdfЗадача 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 2λN 2
λN λN 1 2λN 2 0
λN λN 1 2λ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, …, xn–k, а кроме того указаны значения начальных элементов последовательности
x1, x2, …, xk.
В линейном рекуррентном уравнении все элементы последовательности присутствуют линейно, поэтому общий вид можно представить следующим образом:
118
a0xn + a1xn–1 + … + akxn–k = 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