Havel-Hakimi-algoritmus
Kiejtés
- IPA: [ ˈhɒvɛlhɒkimiɒlɡoritmuʃ]
Főnév
Havel-Hakimi-algoritmus
A Havel-Hakimi-algoritmus egy gráfelméleti algoritmus, amely egy adott fokszámsorozatról eldönti, hogy létezik-e olyan egyszerű gráf, amelynek csúcsfokai megegyeznek ezzel a sorozattal. Az algoritmust Vaclav Havel (1955) és Simon Hakimi (1962) dolgozta ki.
Fő ötlet
Egy fokszámsorozat akkor valósítható meg egy egyszerű gráfban, ha az algoritmus ismételt csökkentésekkel és rendezésekkel ki tudja szűrni az érvényes csúcsösszekötéseket.
Algoritmus működése
Bemenet:
- Egy nem negatív egész számokat tartalmazó sorozat ((d_1, d_2, , d_n)).
Kimenet:
- Igaz: Ha létezik egy egyszerű gráf, amely megfelel a sorozatnak.
- Hamis: Ha nem létezik ilyen gráf.
Feltételek:
- Egy egyszerű gráf:
- Nem tartalmaz hurokéleket.
- Nem tartalmaz párhuzamos éleket.
Lépések
- Sorozat rendezése:
- Rendezzük a fokszámsorozatot csökkenő sorrendbe.
- Érvénytelen fokszám kiszűrése:
- Ha bármelyik fokszám negatív, a sorozat nem megvalósítható ((Hamis)).
- Nullák ellenőrzése:
- Ha minden fokszám (0), akkor a sorozat érvényes ((Igaz)).
- Csúcsok csökkentése:
- Vegyük a legnagyobb fokszámot ((d_1)), majd távolítsuk el azt a sorozatból.
- Csökkentsük az első (d_1) elem értékét (1)-gyel (kivéve, ha ez negatív értéket eredményez).
- Ismétlés:
- Térj vissza az első lépéshez.
Pszeudokód
HavelHakimi(sequence): amíg sequence nem üres: rendezd sequence-et csökkenő sorrendbe ha a sequence első eleme negatív: térj vissza Hamis ha minden elem 0: térj vissza Igaz vegyük ki az első elemet (max_degree) ha max_degree > len(sequence): térj vissza Hamis csökkentsük a sequence első max_degree elemét 1-gyel térj vissza Igaz
Példa
Bemenet:
([4, 3, 3, 2, 2])
- Rendezés: ([4, 3, 3, 2, 2])
- Első elem kivétele ((d_1 = 4)): ([3, 3, 2, 2])
- Első négy elem csökkentése: ([2, 2, 1, 1])
- Ismétlés:
- Rendezés: ([2, 2, 1, 1])
- Első elem kivétele ((d_1 = 2)): ([2, 1, 1])
- Csökkentés: ([1, 0, 0])
- Ismétlés:
- Rendezés: ([1, 0, 0])
- Első elem kivétele ((d_1 = 1)): ([0, 0])
- Csökkentés: ([0, 0])
- Minden elem (0): (Igaz).
Kimenet:
- A sorozat megvalósítható.
Python implementáció
def havel_hakimi(sequence):
while sequence:
# Rendezés csökkenő sorrendbe
sequence.sort(reverse=True)
# Negatív értékek ellenőrzése
if sequence[0] < 0:
return False
# Nullák ellenőrzése
if all(degree == 0 for degree in sequence):
return True
# Legnagyobb fokszám eltávolítása
max_degree = sequence.pop(0)
# Ellenőrizzük, hogy van-e elég csúcs csökkenteni
if max_degree > len(sequence):
return False
# Csökkentsük az első max_degree csúcsot
for i in range(max_degree):
sequence[i] -= 1
return True
# Példa használat
sequence = [4, 3, 3, 2, 2]
print("Megvalósítható:", havel_hakimi(sequence))
Kimenet:
Megvalósítható: True
C++ implementáció
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool havel_hakimi(vector<int> sequence) {
while (!sequence.empty()) {
// Rendezés csökkenő sorrendbe
sort(sequence.rbegin(), sequence.rend());
// Negatív értékek ellenőrzése
if (sequence[0] < 0) {
return false;
}
// Nullák ellenőrzése
if (all_of(sequence.begin(), sequence.end(), [](int degree) { return degree == 0; })) {
return true;
}
// Legnagyobb fokszám eltávolítása
int max_degree = sequence[0];
sequence.erase(sequence.begin());
// Ellenőrizzük, hogy van-e elég csúcs csökkenteni
if (max_degree > sequence.size()) {
return false;
}
// Csökkentsük az első max_degree csúcsot
for (int i = 0; i < max_degree; ++i) {
sequence[i] -= 1;
}
}
return true;
}
int main() {
vector<int> sequence = {4, 3, 3, 2, 2};
cout << "Megvalósítható: " << (havel_hakimi(sequence) ? "True" : "False") << endl;
return 0;
}
Kimenet:
Megvalósítható: True
Előnyök
- Egyszerűség:
- Az algoritmus intuitív és könnyen implementálható.
- Hatékonyság:
- Az algoritmus időkomplexitása (O(n^2)), ami kis méretű gráfok esetén megfelelő.
- Gráfelméleti alapok:
- Alkalmas gráfok fokszámsorozatainak vizsgálatára.
Hátrányok
- Nagyobb méretű adatok esetén:
- Az (O(n^2)) időkomplexitás miatt lassú lehet nagy méretű sorozatoknál.
- Specifikus alkalmazás:
- Csak fokszámsorozatok realizálhatóságának vizsgálatára alkalmas, nem adja meg a gráf konkrét szerkezetét.
Összegzés
A Havel-Hakimi-algoritmus egy hatékony eszköz annak eldöntésére, hogy egy fokszámsorozat megvalósítható-e egyszerű gráfként. Alkalmazásai közé tartozik a gráfok modellezése, hálózatelemzés és a gráfelméleti problémák vizsgálata. Egyszerűsége és intuitivitása miatt széles körben tanítják az algoritmusok és gráfelmélet kurzusokon.
- Havel-Hakimi-algoritmus - Értelmező szótár (MEK)
- Havel-Hakimi-algoritmus - Etimológiai szótár (UMIL)
- Havel-Hakimi-algoritmus - Szótár.net (hu-hu)
- Havel-Hakimi-algoritmus - DeepL (hu-de)
- Havel-Hakimi-algoritmus - Яндекс (hu-ru)
- Havel-Hakimi-algoritmus - Google (hu-en)
- Havel-Hakimi-algoritmus - Helyesírási szótár (MTA)
- Havel-Hakimi-algoritmus - Wikidata
- Havel-Hakimi-algoritmus - Wikipédia (magyar)