Bloomův filtr

Bloomův filtr, pojmenovaný podle Burtona Howarda Blooma, který ho objevil v roce 1970,[1] je prostorově efektivní pravděpodobnostní datová struktura, která se používá na ověřování příslušnosti prvků do množiny. Protože je tato struktura pravděpodobnostní, mohou při tomto ověřování nastat chyby. Při této chybě se o prvku, který ve skutečnosti do dané množiny nepatří, dozvíme, že tam patří, ale nikdy ne naopak. To znamená, že při odpovědi, že daný prvek do množiny nepatří, se dá na Bloomův filtr spolehnout na 100 %. Pravděpodobnost chyby roste s větším počtem prvků v dané množině (při pevné velikosti reprezentace).

Bloomův filtr se používá v různých aplikacích. Například, databázový systém Big Table od společnosti Google používá Bloomův filtr na redukování vyhledávání na disku. Před tím, než vůbec zpracuje požadavek, ověří si pomocí Bloomova filtru, zda daný řádek anebo sloupec databáze existuje (tj. zda patří do množiny reprezentované Bloomovým filtrem). Kvůli charakteru možných chyb při použití Bloomova filtru se nikdy nemůže stát, že by "přehlédnul" existující záznam. Tím se výrazně zvyšuje výkon databázového systému (při neexistujících záznamech nemusí pokaždé číst z disku) při zachování stoprocentní spolehlivosti.[2] Bloomovy filtry používá také proxy server Squid pro tzv. cache digests [3] a archivační systém Venti na detekování předtím vloženého obsahu.[4]

Popis algoritmu

Příklad Bloomova filtru reprezentujícího množinu {x, y, z}. Barevné šipky ukazují na pozice v bitové poli, kde jsou na základě hašovacích funkcí přiřazeny všechny prvky množiny. Množina {x, y, z} neobsahuje prvek w, protože existuje taková hašovací funkce, které hodnota je pro vstup w rovná 0. V tomto příklade je m=18 (velikost pole) a k=3 (počet hašovacích funkcí). Barva šipek určuje vstup hašovací funkce (tedy prvek univerza), pro každou barvu jsou 3 šipky odpovídající třem hašovacím funkcím (k = 3).

Prázdný Bloomův filtr (odpovídající prázdné množině) je bitové pole délky m bitů, přičemž všechny hodnoty pole jsou nastaveny na 0.

Na práci s Bloomovým filtrem je potřebné mít definovaných k různých hašovacích funkcí, přičemž každá z nich (při zachování požadavku rovnoměrného hašování) přiřadí každému prvku univerza (množina všech prvků, o kterých potenciálně můžeme chtít zjišťovat jejich příslušnost do množiny) jednu z m pozic pole.

Vložení prvku x do reprezentované množiny funguje podle následujícího algoritmu:

  1. Vypočítejme hodnotu každé z k hašovacích funkcí (označme tyto hašovací funkce h 1 h k {\displaystyle h_{1}\ldots h_{k}} ) pro argument x.
  2. Takto dostaneme hodnoty h 1 ( x ) , h 2 ( x ) , h k ( x ) {\displaystyle h_{1}(x),h_{2}(x),\ldots h_{k}(x)} , tedy nejvíc k různých hodnot.
  3. Nastavme hodnoty pole na pozicích h 1 ( x ) , h 2 ( x ) , h k ( x ) {\displaystyle h_{1}(x),h_{2}(x),\ldots h_{k}(x)} na 1.

Dotaz na nějaký prvek x (tj. otázka, zda prvek x patří do množiny anebo nepatří) funguje podle následujícího algoritmu:

  1. Vypočítejme hodnotu každé z k hašovacích funkcí (označme tyto hašovací funkce h 1 h k {\displaystyle h_{1}\ldots h_{k}} ) pro argument x (stejně jako při vkládání).
  2. Takto dostaneme hodnoty h 1 ( x ) , h 2 ( x ) , h k ( x ) {\displaystyle h_{1}(x),h_{2}(x),\ldots h_{k}(x)} , tedy nejvíc k různých hodnot (stejně jako při vkládání).
  3. Podíváme se na hodnoty pole na pozicích h 1 ( x ) , h 2 ( x ) , h k ( x ) {\displaystyle h_{1}(x),h_{2}(x),\ldots h_{k}(x)} . Pokud je aspoň jedna z nich 0, můžeme s určitostí říct, že prvek x se v množině nenachází, protože jinak by byly všechny tyto hodnoty při jeho vložení nastaveny na 1. Pokud jsou všechny tyto hodnoty 1, potom sice s určitostí nelze říct nic, ale aspoň pro menší počet prvků v množině je relativně vysoká pravděpodobnost, že prvek x se v množině nachází. Proto je výstupem algoritmu zjištění, že prvek se v množině nachází, je potřeba ale počítat s možností chyby.

Protože při dotazech na prvky mohou vznikat chyby, Bloomovy filtry se v praxi používají obzvlášť tehdy, když chyba tohoto druhu nemůže způsobit problém. Tedy například v této modelové situaci: máme nějakou proceduru, která na základě nějakého vstupu vykoná nějakou proceduru (typicky nějaké časově náročné výpočty). Výpočet ale může proběhnout úspěšně jen v případě, pokud byl vstup ještě před tímto požadavkem uživatelem vložen do nějaké databáze informací (tedy např. k rodnému číslu, které budeme považovat za vstup, musíme mít v databázi jméno, příjmení,...). V takovém případě lze říct, že vstup bude patřit do množiny, pokud o něm v dané databázi existuje záznam, v opačném případě do ní nebude patřit. V případě, že dokážeme ještě před spuštěním výpočtu určit, že vstup do této množiny nepatří, umíme ušetřit náklady na vykonání tohoto výpočtu. Na to lze použít Bloomův filtr. Pokud nastane chyba, neznamená to velký problém, protože fakt, že vstup do množiny nepatří, dokážeme zjistit i po vykonání výpočtu (pouze to bude stát nějaký výpočtový čas). V mnoha případech však chyba nenastane, a co je podstatné, nikdy nenastane v případě, že vstup skutečně do množiny patří. Bloomův filtr tedy, jak napovídá jeho název, dokáže odfiltrovat poměrně velké množství vstupů, pro které bychom výpočet spouštěli marně.

Omezení Bloomových filtrů

Asi nejpodstatnějším omezením Bloomových filtrů je, že z pochopitelných důvodů nepodporují odebírání prvků z množiny. Pokud bychom se totiž pokusili všech k hodnot daných vzpomínanými hašovacími funkcemi pro prvek x nastavit na 0, mohlo by se stát, že bychom nedopatřením odebrali také jiný prvek - libovolný prvek y, který je prvkem množiny a současně hodnota aspoň jedné hašovací funkce má pro vstup y stejnou hodnotu jako některá z těchto k hodnot. Tím by se ale porušila základní vlastnost Bloomových filtrů, že pokud prvek patří do množiny, výsledkem dotazu je vždy kladná odpověď.

Reference

V tomto článku byl použit překlad textu z článku Bloomov filter na slovenské Wikipedii.

  1. Donald Knuth. The Art of Computer Programming, Errata for Volume 3 (2nd ed.) [online]. Dostupné online. Je zde použita šablona {{Cite web}} označená jako k „pouze dočasnému použití“.
  2. CHANG, Fay; DEAN, Jeffrey; GHEMAWAT, Sanjay. Bigtable: A Distributed Storage System for Structured Data. In: Seventh Symposium on Operating System Design and Implementation. [s.l.]: [s.n.], 2006. Dostupné v archivu pořízeném dne 2010-01-03. Archivováno 3. 1. 2010 na Wayback Machine.
  3. WESSELS, Duane. Squid: The Definitive Guide. 1st. vyd. [s.l.]: O'Reilly Media, 2004. ISBN 0596001622. Kapitola 10.7 Cache Digests, s. 172. Je zde použita šablona {{Cite book}} označená jako k „pouze dočasnému použití“.
  4. Archivovaná kopie. plan9.bell-labs.com [online]. [cit. 2011-06-26]. Dostupné v archivu pořízeném dne 2014-08-28. 

Externí odkazy


Zdroj datcs.wikipedia.org
Originálcs.wikipedia.org/wiki/Bloomův_filtr
Zobrazit sloupec 

Kalkulačka - Výpočet

Výpočet čisté mzdy

Důchodová kalkulačka

Přídavky na dítě

Příspěvek na bydlení

Rodičovský příspěvek

Životní minimum

Hypoteční kalkulačka

Povinné ručení

Banky a Bankomaty

Úrokové sazby, Hypotéky

Směnárny - Euro, Dolar

Práce - Volná místa

Úřad práce, Mzda, Platy

Dávky a příspěvky

Nemocenská, Porodné

Podpora v nezaměstnanosti

Důchody

Investice

Burza - ČEZ

Dluhopisy, Podílové fondy

Ekonomika - HDP, Mzdy

Kryptoměny - Bitcoin, Ethereum

Drahé kovy

Zlato, Investiční zlato, Stříbro

Ropa - PHM, Benzín, Nafta, Nafta v Evropě

Podnikání

Města a obce, PSČ

Katastr nemovitostí

Katastrální úřady

Ochranné známky

Občanský zákoník

Zákoník práce

Stavební zákon

Daně, formuláře

Další odkazy

Auto - Cena, Spolehlivost

Registr vozidel - Technický průkaz, eTechničák

Finanční katalog

Volby, Mapa webu

English version

Czech currency

Prague stock exchange


Ochrana dat, Cookies

 

Copyright © 2000 - 2024

Kurzy.cz, spol. s r.o., AliaWeb, spol. s r.o.