Коды Прюфера — различия между версиями
 (→Алгоритм построения кодов Прюфера)  | 
				|||
| (не показаны 43 промежуточные версии 8 участников) | |||
| Строка 1: | Строка 1: | ||
| − | ==   | + | == Алгоритм построения кодов Прюфера ==  | 
| − | Кодирование Прюфера переводит помеченные деревья порядка n в последовательность чисел от 1 до n по алгоритму:  | + | Кодирование Прюфера переводит [[Количество помеченных деревьев#Помеченное дерево|помеченные деревья порядка <tex>n</tex>]] в последовательность чисел от <tex>1</tex> до <tex>n</tex> по алгоритму:<br>  | 
| − | + | Пока количество вершин больше двух:  | |
| − | + | # Выбирается лист <tex>v</tex> с минимальным номером.  | |
| − | + | # В код Прюфера добавляется номер вершины, смежной с <tex>v</tex>.  | |
| − | + | # Вершина <tex>v</tex> и инцидентное ей ребро удаляются из дерева.  | |
| − | + | <br>  | |
| − | Полученная последовательность   | + | Полученная последовательность называется '''кодом Прюфера''' ''(англ. Prüfer code)'' для заданного дерева.  | 
{{Лемма  | {{Лемма  | ||
|statement=  | |statement=  | ||
| − | + | Номер вершины <tex>v</tex> встречается в коде Прюфера тогда и только тогда, когда <tex>v</tex> не является листом, причём встречается этот номер к коде дерева в точности <math>\deg v - 1</math> раз.  | |
|proof=  | |proof=  | ||
| − | Доказательство по индукции  | + | # Вершина с номером <tex>n</tex> не может быть удалена, следовательно на последнем шаге у неё была смежная вершина, и число <tex>n</tex> встретилось в коде.  | 
| − | База  | + | # Если вершина не является листом, то у неё на некотором шаге была смежная вершина <tex>-</tex> лист, следовательно номер этой вершины встречается в коде.  | 
| − | <  | + | # Если вершина является листом с номером меньше <tex>n</tex>, то она была удалена до того, как был удален её сосед, следовательно её номер не встречается в коде.  | 
| − | + | ||
| − | + | Таким образом, номера всех вершин, не являющихся листьями или имеющих номер <tex>n</tex>, встречаются в коде Прюфера, а остальные <tex>-</tex> нет.  | |
| + | }}  | ||
| + | |||
| + | {{Лемма  | ||
| + | |statement=  | ||
| + | По любой последовательности длины <tex>n - 2</tex> из чисел от <tex>1</tex> до <tex>n</tex> можно построить помеченное дерево,  | ||
| + | для которого эта последовательность является кодом Прюфера.  | ||
| + | |proof=  | ||
| + | Доказательство проведем по индукции по числу <tex>n</tex><br>  | ||
| + | <u>''База индукции:''</u>  | ||
| + | |||
| + | <tex>n = 1</tex> <tex>-</tex> верно.  | ||
| + | |||
| + | <u>''Индукционный переход:''</u>  | ||
| + | |||
| + | Пусть для числа <tex>n</tex> верно, построим доказательство для <tex>n+1</tex>:  | ||
| + | |||
Пусть у нас есть последовательность: <tex>A = [a_1, a_2, ..., a_{n - 2}].</tex>  | Пусть у нас есть последовательность: <tex>A = [a_1, a_2, ..., a_{n - 2}].</tex>  | ||
| − | Выберем минимальное число <tex>v</tex> не лежащее в A.   | + | Выберем минимальное число <tex>v</tex> не лежащее в <tex>A</tex>. По предыдущей лемме <tex>v</tex> <tex>-</tex> вершина, которую мы удалили первой. Соединим <tex>v</tex> и <tex>a_1</tex> ребром. Выкинем из последовательности <tex>A</tex> число <tex>a_1</tex>. Перенумеруем вершины, для всех <tex>a_i > v</tex> заменим <tex>a_i</tex> на <tex>a_i - 1</tex>. А теперь мы можем применить предположение индукции.  | 
}}  | }}  | ||
{{Теорема  | {{Теорема  | ||
|statement=  | |statement=  | ||
| − | Кодирование Прюфера задаёт биекцию между множествами помеченных деревьев порядка <math>n</math> и последовательностями длиной <tex>n - 2</tex> из чисел от <tex>1</tex> до <tex>n</tex>    | + | Кодирование Прюфера задаёт биекцию между множествами помеченных деревьев порядка <math>n</math> и последовательностями длиной <tex>n - 2</tex> из чисел от <tex>1</tex> до <tex>n</tex>  | 
|proof=  | |proof=  | ||
| − | + | # Каждому помеченному дереву приведенный алгоритм сопоставляет последовательность.  | |
| − | + | # Каждой последовательности, как следует из предыдущей леммы, соотвествует помеченное дерево.  | |
| − | |||
| − | |||
| − | |||
}}  | }}  | ||
| − | Следствием из этой теоремы является [[Количество помеченных деревьев|  | + | |
| + | Следствием из этой теоремы является [[Количество помеченных деревьев|формула Кэли]].  | ||
| + | |||
| + | == Пример построения кода Прюфера ==  | ||
| + | [[Файл: Prufer.png|500px]]  | ||
| + | |||
| + | == Пример декодирования кода Прюфера ==  | ||
| + | [[Файл: backprufer.png|700px]]  | ||
| + | |||
| + | ==См. также==  | ||
| + | *[[Связь матрицы Кирхгофа и матрицы инцидентности]]  | ||
| + | *[[Матрица Кирхгофа]]  | ||
| + | *[[Количество помеченных деревьев]]  | ||
| + | *[[Подсчет числа остовных деревьев с помощью матрицы Кирхгофа]]  | ||
| + | |||
| + | |||
| + | == Источники информации ==  | ||
| + | * [http://www.intuit.ru/department/algorithms/graphsuse/11/2.html Университет INTUIT | Представление с помощью списка ребер и кода Прюфера]  | ||
| + | |||
| + | [[Категория: Алгоритмы и структуры данных]]  | ||
| + | [[Категория: Остовные деревья ]]  | ||
| + | [[Категория: Свойства остовных деревьев ]]  | ||
Версия 08:42, 17 октября 2019
Содержание
Алгоритм построения кодов Прюфера
Кодирование Прюфера переводит помеченные деревья порядка  в последовательность чисел от  до  по алгоритму:
Пока количество вершин больше двух:
- Выбирается лист с минимальным номером.
 - В код Прюфера добавляется номер вершины, смежной с .
 - Вершина и инцидентное ей ребро удаляются из дерева.
 
Полученная последовательность называется кодом Прюфера (англ. Prüfer code) для заданного дерева.
| Лемма: | 
Номер вершины  встречается в коде Прюфера тогда и только тогда, когда  не является листом, причём встречается этот номер к коде дерева в точности  раз.  | 
| Доказательство: | 
  | 
| Лемма: | 
По любой последовательности длины  из чисел от  до  можно построить помеченное дерево,
для которого эта последовательность является кодом Прюфера.  | 
| Доказательство: | 
| 
 Доказательство проведем по индукции по числу  верно. Индукционный переход: Пусть для числа верно, построим доказательство для : Пусть у нас есть последовательность: Выберем минимальное число не лежащее в . По предыдущей лемме вершина, которую мы удалили первой. Соединим и ребром. Выкинем из последовательности число . Перенумеруем вершины, для всех заменим на . А теперь мы можем применить предположение индукции. | 
| Теорема: | 
Кодирование Прюфера задаёт биекцию между множествами помеченных деревьев порядка  и последовательностями длиной  из чисел от  до   | 
| Доказательство: | 
  | 
Следствием из этой теоремы является формула Кэли.
Пример построения кода Прюфера
Пример декодирования кода Прюфера
См. также
- Связь матрицы Кирхгофа и матрицы инцидентности
 - Матрица Кирхгофа
 - Количество помеченных деревьев
 - Подсчет числа остовных деревьев с помощью матрицы Кирхгофа