Участник:Masha — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм декодирования кодов Прюфера)
(Алгоритм декодирования кодa Прюфера)
Строка 1: Строка 1:
 
== Алгоритм декодирования кодa Прюфера ==
 
== Алгоритм декодирования кодa Прюфера ==
Пусть есть массив <tex>P = {p_1, ..., p_{n - 2}}</tex> - код Прюфера какого-то дерева и массив вершин дерева <tex>V</tex>. Для получения дерева по коду Прюфера необходимо выполнять следующие действия, пока массив <tex>P</tex> не станет пустым. В массиве <tex>V</tex> найти вершину <tex>v_{min}</tex> с минимальным номером, не содержащуюся в массиве <tex>P</tex>. Добавить ребро {<tex>p_1</tex>, <tex>v_{min}</tex>} в дерево, удалить найденные вершины из соответствующих массивов. В конце работы алгоритма в массиве <tex>V</tex> останется две вершины, составляющих последнее ребро дерева.
+
 
 +
В массиве вершин исходного дерева <tex>V</tex> найдём вершину <tex>v_{min}</tex> с минимальным номером, не содержащуюся в массиве с кодом Прюфера <tex>P</tex>, т.е. такую, что она является листом или концом уже добавленного в граф ребра, т.е. она стала листом в процессе построения кода Прюфера (по первому пункту построения). Вершина <tex>p_1</tex> была добавлена в код Прюфера как инцидентная листу с минимальным номером (по второму пункту построения), поэтому в исходном дереве существует ребро {<tex>p_1</tex>, <tex>v_{min}</tex>}, добавим его в список ребер. Удалим первый элемент из массива <tex>Р</tex>, а вершину <tex>v_{min}</tex> - из массива <tex>V</tex> т.к. она больше не может являться листом (по третьему пункту построения). Будем выполнять вышеуказанные действия, пока массив <tex>P</tex> не станет пустым. В конце работы алгоритма в массиве <tex>V</tex> останутся две вершины, составляющие последнее ребро дерева (это следует из построения).
  
 
=== Реализация ===
 
=== Реализация ===
 
+
# P - код Прюфера
 +
# V - вершины
 
  '''function''' buildTree(P, V):
 
  '''function''' buildTree(P, V):
 
     '''while'' '''not'' P.empty():
 
     '''while'' '''not'' P.empty():
Строка 10: Строка 12:
 
       G.push({u, v})
 
       G.push({u, v})
 
       P.erase(0)
 
       P.erase(0)
       V.erase(indexOf(x))
+
       V.erase(indexOf(v))
 
     G.push({v[0], v[1]})
 
     G.push({v[0], v[1]})
 
     '''return''' G
 
     '''return''' G

Версия 18:44, 6 января 2021

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

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

Реализация

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