Page 26 - 4761
P. 26

обчислена  для  цього  елемента.  Тоді  в  ідеальному  випадку  для  розміщення  будь-якого
                  елемента  в ТІ  достатньо тільки обчислити його хеш-функцію і звернутися до потрібної
                  комірки масиву даних. Для пошуку елемента в таблиці необхідно обчислити хеш-функцію
                  для шуканого елемента і перевірити, чи не є задана нею комірка пустою (якщо не пуста –
                  елемент знайдено, якщо пуста - ні).
                         Ідентифікаторам А 1, А 2, А 3 відповідають три значення хеш-функцій n 1  , n 2  , n 3  . В
                  комірки, які адресують n 1  , n 2  , n 3 поміщається інформація про А 1, А 2, А 3 . При пошуку
                  ідентифікатора  А 2  ,  обчислюється  значення  адреси  n 2  і  вибираються  дані  з  відповідної
                  комірки таблиці.
                         Цей  метод  ефективний,  бо  час  розміщення  та  пошук  елемента  в  таблиці
                  визначається часом  на обчислення хеш-функції.
                         Недолік  :  неефективне  використання об’єму  пам’яті  під  ТІ:  розмір  масиву  для  її
                  зберігання повинен відповідати області значень хеш-функції, а реальних даних в ТІ може
                  бути менше.

                         Побудова ТІ на основі хеш-функцій
                         Є різні варіанти хеш-функцій «хешування» - як правило, можна досягти за рахунок
                  виконання  над  ланцюгом  символів  деяких  простих  арифметичних  і  логарифмічних
                  операцій.
                         Найпростіша  хеш-функція  для  символу  –  це  код  внутрішнього  представлення  в
                  компіляторі літери символа. Її можна використовувати і для ланцюга символу, вибираючи
                  перший символ.
                         Наприклад, двійкове представлення символу А – це двійковий код 001000012, то
                  результат хешування ідентифікатора А Table – код 00100012.
                         Але  ця  хеш-функція  не  є  задовільною:  при  її  виконанні  двом  різним
                  ідентифікаторам, які починаються з однієї і тієї ж букви, буде відповідати одне значення
                  хеш-функції. Тоді при хеш-адресації в одну комірку ТІ по одній і тій же адресі мають бути
                  поміщені  два  різні  ідентифікатори,  що  неможливо.  Ситуація,  коли  двом  або  більше
                  ідентифікаторам відповідає одне і те ж значення функції, називається колізією.
                         Природно,  що  хеш-функція,  яка  допускає  колізію,  не  може  напряму  бути
                  використана для хеш-адресації ТІ.
                         Отже, для повного виключення колізії хеш-функція має бути взаємно однозначною:
                  кожному елементу з області визначення хеш-функції має відповідати одне значення з її
                  множини значень, і кожному значенню з множини значень цієї функції має відповідати
                  тільки один елемент з її області визначення.
                         Теоретично  для  ідентифікаторів  таку  хеш-функцію  побудувати  можна,  так  як
                  область визначення хеш-функції (всі можливі імена ідентифікаторів) і область її значень
                  (цілі  невід’ємні  числа)  є  ∞  множинами,  але  практично  дуже  важко.  Наприклад,
                  відображення для рядка символів – двійкове число, отримане шляхом конкатенації кодів
                  символів, що утворюють рядок.
                         Існує  обмеження,  яке  робить  створення  взаємно  однозначної  хеш-функції  для
                  ідентифікаторів неможливим. Область значень будь-якої хеш-функції обмежена розміром
                  доступного  адресного  простору  в  даній  архітектурі  компілятора.  (Може  організувати
                  адресацію з використанням зовнішніх накопичувачів для організації віртуальної пам’яті,
                  але накладені затрати для такої адресації будуть дуже великі). Множина адрес будь-якого
                  компілятора з традиційною архітектурою може бути великою, проте обмеженою. Можна
                  врахувати,  що  довжина  частини  імені  ідентифікатора,  яка  береться  до  уваги,  теж
                  обмежена (від 32 до 128 символів). Але й тоді кількість елементів у кінцевій множині, яка
                  складає область визначення функції, будуть перевищувати їх кількість в кінцевій множині
                  області  значень  функції  (кількість  всіх  можливих  ідентифікаторів  все  рівно  більша
                  кількості допустимих адрес в сучасних компіляторах).



                                                                24
   21   22   23   24   25   26   27   28   29   30   31