Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Поиск. Хеширование
Николай Гребенщиков, www.grebenshikov.ru
Скорость поиска
• Линейный поиск - Tprepare = O(n), T find = O(n)
• Бинарный поиск и деревья поиска -
Tprepare = O(n · log(n)), T find = O(log(n))
• Но хочется быстрее - можно ли искать за O(1)
1
Прямой доступ
Если ключи ∈ {0,1, . . . ,m − 1} и различны, то множество S
можно представить в виде массива T [0..m− 1].
T [k] =
x,x∈S∧key[x]=knull, otherwise
Операция поиска по ключу занимает время O(1)
2
Более сложные ключи
Пусть, количество элементов в множестве ограничено неболь-шим числом.
Проблемы возникают, когда:
• возможные ключи принадлежат большому множеству?Например, {0,1, . . . ,109}
• ключи не являются числами? Например, строки.
3
Хеширование
Хеш-функция - такая функция h, которая определяет ме-стоположение элементов множества S в таблице T .
x.key ∈ A⇒ h(x.key) = k
4
Коллизии
|A| > 1⇒ Коллизия. Например, h(43) = h(89) = h(112) = k
Решения коллизий:
• Метод цепочек
• Открытая адресация
5
Метод цепочек
Идея: Хранить элементы множества с одинаковым значениемхэш-функции в виде списка.
h(51) = h(49) = h(63) = i
6
Анализ метода цепочек
• Наихудший случай: если хэш-функция для всех элемен-тов множество выдает одно и то же значение.Время доступа равно Θ(n), при |S| = n.
• Средний случай: для случая, когда значения хэш-функцииравномерно распределены. Каждый ключ с равной веро-ятностью может попасть влюбою ячейку таблицы, внезависимоти от того куда попали другие ключи.Время доступа?
7
Коэффициент заполненности хэш-таблицы
Пусть дана таблицы T [0..m− 1], и в ней хранится n ключей.
Тогда, α = n/m = среднее количество ключей в ячейках таб-лицы.
Математическое ожидание времени поиска, закончив-шегося неудачей = Θ(1 + α) (вычисление значения хэш-функции + просмотри списка).
M [T (n)] = Θ(1), если α = O(1)⇔ n = O(m)
8
Выбор хэш-функции
• Ключи должны равномерно распределяться по всем ячей-кам таблицы
• Закономерность распределения ключей хэш-функцией недолжна коррелировать с закономерностями данных. (На-пример, данные - это четные числа).
Методы:
• Метод деления
• Метод умножения
9
Метод деления
h(k) = k mod m
Проблема маленького делителя m:
Пример №1. d = 2 и все ключи четные ⇒ нечетные ячейкине заполнены.
Пример №2. m = 2r ⇒ хэш не зависит от битов выше r.
10
Метод деления: хорошая эвристика
Выбирать для m простое число не близкое к степеням 2 и10.
11
Метод умножения
Пусть m = 2r, ключи являются w-битными словами.
h(k) = (A · k mod 2w) >> (w − r), где
A mod 2 = 1 ∧ 2w−1 < A < 2w
• Не следует выбирать A близко к 2w−1 и 2w
• Данный метод быстрее метода деления
12
Метод умножения: пример
m = 8 = 23, w = 7
1 0 1 1 0 0 1 A1 1 0 1 0 1 1 k
1 0 0 1 0 1 0 0 1 1 0 0 1 1
1001010︸ ︷︷ ︸ignore by mod 2w
011︸ ︷︷ ︸h(k)
0011︸ ︷︷ ︸ignore by >>(w−r)
13
Колесо остатков
k ∈ {1,2,3}
14
Разрешение коллизий: открытая адресация
• Не нужно хранить ссылки.
• Будем последовательно проверять ячейки таблиц, покане найдем пустую.
• h : U × {0,1, . . . ,m− 1} → {0,1, . . . ,m− 1}
• 〈h(k,0), h(k,1), . . . , h(k,m− 1)〉 - это перестановка 〈0,1, . . . ,m− 1〉
• n ≤ m
15
Открытая адресация: пример вставки
Пусть дана таблица A:
1 2 3 4 5 6 7 8 9 1023 45 78
Вставим k = 89:
1. h(89,0) = 3
2. h(89,1) = 2
3. h(89,2) = 9 - Успех!
16
Открытая адресация: поиск
• Поиск - также последовательное исследование.
• Успех, когда нашли значение.
• Неудача, когда нашли пустую клетку или прошли всю таб-лицу.
17
Стратегии исследования
• Линейная - h(k, i) = (h(k,0) + i) mod m.Плохо работает для заполненных областей ячек.
• Двойное хэширование - h(k, i) = (h1(k) + i · h2(k)) mod m.Обычно выбирают m = 2r и h2(k) - нечетной.
18
Анализ открытой адресации
Дополнительное допущение для равномерного хэширования:каждый ключ может равновероятно получить любую из m!
перестановок последовательностей исследования таблицы неза-висимо от других ключей..
Теорема. E[количество исследований] ≤ 11−α,
где α < 1⇐⇒ n < m
19
Доказательство (неудачный поиск)
• Одно исследование всегда нужно. С вероятностью n/mбудет выявлена коллизия.⇒ (n− 1)/(m− 1)⇒ . . .⇒ (n− i)/(m− i)⇒ . . .
• Заметим, что n−im−i <
nm = α для i ∈ {1,2,3, . . . , n− 1}
• E[#probes] = 1 + nm(1 + n−1
m−1(1 + n−2m−2(. . . 1
m−n . . .)))≤ 1 + α(1 + α(1 + α(1 + α(. . .1 + α . . .))))≤ 1 + α+ α2 + α3 + . . .
=∞∑i=0
αi
= 11−α
20
Скорость работы поиска в хэш-таблице при открытойадресации
α < 1− const⇒ O(1)
Как же себя ведет α:
• Таблица заполнена на 50% ⇒ 2 исследования
• Таблица заполнена на 90% ⇒ 10 исследований
• Таблица заполнена на 100% ⇒ m исследований
21
Список литературы
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных иалгоритмы. - М. : Издательский дом “Вильямс”, 2000.сс.116-127.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-мы: построение и анализ, 2-е издание. - М. : Издатель-ский дом “Вильямс”, 2007. сс.282-315.
22