Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Анализ алгоритмов.doc
Скачиваний:
55
Добавлен:
20.11.2018
Размер:
1.29 Mб
Скачать

В режиме неполного вычисления

логических выражений

оператор repeat можно заменить

оператором

while (sp[k]=nil) or (sp[k].r<>nil) do

k:=k+1;

repeat

rab:=false;

if sp[k]=nil then k:=k+1

else

if sp[k]^.r<>nil then k:=k+1

else rab:=true

until rab;

a:=sp[k]^.i; pr[j]:=a;

sp[k]:=nil;

x:=sp[a];

while ( x^.i<>k) do begin y:=x; x:=x^.r end;

if sp[a]=x then sp[a]:=x^.r else y^r:=x^.r

end ;

end{inpruff};

Процедура восстановления дерева по коду Прюфера выглядит так:

procedure outpruff; {преобразует код Прюфера в список смежности }

procedure bk(var a,b:integer); {включить вершины a,b в список смежности}

begin new(x); new(y);

x^.i:=a; x^.r:=sp[b]; sp[b]:=x;

y^.i:=b; y^.r:=sp[a]; sp[a]:=y

end{bk};

begin{ outpruff }

for i:=1 to n do sp[i]:=nil; pr[0]:=n;

a:=pr[n-2];

if a=n then i:=n-1 else i:=n; bk(a,i);

for j:=n-2 downto 1 do

{1} if sp[pr[j-1]]=nil then bk(pr[j-1],pr[j])

else begin while sp[i]<>nil do i:=i-1;

bk(i,pr[j])

end

end{outpruff};

Комментарий. Нулевой элемент в описании типа pru введен для корректного вычисления, в случае j=1, логического выражения в условии оператора {1}. В массиве pr, используемого процедурой outpruff в качестве значения кода Прюфера, нулевому элементу присвоено значение равное n.

Замечание. Код Прюфера является оптимальным по памяти кодирования деревьев. В самом деле, W =Wn, где Wn – конечные множества. Предположим, что при каком-то способе кодирования элементов из W для запоминания одного элемента из Wn используется самое большое f(n) бит памяти. Кодирование f(n) называется оптимальным, если =1, где h(n) = log2 Wn.

Для оценки энтропия h(n) для множества деревьев с n вершинами по теореме Кэли имеем h(n) = (n-2)log2n. Отсюда следует, что кодирование деревьев кодом Прюфера необходимо f(n) = (n-2)log2n , бит памяти, и поэтому =1.

При задании дерева списками смежности имеем =3 для неориентированных графов, и =2 для ориентированных.

В. А. Евстигнеев. Применение теории графов в программировании. Наука. 1985.

Статистическая теория деревьев (по А. Реньи).

Начнем со следующего вопроса: сколько висячих вершин может быть у дерева с n вершинами? На первый взгляд ответ кажется тривиальным. Число t висячих вершин всегда удовлетворяет неравенству 2tn-1, причем как предельные случаи (прямолинейный маршрут и звезда), так и все промежуточные случаи осуществимы. Но такой ответ на поставленный нами вопрос нельзя считать исчерпывающим. Действительно, если число n очень велико, то среди огромного числа возможных конфигураций (напомним, что существует nn-2 вариантов строения помеченных деревьев с n вершинами) предельные случаи t=2 и t=n-1 крайне редки: случай t=n-1 встречается только n раз, а случай t=2 встречается n!/2 раз. Хотя число n!/2 само по себе велико, оно все же (как следует из формулы Стирлинга) очень мало по сравнению с nn-2. Учитывая это, поставим наш вопрос несколько иначе: сколько помеченных деревьев с n вершинами имеют ровно t висячих вершин? В частности, сколько помеченных деревьев с n вершинами обладают наибольшим числом висячих вершин? В новой постановке наш вопрос можно сформулировать также следующим образом: если nn-2 различных помеченных деревьев с n вершинами сложить в большую шляпу и вытягивать их оттуда наугад по одному, каждый раз подсчитывая у извлеченного дерева число висячих вершин, то с какой вероятностью будет встречаться то или иное число? Более кратко тот же вопрос можно поставить и так: сколько висячих вершин у “типичного” дерева с n вершинами?