Previous Page  8 / 14 Next Page
Information
Show Menu
Previous Page 8 / 14 Next Page
Page Background

В.П. Корвяков

40

ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 3

Алгоритм функции

encode

описан следующим псевдокодом:

INTEGER encode(ROOT)

{

if (ROOT == EMPTY) return 0 // Пустое дерево кодируется нулём

N = size(ROOT) // Число узлов дерева ROOT

NL = size(ROOT.LLINK) // Число узлов левого поддерева

NR = N – NL – 1 // Число узлов правого поддерева

I = 0

for (k = 0; k < NR; k++)

{

I = I + catalan(N – k – 1)*catalan(k)

}

IL = encode(ROOT.LLINK) // Код левого поддерева

IR = encode(ROOT.LLINK) // Код правого поддерева

I = I + catalan(NL)*IR + IL

return I

}

Вычислительная сложность алгоритма.

Для анализа вычислительной

сложности разработанных алгоритмов сделаем допущение о том, что вычисле-

ние факториалов и чисел Каталана выполняется «наивным» способом, приве-

денным ниже.

1. Функция факториала требует

N

–1 операций умножения, т.

е. имеет

линейную сложность

( )

.

O N

2.

В соответствии с формулой (1) вычисление числа Каталана требует

2 1

1 2 4

N N N

N

− + + − + =

операций умножения и деления, т. е. также имеет

линейную сложность

( )

O N

.

Кроме того, значения чисел Каталана рассчитываются каждый раз и не кэ-

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

1,

N

C

на каждом этапе рекурсивного вызова функции

decode

заранее неизвест-

но, какие индексы будут переданы функциям, вызываемым для правого и лево-

го поддеревьев. Также неизвестно, на какой итерации (от 0 до

N

–1) остановится

цикл поиска суммы, вычисляемой по формуле (2). Для упрощения будем пола-

гать, что на каждом этапе дерево разбивается на две равные части, а вычисление

формулы (2) в худшем случае проходит все

N

итераций. В соответствии с основ-

ной теоремой о рекуррентных соотношениях (

Master theorem

) [9], время работы

рекуррентного алгоритма может быть оценено по формуле

( )

( )

,

n

T n aT f n

b

 

=

+

 

 

где

n

— размер задачи;

a

— число подзадач в рекурсии (в рассматриваемом случае

a

= 2);

n/b

— размер каждой подзадачи (с учетом принятых допущений

b

= 2);

f

(

n

) — сложность алгоритма, выполняемого вне рекурсивных вызовов.