Коды Прюфера: различия между версиями

Материал из WEGA
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 21: Строка 21:




Распаковка кода  Прюфера осуществляется следующим образом:
Распаковка кода  Прюфера (или восстановление дерева по коду Прюфера) осуществляется следующим образом:


     '''функ''' РАСПАКОВКА (A: '''код''')=
     '''функ''' РАСПАКОВКА (A: '''код''')=
Строка 27: Строка 27:
           что номер вершины <math>\nu_i</math> равен <math>i</math>,где n - длина кода A плюс 2;
           что номер вершины <math>\nu_i</math> равен <math>i</math>,где n - длина кода A плюс 2;
     2.    B: = [1 : n];
     2.    B: = [1 : n];
     3.    '''для''' i '''от''' 1 '''до''' n+1 '''цикл'''
     3.    '''для''' i '''от''' 1 '''до''' n-2 '''цикл'''
     4.        b:=min{k ∈ B ; k <math>\neq</math> A[j] для любого j <math>\geq</math> i};
     4.        b:=min{k ∈ B : k <math>\neq</math> A[j] для любого j <math>\geq</math> i};
     5.        В <math>T</math> добавить ребро,
     5.        В <math>T</math> добавить ребро, соединяющее вершины
               соединяющее вершины с номерами <math>b</math> и <math>A[i]</math>;
               с номерами <math>b</math> и <math>A[i]</math>;
     6.        B:=B-{b}
     6.        B:=B-{b}
           '''всё;'''
           '''всё;'''
     7.    '''возврат''' ''T''
     7.    В <math>T</math> добавить ребро, соединяющее вершины
     всё
          с номерами, оставшимися в В;
    8.    '''возврат''' ''T''
     '''всё'''


В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в <math>A</math> указывать корневую вершину и при распаковке кода <math>A</math> исключать номер этой вершины из множества <math>B</math>.
В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в <math>A</math> указывать корневую вершину и при распаковке кода <math>A</math> исключать номер этой вершины из множества <math>B</math>.

Версия от 05:02, 31 мая 2017

Пусть T - дерево с множеством вершин {ν1,ν2,...,νn}. Будем считать, что номер вершины νi равен i. Сопоставим дереву T последовательность [a1,a2,...,an2] называемую кодом Прюфера, по следующему правилу:

   функ КОД_ПРЮФЕРА(T: дерево) =
   1.    Пусть n - число вершин в T, 
         а A - целочисленный вектор длины n-2;
   2.    B:= [1 : n];
   3.    для i от 1 до n-2 цикл
   4.        b:=min{k ∈ B; k - номер висячей вершины};
   5.        A[i]:= номер вершины, смежной вершине с номером b;
   6.        B:=B-{b};
   7.        Удалить из T вершину с номером b
         всё
   8     возврат A
   всё

Рассмотрим седующий пример. Для дерева T (рис.) код Прюфера имеет вид:

P2(T) = [2, 5, 5, 2, 1, 3, 3].

Prufer 1.gif


Распаковка кода Прюфера (или восстановление дерева по коду Прюфера) осуществляется следующим образом:

   функ РАСПАКОВКА (A: код)=
   1.    Пусть T состоит из вершин {ν1,ν2,...,νn} таких,
         что номер вершины νi равен i,где n - длина кода A плюс 2;
   2.    B: = [1 : n];
   3.    для i от 1 до n-2 цикл
   4.        b:=min{k ∈ B : k  A[j] для любого j  i};
   5.        В T добавить ребро, соединяющее вершины 
             с номерами b и A[i];
   6.        B:=B-{b}
         всё;
   7.    В T добавить ребро, соединяющее вершины 
         с номерами, оставшимися в В;
   8.    возврат T
   всё

В случае корневого ордерева процедуры построения кода Прюфера и его распаковки аналогичны. Необходимо только на последнем месте в A указывать корневую вершину и при распаковке кода A исключать номер этой вершины из множества B.

Операции над деревьями и кодами Прюфера

Будем считать, что вершины двух разных деревьев нумеруются различными числами, причём номера одного дерева всегда больше или меньше любого номера другого. Это требование часто выполняется в практических реализациях, т.к для вершин каждого дерева обычно отводят последовательные массивы номеров ячеек памяти. Если все номера дерева T1 (или ориентированного дерева T1) меньше всех номерова дерева T2 (или T2) то пишут T1<T2 (или T1<T2).

Рассмотрим следующие операции над деревьями:

ba - операция замены номера a вершины T на номер b;

a0b - операция склеивания двух деревьев по вершинам a и b, т.е. дерево T1a0bT2 получается из T2 и T1 отождествлением вершин a из T1 b из T2 и присвоением склеенной вершине номера b (при склеивании ордеревьев добавляется требование, чтобы вершина b была корневой).

На рис 2.22 представлен результат выполнения операции T13010T2, где T1 и T2 - деревья, изображённые на рис. 2.20 и 2.21.

Рассмотрим некоторые вставки кода Прюфера: [] - операция формального отбрасывания квадратных скобок; определена на всех выражениях вида [a1,a2,...,an],b,[b1,b2,...,bm] и состоит в отбрасывании всех внутренних квадратных скобок и добавлении двух внешних;

c -операция вставки кода Прюфера; если


P2(T1)=[a1,a2,...,ak,c,ak+2,...,an1]

и среди чисел ak+2,ak+3,an1 нет числа c, то

P2(T1)cP2(T2)=[a1,a2,...,ak,P2(T2),c,ak+2,...,an1].

Справедливы следующие соотношения, связывающие операции над деревьями и кодами Прюфера:

если T1<T2, то

P2(T1a0bT2)=[P2(baT1),b,P2(T2)];

если T1>T2, то необходимо рассматривать дерево T1b0aT2, и всё сводится к предыдущему случаю;

если T1<T2, то

P2(T1a0bT2)=[P2(baT1),c,P2(T2)],

где c - непосредственный предок вершины a в дереве T1


если T1>T2, то

P2(T1a0bT2)=[P2(T2),P2(baT1)],