33
Алгоритмы и структуры данных Лекция 6. Таблицы. (с) Глухих Михаил Игоревич, [email protected]

Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Алгоритмы иструктуры данных

Лекция 6. Таблицы.

(с) Глухих Михаил Игоревич, [email protected]

Page 2: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица

Элемент = Ключ + Данные

Ключи у разных элементов не совпадают

Операции

Search (Key)

Insert (Key, Value)

Remove (Key)

Таблицы и деревья

2

Page 3: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Таблицы и деревья

3

Page 4: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблицы с прямой адресацией

Ключ = Целое неотрицательное число или может быть кнему преобразован (взаимно-однозначно)

Ключи не слишком большие

Таблицы и деревья

4

Page 5: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблицы с прямой адресацией

Ключ = Целое неотрицательное число или может быть кнему преобразован (взаимно-однозначно)

Ключи не слишком большие

=> Используем ключ как индекс массива, а данные хранимв этом массиве

Достоинства, Недостатки?

Таблицы и деревья

5

Page 6: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблицы с прямой адресацией

Ключ = Целое неотрицательное число или может быть кнему преобразован (взаимно-однозначно)

Ключи не слишком большие

=> Используем ключ как индекс массива, а данные хранимв этом массиве

Достоинства: трудоёмкость всюду O(1)

Недостатки?

Таблицы и деревья

6

Page 7: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблицы с прямой адресацией

Ключ = Целое неотрицательное число или может быть кнему преобразован (взаимно-однозначно)

Ключи не слишком большие

=> Используем ключ как индекс массива, а данные хранимв этом массиве

Достоинства: трудоёмкость всюду O(1)

Недостатки: ресурсоёмкость O(MaxKey)

Таблицы и деревья

7

Page 8: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Хэш-таблицы

Используем для индексации hash(key) или hash(key) % 2N

Таблицы и деревья

8

Page 9: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Хэш-таблицы

Используем для индексации hash(key) или hash(key) % 2N

В отличие от случая с прямой адресацией, здесь не требуетсявзаимной однозначности

Можем управлять размером нашего массива

НО! Коллизии

Таблицы и деревья

9

Page 10: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Хэш-таблицы: как бороться с коллизиями?

Таблицы и деревья

10

Page 11: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Хэш-таблицы: как бороться с коллизиями?

С помощью цепочек

Каждому значению кода ставится в соответствие не одна параКлюч + Значение, а несколько, объединённых в связанный список

Достоинства = Размерность исходного массива ограничивается

Недостатки = ?

Таблицы и деревья

11

Page 12: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Хэш-таблицы: как бороться с коллизиями?

С помощью цепочек

Каждому значению кода ставится в соответствие не одна параКлюч + Значение, а несколько, объединённых в связанный список

Достоинства = Размерность исходного массива ограничивается

Недостатки = При фиксированной размерности массиватрудоёмкость операций O(N) – в общем случае O(1 + N / m), где m – размерность массива

Как с этим бороться?

Таблицы и деревья

12

Page 13: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Виды таблиц

С прямой адресацией

Хэш-таблицы: как бороться с коллизиями?

С помощью цепочек

Каждому значению кода ставится в соответствие не одна пара Ключ + Значение, а несколько, объединённых в связанный список

Достоинства = Размерность исходного массива ограничивается

Недостатки = При фиксированной размерности массива трудоёмкостьопераций O(N) -- в общем случае O(1 + N / m), где m – размерностьмассива

Как с этим бороться? Понятно как – изменять размерность массивадинамически

Таблицы и деревья

13

Page 14: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Нет никаких цепочек и связанных списков

Всё хранится в едином массиве

Если есть возможность, хэш-код (по модулю) используемкак индекс в массиве

Если возникает коллизия, то сдвигаем

Таблицы и деревья

14

Page 15: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-INSERT(array[m], key)

i = hash(key) % m

start = i

do:

if (array[i] == null):

array[i] = key

return i

i = (i + 1) % m

while (i != start)

Error(“Overflow”)

Таблицы и деревья

15

Page 16: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-INSERT: пример

• Используем 3 бита хэша и массив из 8 элементов

• В качестве ключа используем символ

NN NN NN NN NN NN NN NN

Таблицы и деревья

16

Page 17: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-INSERT: пример

• Используем 3 бита хэша и массив из 8 элементов

• В качестве ключа используем символ

NN NN NN NN NN NN NN NNNN NN 2A NN NN 5B NN 7C

Таблицы и деревья

17

Page 18: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-INSERT: пример

• Используем 3 бита хэша и массив из 8 элементов

• В качестве ключа используем символ

NN NN NN NN NN NN NN NNNN NN 2A NN NN 5B NN 7C

NN NN 2A 2D NN 5B NN 7C

Таблицы и деревья

18

Page 19: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-SEARCH(array[m], key)

i = hash(key) % m

start = i

do:

if (array[i] == key):

return i

if (array[i] == null):

return null

i = (i + 1) % m

while (i != start)

return null

Таблицы и деревья

19

Page 20: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-DELETE

• Реализация «в лоб» не проходит

NN NN NN NN NN NN NN NN

NN NN 2A NN NN 5B NN 7C

NN NN 2A 2D NN 5B NN 7C

Таблицы и деревья

20

Page 21: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-DELETE

• Реализация «в лоб» не проходит

NN NN NN NN NN NN NN NN

NN NN 2A NN NN 5B NN 7C

NN NN 2A 2D NN 5B NN 7C

// Теперь стираем 2A

NN NN NN 2D NN 5B NN 7C

Таблицы и деревья

21

Page 22: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-DELETE

• Реализация «в лоб» не проходит

NN NN NN NN NN NN NN NN

NN NN 2A NN NN 5B NN 7C

NN NN 2A 2D NN 5B NN 7C

// Теперь стираем 2A

NN NN NN 2D NN 5B NN 7C

// И ищем 2D – NOT FOUND!!!

Таблицы и деревья

22

Page 23: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-DELETE

• А как «не в лоб»? Отдельный вариант “DD” -- DELETED

NN NN NN NN NN NN NN NN

NN NN 2A NN NN 5B NN 7C

NN NN 2A 2D NN 5B NN 7C

// Теперь стираем 2A

NN NN DD 2D NN 5B NN 7C

Таблицы и деревья

23

Page 24: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

HASH-DELETE

• А как «не в лоб»? Отдельный вариант “DD” – DELETED

• И при поиске DD не считается null

NN NN NN NN NN NN NN NN

NN NN 2A NN NN 5B NN 7C

NN NN 2A 2D NN 5B NN 7C

// Теперь стираем 2A

NN NN DD 2D NN 5B NN 7C

Таблицы и деревья

24

Page 25: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Трудоёмкость операций зависит от коэффициентазаполнения A = n / m (n = число элементов, m = размерность масссива)

Таблицы и деревья

25

Page 26: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Трудоёмкость операций зависит от коэффициентазаполнения A = n / m (n = число элементов, m = размерность масссива)

И равна ~ 1 / (1 – A) для большинства операций

Таблицы и деревья

26

Page 27: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Трудоёмкость операций зависит от коэффициентазаполнения A = n / m (n = число элементов, m = размерность масссива)

И равна ~ 1 / (1 – A) для большинства операций

Например, при таблице, заполненной на четверть, мы имеем трудоёмкость 4 / 3

Таблицы и деревья

27

Page 28: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Трудоёмкость операций зависит от коэффициентазаполнения A = n / m (n = число элементов, m = размерность масссива)

И равна ~ 1 / (1 – A) для большинства операций

Например, при таблице, заполненной на четверть, мы имеем трудоёмкость 4 / 3

А наполовину – уже 2

Таблицы и деревья

28

Page 29: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Трудоёмкость операций зависит от коэффициента заполненияA = n / m (n = число элементов, m = размерность масссива)

И равна ~ 1 / (1 – A) для большинства операций

Например, при таблице, заполненной на четверть, мы имеем трудоёмкость 4 / 3

А наполовину – уже 2

А на три четверти – уже 4

И наконец, если заполнены все элементы, кроме одного, тотребуется m операций

Таблицы и деревья

29

Page 30: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Последовательности проб: как мы переходим от ячейки кячейке, если не нашли то, что нужно, в ячейке, соответствующей хэш-коду

30

Page 31: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Последовательности проб

H = hashCode % N, N = размер таблицы

Линейная: H, H+1, H+2, …, N-1, 0, 1, 2, …, H-1

Рассмотренный нами вариант

31

Page 32: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Таблица с открытой адресацией

Последовательности проб

H = hashCode % N, N = размер таблицы

Линейная: H, H+1, H+2, …, N-1, 0, 1, 2, …, H-1

Двойное хэширование: H, H+s, H+2s, … (% N), N и s – взаимно простые(обычно достигается выбором простого N или N=2P), s = anotherHashCode(key)

32

Page 33: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/06_Tables.pdfТаблица Элемент= Ключ+ Данные Ключиуразныхэлементовнесовпадают

Итоги

Рассмотрено

Таблицы и хэш-таблицы

На основе цепочек

С открытой адресацией

Далее

Графовые алгоритмы

Таблицы и деревья

33