Чи є хеш-функція для збору (тобто, безлічі) цілих чисел, що має хороші теоретичні гарантії?


36

Мені цікаво, чи існує спосіб збереження хеша з безлічі цілих чисел, який має такі властивості, в ідеалі:

  1. Він використовує простір O (1)
  2. Його можна оновити, щоб відобразити вставку або видалення за час (O)
  3. Дві однакові колекції (тобто колекції, що мають однакові елементи з однаковими множинами) завжди повинні мати хеш-одиницю з одним і тим самим значенням, а дві окремі колекції повинні бути хеш-різними значеннями з високою ймовірністю (тобто функція є незалежною або попарно незалежною)

Початковою спробою цього було б збереження модуля виробу у випадковому простому хеші окремих елементів. Це задовольняє 1 і 2, але незрозуміло, чи задовольнило б це чи близька варіація.

Я спочатку розмістив це на StackOverflow .

* Властивості 1 і 2 можна трохи розслабити до, скажімо, O (log n) або невеликого підлінійного многочлена. Сенс полягає в тому, щоб ми могли ідентифікувати багато множин і надійно перевірити рівність, не зберігаючи самі елементи.


Яке ваше представлення щодо мультисетів? Тобто, як ви кодувати мультисети як бітовий рядок? Якщо ви дійсно хочете отримати O(1) -часові операції (незалежно від розміру мультисети), я думаю, вам слід зробити кодування явним.
Jukka Suomela

Кодування множин є неважливим. Хеш-функція повинна бути незалежною від представлення множин. Якби я використовував канонічне подання хеш-набору, то будь-який стандартний хеш на бітове представлення набору задовольняв би 3 та, ймовірно, 1, але не 2. Я повинен додати, що два рівних колекції завжди мають хеш до одного значення.
Jonderry

Що саме ви маєте на увазі під 2? Чи отримуєте ви старий набір, старий хеш-код і новий елемент, і ви хочете обчислити новий хеш-код? Або ви отримуєте лише старий хеш-код і новий елемент?
Міхай

В ідеалі вам не знадобиться старий набір. Вам навіть не потрібно виконувати запити учасників (важливо, враховуючи обмеження місця), просто тестування рівності, ймовірно, шляхом порівняння хеш-значень, що мають малу ймовірність помилкового додатного.
Jonderry

Відповіді:


17

Якщо ви вважаєте, що множини живуть у Всесвіті , вирішити вашу проблему можна з часом оновлення O ( lg u ) . Все, що вам потрібно, - це швидка хеш-функція для вектора i чисел, з швидкими "локальними оновленнями".[u]O(lgu)u

p a [ p ]h(x)=(i=1uxiai)modppa[p]a i O ( lg i ) u u O ( u / p ) p p = u 2 [ u ]iaiO(lgi)uuO(u/p) . Це можна зробити дуже маленьким, взявши достатньо великим (наприклад, і ви працюєте в "подвійній точності"). Якщо множини значно менші, ніж , можна, звичайно, почати з переміщення Всесвіту до меншої Всесвіту.pp=u2[u]

Хтось знає рішення з ймовірністю зіткнення при хешировании до діапазону ? Це повинно бути можливим.[ p ]O(1/p)[p]


0

Картер і Вегман висвітлюють це в нових хеш-функціях та їх використанні для аутентифікації та встановлення рівності ; це дуже схоже на те, що ви описуєте. По суті, комутативна хеш-функція може бути оновлена ​​по одному елементу одночасно для вставок та вилучень та збігів з високою ймовірністю в O (1).


Я думаю, що це працює лише на множинах, а не на мультисетах (як було задано питання). З Розділу 5, внизу сторінки 274: "ADD (x, S) -Додає елемент x до набору з назвою S. Ця операція може бути використана, якщо x вже є членом S."
jbapple

Ти правий; Я пропустив "мульти" частину. Здається, що хеш-функція може обробляти дублікати, хоча я не маю на це посилання.
KWillets

-2

Якість хеш-функції завжди буде залежати від властивостей елементів, які вона має хешувати. Ви можете щось про це сказати? Наприклад, ваша пропозиція щодо продукту - це, мабуть, погана хеш-функція, якщо елементи x_i вашого мультисети зазвичай мають багато невеликих простих факторів. Але ви можете вдосконалити його в цьому випадку, просто взявши добуток усіх x_i + p mod q для деяких простих чисел p і q.


1
Так, це причина взяти хеши окремих елементів, перш ніж множити їх разом.
Jonderry

Що? Пропозиція ОП - просто помножити їх усі разом, чи не так? Я кажу, що якщо ви додасте константу до кожного, перш ніж це зробити, ви, ймовірно, отримаєте кращий хеш.
TonyK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

сума дозволяє нам мати декілька входжень одного і того ж значення,
xor дозволяє нам мати множини, які підсумовують однакову суму

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.