Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсова1.doc
Скачиваний:
8
Добавлен:
10.12.2018
Размер:
273.92 Кб
Скачать

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

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

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

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

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

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

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