Лекция
Привет, Вы узнаете о том , что такое код прюфера, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое код прюфера , настоятельно рекомендую прочитать все из категории Структуры данных.
код прюфера – это способ взаимно однозначного кодирования помеченных деревьев с n вершинами с помощью последовательности n-2 целых чисел в отрезке [1,n]. То есть, можно сказать, что код Прюфера – это биекция между всеми остовными деревьями полного графа и числовыми последовательностями. Данный способ кодирования деревьев был предложен немецким математиком Хайнцом Прюфером в 1918 году. Код Прюфера сопоставляет произвольному конечному дереву с вершинами последовательность из
чисел (от
до
) с возможными повторениями. Отношение между деревом с помеченными вершинами и кодом Прюфера является взаимно однозначным: каждому дереву соответствует уникальный код Прюфера, при этом номерам вершин сопоставляются элементы последовательности кода. Обратно, по заданному коду из
чисел можно однозначно восстановить дерево с
вершинами. Код был построен Хайнцем Прюфером при доказательстве формулы Кэли в 1918 году.
Пусть есть дерево с вершинами, занумерованными числами
. Построение кода Прюфера дерева T ведется путем последовательного удаления вершин из дерева, пока не останутся только две вершины. При этом каждый раз выбирается концевая вершина с наименьшим номером, и в код записывается номер единственной вершины, с которой она соединена. В результате образуется последовательность
, составленная из чисел
, возможно с повторениями.
Для дерева на диаграмме вершина 1 является концевой вершиной с наименьшим номером, поэтому она удаляется первой, и 4 записывается в код Прюфера.
Вершины 2 и 3 удаляются следующими, так что 4 добавляется в код два раза.
Вершина 4 сейчас теперь стала концевой и имеет наименьший номер, поэтому она удаляется, а 5 добавляется в код.
Остались только две вершины, поэтому код записан полностью, и процесс останавливается.
В результате получается код Прюфера (4,4,4,5).
Для восстановления дерева по коду заготовим список номеров вершин
. Об этом говорит сайт https://intellect.icu . Выберем первый номер
, который не встречается в коде. Добавим ребро
, после этого удалим
из
и
из
.
Повторяем процесс до момента, когда код становится пустым. В этот момент список
содержит ровно два числа
и
. Остается добавить ребро
, и дерево построено.
Позвольте {a , a , ..., a[n]}
быть последовательность Прюфера:
В дереве будут n+2
узлы, пронумерованные от 1
до n+2
. Для каждого узла установите его степень равной количеству раз, которое он появляется в последовательности плюс 1. Например, в псевдокоде:
Преобразование Прюфера в дерево ( а ) 1 n ← длина [ a ] 2 T ← граф с n + 2 изолированными узлами, пронумерованными от 1 до n + 2 3 степень ← массив целых чисел 4 для каждого узла i в T - 5 градусов [ i ] ← 1 6 для каждого значения I в сделать 7 степень [ я ] ← степень [ я ] + 1
Затем для каждого числа в последовательности a[i]
найдите первый (с наименьшим номером) узел j
со степенью, равной 1, добавьте ребро (j, a[i])
к дереву и уменьшите степени j
и a[i]
. В псевдокоде:
8 для каждого значения i в a do 9 для каждого узла j в T do 10, если степень [ j ] = 1, то 11 Вставить ребро [ i , j ] в T 12 степень [ i ] ← степень [ i ] - 1 13 степень [ j ] ← степень [ j ] - 1 14 перерыв
В конце этого цикла останутся два узла со степенью 1 (назовем их u
, v
). Наконец, добавьте край (u,v)
к дереву.
15 u ← v ← 0 16 для каждого узла i в T 17, если степень [ i ] = 1, то 18, если u = 0, то 19 u ← i 20 else 21 v ← i 22 break 23 Вставить ребро [ u , v ] в T 24 степень [ u ] ← степень [ u ] - 1 25 градус [ v ] ← градус [ v ] - 1 26 возврат T
0 #include 1 using namespace std; 2 void printTreeEdges(int prufer[], int m) 3 { 4 int vertices = m + 2; 5 int vertex_set[vertices]; 6 for (int i=0; i
0 int main() 1 { 2 int prufer[] = {4, 1, 3, 4}; 3 int n = sizeof(prufer)/sizeof(prufer ); 4 printTreeEdges(prufer, n); 5 return 0; 6 }
Исследование, описанное в статье про код прюфера, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое код прюфера и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Структуры данных
Из статьи мы узнали кратко, но содержательно про код прюфера
Комментарии
Оставить комментарий
Структуры данных
Термины: Структуры данных