Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spz / lect / lekc2_3_hash

.pdf
Скачиваний:
17
Добавлен:
23.02.2016
Размер:
258.09 Кб
Скачать

Системне програмне забезпечення.

11

h(A5)

n1

 

A1

FreePtr

 

 

 

n2

 

A2

 

 

n3

-

A3

-

 

n4

 

A4

-

 

n5

-

A5

-

 

5

 

 

 

Рис. Заповнення хеш-таблиці і таблиці ідентифікаторів з використанням методу ланцюжків

На мал. 13.6 проілюстроване заповнення хеш-таблиці і таблиці ідентифікаторів для приклада, що раніше був розглянутий на мал. 13.5 для найпростішого рехешування. Після розміщення в таблиці для пошуку ідентифікатора А1 буде потрібно 1 порівняння, для А2 — 2 порівняння, для А3

— 1 порівняння, для А4 — 1 порівняння і для А5 — 3 порівняння (порівняєте з результатами простого рехешуровання).

Метод ланцюжків є дуже ефективним засобом організації таблиць ідентифікаторів. Середній час на розміщення одного елемента і на пошук елемента в таблиці для нього залежить тільки від середнього числа колізій, що виникають при обчисленні хеш-функції. Накладні витрати пам'яті, зв'язані з необхідністю мати одне додаткове поле покажчика в таблиці ідентифікаторів на кожен її елемент, можна визнати цілком виправданими. Цей метод дозволяє більш ощадливо використовувати пам'ять, але вимагає організації роботи з динамічними масивами даних.

Комбіновані способи побудови таблиць ідентифікаторів

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

У реальних компіляторах практично завжди так чи інакше використовується хеш-адресація. Алгоритм застосовуваної хеш-функції звичайно складає «ноу-хау» (розроблювачів компілятора). Звичайно при розробці хеш-функції творці компілятора прагнуть звести до мінімуму кількість виникаючих колізій не на всій множині можливих ідентифікаторів, а на тих їхніх варіантах, що найбільше часто зустрічаються у вхідних програмах. Звичайно, узяти до уваги всі припустимі вхідні програми неможливо.

Системне програмне забезпечення.

12

Найчастіше виконується статистична обробка імен ідентифікаторів, що зустрічаються, на деякій множині типових вихідних програм, а також приймаються в увагу угоди про вибір імен ідентифікаторів, загальноприйняті для вхідної мови. Гарна хеш-функція — це крок до значного прискорення роботи компілятора, оскільки звертання до таблиць ідентифікаторів виконуються багаторазово на різних фазах компіляції.

Те, який конкретно метод застосовується в компіляторі для організації таблиць ідентифікаторів, залежить від реалізації компілятора. Той самий компілятор може мати навіть декілька різних таблиць ідентифікаторів, організованих на основі різних методів.

Як правило, застосовуються комбіновані методи. У цьому випадку, як і для методу ланцюжків, у таблиці ідентифікаторів організується спеціальне додаткове поле посилання. Але на відміну від методу ланцюжків воно має трохи інше значення. При відсутності колізій для вибірки інформації з таблиці використовується хеш-функція, поле посилання залишається порожнім. Якщо ж виникає колізія, то через поле посилання організується пошук ідентифікаторів, для яких значення хеш-функції збігаються по одному з розглянутих вище методів: неупорядкований список, упорядкований список або бінарне дерево. При добре побудованій хеш-функції колізії будуть виникати рідко, тому кількість ідентифікаторів, для яких значення хеш-функції збіглися, буде не настільки велике. Тоді і час пошуку одного серед них буде незначним (у принципі при високій якості хеш-функції підійде навіть перебір неупорядкованому списку).

Такий підхід має переваги в порівнянні з методом ланцюжків: для збереження ідентифікаторів зі співпадаючими значеннями хеш-функції використовуються області пам'яті, що не перетинаються з основною таблицею ідентифікаторів, а виходить, їхнє розміщення не приведе до виникнення додаткових колізій. Недоліком методу є необхідність роботи з динамічно поділюваними областями пам'яті. Ефективність такого методу, очевидно, у першу чергу залежить від якості застосовуваної хеш-функції, а в другу - від методу організації додаткових сховищ даних.

Хеш-адресація — це метод, що застосовується не тільки для організації таблиць ідентифікаторів у компіляторах. Даний метод знайшов своє застосування й в операційних системах, і в системах керування базами даних.

Соседние файлы в папке lect