Алгоритмы и структуры...

Post on 05-Oct-2020

7 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

(с) Глухих Михаил Игоревич, glukhikh@mail.ru

Таблица

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

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

Операции

Search (Key)

Insert (Key, Value)

Remove (Key)

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

2

Виды таблиц

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

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

3

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

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

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

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

4

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

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

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

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

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

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

5

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

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

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

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

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

Недостатки?

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

6

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

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

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

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

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

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

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

7

Виды таблиц

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

Хэш-таблицы

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

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

8

Виды таблиц

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

Хэш-таблицы

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

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

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

НО! Коллизии

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

9

Виды таблиц

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

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

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

10

Виды таблиц

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

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

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

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

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

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

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

11

Виды таблиц

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

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

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

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

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

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

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

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

12

Виды таблиц

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

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

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

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

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

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

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

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

13

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

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

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

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

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

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

14

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

HASH-INSERT: пример

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

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

NN NN NN NN NN NN NN NN

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

16

HASH-INSERT: пример

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

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

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

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

17

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

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

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

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

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

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

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

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

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

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

25

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

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

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

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

26

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

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

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

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

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

27

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

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

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

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

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

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

28

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

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

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

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

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

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

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

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

29

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

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

30

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

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

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

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

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

31

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

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

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

Итоги

Рассмотрено

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

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

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

Далее

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

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

33

top related