Flajolet–Martin algoritm

Flajolet -Martin-algoritmen är en algoritm för att approximera antalet distinkta element i en ström med en enda passage och logaritm för utrymmesförbrukning i det maximala antalet möjliga distinkta element i strömmen (det antal distinkta problemet) . Algoritmen introducerades av Philippe Flajolet och G. Nigel Martin i deras 1984 artikel "Probabilistic Counting Algorithms for Data Base Applications". Senare har det förfinats i "LogLog counting of large cardinalities" av Marianne Durand och Philippe Flajolet , och " HyperLogLog : The analysis of a near-optimal cardinality estimation algorithm" av Philippe Flajolet et al.

I sin artikel från 2010 "An optimal algorithm for the distinct elements problem" ger Daniel M. Kane, Jelani Nelson och David P. Woodruff en förbättrad algoritm, som använder nästan optimalt utrymme och har optimala O (1) uppdaterings- och rapporteringstider.

Algoritmen

Antag att vi får en hashfunktion som mappar indata till heltal i intervallet , och där utsignalerna är tillräckligt jämnt fördelade . Observera att uppsättningen av heltal från 0 till motsvarar uppsättningen av binära strängar med längden . För alla icke-negativa heltal , definiera till -th biten i binär representation av , så att:

Vi definierar sedan en funktion som matar ut positionen för den minst signifikanta setbiten i den binära representationen av , och om nej sådan set bit kan hittas eftersom alla bitar är noll:

Observera att med ovanstående definition använder vi 0-indexering för positionerna, med början från den minst signifikanta biten. Till exempel, eftersom den minst signifikanta biten är en 1 (0:e position), och eftersom den minst signifikanta setbiten är på den tredje positionen. Notera nu att under antagandet att utdata från vår hashfunktion är likformigt fördelad, då är sannolikheten att observera en hashutgång som slutar med (en etta, följt av nollor) är , eftersom detta motsvarar att vända huvuden och sedan en svans med ett rättvist mynt.

Nu är Flajolet–Martin-algoritmen för att uppskatta kardinaliteten för en multiset som följer:

  1. Initiera en bit-vektor BITMAP så att den har längden och innehåller alla nollor.
  2. För varje element i :
    1. Beräkna indexet .
    2. Sätt .
  3. Låt beteckna det minsta indexet så att .
  4. Uppskatta kardinaliteten för som , där .

Tanken är att om är antalet distinkta element i multiuppsättningen , så kommer åtkomst ungefär gånger, nås ungefär gånger och så på. Följaktligen, om så är nästan säkert 0 , och om så är nästan säkert 1 . Om , då kan förväntas vara antingen 1 eller 0.

Korrektionsfaktorn hittas genom beräkningar, som finns i originalartikeln.

Förbättrar noggrannheten

Ett problem med Flajolet–Martin-algoritmen i ovanstående form är att resultaten varierar avsevärt. En vanlig lösning har varit att köra algoritmen flera gånger med olika hashfunktioner och kombinera resultaten från de olika körningarna. En idé är att ta medelvärdet av -resultaten tillsammans från varje hashfunktion och erhålla en enda uppskattning av kardinaliteten. Problemet med detta är att medelvärdesberäkning är mycket känsligt för extremvärden (vilket är troligt här). En annan idé är att använda medianen , som är mindre benägen att påverkas av extremvärden. Problemet med detta är att resultaten bara kan ta formen där är heltal. En vanlig lösning är att kombinera både medelvärdet och medianen: Skapa hashfunktioner och dela upp dem i distinkta grupper (var och en av storleken ) . Inom varje grupp använd medelvärdet för att aggregera samman -resultaten, och ta slutligen medianen för -gruppens uppskattningar som den slutliga uppskattningen.

2007 års HyperLogLog -algoritm delar upp multiuppsättningen i delmängder och uppskattar deras kardinaliteter, sedan använder den det harmoniska medelvärdet för att kombinera dem till en uppskattning för den ursprungliga kardinaliteten.

Se även

Ytterligare källor