Обсуждение участника:Kurkin
Quotient filter
Определение: |
Quotient filter — вероятностная структура данных, позволяющая проверить принадлежность элемента множеству. При этом существует возможность получить ложноположительное срабатывание (элемента в множестве нет, но структура данных сообщает, что он есть), но не ложноотрицательное. |
Существует связь между размером хранилища и шансом ложноположительного срабатывания. Поддерживаются операции добавления и удаления элементов в множество. С увеличением размера хранимого множества повышается вероятность ложного срабатывания.
Структура разработана в 2011 году Бендером как замена фильтра Блума.
Описание структуры данных
Фильтр представляет собой хеш таблицу в которой харанится часть ключа и 3 бита дополнительной информации. Они используются для разрешения ситуации, когда хеш различных ключей указывает на одну ячейку в хеш таблице. В
хеш функция возвращает битовый хеш, последние r бит которого называются остаток, а старших бит называются частное (англ. quotient), отсюда название структуры Quotient filter(придумано Кнутом в The Art of Computer Programming:Searching and Sorting, volume 3. Section 6.4, exercise 13). Размер хеш таблицы составляет 2^q.Пусть у нас есть ключ
, его хеш обозначим , остаток и частное . Попробуем поместить остаток в хеш таблицу в ячейку , называемую канонической. Возможно ячейка уже занята, так как существует шанс полных коллизий (остаток и частное разных ключей совпадают) или частичных коллизий (частное разных ключей совпадают). Когда каноническая ячейка занята, помещаем остаток в какую-то ячейку справа.Последовательность ячеек имеющих одинаковые частные называется пробегом (англ. run). Возможно, что начало пробега не занимает канонический слот, если он уже занят каким-то другим пробегом.
Пробег у которого первый элемент занимает каноническую ячейку является началом кластера. Кластер (англ. cluster) — объединение последовательных пробегов, концом кластера является пустая ячейка или начало другого кластера.
Три дополнительных бита имеют следующие функции:
- — равно единице, если ячейка является канонической для некого ключа в фильтре, сохраненого необязательно в этой ячейке.
- — равно единице, если ячейка занята, но не первым элементов пробеге.
- — равно единице, если пробег сдвинут относительно канонического слота.