Послідовність Прюфера (або ж код Прюфера) у комбінаторній математиці є унікальною послідовністю, пов'язаною з деревом. Послідовність дерева з n
вершин має довжину n - 2
, і може бути сформована простим ітераційним алгоритмом. Послідовність Прюфера вперше використав Хайнц Прюфе, щоб довести формулу Келі в 1918 році.
Алгоритм перетворення дерева в послідовність Прюфера
Нехай T
є дерево з вершинами, пронумеровані числами {1,2,...,n}
. Побудова послідовності Прюфера для дерева T
ведеться шляхом послідовного видалення вершин з дерева, поки не залишаться тільки дві вершини. При цьому кожен раз вибирається кінцева вершина з найменшим номером і в послідовність записується номер єдиної вершини, з якою вона з'єднана. В результаті отворюється послідовність (p1,...,pn-2)
, складену з чисел {1,2,..., n}
, можливо з повтореннями.
Приклад в графах
- Для дерева на діаграмі вершина
1
є кінцевою вершиною з найменшим номером, тому вона видаляється і4
ставиться в послідовність Прюфера. - Вершини
2
і3
видаляються в наступному, так що4
додається двічі. - Вершина
4
Тепер стала кінцевою і має найменший номер, тому вона видаляється і додається5
до послідовності. - Залишається лише з двома вершинами, тому завершуються подальші перетворення.
- В результаті послідовність Прюфера
(4,4,4,5)
.
Алгоритм перетворення послідовності Прюфера в дерево
Для відновлення дерева за послідовністю p=(p1,...,pn-2)
, створений список номерів вершин s=(1,...,n)
. Вибрано перший номер i1
, який не зустрічається в послідовності. Додано ребро (i1,p1)
, після цього видалено i1
з s
і p1
з p
. Процес повторюється до моменту, коли послідовність p стає порожнім. У цей момент список s
містить рівно два числа іn-1
і n
. Залишається додати ребро (in-1,n)
, і дерево побудовано.
Приклад в графах
Приклад у вигляді псевдокоду
Нехай {a [1], a [2], ..., a [n]}
буде послідовністю Прюфера:
Дерево буде мати вузли n + 2
, пронумеровані з 1
до n + 2
. Для кожного вузла встановлюється його ступінь на кількість разів, що з'являються в послідовності плюс 1
. Наприклад, в псевдокоді:
0 Convert-Prüfer-to-Tree(a) 1 n ← length[a] 2 T ← a graph with n + 2 isolated nodes, numbered 1 to n + 2 3 degree ← an array of integers 4 for each node i in T 5 do degree[i] ← 1 6 for each value i in a 7 do degree[i] ← degree[i] + 1
Далі для кожного числа в послідовності a[i]
знайдіть перший (найменш нумерований) вузол, j
, ступінь якої дорівнює 1
, додати край (j,a[i])
до дерева та зменшити ступені j
і a[i]
. У псевдокоді:
8 for each value i in a 9 for each node j in T 10 if degree[j] = 1 11 then Insert edge[i, j] into T 12 degree[i] ← degree[i] - 1 13 degree[j] ← degree[j] - 1 14 break
Наприкінці цього циклу залишиться два вузли з ступенем 1
(називайте їх u
, v
). Нарешті, додати до дерева край (u,v)
15 u ← v ← 0 16 for each node i in T 17 if degree[i] = 1 18 then if u = 0 19 then u ← i 20 else v ← i 21 break 22 Insert edge[u, v] into T 23 degree[u] ← degree[u] - 1 24 degree[v] ← degree[v] - 1 25 return T
C++ реалізація
Код функції
0 #include<bits/stdc++.h> 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<vertices-2; i++) 7 vertex_set[prufer[i]-1] += 1; 8 cout<<"\nThe edge set E(G) is :\n"; 9 int j = 0; 10 for (int i=0; i<vertices-2; i++) 11 { 12 for (j=0; j<vertices; j++) 13 { 14 if (vertex_set[j] == 0) 15 { 16 vertex_set[j] = -1; 17 cout << "(" << (j+1) << "," 18 << prufer[i] << ") "; 19 vertex_set[prufer[i]-1]--; 20 break; 21 } 22 } 23 } 24 for (int i=0; i<vertices; i++ ) 25 { 26 if (vertex_set[i] == 0 && j == 0 ) 27 { 28 cout << "(" << (i+1) << ","; 29 j++; 30 } 31 else if (vertex_set[i] == 0 && j == 1 ) 32 cout << (i+1) << ")\n"; 33 } 34 }
Код реалізації функції
0 int main() 1 { 2 int prufer[] = {4, 1, 3, 4}; 3 int n = sizeof(prufer)/sizeof(prufer[0]); 4 printTreeEdges(prufer, n); 5 return 0; 6 }
Інші приклади
- З послідовності Прюфера випливає Формула Келі, тобто число кістякових дерев повного графу
n
зn
вершинами рівнеnn-2
. Доказ випливає з того, що код Прюфера дає бієкцію б між кістяковими деревами та послідовністю довжинn-2
з числаn
чисел. - Послідовність Прюфера також дозволяє узагальнити формулу Келі в разі, якщо дана ступінь вершин, якщо
(d1,...,dn)
це послідовність ступеня дерева, то число дерев з такими ступенями рівне мультиномінальному коефіцієнту:
- Код Прюфера використовується для побудови випадкових дерев.
Посилання
- Prüfer code [Архівовано 2 червня 2021 у Wayback Machine.] на сайті MathWorld (англ.)
- Prufer Code to Tree Creation [Архівовано 17 листопада 2018 у Wayback Machine.] (англ.)
- Коды Прюфера [Архівовано 1 грудня 2018 у Wayback Machine.] (рос.)
Примітки
- Prüfer, H. (1918). Neuer Beweis eines Satzes über Permutationen. Arch. Math. Phys. 27: 742—744.
- Jens Gottlieb; Bryant A. Julstrom; Günther R. Raidl; Franz Rothlauf. (2001). Prüfer numbers: A poor representation of spanning trees for evolutionary search (PDF). Proceedings of the Genetic and Evolutionary Computation Conference (GECCO-2001): 343—350. Архів оригіналу (PDF) за 26 вересня 2006.
{{}}
: Cite має пустий невідомий параметр:|df=
()
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Nemaye perevirenih versij ciyeyi storinki jmovirno yiyi she ne pereviryali na vidpovidnist pravilam proektu Poslidovnist Pryufera abo zh kod Pryufera u kombinatornij matematici ye unikalnoyu poslidovnistyu pov yazanoyu z derevom Poslidovnist dereva z n vershin maye dovzhinu n 2 i mozhe buti sformovana prostim iteracijnim algoritmom Poslidovnist Pryufera vpershe vikoristav Hajnc Pryufe shob dovesti formulu Keli v 1918 roci 1 Zmist 1 Algoritm peretvorennya dereva v poslidovnist Pryufera 1 1 Priklad v grafah 2 Algoritm peretvorennya poslidovnosti Pryufera v derevo 2 1 Priklad v grafah 2 2 Priklad u viglyadi psevdokodu 2 3 C realizaciya 2 3 1 Kod funkciyi 2 3 2 Kod realizaciyi funkciyi 3 Inshi prikladi 4 Posilannya 5 PrimitkiAlgoritm peretvorennya dereva v poslidovnist Pryuferared Nehaj T ye derevo z vershinami pronumerovani chislami 1 2 n Pobudova poslidovnosti Pryufera dlya dereva T vedetsya shlyahom poslidovnogo vidalennya vershin z dereva poki ne zalishatsya tilki dvi vershini Pri comu kozhen raz vibirayetsya kinceva vershina z najmenshim nomerom i v poslidovnist zapisuyetsya nomer yedinoyi vershini z yakoyu vona z yednana V rezultati otvoryuyetsya poslidovnist p sub 1 sub p sub n 2 sub skladenu z chisel 1 2 n mozhlivo z povtorennyami Priklad v grafahred nbsp nbsp nbsp nbsp nbsp Dlya dereva na diagrami vershina 1 ye kincevoyu vershinoyu z najmenshim nomerom tomu vona vidalyayetsya i 4 stavitsya v poslidovnist Pryufera Vershini 2 i 3 vidalyayutsya v nastupnomu tak sho 4 dodayetsya dvichi Vershina 4 Teper stala kincevoyu i maye najmenshij nomer tomu vona vidalyayetsya i dodayetsya 5 do poslidovnosti Zalishayetsya lishe z dvoma vershinami tomu zavershuyutsya podalshi peretvorennya V rezultati poslidovnist Pryufera 4 4 4 5 Algoritm peretvorennya poslidovnosti Pryufera v derevored Dlya vidnovlennya dereva za poslidovnistyu p p sub 1 sub p sub n 2 sub stvorenij spisok nomeriv vershin s 1 n Vibrano pershij nomer i sub 1 sub yakij ne zustrichayetsya v poslidovnosti Dodano rebro i sub 1 sub p sub 1 sub pislya cogo vidaleno i sub 1 sub z s i p sub 1 sub z p Proces povtoryuyetsya do momentu koli poslidovnist p staye porozhnim U cej moment spisok s mistit rivno dva chisla i sub n 1 sub i n Zalishayetsya dodati rebro i sub n 1 sub n i derevo pobudovano Priklad v grafahred nbsp nbsp nbsp nbsp nbsp Priklad u viglyadi psevdokodured Nehaj a 1 a 2 a n bude poslidovnistyu Pryufera Derevo bude mati vuzli n 2 pronumerovani z 1 do n 2 Dlya kozhnogo vuzla vstanovlyuyetsya jogo stupin na kilkist raziv sho z yavlyayutsya v poslidovnosti plyus 1 Napriklad v psevdokodi 0 Convert Prufer to Tree a 1 n length a 2 T a graph with n 2 isolated nodes numbered 1 to n 2 3 degree an array of integers 4 for each node i in T 5 do degree i 1 6 for each value i in a 7 do degree i degree i 1 Dali dlya kozhnogo chisla v poslidovnosti a i znajdit pershij najmensh numerovanij vuzol j stupin yakoyi dorivnyuye 1 dodati kraj j a i do dereva ta zmenshiti stupeni j i a i U psevdokodi 8 for each value i in a 9 for each node j in T 10 if degree j 1 11 then Insert edge i j into T 12 degree i degree i 1 13 degree j degree j 1 14 break Naprikinci cogo ciklu zalishitsya dva vuzli z stupenem 1 nazivajte yih u v Nareshti dodati do dereva kraj u v 2 15 u v 0 16 for each node i in T 17 if degree i 1 18 then if u 0 19 then u i 20 else v i 21 break 22 Insert edge u v into T 23 degree u degree u 1 24 degree v degree v 1 25 return T C realizaciyared Kod funkciyired 0 include lt bits stdc h gt 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 lt vertices 2 i 7 vertex set prufer i 1 1 8 cout lt lt nThe edge set E G is n 9 int j 0 10 for int i 0 i lt vertices 2 i 11 12 for j 0 j lt vertices j 13 14 if vertex set j 0 15 16 vertex set j 1 17 cout lt lt lt lt j 1 lt lt 18 lt lt prufer i lt lt 19 vertex set prufer i 1 20 break 21 22 23 24 for int i 0 i lt vertices i 25 26 if vertex set i 0 amp amp j 0 27 28 cout lt lt lt lt i 1 lt lt 29 j 30 31 else if vertex set i 0 amp amp j 1 32 cout lt lt i 1 lt lt n 33 34 Kod realizaciyi funkciyired 0 int main 1 2 int prufer 4 1 3 4 3 int n sizeof prufer sizeof prufer 0 4 printTreeEdges prufer n 5 return 0 6 Inshi prikladired Z poslidovnosti Pryufera viplivaye Formula Keli tobto chislo kistyakovih derev povnogo grafu big span class mwe math element span class mwe math mathml inline mwe math mathml a11y style display none math xmlns http www w3 org 1998 Math MathML alttext displaystyle pi semantics mrow class MJX TeXAtom ORD mstyle displaystyle true scriptlevel 0 mi p p mi mstyle mrow annotation encoding application x tex displaystyle pi annotation semantics math span noscript img src https wikimedia org api rest v1 media math render svg 9be4ba0bb8df3af72e90a0535fabcc17431e540a class mwe math fallback image inline mw invert skin invert aria hidden true style vertical align 0 338ex width 1 332ex height 1 676ex alt displaystyle pi noscript span class lazy image placeholder style width 1 332ex height 1 676ex vertical align 0 338ex data src https wikimedia org api rest v1 media math render svg 9be4ba0bb8df3af72e90a0535fabcc17431e540a data alt displaystyle pi data class mwe math fallback image inline mw invert skin invert nbsp span span big sub n sub z n vershinami rivne n sup n 2 sup Dokaz viplivaye z togo sho kod Pryufera daye biyekciyu b mizh kistyakovimi derevami ta poslidovnistyu dovzhin n 2 z chisla n chisel Poslidovnist Pryufera takozh dozvolyaye uzagalniti formulu Keli v razi yaksho dana stupin vershin yaksho d sub 1 sub d sub n sub ce poslidovnist stupenya dereva to chislo derev z takimi stupenyami rivne multinominalnomu koeficiyentu n 2 d 1 1 d 2 1 d n 1 n 2 d 1 1 d 2 1 d n 1 displaystyle binom n 2 d 1 1 d 2 1 dots d n 1 frac n 2 d 1 1 d 2 1 cdots d n 1 nbsp Kod Pryufera vikoristovuyetsya dlya pobudovi vipadkovih derev Posilannyared Prufer code Arhivovano 2 chervnya 2021 u Wayback Machine na sajti MathWorld angl Prufer Code to Tree Creation Arhivovano 17 listopada 2018 u Wayback Machine angl Kody Pryufera Arhivovano 1 grudnya 2018 u Wayback Machine ros Primitkired Prufer H 1918 Neuer Beweis eines Satzes uber Permutationen Arch Math Phys 27 742 744 Jens Gottlieb Bryant A Julstrom Gunther R Raidl Franz Rothlauf 2001 Prufer numbers A poor representation of spanning trees for evolutionary search PDF Proceedings of the Genetic and Evolutionary Computation Conference GECCO 2001 343 350 Arhiv originalu PDF za 26 veresnya 2006 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite journal title Shablon Cite journal cite journal a Cite maye pustij nevidomij parametr df dovidka Otrimano z https uk wikipedia org wiki Poslidovnist Pryufera