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

21. Колізія, ре хешування

Ситуація, коли хеш-адреса для 2 імен різні коди, то все нормально, але якщо ні, то така ситуація називається- колізією. «Добра хеш-функція» - функція, яка розподіляє адреси імен по табл.. відносно рівномірно і колізії виникають не надто часто.

Нехай хешується ім’я S результаті хешування виникла колізія. Позначимо через h значення хеш-функції. Один із способів- знайти нову адресу за наступною схемою h1=( h+р)modN. Знаходження(повторне) нової адреси – ре хешування, це продовжуватиметься доти, поки не зустрінеться елемент hі=( h+рі)modN, який або порожній, або містить це ім’я S або є знову адресою h. Якщо hі= h, то вважається, що таблиця-повна. Способи ре хешування полягають у виборі послідовності р1,р2,…,р n. Розглянемо найрозповсюдженіші способи вибору цих чисел. Введемо параметр lf –коефіцієнт завантаження таблиці lf=n/N

Лінійне ре хешування:Рі=і. :Середнє число порівнянь при коефіцієнті lf на даний момент часу: Е=1- lf/2/1- lf. При lf=0.1 Е=1,006; при lf=0.5 Е=1,5: при lf=0.9 Е=5,5.

Випадкове ре хешування: Припустимо таблиця має розмір N=2к. Обчислення Рі проводимо за наступною схемою: а)R=1; б) Обчислюємо Рі: 1) R= R+5; 2)Виділяємо з R-молодші К+2 розряди, поміщаємо їх в R. R←(К+2) R ;3)Рі= R>>1 – R зсунуто вправо на 1 розряд. в) перейти до пункту 2 і знаходимо наступне Рі.

Середнє число порівнянь : Е=-1/ lf* log2(1- lf ).

Ре хешування додаванням: Рі=і(h+1), де h=початковий хеш-індекс, коли N-просте число.

Імя представляє собою множину символів.

22. Хеш-функціі і хеш-адресація

Логарифмічна залежність часу пошуку та часу заповнення таблиці ідентифікаторів - це найкращий результат, якого можна досягти за рахунок застосування різних методів організації таблиць. Однак у реальних вихідних програмах кількість ідентифікаторів настільки велике, що навіть логарифмічну залежність часу пошуку від їх числа не можна визнати задовільною. Необхідні більш ефективні методи пошуку інформації в таблиці ідентифікаторів. Кращих результатів можна досягти, якщо застосувати методи, пов'язані з використанням хеш-функцій і хеш-адресації. Хеш-функцією F називається деякий відображення множини вхідних елементів R на безліч цілих невід'ємних чисел Z: F(r) = n, rÎR, nÎZ.. Сам термін «хеш-функція» походить від англійського терміна «hash function» (hash - «заважати», «змішувати», «плутати»). Замість терміна «Хешування» іноді використовуються терміни «рандомізація», «переупорядочіваніе». Безліч допустимих вхідних елементів R називається областю визначення хеш-функції. Безліччю значень хеш-функції F називається підмножина M з безлічі цілих невід'ємних чисел Z: MÍZ,, що містить всі можливі значення, що повертаються функцією F: "rÎR: F(r)ÎM и "mÎM: $rÎR: F(r)=m. Процес відображення області визначення хеш-функції на безліч значень називається «хешування». При роботі з таблицею ідентифікаторів хеш-функція повинна виконувати відображення імен ідентифікаторів на безліч цілих невід'ємних чисел. Областю визначення хеш-функції буде безліч всіх можливих імен ідентифікаторів. Хеш-адресація полягає у використанні значення, що повертається хеш-функцією, як адресу комірки з деякого масиву даних. Тоді розмір масиву даних повинен відповідати області значень використовується хеш-функції. Отже, в реальному компіляторі область значень хеш-функції ніяк не повинна перевищувати розмір доступного адресного простору комп'ютера. Метод організації таблиць ідентифікаторів, заснований на використанні хеш-адресації, полягає в розміщенні кожного елементу таблиці в клітинці, адресу якої повертає хеш-функція, обчислена для цього елемента. Тоді в ідеальному випадку для розміщення будь-якого елементу в таблиці ідентифікаторів достатньо тільки обчислити його хеш-функцію і звернутися до потрібної комірці масиву даних. Для пошуку елемента в таблиці необхідно обчислити хеш-функцію для шуканого елемента і перевірити, чи не є задана нею осередок масиву порожній (якщо вона не порожня - елемент знайдений, якщо порожня - не знайдено). Спочатку таблиця ідентифікаторів повинна бути заповнена інформацією, яка дозволила б говорити про те, що всі її осередки є порожніми. Цей метод досить ефективний оскільки як час розміщення елементу в таблиці, так і час його пошуку визначаються тільки часу, що витрачається на обчислення хеш-функції, яке в загальному випадку незрівнянно менше часу, необхідного на багаторазові порівняння елементів таблиці. Метод має два очевидних недоліку. Перший з них - неефективне використання обсягу пам'яті під таблицю ідентифікаторів: розмір масиву для її зберігання повинен відповідати області значень хеш-функції, в той час як реально зберігаються в таблиці ідентифікаторів може бути істотно менше. Другий недолік - необхідність відповідного розумного вибору хеш-функції. Цьому істотного питання присвячені наступні два підпункти.

Реалізація

Struct name{

Char * srting;

Name * next;

Boudle value;}

Const TBLSIZE=26;

Name * table [TBLSIZE];

Name * findname (char * str, int ins);

// ф-я пошуку таблиці

{int hi=0;

Char * pp=str;

While(*pp){

Hi<<1;

Hi^=*pp++;}

If(hi<0) hi=-hi;

Hi %= TBLSIZE;

/*for (stremp(str,n->string)==0) return n; */

For(name *n = table[hi];n;n=n->next)

If(strcmp(str,n->string))==0

Return n;

If (ins==0) return null;

Name 8 nn=new name;

nn->string=new char[strlen(str)+1];

strcpy(nn->string, str);

nn->value=0;

nn->next=table[hi]

table[hi]=nn;

return nn;}

Ця ф-я здійснює пошук імен name, якщо ins≠0, то здійснює додавання в таблицю(імен) списків. Якщо =0 то повертає .Таблиця являє масив списків, кеш-шндексів – номер списку масиву

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]