#11. Хеш-таблицы (Карпенко Т).pptx
- Количество слайдов: 19
Хеш-таблицы
Таблицы с прямой адресацией • Предположим, что приложению требуется пространство возможных ключей U={0, 1, …, m-1} и пространство реальных ключей K. • Если m мало и никакие два элемента не имеют одинаковых значений, тогда реализуем пространство в виде таблицы с прямой адресацией T[0, 1, …, m-1]. • Элемент с ключом k хранится в ячейке k. • Т 2
Таблицы с прямой адресацией. Словарные операции Direct_Address_Search(T, к) return T[k] int Direct_Address_Search return T[k] ; } Direct_Address_Insert(T, х) Т[key[х]] х void Direct_Address_Insert (int х){ Т[key[х]] = х ; } Direct_Address_Delete(T, х) Т[key[х]] NIL void Direct_Address_Delete (int х){ Т[key[х]] = NIL; } (int k){ 3
Хеш-таблицы • Предположим, что приложению требуется пространство возможных ключей U={0, 1, …, m-1} и пространство реальных ключей K. • Если m велико и пространство K гораздо меньше пространства U, тогда реализуем пространство в виде хеш -таблицы T[0, 1, …, m-1]. • Элемент с ключом k хранится в ячейке h(k). 4
Хеш-таблицы. Решение коллизий при помощи цепочек • Элементы k 2 и k 5 отображаются в одну и ту же ячейку, вызывая коллизию • Объединим все элементы хешированные в одну и ту же ячейку, в связанный список • Ячейка j содержит указатель на заголовок списка элементов, для которых j = h(k) 5
Хеш-таблицы. Реализация словарных операций Chained_Hash_Insert(T, x) void Chained_Hash_Insert(struct elem *x) { int j = h(x->key); Вставить х в заголовок списка T[h(key[x])] x->next = T[j]; T[j] = x; } Chained_Hash_Search(T, к) struct elem *Chained_Hash_Search(int k) { struct elem *x; Поиск элемента с ключом k в списке T[h(k)] x = T[h(k)]; while (x != NIL && x->key != k) x = x->next; return x; } 6
Хеш-таблицы. Реализация словарных операций Chained_Hash_Delete(T, x) Удаление х из списка T[h(key[x])] void Chained_Hash_Delete(int k) { struct elem *x, *prev; x = T[h(k)]; if (x->key == k) { T[h(k)] = x->next; free(x); } else { do { prev = x; x = x->next; } while (x != NIL && x->key != k); if (x->key == k) { prev->next = x->next; free(x); } else printf("Element not found!n"); 7 } }
Хеш-функция • Функция h, что отображает пространство ключей U на ячейки хеш-таблицы T[0, 1, …, m-1] называется хешфункцией • Построение: – степени 2; , m – простое число, далекое от , – , m – равное степени 2, 8
Открытая адресация • Откажемся от указателей. • Освободившеюся память, используем для увеличения хеш-таблицы T[0, 1, …, m-1] 0 m-1 Т 9
Открытая адресация. Хеш-функция • Для выполнения операций над хеш-таблицей T[0, 1, …, m -1], используется хеш-функция • Построение: где , вспомогательные хеш-функции. 10
Открытая адресация. Словарные операции Hash_Insert(T, k) int Hash_Insert(int k) { 1 int i, j; 1 i 0 2 repeat j 3 if T[j] = NIL 4 then T[j] k 5 return j 6 else i i +1 7 until i = m 2 3 4 5 6 7 8 10 i = 0; do { j = h(k, i); if (T[j]==NIL || T[j]==DELETED){ T[j] = k; return j; } else i++; } while (i != m); 8 error "Хеш-таблица переполнена" 11 } return OVERFLOW; h(k, i) 11
Открытая адресация. Вставка элемента. Пример • Пусть имеем пространство реальных ключей K={13, 2, 7}. Сохраним их в хеш-таблице Т[0, …, 4]. • Для определения ячеек будем использовать хеш-функцию , где • Подставив, имеем m=5, i={0, …, 4} , 12
Открытая адресация. Вставка элемента. Пример 13
Открытая адресация. Вставка элемента. Пример 14
Открытая адресация. Вставка элемента. Пример 15
Открытая адресация. Вставка элемента. Пример 16
Открытая адресация. Вставка элемента. Пример 17
Открытая адресация. Вставка элемента. Пример 18
Открытая адресация. Словарные операции Hash_Search(T, k) i 0 repeat j int Hash_Search(int k) { int i, j; i = 0; do { j = h(k, i); if (T[j] == k) return j; i++; } while (T[j] != NIL && i < m); h(k, i) if T[j] = k then return j i i +1 until T[j]=NIL или i=m return NIL; } 19
#11. Хеш-таблицы (Карпенко Т).pptx