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

Побудова таблиць ідентифікаторів на основі хеш-функцій

Існують різні варіанти хеш-функцій. Отримання результату хеш-функції - «хешування» - зазвичай досягається за рахунок виконання над Це ¬ ниркою символів деяких простих арифметичних і логічних операцій.Найпростішою хеш-функцією для символу є код внутрішнього пред ¬ дання в комп'ютері літери символу. Цю хеш-функцію можна використовувати і для ланцюжка символів, вибираючи перший символ у ланцюжку.Так, якщо двійкове ASCII-представлення символу А є двійковий код 001000012, то результатом хе ¬ шірованія ідентифікатора АТаИе буде код 001000012.

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

Природно, що хеш-функція, яка припускає колізії, не може бути напря ¬ ну використана для хеш-адресації в таблиці ідентифікаторів. Причому дос ¬ таточно отримати хоча б один випадок колізії по всьому безлічі ідентифі ¬ Катор, щоб такий хеш-функцією не можна було користуватися безпосередньо.Але в прикладі взята сама елементарна хеш-функція. А чи можливо побудувати хеш-функцію, яка б повністю виключала виникнення колізій?Очевидно, що для повного виключення колізій хеш-функція повинна бути взаємно однозначною: кожному елементу з області визначення хеш-функції має відповідати одне значення з її безлічі значень,і кожному значенню з безлічі значень цієї функції повинен відповідати тільки один елемент з області її визначення.Тоді будь-яким двом елементам довільним з області визначення хеш-функції будуть завжди відповідати два різних її значення.Теоретично для ідентифікаторів таку хеш-функцію побудувати можна, так як і область визначення хеш-функції (всі можливі імена ідентифікаторів), і область її значень (цілі неотріца ¬ тільні числа) є нескінченними рахунковими множинами.Теоретично можна організувати взаємно однозначне відображення одного рахункового безлі ¬ ства на інше, але практично це зробити виключно сложно1. Практично існує обмеження, що робить створення взаємно однозначної хеш-функції для ідентифікаторів неможливим.Справа в тому, що в реальності область значень будь хеш-функції обмежена розміром доступного адресного простору в даній архітектурі комп'ютера.При організації хеш-адресації значення, яке використовується в якості адреси таблиці ідентифікаторів, не може виходити за межі, задані розрядністю адреси компьютера2. Безліч адрес будь-якого комп'ютера з традиційною архітектурою може бути велике, але завжди звичайно, тобто обмежена.Організувати взаємно однозначне отобра ¬ ються нескінченної кількості на кінцеве навіть теоретично неможливо.Мож ¬ но врахувати, що довжина прийому до уваги частини імені ідентифікатора в ре ¬ альних компіляторах також практично обмежена - зазвичай вона лежить в преде ¬ лах від 32 до 128 символів (тобто і область визначення хеш-функції кінцева).Але і тоді кількість елементів в кінцевому безлічі, що становить область визначення функції, буде перевищувати їх кількість в кінцевому безлічі області значень функції (кількість всіх можливих ідентифікаторів все одно більше кількості допустимих адрес в сучасних комп'ютерах).Таким чином, створити взаємно однозначну хеш-функцію практично ні в якому ва ¬ риант неможливо. Отже, неможливо уникнути виникнення колізій. Для вирішення проблеми колізії можна використовувати багато способів. Одним з них є метод рехешірованія (або розстановка).Згідно з цим мето ¬ ду, якщо для елемента А адреса h (A), обчислений за допомогою хеш-функції h, вказує на вже зайняту комірку, то необхідно обчислити значення функції n (= h ((A) і перевірити зайнятість комірки за адресою п (.Якщо і вона зайнята, то ви ¬ обчислюється значення h2 (A) і так до тих пір, поки або не буде знайдена вільна комірка, або чергове значення h, (A) збіжиться з h (A).В останньому випадку вва ¬ шається, що таблиця ідентифікаторів заповнена, і місця в ній більше немає - ви ¬ дається інформація про помилку розміщення ідентифікатора в таблиці. Таку таблицю ідентифікаторів можна організувати за наступним алгоритми ¬ му розміщення елементу:

Крок 1.Обчислити значення хеш-функції n = h (A) для нового елемента А. Крок 2. Якщо осередок за адресою п порожня, то помістити в неї елемент А і завер ¬ шити алгоритм, інакше i: - 1 і перейти до кроку 3.

Крок 3. Обчислити n, = h, (A).Якщо осередок за адресою щ порожня, то помістити в неї елемент А і завершити алгоритм, інакше перейти до кроку 4.

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

Можна, звичайно, організувати адресацію з використанням зовнішніх накопичувачів для організації віртуальної пам'яті, але накладні витрати для такої адресації будуть дуже великі. І навіть у такому варіанті адресний простір ніколи не буде біс ¬ кінцевим.

Крок 4.Якщо п = п "то повідомити про помилку і завершити алгоритм, інакше i: = i + 1 і повернутися до кроку 3.

Тоді пошук елемента А в таблиці ідентифікаторів, організованої таким об ¬ разом, буде виконуватися за наступним алгоритмом:

Крок 1. Обчислити значення хеш-функції n = h (A) для шуканого елемента А. Крок 2.Якщо осередок за адресою п порожня, то елемент не знайдений, алгоритм завер ¬ шен, інакше порівняти ім'я елемента в комірці п з ім'ям шуканого елемента А. Якщо вони збігаються, то елемент знайдений і алгоритм завершений, інакше i 1 і пе ¬ рейти до кроку 3.

Крок 3. Обчислити n, = h, (A).Якщо осередок за адресою п, пуста, або п = п "то еле ¬ мент не знайдений і алгоритм завершений, інакше порівняти ім'я елемента в комірці п, з ім'ям шуканого елемента А. Якщо вони збігаються, то елемент знайдений і алго ¬ ритм завершений, інакше i: = i + 1 і повторити крок 3.

Алгоритми розміщення та пошуку елемента схожі по виконуваних операціях. Тому вони будуть мати однакові оцінки часу, необхідного для їх ви ¬ нання.

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

Для організації таблиці ідентифікаторів за методом рехешірованія необ ¬ хідно визначити всі хеш-функції h, для всіх i.Найчастіше функції h, оп ¬ ределяют як деякі модифікації хеш-функції h. Наприклад, найпростішим методом обчислення функції h, (A) є її організація у вигляді h, (A) = (h (A) + р,) mod Nm, де р, - деяке обчислюване ціле число, a Nm - максимальне значення з області значень хеш-функції h.У свою чергу, найпростішим підходом тут буде покласти Pi - i. Тоді отримуємо формулу h, (A) = (h (A) + i) mod Nm.У цьому випадку при збігу значень хеш-функції для будь-яких елементів пошук вільного осередку в таблиці починається після ¬ послідовно від поточної позиції, заданої хеш-функцією h (A).Цей спосіб не можна визнати особливо вдалим - при збігу хеш-адрес елементи в таблиці починають групуватися навколо них, що збільшує число необхідних порівнянь при пошуку і розміщенні.Середній час пошуку елементів ¬ та в такій таблиці в залежності від кількості операцій порівняння можна оцінити таким чином [17]:

Т "- 0« 1 - Lf / 2) / (l - Lf)).

Тут Lf - (load factor) ступінь заповнювання таблиці ідентифікаторів - від ¬ носіння числа зайнятих клітинок N таблиці до максимально допустимому числу елементів у ній: Lf = N / Nm.

Розглянемо як приклад ряд послідовних елементів таблиці: щ, п2, П3, П4, П5 і ряд ідентифікаторів, які треба розмістити в ній: АЬ А2, А3, А4, А5 за умови, що h (A () = h (A2) = h (A5) = n (; h (A3) = n2; h (A4) = n4.Последова ¬ ність розміщення ідентифікаторів у таблиці при використанні простої ¬ го методу рехешірованія показана на рис. 2.4.У підсумку після розміщення в таблиці для пошуку ідентифікатора А (потрібно 1 порівняння, для А2 - 2 порівняння, для А3 - 2 порівняння, для А4 - 1 порівняння і для А5 - 5 порівнянь.