Автор работы: Пользователь скрыл имя, 23 Сентября 2012 в 22:25, курсовая работа
Хеширование – это преобразование множества ключей, которые однозначно определяют хранимые элементы, на подмножества элементов, обладающие определенным свойством. Данное свойство описывается хеш-функцией, и называется хеш-адресом. Для реализации обратной задачи используются хеш-таблицы: по хеш-адресу они обеспечивают быстрый доступ к нужному элементу. В идеале для задач поиска хеш-адрес должен быть уникальным, чтобы за одно обращение получить доступ к элементу, характеризуемому заданным ключом (идеальная хеш-функция).
Введение 3
Открытая адресация 4
Линейная адресация 5
Квадратичная адресация 5
Двойное хеширование 5
Анализ хеширования с открытой адресацией 6
Заключение 7
Приложение (демонстрационная программа) 7
Список литературы: 8
Факультет ПМ - ПУ
Курсовая работа
по дисциплине
«Дискретная математика»
Открытая адресация. Двойное хеширование. Анализ открытой адресации с двойным хешированием
Выполнил: студент 109 гр.
Капустинский К.В..
ассистент кафедры МТМПСУ Пешехонов К.А..
Санкт-Петербург
2012
Содержание
Введение 3
Открытая адресация 4
Линейная адресация 5
Квадратичная адресация 5
Двойное хеширование 5
Анализ хеширования с открытой адресацией 6
Заключение 7
Приложение (демонстрационная программа) 7
Список литературы: 8
В повседневной жизни мы довольно-таки часто сталкиваемся с хешированием: словари и текстовые редакторы, списки Web-ссылок в браузерах, компиляторы (таблицы символов).
Хеширование – это преобразование множества ключей, которые однозначно определяют хранимые элементы, на подмножества элементов, обладающие определенным свойством. Данное свойство описывается хеш-функцией, и называется хеш-адресом. Для реализации обратной задачи используются хеш-таблицы: по хеш-адресу они обеспечивают быстрый доступ к нужному элементу. В идеале для задач поиска хеш-адрес должен быть уникальным, чтобы за одно обращение получить доступ к элементу, характеризуемому заданным ключом (идеальная хеш-функция). Однако на практике идеал приходится заменять компромиссом и исходить из того, что получающиеся наборы с одинаковым хеш-адресом содержат более одного элемента.
По словам Дональда Кнута, впервые хеширование предложил Г.П. Лан при создании внутреннего меморандума IBM в январе 1953 г. с целью использовать метод цепочек для предотвращения коллизий. Примерно в это же время была высказана идея открытой адресации. В печати хеширование впервые было описано А. Думи в 1956 году. В 1957 А.П. Ершов разработал и описал метод линейной открытой адресации. Также можно отметить работу Петерсона, определил открытую адресацию в общем случае, провел анализ характеристик равномерного хеширования, изучал использование открытой адресации на различных задачах. В 1963 г. Вернер Букхольц опубликовал наиболее основательное исследование хеш-функций.
К концу 60х годов прошлого века линейная адресация была единственным известным типом открытой адресации, хотя и были разработки других схем, основанных на неоднократном применении независимых хеш-функции. В течение нескольких последующих лет хеширование стало широко использоваться. Работа Роберта Морриса привела к созданию открытой адресации с двойным хешированием.
Далее будут рассмотрены один из видов разрешения коллизий: открытая адресация, ее разновидности, метод двойного хеширования, примеры задач с ее использованием.
Хеш-функция – это некая функция h(K), которая по некоторому ключу K возвращает позицию элемента в хеш-таблице, чтобы получить информацию, связанную с K. Например, K – номер банковского счета человека, а искомая информация – его имя. Хеш-функция в данном примере позволит узнать имя человека, которому принадлежит данный счет.
Коллизия – это ситуация, когда хеш-функция от двух разных ключей возвращает одно и то же значение. Возникает необходимость поиска нового места для хранения данных. В связи с этим ставится задача минимизировать количество коллизий. Рассмотрим один из способов более подробно
В отличие от метода цепочек, где все элементы, которым соответствует одно и то же значение хеш-функции, связываются в цепочку-список, при открытой адресации списков нет, а все элементы хранятся в самой хеш-таблице. То есть каждая ячейка таблицы содержит либо элемент, либо значение NULL. Таким образом, хеш-таблица может оказаться заполненной, что сделает невозможным добавление новых элементов. Однако достоинство открытой адресации в том, что она позволяет полностью отказаться от указателей. Это дает возможность использовать хеш-таблицы больших размеров, а также уменьшает количество коллизий при тех же затратах памяти, что и при использовании метода цепочек.
При выполнении вставки элемента, в случае, если ячейка с вычисленным индексом занята, необходимо проверять следующие записи таблицы по порядку до тех пор, пока не будет найден ключ К или пустая позиция в таблице. Для этого в исходную хеш-функцию добавляется еще один аргумент-номер исследования. То есть для каждого ключа К последовательность исследований <h(k,0), h(k,1), … ,h(k,m-1)>, где h(k, i)- хеш-функция, должна представлять собой перестановку множества <0,1, …, m-1>.
Пример: Пусть задана последовательность чисел: data={59,70,96,81,13,41,79}. И дана хеш-функция h(data, i)=data%10, то есть остаток от деления на 10. Размер хеш-таблицы m = 10. На основании исходных данных заполняем таблицу.
Общее число проб такого метода от 1 до n - 1 пробы на элемент, где n - размер хеш-таблицы
Для открытой
адресации обычно используют 3 метода
вычисления последовательностей
Основная идея этого метода заключается в последовательном исследовании ячеек хеш-таблицы с интервалом t между ними. То есть используется хеш-функция вида:
h(k,i)=(h’(k)+it)mod m, где h’(k) – вспомогательная хеш-функция. Для данного ключа k она задает первую исследуемую ячейку. Затем исследуется ячейка [h’(k)+i*t] и так далее до [m-1]. Далее осуществляется переход в начало хеш-таблицы и исследование ячеек [0], [1] до [h’(k)-1].
Представленное исследование не сложно в реализации, однако с ним связана проблема первичной кластеризации: После добавления большого количества элементов в таблицу, возникает конфликт между новыми элементами и уже имеющимися, что в свою очередь заметно увеличивает время поиска. Кластеры возникают вследствие того, что вероятность заполнения ячейки, которой предшествуют i заполненных, равна (i+1)/m. Если же кластер начинает расти, то его рост продолжается до тех пор, пока он не дойдет до соседнего кластера. Затем два кластера соединяются, создавая новый кластер еще большего размера, который соответственно растет еще быстрее, сливается с другими кластерами и так далее.
Квадратичное исследование использует хеш-функцию вида: h(k,i)=(h’(k)+c1i+c2i2)mod m,
где h’(k) – вспомогательная хеш-функция, а c1, c2 – некоторые, не равные нулю, константы. h’(k) так же задает начальную ячейку исследования, а остальные определяются величинами, которые описаны квадратичной зависимостью от номера исследования. Данные способ работает много лучшего линейного пробирования, хотя и приводит к более мягкой вторичной кластеризации. Это происходит из-за того что если два ключа имеет одинаковую стартовую ячейку для исследования, то последовательности исследования будут также одинаковы. То есть из h1(k,0)=h2(k,0) => h1(k,i)=h2(k,i).
Двойное хеширование представляет собой наилучший способ использования открытой адресации, поскольку получаемые перестановки максимально приближенны к случайным. Основа метода состоит в том, что включении или поиске ключа в хеш-таблице, к ключу применяется вторичная хеш-функция, значение которой указывает циклическое смещение от текущего индекса к ячейке, в которую следует вставить требуемый элемент.
Сама хеш-функция имеет вид: h(k,i)=(h1(k)+ih2(k))mod m, где h1(k) и h2(k) – вспомогательные хеш-функции. В отличие от линейного и квадратичного пробирований, последовательность исследований зависит от ключа k по двум параметрам: выбор стартовой ячейки и расстояние между двумя исследуемыми. Двойное хеширование также превосходит линейное и квадратичное в плане количества исследований(Ɵ(m2) при двойном хешировании, и Ɵ(m) при линейном и квадратичном), так как пара (h1(k), h2(k)) дает практически уникальную последовательность исследований.
Рассмотрим на примере. Пусть дана хеш-таблица размером m=20 и 2 вспомогательные хеш-функции: h1(k)=k mod 15 и h2(k)=2+(k mod 12)
Хеш-таблица(m=20)
Индекс ячейки |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
… |
19 |
20 |
Элемент |
61 |
103 |
20 |
37 |
16 |
Для охвата всей таблицы требуют, чтобы h2(k) была взаимно простой с размером таблицы. Один из способов: выбрать в качестве m простое число и реализовать функцию h2(k) таким образом, чтобы она возвращала натуральные значения, меньше m.
Анализ хеширования с открытой адресацией выполняется при помощи коэффициента заполнения a=n/m, где n – количество элементов в таблице, а m – размер хеш-таблицы. Так как при открытой адресации на одну ячейку не может приходиться более одного элемента, следовательно, n ≤ m,а значит a ≤ 1. Анализ будем проводить из предположения равномерного хеширования. И для начала рассмотрим количество исследований в случае неуспешного поиска:
При
неуспешном поиске каждая последовательность
исследований завершается на пустой
ячейке. Обозначим за T количество исследований при неуспешном
поиске и за Ai - событие, обозначающее,
что i-е
исследование пришлось на занятую ячейку.
Следовательно, событие {T≥i}=A1∩A2∩…Ai. Для дальнейшего анализа
ограничим вероятность {A1∩A2∩…Ai}, а, следовательно, и {T≥i}. Вероятность {A1}=n/m. Соответственно вероятность того,
что j-е
исследование будет произведено над занятой
ячейкой = (n-j+1)/(m-j+1)
(C учетом того, что (j-1) исследование также были произведены
над заполненными ячейками). Так как количество
элементов в таблице не может превосходить
ее размеры, то получаем что (n-j+1)/(m-j+1) ≤ n/m. Обобщая полученный факт для всех i, приходим
к выводу: вероятность {T≥i} = ∙ ∙…∙ ≤ = .
Следовательно, математическое ожидание
количества исследований представимо
в виде: ≤ = = .
Вторым
пунктом анализа будет
Заключение
Исходя из представленных выше фактов и результатов анализа математических ожиданий последовательностей исследований, можно сделать вывод:
Как логическое продолжение данной работы, будет представлен набор из программ и задач, которые в той или иной степени раскрывают особенности, как двойного хеширования, так и открытой адресации в целом: