Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
55
Добавлен:
10.02.2015
Размер:
255.49 Кб
Скачать
  1. Хеш-таблицы

Эффективность использования деревьев для поиска информации – O(log2n). Функция по значению ключа сразу определяет индекс элемента массива хранения информации, т. е. это функция, по которой можно вычислить этот индекс. Такая функция называется хеш-функцией (от to hash - крошить, рубить) и она ставит в соответствие каждому ключу (ai) индекс ячейки (j), где расположен элемент с этим ключом:

h(ai) = j, если j=(1,M),

т. е. j принадлежит множеству от 1 до M, где M.- размер массива.

Массив, заполненный в порядке, определенным хеш-функцией (хеширование) называется хеш-таблицей.

Т.О. хеш-таблица – это стр-ра данных вида ассоциативный массив, которая ассоциирует ключи со значениями. Идеально: хеш–адрес уникален для значения, тогда сложность О(1)!!! и НЕ зависит от размерности набора данных.

Иначе возникает коллизия (конфликт): один хеш–адрес для разных ключей.

2 этапа

  • построение хеш-таблицы, используя хеш-функцию;

  • использование хеш-таблицы для поиска

        1. Метод деления

Используется остаток от деления ключа (K) на M:

h(K)=K mod M

при N < M, где N – количество ключей, M – размер массива

M - Простое число!

Данная функция очень проста, хотя и не самая лучшая.

Вообще, для количества ключей равного 31 при размерности массива 41 можно создать 4131  1050 хеш-функций, т. е. поиск хорошей хеш-функции - достаточно сложная задача!

Хорошей является хеш-функция, удовлетворяющая условиям:

  • она д. б. простой с вычислительной точки зрения;

  • должна распределять ключи в хеш-таблице наиболее равномерно;

  • должна создавать минимальное число коллизий

          1. Пример1: ключи целые

ключи: 25, 19, 07, 34, 16, 61, 44, 81

массив M=11

25 Mod 11 = 3

19 Mod 11 = 8 ….

индекс

0

1

2

3

4

5

6

7

8

9

ключ

44

34

25

81

16

61

07

19

Для всех различных ключей различные индексы – бесконфликтная хеш-таблица

    1. Метод умножения (мультипликативный)

Для мультипликативного хеширования используется следующая формула:

h(K)=[M* ((C* K) mod1)]

Умножение ключа К на константу С, лежащую в интервале [0..1].

Далее берется дробная часть этого выражения и умножается на константу M, выбранную т. о., чтобы результат не вышел за границы хеш-таблицы. Оператор [ ] возвращает наибольшее целое, которое меньше аргумента.

    1. Метод сложения

Для строк переменной длины (сложение по модулю 256)

          1. Пример2: ключи строковые

ключи: END, VAR, FOR, OR, AND, NIL, BEGIN

массив M=10 (для простоты!!!)

h(END) = 69 + 78 + 68 = 215 Mod 10 = 5

h(VAR )= 233 Mod 10 = 3

h(FOR )= 70 + 79 + 82 = 231 Mod 10 = 1

h(OR )= 79 + 82 = 161 Mod 10 = 1

h(AND )=211 Mod 10 = 1

h(NIL )=227 Mod 10 = 7

h(BEGIN )=66+69+71+73+78=357 Mod 10 = 7

индекс

0

1

2

3

4

5

6

7

8

9

ключ

FOR

VAR

END

NIL

Коллизия – хеш-функция отражает 2 разных эл-та из более широкого множества в один и тот же эл-нт более узкого множества.

Метод «исключающее или»

Для строк переменной длины – аналогичен сложению, но дает разные ключи например для XYиYX(последовательно применяетсяXORк элементам строки)

    1. Устранение коллизий

    2. Метод цепочек

    3. (Открытое хеширование - внешнее)

Создается цепочка (список) элементов с одним ключем. Поиск в этом списке осуществляется простым перебором, т.к. при грамотном выборе хеш-функции любой из списков оказывается достаточно коротким.

    1. индекс

    1. ключ

    1. Указатель

    1. 0

    1. Nil

    1. Nil

    1. 1

    1. FOR

    1. н

      OR

      AND

      ачало

    1. конец

    1. 2

    1. Nil

    1. Nil

    1. 3

    1. VAR

    1. Nil

    1. Nil

    1. 4

    1. Nil

    1. Nil

    1. 5

    1. END

    1. Nil

    1. Nil

    1. 6

    1. Nil

    1. N

      BEGIN

      il

    1. 7

    1. NIL

    1. начало

    1. конец

    1. 8

    1. Nil

    1. Nil

    1. 9

    1. Nil

    1. Nil