41
правка
Изменения
Нет описания правки
[[Файл:filter.png|350px500px|thumb|right|Фильтр используется для ускорения ответов в хранилище ключ-значение. Пары ключ-значение содержатся в хранилище с медленным доступом. Фильтр отфильтровывает ненужные запросы в хранилище (запрос ключа которого точно нет в хранилище), что ускоряет его работу вцелом, но увеличевает потребление памяти]]
'''Quotient filter''' {{---}} вероятностная структура данных, позволяющая проверить принадлежность элемента множеству. При этом существует возможность получить ложноположительное срабатывание (элемента в множестве нет, но структура данных сообщает, что он есть), но не ложноотрицательное (элемент в множестве есть, но структура данных сообщает, что его нет).
Фильтр представляет собой [[:Хеш-таблица|хеш-таблицу]], в которой харанится часть ключа и <tex>3</tex> бита дополнительной информации. Они используются для разрешения ситуации, когда хеш различных ключей указывает на одну ячейку в хеш-таблице. В quotient filter хеш-функция возвращает <tex>p</tex> битовый хеш, последние r бит которого называются '''остатком''' (англ. ''remainder''), а <tex>q = p - r</tex> старших бит называются '''частным''' (англ. ''quotient''), отсюда название структуры Quotient filter<ref>Knuth, Donald (1973). The Art of Computer Programming:Searching and Sorting, volume 3. Section 6.4, exercise 13: Addison Wesley</ref>. Размер хеш-таблицы составляет <tex>2^q</tex>.
Пусть у нас есть ключ <tex>K</tex>, его хеш обозначим <tex>Hh(kK)</tex>, остаток <tex>H_r</tex> и частное <tex>H_q</tex>. Попробуем поместить остаток в хеш-таблицу в ячейку <tex>H_q</tex>, называемую канонической. Возможно, ячейка уже занята, так как существует шанс полных коллизий (остаток и частное разных ключей совпадают) или частичных коллизий (частное разных ключей совпадают). Когда каноническая ячейка занята, помещаем остаток в какую-то ячейку справа. Этот способ решения колизий схож с [[:Разрешение_коллизий|линейным методом разрешения колизий]].
Последовательность ячеек, имеющих одинаковые частные называется '''пробегом''' (англ. ''run''). Возможно, что начало пробега не занимает канонический слот, если он уже занят каким-то другим пробегом.
Пробег, у которого первый элемент занимает каноническую ячейку, является началом кластера. '''Кластер''' (англ. ''cluster'') {{---}} объединение последовательных пробегов, концом кластера является пустая ячейка или начало другого кластера.
Три дополнительных бита имеют следующие функции:
* бит сдвига {{---}} равен единице, если пробег сдвинут относительно канонического слота.
[[Файл:Quotient Filter.png|500px|thumb|right|Пример последовательной вставки элементов <tex> b, f, e, c, d, a</tex>]]
{| class="wikitable" border=1
|+
|0||1||0||style="text-align:left;"|Не используется.
|-align="center" bgcolor=#FFFFFF
|0||1||1||style="text-align:left;"|Ячейка содержит элемент пробега(не первый), сдвинутого относительно канонического слота.
|-align="center" bgcolor=#FFFFFF
|1||0||0||style="text-align:left;"|Ячейка содержит первый элемет пробега в его каноническом слоте.
|1||1||0||style="text-align:left;"|Не используется.
|-align="center" bgcolor=#FFFFFF
|1||1||1||style="text-align:left;"|Ячейка содержит элемент пробега(не первый), сдвинутого относительно канонического слота. Ячейка является канонической, для существующего пробега сдвинутого вправо.
|}
=== Поиск ===
Пусть мы ищем ключ <tex>K</tex>. Смотрим в его каноническую ячейку <tex>H_q</tex>. Если бит занятости не единица, то элемент точно не содержится в множестве.
<references />
== Источники информации ==
* [http://en.wikipedia.org/wiki/Quotient_filter Wikipedia — Quotient filter]