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

Материал из Викиконспекты
Перейти к: навигация, поиск
(добавлен алгоритм декодирования)
Строка 1: Строка 1:
 +
{| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;"
 +
|+
 +
|-align="center"
 +
|'''НЕТ ВОЙНЕ'''
 +
|-style="font-size: 16px;"
 +
|
 +
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.
 +
 +
Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.
 +
 +
Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.
 +
 +
Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.
 +
 +
''Антивоенный комитет России''
 +
|-style="font-size: 16px;"
 +
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
 +
|-style="font-size: 16px;"
 +
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].
 +
|}
 +
 
== Алгоритм построения кодов Прюфера ==
 
== Алгоритм построения кодов Прюфера ==
 
Кодирование Прюфера переводит [[Количество помеченных деревьев#Помеченное дерево|помеченные деревья порядка <tex>n</tex>]] в последовательность чисел от <tex>1</tex> до <tex>n</tex> по алгоритму:<br>
 
Кодирование Прюфера переводит [[Количество помеченных деревьев#Помеченное дерево|помеченные деревья порядка <tex>n</tex>]] в последовательность чисел от <tex>1</tex> до <tex>n</tex> по алгоритму:<br>

Версия 09:22, 1 сентября 2022

НЕТ ВОЙНЕ

24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.

Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.

Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.

Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.

Антивоенный комитет России

Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки.

Алгоритм построения кодов Прюфера

Кодирование Прюфера переводит помеченные деревья порядка n в последовательность чисел от 1 до n по алгоритму:
Пока количество вершин больше двух:

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


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

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

Доказательство проведем по индукции по числу n
База индукции:

n=1 верно.

Индукционный переход:

Пусть для числа n верно, построим доказательство для n+1:

Пусть у нас есть последовательность: A=[a1,a2,...,an2].

Выберем минимальное число v не лежащее в A. По предыдущей лемме v вершина, которую мы удалили первой. Соединим v и a1 ребром. Выкинем из последовательности A число a1. Перенумеруем вершины, для всех ai>v заменим ai на ai1. А теперь мы можем применить предположение индукции.
Теорема:
Кодирование Прюфера задаёт биекцию между множествами помеченных деревьев порядка n и последовательностями длиной n2 из чисел от 1 до n
Доказательство:
  1. Каждому помеченному дереву приведенный алгоритм сопоставляет последовательность.
  2. Каждой последовательности, как следует из предыдущей леммы, соотвествует помеченное дерево.

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

Пример построения кода Прюфера

Prufer.png

Алгоритм декодирования кодa Прюфера

В массиве вершин исходного дерева V найдём вершину vmin с минимальным номером, не содержащуюся в массиве с кодом Прюфера P, т.е. такую, что она является листом или концом уже добавленного в граф ребра, т.е. она стала листом в процессе построения кода Прюфера (по первому пункту построения). Вершина p1 была добавлена в код Прюфера как инцидентная листу с минимальным номером (по второму пункту построения), поэтому в исходном дереве существует ребро {p1, vmin}, добавим его в список ребер. Удалим первый элемент из массива Р, а вершину vmin - из массива V т.к. она больше не может являться листом (по третьему пункту построения). Будем выполнять вышеуказанные действия, пока массив P не станет пустым. В конце работы алгоритма в массиве V останутся две вершины, составляющие последнее ребро дерева (это следует из построения).

Реализация

# P - код Прюфера
# V - вершины
function buildTree(P, V):
   while not P.empty():
      u = P[0]
      v = min(x  V: P.count(x) == 0)
      G.push({u, v})
      P.erase(0)
      V.erase(indexOf(v))
   G.push({v[0], v[1]})
   return G


Пример декодирования кода Прюфера

Backprufer.png

См. также


Источники информации