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

Материал из WEGA
Перейти к навигации Перейти к поиску
(Новая страница: «''' Код Прюфера''' - Представление с помощью списка рёбер и кода Прюфера. Дерево при этом сп…»)
 
Нет описания правки
 
(не показаны 24 промежуточные версии 2 участников)
Строка 1: Строка 1:
''' Код Прюфера''' - Представление с помощью списка рёбер и кода Прюфера.
Пусть T - дерево с множеством вершин <math>\{\nu_1, \nu_2,..., \nu_n\}</math>. Будем считать, что номер вершины <math>\nu_i</math> равен <math>i</math>. Сопоставим дереву T последовательность <math>[a_1, a_2, ... , a_{n-2}]</math> называемую '''кодом Прюфера''', по следующему правилу:
Дерево при этом способе задаётся перечислением пар <math><\nu_i, \nu_j></math> или троек <math><\nu_i, \nu_j, u_k></math>, если дополнительно нужна нумерация рёбер. Характер связей в списке определяется исходя из условий задачи. Например, для дерева T(см.рис X1) имеем


<math>T = \{<1, 4>, <2, 4>, <3,4>,<4,5>, <5,6>, <5,7>, <7,8>,<7,9>\}</math>
    '''функ''' КОД_ПРЮФЕРА(''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 - дерево с множеством вершин <math>\{\nu_1, \nu_2,..., \nu_n\}</math>. Будем считать, что номер вершины <math>\nu_i</math> равен <math>i</math>. Сопоставим дереву T последовательность <math>[a_1, a_2, ... , a_{n-2}]</math> называемую кодом Прюфера, по следующему правилу:
Рассмотрим седующий пример. Для дерева ''T'' (рис.) код Прюфера имеет вид:


''' функ''' КОД_ПРЮФЕРА(''' T дерево''') =
<math>P_2(T) = [4, 4, 4, 5, 5, 7, 7].</math>


1. Пусть n - число вершин в ''T'', а
[[Файл:Priifer.mp4|360 px]]


\quad\quad''A'' - Целочисленный вектор длины ''n''-2;


2.\quad <math>B:= [1 \; n]</math>;
Распаковка кода  Прюфера (или восстановление дерева по коду Прюфера) осуществляется следующим образом:


3.\quad для ''i'' от ''1'' до ''n-1'' цикл
    '''функ''' РАСПАКОВКА (A: '''код''')=
    1.    Пусть ''T'' состоит из вершин ''{ν₁, ν₂, ... , νₙ}'' таких,
          что номер вершины ''νᵢ'' равен ''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''
    '''всё'''


4.\quad\quad <math>b:=min\{k \in B; k</math> - номер висячей вершины<math>\}</math>;
[[Файл:Priifer decode.mp4|360 px]]
 
5.\quad\quad A[i]:= номер вершины, смежной вершине с номером <math>b</math>;
 
6.\quad\quad B:= B-\{b\};
 
7.\quad\quad Удалить из ''T'' вершину с номером <math>A[i]</math>
 
\quad\quad всё
 
8 \quad возврат A
 
всё
 
Рассмотрим седующий пример. Для дерева ''T'' (рис. 2.19) код Прюфера имеет вид:
 
<math>P_2(T)</math> = [2, 5, 5, 5, 6, 6, 10, 9, 10, 11, 13, 15, 15, 10, 13, 13, 13].
 
<изображение>
 
Распаковка кода  Прюфера осуществляется следующим образом:
 
'''функ''' РАСПАКОВКА (A: ''код'')=
 
1.\quad  Пусть ''T'' состоит из вершин <math>\{\nu_1, \nu_2, ... , \nu_n)\}</math> таких, что номер вершины <math>\nu_i</math> равен <math>i</math>, где n - длина кода A плюс 2;
 
2.\quad <math>B: = [1 \; n]</math>;
 
3.\quad для <math>i</math> от <math>n+1</math> цикл
 
4.\quad\quad b:=<math>min\{k \in B \; k \neq A[j]</math> для любого <math>j \geq i\}</math>;
 
5.\quad\quad В <math>T</math> добавить ребро, соединяющее вершины с номерами <math>b</math> и <math>A[i]</math>;
 
6.\quad\quad <math>B:=B-\{b\}</math>
 
всё;
 
7. \quad возврат T
 
всё


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


<math>\overset{a}{\underset{b}{\downarrow}}</math> - операция замены номера a вершины T на номер b;
<math>\overset{a}{\underset{b}{\downarrow}}</math> - операция замены номера a вершины ''T'' на номер b;


<math>a \overset{0}{\rightarrow} b</math> - операция склеивания двух деревьев по вершинам a и b, т.е. дерево <math>T_1 a  \overset{0}{\rightarrow}  b T_2</math> получается из <math>T_2</math> и <math>T_1</math> отождествлением вершин a из <math>T_1</math> b из <math>T_2</math> и присвоением склеенной вершине номера b (при склеивании ордеревьев добавляется требование, чтобы вершина b была корневой).
<math>a \overset{0}{\rightarrow} b</math> - операция склеивания двух деревьев по вершинам a и b, т.е. дерево <math>T_1 a  \overset{0}{\rightarrow}  b T_2</math> получается из <math>T_2</math> и <math>T_1</math> отождествлением вершин a из <math>T_1</math> b из <math>T_2</math> и присвоением склеенной вершине номера b (при склеивании ордеревьев добавляется требование, чтобы вершина b была корневой).
Строка 73: Строка 55:


Рассмотрим некоторые вставки кода Прюфера:
Рассмотрим некоторые вставки кода Прюфера:
[] - операция формального отбрасывания квадратных скобок; определена на всех выражениях вида <math>[a_1, a_2, ..., a_n],b,[b_1, b_2, ..., b_m]</math> и состоит в отбрасывании всех внутренних квадратных скобок и добавлении двух внешних;
[ ] - операция формального отбрасывания квадратных скобок; определена на всех выражениях вида <math>[a_1, a_2, ..., a_n],b,[b_1, b_2, ..., b_m]</math> и состоит в отбрасывании всех внутренних квадратных скобок и добавлении двух внешних;


<math>\stackrel{*}{c}</math> -операция вставки кода Прюфера; если  
<math>\stackrel{*}{c}</math> -операция вставки кода Прюфера; если  
Строка 92: Строка 74:
если <math>T_1 > T_2</math>, то необходимо рассматривать дерево <math>T_1b \overset{0}{\rightarrow} aT_2</math>, и всё сводится к предыдущему случаю;
если <math>T_1 > T_2</math>, то необходимо рассматривать дерево <math>T_1b \overset{0}{\rightarrow} aT_2</math>, и всё сводится к предыдущему случаю;


если <math>\overrightarrow{T_1} > \overrightarrow{T_2}</math>, то
если <math>\overrightarrow{T_1} < \overrightarrow{T_2}</math>, то


: <math>P_2({T_1}a \overset{0}{\rightarrow} bT_2) = [P_2(\overset{a}{\underset{b}{\downarrow}}\overrightarrow{T_1}),\stackrel{*}{c}, P_2(\overrightarrow{T_2})]</math>,  
: <math>P_2({T_1}a \overset{0}{\rightarrow} bT_2) = [P_2(\overset{a}{\underset{b}{\downarrow}}\overrightarrow{T_1}),\stackrel{*}{c}, P_2(\overrightarrow{T_2})]</math>,  
Строка 103: Строка 85:
: <math>P_2({T_1}a \overset{0}{\rightarrow} bT_2) = [P_2(\overrightarrow{T_2}), P_2(\overset{a}{\underset{b}{\downarrow}}\overrightarrow{T_1})]</math>,  
: <math>P_2({T_1}a \overset{0}{\rightarrow} bT_2) = [P_2(\overrightarrow{T_2}), P_2(\overset{a}{\underset{b}{\downarrow}}\overrightarrow{T_1})]</math>,  


[Категория: Обработка и визуализация деревьев]
[[Категория: Коды деревьев]]

Текущая версия от 11:55, 11 мая 2023

Пусть 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)=[4,4,4,5,5,7,7].


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

   функ РАСПАКОВКА (A: код)=
   1.    Пусть T состоит из вершин {ν₁, ν₂, ... , νₙ} таких,
         что номер вершины νᵢ равен 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)],