Ця відповідь підсумовує частини TAoCP Vol 3, Ch 6.4.
Припустимо, у нас є набір значень , яких ми хочемо зберігати в масиві розміром . Ми використовуємо хеш-функцію ; як правило,. Ми називаємо коефіцієнт навантаження по . Тут будемо вважати природне ; У практичних сценаріях ми маємо , і нам доводиться відображати до себе.VnAmh:V→[0..M)M≪|V|α=nmm = M m ≪ M mAm=Mm≪Mm
Перше спостереження полягає в тому, що навіть якщо має однакові характеристики¹ висока ймовірність двох значень, що мають однакове хеш-значення; це, по суті, зразок сумнозвісного парадоксу дня народження . Тому нам зазвичай доведеться мати справу з конфліктами і можемо відмовитись від сподівання на найгірший час доступу.O ( 1 )hO(1)
А як із середнім випадком? Припустимо, що кожен ключ з відбувається з однаковою ймовірністю. Середня кількість перевірених записів (успішний пошук), відповідно (невдалий пошук) залежить від використовуваного методу вирішення конфлікту.C S n C U n[0..M)CSnCUn
Прикування
Кожен запис масиву містить (вказівник на голову) пов'язаних списків. Це гарна ідея, оскільки очікувана довжина списку невелика ( ), хоча ймовірність виникнення зіткнень висока. Зрештою, отримуємо
Це можна трохи покращити, зберігаючи списки (частково або повністю) всередині таблиці. C S n ≈1+αnm
CSn≈1+α2 and CUn≈1+α22.
Лінійне зондування
При вставці (відповідно пошуку значень) перевіряйте позиції
у цьому порядку до порожнього положення (відповідно ) знайдено Перевага полягає в тому, що ми працюємо локально і без вторинних структур даних; однак кількість середніх доступів розходиться для :
Однак для продуктивність порівнянна з ланцюжком².v
h(v),h(v)−1,…,0,m−1,…,h(v)+1
vα→1CSn≈12(1+11−α) and CUn≈12(1+(11−α)2).
α<0.75
Подвійний хешинг
Подібно лінійним зондуванням , але розмір кроку пошуку управляється з допомогою другого хеш - функції , яка є взаємно просте з . Офіційне виведення не наводиться, але емпіричні спостереження говорять про те, що
Цей метод був адаптований Brent; його варіант амортизує збільшені витрати на введення при дешевших пошуках.M
CSn≈1αln(11−α) and CUn≈11−α.
Зауважте, що видалення елементів із та розширення таблиць має різну ступінь складності для відповідних методів.
Знизу ви повинні вибрати реалізацію, яка добре адаптується до ваших типових випадків використання. Очікуваний час доступу в можливий, якщо не завжди гарантується. Залежно від використовуваного методу, важливим є утримання низького рівня; вам потрібно розмістити (очікуваний) час доступу порівняно з простором накладних витрат. Очевидно, хороший вибір для також є центральним.O(1)αh
1] Оскільки довільно тупі неінформовані програмісти можуть надати , будь-яке припущення щодо його якості є практичним розтягненням.
2] Зауважте, як це збігається з рекомендаціями щодо використання Java .h
Hashtable