Набір цілих чисел для тестування включення


10

Я шукаю хеш-функцію над множинами H (.) І відношенням R (.,.) Таким чином, що якщо A включено в B, то R (H (A), H (B)). Звичайно, R (.,.) Повинно бути легко перевірити (постійний час), а H (A) слід обчислити в лінійному часі.

Одним із прикладів H і R є:

  • H(A)=xA1<<(h(x)modk) , де k є фіксованим цілим числом, а h (x) хеш-функцією над цілими числами.
  • R (H (A), H (B)) = ((H (A) & H (B)) == H (A))

Чи є інші добрі приклади? (добре важко визначити, але інтуїтивно, якщо R (H (A), H (B)), то whp A включено до B).

Пізніше редагуйте :

  1. Я шукаю сімейство хеш-функцій. У мене багато наборів; 3 - 8 елементів у кожному наборі; 90% з них мають 3 або 4 елемента. Приклад хеш-функції, яку я дав, не дуже добре розподілений для цього випадку.
  2. Кількість бітів H (.) (У моєму прикладі k), яка повинна бути невеликою (тобто H (.), Повинна відповідати цілому чи довгій).
  3. Однією приємною властивістю R є те, що якщо H (.) Має k біт, то R (.,.) Вірно для пар (3 ^ k - 2 ^ k) / 4 ^ k, тобто. для дуже мало пар.
  4. Блум-фільтри особливо хороші для великих наборів. Я спробував використовувати BF для цієї проблеми, але оптимальні результати були лише з однією функцією.

(перехрестя від stackoverflow , я не отримав відповіді досить добре)


"whp" над чим? Чи вважаєте ви, що ваші вхідні дані надходять із певного розподілу?
Jukka Suomela

А ви справді шукаєте одну, фіксовану хеш-функцію, а не сімейство хеш-функцій?
Jukka Suomela

@Jukka: Я думаю, що він має на увазі, якщо R (H (A), H (B)), то з високою ймовірністю робимо висновок, що A є підмножиною B. Імовірність переймається випадковими виборами A і B, а також внутрішні викиди монет H і R (якщо такі є).
MS Dousti

Я шукаю сімейство хеш-функцій. Мої набори, як правило, невеликі (3 - 8 елементів кожен; 90% з них мають 3 або 4 елементи), тому приклад хеш-функції, який я дав, не дуже добре розподілений.
Олександру

Одна приємна властивість R полягає в тому, що якщо H (.) Має n біт, то R (.,.) Вірно для пар (3 ^ n - 2 ^ n) / 4 ^ n, тобто. для дуже мало пар.
Олександру

Відповіді:


10

(Ця відповідь спочатку була в коментарях, але я рухаю її окремою відповіддю за пропозицією Суреша.)

Для вашої програми з дуже маленькими наборами ви, мабуть, хочете, щоб кількість хеш-функцій Bloom було досить великим, щоб мінімізувати кількість помилкових позитивних результатів. Для економії часу на обчислення пропоную наступний варіант фільтра Блюма. Припустимо, у вас є три традиційні хеш-функції , , для елементів, що створюють бітові рядки. Хешируйте кожен елемент на біт і з цих трьох хеш-функцій. Отримані хеші елементів будуть приблизноkh1h2h3m23=1/8thті. Кожен набір слід розмістити на бітах або хешах його складових елементів. Оскільки у ваших наборах є 3-8 елементів, отримані хеши будуть знаходитись поблизу половини, що, мабуть, саме ви хочете найкращим чином зменшити помилковий показник.

Відмінність наведеної схеми від традиційного фільтра Блума аналогічна різниці між класичною Ердосовою моделлю випадкових графів та випадковими -регулярними графами. Наведена схема має ефективне число хемів Bloom дещо відрізняється від середнього значення але досить велике, тому ця різниця не має значення.Gn,pdkm/8m/8


Це особливо добре для великих m (32 або 64), як ви запропонували.
Олександру

4

Я б спробував використовувати фільтр Bloom як ваш хеш із співвідношенням, таким же, як і ваша пропозиція. Обчислення найкращого розміру фільтра та кількості хеш-функцій для вашої програми не повинно бути занадто важким; див. статтю фільму Вікіпедії про фільм для натхнення. Залежно від того, наскільки сильно ви хочете уникнути помилкових позитивних результатів, може бути достатньо чогось типу і .mkm=64k=4


Для вашої програми з дуже маленькими наборами ви, мабуть, хочете досить великі. Це може бути досить повільним при традиційному підході. Я замість цього пропоную наступне. k
Воррен Шуді

(Продовження попереднього коментаря) Це, по суті, різновид фільтрів Bloom. Припустимо, у вас є три хеш-функції , , для елементів, що створюють бітові рядки. Хеш-елемент до бітових і цих трьох. Отримані хеші матимуть приблизно 1/8 секунди. Накладіть набір на бітові або хеши складових його елементів. Оскільки у ваших наборах є 3-8 елементів, отримані хеші матимуть близькості половини, що, ймовірно, допоможе утримати помилковий позитивний показник. h1h2h3m
Warren Schudy

Перевага цього варіанту полягає лише в тому, що він дозволяє краще використовувати паралелізм, притаманний словам операцій, які мають більшість комп'ютерів.
Warren Schudy

Воррен, ти повинен опублікувати це як відповідь. Заслуговує на деякі голоси
Суреш Венкат

2
@Warren, @Suresh: Я думаю, було б більше сенсу поєднати ці два тісно пов'язані відповіді, а потім видалити коментарі. Це було б простіше слідувати, зокрема, оскільки одна з відповідей стосується параметрів, визначених в іншій.
Jukka Suomela
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.