Flajolet-Martin-algoritmus
Kiejtés
- IPA: [ ˈflɒjolɛtmɒrtinɒlɡoritmuʃ]
Főnév
Flajolet-Martin-algoritmus
A Flajolet-Martin-algoritmus egy valószínűségi algoritmus, amelyet nagy adathalmazokban található egyedi elemek számának becslésére használnak. A probléma gyakori a streaming adatok és a Big Data feldolgozásában, ahol a teljes adathalmaz tárolása és pontos feldolgozása nem lehetséges.
Probléma
Legyen adott egy adathalmaz ( S ), amely tartalmaz ismétlődő elemeket. A cél annak meghatározása, hogy hány különböző elem (( n )) található az adathalmazban.
Példa:
Adott az ( S = {a, b, a, c, b, d, e, e} ) adathalmaz.
Az egyedi elemek száma ( n = 5 ) (( a, b, c, d, e )).
Módszer
A Flajolet-Martin-algoritmus a következő lépéseken alapul:
- Hashing:
- Az adathalmaz elemeit egy hash függvénnyel dolgozzuk fel.
- A hash függvény véletlenszerű és egyenletes eloszlású értékeket generál.
- Bináris reprezentáció vizsgálata:
- Minden elem hash értékét binárisan ábrázoljuk.
- Figyeljük meg a hash értékben található jobb oldali nullák sorozatának hosszát.
- Becslés:
- A legnagyobb jobb oldali nullák száma (R) alapján becslést adunk az egyedi elemek számára: [ n ^R ]
- Minél több az egyedi elem, annál hosszabb jobb oldali nullák sorozatát találhatjuk véletlenszerűen a hash értékekben.
- Pontosítás:
- Az algoritmus egyszerre több hash függvényt használ, hogy az eredmény stabilabb és pontosabb legyen.
Lépések részletesen
- Hash függvény alkalmazása: Minden elemhez számítsunk egy hash értéket (( h(x) )), amely binárisan ábrázolható.
- Jobb oldali nullák meghatározása:
- Például:
- Például:
( h(a) = 12 1100 2 ).
- Legnagyobb nullaszám kiválasztása:
- Az összes hash érték közül meghatározzuk a legnagyobb jobb oldali nullák számát (R).
- Becslés: [ n ^R ]
- Több hash függvény használata (opcionális):
- Több hash függvényből származó értékek átlagolása pontosabb eredményt ad.
Python Implementáció
Az alábbi kód egy egyszerű implementációt mutat be a Flajolet-Martin-algoritmushoz.
import hashlib
def hash_function(item):
"""
Egy egyszerű hash függvény, amely SHA-1 hashből bináris számot generál.
"""
hash_object = hashlib.sha1(item.encode())
hex_dig = hash_object.hexdigest()
binary_hash = bin(int(hex_dig, 16))[2:]
return binary_hash
def trailing_zeros(binary_string):
"""
Jobb oldali nullák számának meghatározása egy bináris számban.
"""
return len(binary_string) - len(binary_string.rstrip('0'))
def flajolet_martin(stream, num_hashes=10):
"""
Flajolet-Martin algoritmus implementációja.
:param stream: Bemeneti adathalmaz (list).
:param num_hashes: Hash függvények száma a pontosabb eredményhez.
:return: Az egyedi elemek becsült száma.
"""
max_zeros = [0] * num_hashes
for item in stream:
for i in range(num_hashes):
# Minden hash függvényhez tartozó érték
hash_value = hash_function(item + str(i))
zeros = trailing_zeros(hash_value)
max_zeros[i] = max(max_zeros[i], zeros)
# Átlagolás a hash függvények alapján
avg_zeros = sum(max_zeros) / num_hashes
return 2 ** avg_zeros
# Példa használat
stream = ["a", "b", "a", "c", "b", "d", "e", "e"]
unique_estimate = flajolet_martin(stream)
print(f"Becsült egyedi elemek száma: {unique_estimate}")
Magyarázat
- Hash függvény:
- SHA-1 hash függvényt használunk a bemenet bináris reprezentációjára.
- A hash értékek egyenletesen eloszlanak, ami biztosítja a véletlenszerűség feltételét.
- Jobb oldali nullák száma:
- A jobb oldali nullák száma a hash értékben a ritkaságra utal. Minél több az egyedi elem, annál hosszabb nullasorozatot találunk.
- Több hash függvény:
- A több hash függvény használata javítja a pontosságot és csökkenti az eltéréseket.
Példa kimenet
Becsült egyedi elemek száma: 5.0
Valós adatok esetén a becslés nem mindig pontos, de az eltérés általában kicsi.
Előnyök
- Nagy adathalmazok kezelése:
Az algoritmus nem igényel a teljes adathalmaz tárolását.
- Hatékony:
Az algoritmus idő- és tárbonyolultsága ( O(n) ).
- Streaming adatokra optimalizált:
Valós idejű adatfeldolgozásra alkalmas.
Hátrányok
- Valószínűségi algoritmus:
Nem garantálja a pontos eredményt, csak becslést ad.
- Hash függvények érzékenysége:
A hash függvény minősége befolyásolja a pontosságot.
Alkalmazások
- Big Data feldolgozás:
- Egyedi felhasználók számának becslése webes forgalomban.
- Adatstream kezelés:
- Nagy volumenű logfájlok elemzése.
- Adattömörítés és optimalizáció:
- Adatbázisokban vagy hálózatkezelésben egyedi elemek gyors becslése.
Összegzés
A Flajolet-Martin-algoritmus egy hatékony és memóriahatékony módszer nagy adathalmazok egyedi elemeinek becslésére. Bár valószínűségi algoritmus, a gyakorlatban rendkívül jól használható streaming adatok és Big Data esetén.
Fordítások
- Flajolet-Martin-algoritmus - Értelmező szótár (MEK)
- Flajolet-Martin-algoritmus - Etimológiai szótár (UMIL)
- Flajolet-Martin-algoritmus - Szótár.net (hu-hu)
- Flajolet-Martin-algoritmus - DeepL (hu-de)
- Flajolet-Martin-algoritmus - Яндекс (hu-ru)
- Flajolet-Martin-algoritmus - Google (hu-en)
- Flajolet-Martin-algoritmus - Helyesírási szótár (MTA)
- Flajolet-Martin-algoritmus - Wikidata
- Flajolet-Martin-algoritmus - Wikipédia (magyar)