Розділ IV. АЛГОРИТМИ
4.4.5. ХЕШ-ТАБЛИЦІ З КОЛІЗІЯМИ
Якщо множина K усіх ключів достатньо велика, то не завжди доці- льно чи взагалі можливо зберігати хеш-масив T[n], де n =|K |. До того ж
якщо в зазначеному масиві буде багато порожніх елементів (тих, з яки- ми не асоціюються рядки), то багато пам'яті витрачатиметься даремно.
Якщо кількість потенційно можливих рядків у таблиці суттєво ме- нша, ніж кількість усіх ключів, то хеш-таблиця займає менше місця порівняно з прямою адресацією, при цьому на практиці пошук у хеш- таблиці в середньостатистичному випадку залишається O(1) (рис. 4.4).
Хеш-масив
0
h(k1) h(k2)
h(k3)=h(k4)
…
m-1
Рис. 4.4
Однак виникає колізія при збігу хеш-чисел для різних ключів: два або більше рядків претендують на одне місце в хеш-таблиці. Можна спробувати задати хеш-функцію так, щоб колізій не було, але при
K>m це неможливо. Розглянемо два способи виходу із цієї ситуації:
1)відкрите, або зовнішнє, хешування (дозволяє зберігати множини
впотенційно нескінченному просторі);
2)закрите, або внутрішнє, хешування (використовує обмежений простір для збереження таблиць).
4.4.6. ВІДКРИТЕ ХЕШУВАННЯ
При відкритому хешуванні рядки таблиці з однаковими хеш-числами об'єднуються у зв'язані списки і хеш-масив містить покажчики на їхні голови (рис. 4.5). Щоб отримати доступ до певного рядка таблиці, потрі- бно знайти його хеш-число й зайти у відповідний список.
Бажано вибрати хеш-функцію h так, щоб вона приблизно рівно- мірно розподіляла рядки таблиці по списках. Зазвичай хеш-функція