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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Коды Прюфера.)
Строка 1: Строка 1:
 
== Коды Прюфера. ==
 
== Коды Прюфера. ==
 
Кодирование Прюфера переводит помеченные деревья порядка <tex>n</tex> в последовательность чисел от <tex>1</tex> до <tex>n</tex> по алгоритму:
 
Кодирование Прюфера переводит помеченные деревья порядка <tex>n</tex> в последовательность чисел от <tex>1</tex> до <tex>n</tex> по алгоритму:
   Пока количество вершин <tex>>1</tex> {
+
   Пока количество вершин больше одной {
     1. Выбирается лист с минимальным номером.
+
     1. Выбирается лист v с минимальным номером.
     2. В последовательность Прюфера добавляется номер смежной вершины.
+
     2. В код Прюфера добавляется номер вершины, смежной с v
     3. Лист и инцидентное ребро удаляются из дерева.
+
     3. Вершина v и инцидентное ей ребро удаляются из дерева.
 
   }
 
   }
Полученная последовательность и есть '''код Прюфера'''.
+
Полученная последовательность называется '''кодом Прюфера''' для заданного дерева.
  
 
{{Лемма
 
{{Лемма
 
|statement=
 
|statement=
Номера всех вершин, которые не являются листьями или имеют номер <tex>n</tex>, встречаются в коде Прюфера. А номера вершин - листьев, не имеющих номер <tex>n</tex>, не встречаются в коде Прюфера.
+
Номер вершины v встречается в коде Прюфера тогда и только тогда, когда v не является листом или v имеет номер <tex>n</tex>.
 
|proof=
 
|proof=
1. Вершина <tex>n</tex> не удаляется, так как у неё максимальный номер (в графе с <tex>>1</tex> вершиной - <tex>\geq 2</tex> листа), а, значит, на последнем шаге у неё была смежная вершина. <tex>\Rightarrow</tex> <tex>n</tex> - как минимум один раз встретилось в коде.
+
# Вершина с номером <tex>n</tex> не может быть удалена, следовательно на последнем шаге у неё была смежная вершина, и число <tex>n</tex> встретилось в коде.
 +
# Если вершина не является листом, то у неё на некотором шаге была смежная вершина - лист, следовательно номер этой вершины встречается в коде.
 +
# Если вершина является листом с номером меньше <tex>n</tex>, то она была удалена до того, как был удален ее сосед, следовательно ее номер не встречается в коде.
  
2. Если вершина - не лист, то у неё на каком-то шаге была смежная вершина - лист. А, значит, номер этой вершины был <tex>>1</tex> раза выписан в код.
+
Таким образом, номера всех вершин, не являющихся листьями или имеющих номер <tex>n</tex>, встречаются в коде Прюфера, а остальные - нет.
 
 
3. Так как вершина - лист(с номером не равным <tex>n</tex>), она была только удалена.
 
 
 
А, значит, все вершины, не являющиеся листьями или имеющие номер <tex>n</tex>, "входят" в код Прюфера, а остальные - нет.
 
 
}}
 
}}
  
 
{{Лемма
 
{{Лемма
 
|statement=
 
|statement=
По любой последовательности длиной <tex>n - 2</tex> из чисел от <tex>1</tex> до <tex>n</tex> можно построить помеченное дерево.
+
По любой последовательности длиной <tex>n - 2</tex> из чисел от <tex>1</tex> до <tex>n</tex> можно построить помеченное дерево,
 +
для которого эта последовательность является кодом Прюфера.
 
|proof=
 
|proof=
Доказательство по индукции.
+
Доказательство проведем по индукции.
 
База. <tex>n = 1</tex> - верно.
 
База. <tex>n = 1</tex> - верно.
 
<br>
 
<br>
Переход <tex>n \rightarrow n + 1</tex>.
+
Переход от <tex>n</tex> к <tex>n + 1</tex>.
 
<br>
 
<br>
 
Пусть у нас есть последовательность: <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> - вершина, которую мы удалили первой (По предыдущей лемме v - лист, а по построению кода мы удаляем лист с минимальным номером). Соединяем <tex>v</tex> и <tex>a_1</tex> ребром. Выкинем из последовательности <tex>A</tex> - <tex>a_1</tex>. Далее будем перенумеровывать вершины, то есть - <tex>\forall i : a_i > v</tex> выполняем <tex>a_i = a_i - 1</tex>. А теперь мы можем применить предположение индукции.
+
Выберем минимальное число <tex>v</tex> не лежащее в A. По предыдущей лемме <tex>v</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>. А теперь мы можем применить предположение индукции.
 
}}
 
}}
  
Строка 38: Строка 37:
 
Кодирование Прюфера задаёт биекцию между множествами помеченных деревьев порядка <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=
1. Каждому помеченному дереву соотвествует последовательность и только одна. Это верно по построению кода.
+
# Каждому помеченному дереву приведенный алгоритм сопоставляет последовательность.
2. Каждой последовательности соотвествует помеченное дерево и только одно. Это верно по предыдущей лемме, т.к. восстанавливали мы однозначно.
+
# Каждой последовательности, как следует из предыдущей леммы, соотвествует помеченное дерево.
<br>
 
Значит, это биекция - по определению.
 
 
}}
 
}}
 +
 
Следствием из этой теоремы является [[Количество помеченных деревьев|формула Кэли]].
 
Следствием из этой теоремы является [[Количество помеченных деревьев|формула Кэли]].

Версия 02:56, 9 октября 2010

Коды Прюфера.

Кодирование Прюфера переводит помеченные деревья порядка [math]n[/math] в последовательность чисел от [math]1[/math] до [math]n[/math] по алгоритму:

 Пока количество вершин больше одной {
   1. Выбирается лист v с минимальным номером.
   2. В код Прюфера добавляется номер вершины, смежной с v
   3. Вершина v и инцидентное ей ребро удаляются из дерева.
 }

Полученная последовательность называется кодом Прюфера для заданного дерева.

Лемма:
Номер вершины v встречается в коде Прюфера тогда и только тогда, когда v не является листом или v имеет номер [math]n[/math].
Доказательство:
[math]\triangleright[/math]
  1. Вершина с номером [math]n[/math] не может быть удалена, следовательно на последнем шаге у неё была смежная вершина, и число [math]n[/math] встретилось в коде.
  2. Если вершина не является листом, то у неё на некотором шаге была смежная вершина - лист, следовательно номер этой вершины встречается в коде.
  3. Если вершина является листом с номером меньше [math]n[/math], то она была удалена до того, как был удален ее сосед, следовательно ее номер не встречается в коде.
Таким образом, номера всех вершин, не являющихся листьями или имеющих номер [math]n[/math], встречаются в коде Прюфера, а остальные - нет.
[math]\triangleleft[/math]
Лемма:
По любой последовательности длиной [math]n - 2[/math] из чисел от [math]1[/math] до [math]n[/math] можно построить помеченное дерево, для которого эта последовательность является кодом Прюфера.
Доказательство:
[math]\triangleright[/math]

Доказательство проведем по индукции. База. [math]n = 1[/math] - верно.
Переход от [math]n[/math] к [math]n + 1[/math].
Пусть у нас есть последовательность: [math]A = [a_1, a_2, ..., a_{n - 2}].[/math]

Выберем минимальное число [math]v[/math] не лежащее в A. По предыдущей лемме [math]v[/math] - вершина, которую мы удалили первой. Соединим [math]v[/math] и [math]a_1[/math] ребром. Выкинем из последовательности [math]A[/math] число [math]a_1[/math]. Перенумеруем вершины, для всех [math]a_i \gt v[/math] заменим [math]a_i[/math] на [math]a_i - 1[/math]. А теперь мы можем применить предположение индукции.
[math]\triangleleft[/math]
Теорема:
Кодирование Прюфера задаёт биекцию между множествами помеченных деревьев порядка [math]n[/math] и последовательностями длиной [math]n - 2[/math] из чисел от [math]1[/math] до [math]n[/math]
Доказательство:
[math]\triangleright[/math]
  1. Каждому помеченному дереву приведенный алгоритм сопоставляет последовательность.
  2. Каждой последовательности, как следует из предыдущей леммы, соотвествует помеченное дерево.
[math]\triangleleft[/math]

Следствием из этой теоремы является формула Кэли.