Лекция №8. Поиск. Хэширование. Предмет "Структуры и алгоритмы обработки данных" - Presentation Transcript
Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Поиск. Хеширование
Николай Гребенщиков, www.grebenshikov.ru
Скорость поиска
• Линейный поиск - Tprepare = O(n), T f ind = O(n)
• Бинарный поиск и деревья поиска -
Tprepare = O(n · log(n)), T f ind = O(log(n))
• Но хочется быстрее - можно ли искать за O(1)
1
Прямой доступ
Если ключи ∈ {0, 1, . . . , m − 1} и различны, то множество S
можно представить в виде массива T [0..m − 1].
x,x∈S∧key[x]=k
T [k] = null, 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 A
1 1 0 1 0 1 1 k
1 0 0 1 0 1 0 0 1 1 0 0 1 1
1001010 011 0011
ignore by mod 2w h(k) 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
Открытая адресация: поиск
• Поиск - также последовательное исследование.
• Успех, когда нашли значение.
• Неудача, когда нашли пустую клетку или прошли всю таб-
лицу.
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!
перестановок последовательностей исследования таблицы неза-
висимо от других ключей..
1
Теорема. E[количество исследований] ≤ 1−α ,
где α < 1 ⇐⇒ n < m
19
Доказательство (неудачный поиск)
• Одно исследование всегда нужно. С вероятностью n/m
будет выявлена коллизия.
⇒ (n − 1)/(m − 1) ⇒ . . . ⇒ (n − i)/(m − i) ⇒ . . .
n−i n
• Заметим, что m−i < m = α для i ∈ {1, 2, 3, . . . , n − 1}
n n−1 n−2 1
• E[#probes] = 1 + m (1 + m−1 (1 + m−2 (. . . m−n . . .)))
≤ 1 + α(1 + α(1 + α(1 + α(. . . 1 + α . . .))))
≤ 1 + α + α 2 + α3 + . . .
∞
= αi
i=0
1
= 1−α
20
Скорость работы поиска в хэш-таблице при открытой
адресации
α < 1 − const ⇒ O(1)
Как же себя ведет α:
• Таблица заполнена на 50% ⇒ 2 исследования
• Таблица заполнена на 90% ⇒ 10 исследований
• Таблица заполнена на 100% ⇒ m исследований
21
Список литературы
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и
алгоритмы. - М. : Издательский дом “Вильямс”, 2000.
сс.116-127.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-
мы: построение и анализ, 2-е издание. - М. : Издатель-
ский дом “Вильямс”, 2007. сс.282-315.
22
0 comments
Post a comment