Я ищу хэш-функцию над множествами H (.) И отношением R (.,.), Чтобы, если A входит в B, то R (H (A), H (B)). Конечно, R (.,.) Должно легко проверяться (постоянное время), а H (A) должно вычисляться за линейное время.
Одним из примеров H и R является:
- , где k - фиксированное целое число, а h (x) - хеш-функция над целыми числами.
- R (H (A), H (B)) = ((H (A) и H (B)) == H (A))
Есть ли другие хорошие примеры? (хорошо трудно определить, но интуитивно, если R (H (A), H (B)), тогда whp A включен в B).
Позже редактировать :
- Я ищу семейство хэш-функций. У меня много комплектов; 3 - 8 элементов в каждом наборе; 90% из них имеют 3 или 4 элемента. Пример хэш-функции, который я дал, не очень хорошо распределен для этого случая.
- Число битов H (.) (В моем примере k), которое должно быть небольшим (т. Е. H (.), Должно соответствовать целому или длинному).
- Одно приятное свойство R состоит в том, что если H (.) Имеет k битов, то R (.,.) Истинно для (3 ^ k - 2 ^ k) / 4 ^ k пар, т.е. для очень немногих пар.
- Фильтры Блума особенно хороши для больших наборов. Я пытался использовать BF для этой проблемы, но оптимальные результаты были только с одной функцией.
(кросс-пост из stackoverflow , я не получил достаточно хороший ответ)
ds.algorithms
hash-function
Александр
источник
источник
Ответы:
(Этот ответ изначально был в комментариях, но я перевожу его на отдельный ответ по предложению Суреша.)
Для вашего приложения с очень маленькими наборами вы, вероятно, захотите, чтобы число хеш-функций Блума было достаточно большим, чтобы минимизировать количество ложных срабатываний. Чтобы сэкономить время вычислений, я предлагаю следующий вариант фильтра Блума. Предположим, у вас есть три традиционные хеш-функции , , для элементов, каждый из которых генерирует битные строки. Хэш каждого элемента для побитового и этих трех хеш-функций. Полученные хэши элементов будут примерноч 1 ч 2 ч 3 м 2 - 3 = 1 / 8 т чК час1 час2 h3 m 2−3=1/8th из них. Хеш каждого набора битовый или хэши его составляющих элементов. Поскольку в ваших сетах по 3-8 элементов, полученные хэши будут соседствовать с половиной хэшей, что, по-видимому, является тем, что вы хотите наилучшим образом снизить уровень ложных срабатываний.
Разница между приведенной выше схемой традиционного фильтра Блума аналогична разнице между классической моделью случайных графов Erdos и случайными регулярными графами. Приведенная выше схема имеет эффективное число хэшей Блума, немного отличающееся от среднего значения но довольно велико, поэтому эта разница не должна иметь значения. д к м / 8 м / 8Gn,p d k m/8 m/8
источник
Я бы попробовал использовать фильтр Блума в качестве хэша с отношением, аналогичным вашему предложению. Вычисление наилучшего размера фильтра и количества хеш-функций для вашего приложения не должно быть слишком сложным; см. статью Блум-фильтра Википедии для вдохновения. В зависимости от того, насколько сильно вы хотите избежать ложных срабатываний, может быть достаточно что-то вроде и .k m = 64 k = 4m k m=64 k=4
источник