|
2 | 2 |
|
3 | 3 | ## 1. Таблицы с вычислимым входом. Запись и поиск при переполнении (способ открытого перемешивания).
|
4 | 4 |
|
5 |
| -Функция преобразования значения ключа к номеру (адресу) строки памяти для хранения записи `H: K → L (L = { 0, ... , M - 1 })` называется функцией расстановки (хеширования, перемешивания, рассеивания) (hash - мешанина, путаница). Таблицы, представление которых организуется при использовании функции расстановки, называются таблицы с вычислимыми адресами (хеш-таблицы, перемешиваемые таблицы). Ситуация, когда для расположения записи функцией расстановки определяется уже занятая строка памяти, называется относительным переполнением (коллизией). Уменьшение эффекта сгущений может быть достигнуто при применении способа открытого или линейного перемешивания `s' = (s + p) mod M (1 <= p < M)`. Возможное решение состоит в выборе взаимнопростых значений для `M` и `p`. В более общем виде правило разрешения коллизии может быть представлено как функция вторичного перемешивания `s' = h'(s)`. |
| 5 | +### Методичка с лабами. |
6 | 6 |
|
7 |
| -Теорема: Алгоритм открытого перемешивания при взаимно-простых M и p гарантирует нахождение свободных строк структуры хранения таблицы. |
| 7 | + |
| 8 | +*Таблица* – динамическая структура данных, базисным множеством которой является семейство линейных структур из записей. |
| 9 | +*Запись* – кортеж, каждый элемент которого обычно именуется полем. |
| 10 | +*Имя записи* (ключ) – одно из полей записи, по которому обычно осуществляется поиск |
| 11 | +записей в таблице; остальные поля образуют тело записи. |
| 12 | +*Хеш-функция* – функция, ставящая в соответствие ключу номер записи в таблице. |
| 13 | + |
| 14 | +*Хеш-таблицами*, *таблицами с вычисляемыми адресами* или *перемешиваемыми таблицами* называют таблицы, получаемые при некотором способе построения. Этот способ построения таблиц при большом количестве записей состоит в предварительном (перед непосредственным поиском по таблице) вычислении месторасположения искомой записи. Данный метод предполагает наличие некоторой простой функции `h(key)`, которая отображает множество имен на множество номеров строк таблицы. Эта функция называется функцией хеширования или расстановки. |
| 15 | +Эффективность обработки табиц с вычислимым входом зависит не от количества записей, а от степени заполненности структуры хранения. |
| 16 | + |
| 17 | +При использовании таблиц с вычисляемыми адресами может возникнуть ряд дополнительных проблем. Так, например, при вставке новой записи функция расстановки может выдать номер занятой строки массива (функция расстановки может определять одни и те же значения для нескольких разных ключей). Такая ситуация называется относительным переполнением таблицы или *коллизией*. При возникновении коллизий возможны разные методы их разрешения. Рассмотрим метод *открытого перемешивания*. |
| 18 | + |
| 19 | +*Метод открытого перемешивания* (или *закрытое хеширование*) состоит в добавлении к вычисленному занятому номеру некоторого фиксированного смещения (поторное перемешивание) `k' = (k + p) mod N`; если новый адрес `k'` также является занятым, следует повторить процедуру повторного перемешивания до тех пор, пока не обнаружится свободная строка, либо таблица не будет исчерпана (если значения `p` и `N` являются взаимнопростыми, открытое перемешивание обеспечивает нахождение свободной строки массива); |
| 20 | + |
| 21 | +Среднее количество просматриваемых записей при поиске записи в перемешиваемых |
| 22 | +таблицах при предположении равной вероятности использования ключей и при |
| 23 | +использовании функции расстановки с равномерным рассеиванием ключей по строкам |
| 24 | +массива определяется следующим соотношением (разрешение коллизий по методу открытого |
| 25 | +перемешивания): `Tср = (1 - a / 2) / (1 - a)`, где: `a` - коэффициент заполненности таблицы (`a = N / M`); `M` - количество строк в массиве для хранения записей; `N` - количество записей в таблице. |
| 26 | +Следует отметить, что количество сравнений при поиске в перемешиваемых таблицах зависит не от количества записей в таблице, а от заполненности памяти, отведённой для размещения записей. Для примера, при заполненности массива на 75% (`a = 0.75`) количество сравнений в среднем равно 2.5. |
| 27 | + |
| 28 | +*** |
| 29 | + |
| 30 | +### Шпоры ПМИ |
| 31 | + |
| 32 | +Функция преобразования значения ключа к номеру (адресу) строки памяти для хранения записи `H: K → L (L = { 0, ... , M - 1 })` называется функцией расстановки (хеширования, перемешивания, рассеивания). Таблицы, представление которых организуется при использовании функции расстановки, называются таблицы с вычислимыми адресами (хеш-таблицы, перемешиваемые таблицы). При `M` < `N` (`M` - количество строк памяти, `N` - количество записей) функция расстановки является взаимно-неоднозначной (неинъективной). Темсымым, при использовании функции расстановки могут возникать ситуации, когда получаемый функцией номер строки памяти для расположения записи уже является использованным. Ситуация, когда для расположения записи функцией расстановки определяется уже занятая строка памяти, называется относительным переполнением (коллизией). Уменьшение эффекта сгущений может быть достигнуто при применении способа открытого или линейного перемешивания `s' = (s + p) mod M (1 <= p < M)`. Возможное решение нахождения свободных строк состоит в выборе взаимнопростых значений для `M` и `p`. В более общем виде правило разрешения коллизии может быть представлено как функция вторичного перемешивания `s' = h'(s)`. |
| 33 | + |
| 34 | +Теорема: Алгоритм открытого перемешивания при взаимно-простых `M` и `p` гарантирует нахождение свободных строк структуры хранения таблицы. |
8 | 35 | Доказательство: Рассмотрим множество `G = { 0, 1, ... , M - 1 }` с операцией `a ⊕ b = (a + b) mod M`. Свойства операции: `G` замкнута относительно `⊕`, операция ассоциативна и коммутативна, ∃ нулевой и обратные элементы => Множество `G` с операцией `⊕` является **группой**. Выделим подмножество `G' = { 0, a, a ⊕ a, ... }`. Такое множество `G'` с операцией `⊕` тоже является группой (такие группы называются циклическими). Обозначим `a ⊕ a ⊕ ... ⊕ a` через `na` (`a` - число повторений). Если `n > 0`, то минимальное значение `n`, при котором `na = 0`, называется порядком элемента `a` и обозначатся `|a|` (т.е. порядок определяет количество итераций открытого перемешивания, после которого начнётся повторение строк). Целое значение в операции `(n a) / M` получится только при `n = M` (т.к. `a < M` и для взаимно простых `a` и `M`). Но это означает также, что `na = 0`, и, тем самым, `|a| = M`. Отсюда следует `G = G'`.
|
9 |
| -При разрешении коллизии просматриваемые строки могут рассматриваться как список, в котором порядок следования определяется при помощи алгоритмического правила. Тем самым, удаление записи в середине подобного списка не должно разрушать связность записей. Это может быть достигнуто специальной маркировкой строк с удалёнными записями. Строка структуры хранения имеет три возможных состояния - *свободное, занятое, пустое* (пустое состояние строки возникает посе удаления хранимой в строке записи). |
10 | 36 |
|
11 |
| -**Вставка** (окончательный вариант): |
| 37 | +При открытом перемешивании размер памяти для таблицы фиксирован + хранение записей без упорядоченности по ключам. |
| 38 | + |
| 39 | +При разрешении коллизии просматриваемые строки могут рассматриваться как список, в котором порядок следования определяется при помощи алгоритмического правила. Тем самым, удаление записи в середине подобного списка не должно разрушать связность записей. Это может быть достигнуто специальной маркировкой строк с удалёнными записями. Строка структуры хранения имеет три возможных состояния - **свободное**, **занятое**, **пустое** (пустое состояние строки возникает посе удаления хранимой в строке записи). |
| 40 | + |
| 41 | +**Вставка**: |
12 | 42 | ```
|
13 | 43 | 1. Если n==M, ТО { Переполнение; Останов }
|
14 |
| -2. f=-1 // f – номер первой найденной пустой строки |
| 44 | +2. f = -1 // f – номер первой найденной пустой строки |
15 | 45 | 3. s = h(key) // применение функции расстановки
|
16 | 46 | 4. ЕСЛИ s занята и K[s]==key, ТО {Дублир.; Останов }
|
17 |
| -5. ЕСЛИ s пустая и (f<0), ТО { f = s } |
| 47 | +5. ЕСЛИ s пустая и (f < 0), ТО { f = s } |
18 | 48 | 6. ЕСЛИ s свободна и (f < 0), ТО { K[s]=key; Останов }
|
19 | 49 | 7. ЕСЛИ s свободна и (f >-1), ТО { K[f]=key; Останов }
|
20 | 50 | 8. (!) Коллизия {s = (s+p) mod M и переход к п. 4 }.
|
21 | 51 | ```
|
22 | 52 |
|
23 | 53 | **Поиск**:
|
24 | 54 | ```
|
25 |
| -1) f=-1 // f – номер первой найденной пустой строки |
| 55 | +1) f = -1 // f – номер первой найденной пустой строки |
26 | 56 | 2) s = h(key) // применение функции расстановки
|
27 | 57 | 3) ЕСЛИ s занята и K[s]==key, ТО { Останов }
|
28 |
| -4) ЕСЛИ s пустая и (f<0), ТО { f = s } |
| 58 | +4) ЕСЛИ s пустая и (f < 0), ТО { f = s } |
29 | 59 | 5) ЕСЛИ s свободна, ТО { Останов }
|
30 | 60 | 6) (!) Коллизия { s = (s+p) mod M и переход к п. 3 }.
|
31 | 61 | ```
|
| 62 | + |
| 63 | + |
32 | 64 | ## 2. Понятие линейного списка.
|
33 | 65 |
|
34 | 66 | Необходимость перепаковки для обеспечения динамического
|
|
41 | 73 | запоминанием для каждого текущего элемента структуры адреса памяти, где хранится
|
42 | 74 | следующий элемент. Интерпретация содержимого элемента памяти (значение или адрес
|
43 | 75 | следующего элемента) в самом простом варианте может быть обеспечена фиксированным
|
44 |
| -форматом используемых участков памяти. Под квантом памяти понимается |
45 |
| -последовательность элементов памяти с последовательно-возрастающими адресами. Именем |
46 |
| -(адресом) этой группы считается адрес первого слова кванта. Элементы кванта называются |
47 |
| -полями. В общем случае, набор элементов памяти, связанных с одним именем, называют |
48 |
| -звеном. Далее будут использоваться двухэлементные звенья памяти, в которых первое поле |
49 |
| -будет использоваться для хранения значений, а второе поле – для запоминания адресов. |
50 |
| -Способ задания отношения следования, в котором фиксация месторасположения следующего |
51 |
| -элемента производится путем запоминания соответствующего адреса памяти, называется |
52 |
| -сцеплением (пары, хранящие ai и ai+1, сцеплены адресными указателями). Для изображения |
53 |
| -структуры хранения с использованием сцепления звенья памяти рисуются в виде |
54 |
| -прямоугольников, а сцепление звеньев показывается в виде стрелок. Индикация последнего |
55 |
| -звена в списке обычно производится записью в поле адреса некоторого барьера – фиктивного |
56 |
| -(неадресного) значения (как правило, 0 или -1). Для доступа к звеньям списка должен быть |
57 |
| -известен адрес первого звена списка. Указатель, в котором этот адрес запоминается, |
58 |
| -называется переменной связи. Структура хранения данного типа (звенья, сцепление, барьер, |
59 |
| -переменная связи) называется линейным или односвязным списком. |
| 76 | +форматом используемых участков памяти. |
| 77 | +Под `квантом памяти` понимается последовательность элементов памяти с последовательно-возрастающими адресами. `Именем` (адресом) этой группы считается адрес первого слова кванта. Элементы кванта называются `полями`. В общем случае, набор элементов памяти, связанных с одним именем, называют `звеном`. |
| 78 | + |
| 79 | +Далее будут использоваться двухэлементные звенья памяти, в которых первое поле будет использоваться для хранения значений, а второе поле – для запоминания адресов. |
| 80 | + |
| 81 | +Способ задания отношения следования, в котором фиксация месторасположения следующего элемента производится путем запоминания соответствующего адреса памяти, называется *сцеплением* (пары, хранящие `ai` и `ai+1`, сцеплены адресными указателями). |
| 82 | +Для изображения структуры хранения с использованием сцепления звенья памяти рисуются в виде прямоугольников, а сцепление звеньев показывается в виде стрелок. |
| 83 | + |
| 84 | +Индикация последнего звена в списке обычно производится записью в поле адреса некоторого *барьера* – фиктивного (неадресного) значения (как правило, 0 или -1). Для доступа к звеньям списка должен быть известен адрес первого звена списка. Указатель, в котором этот адрес запоминается, называется *переменной связи*. |
| 85 | +Структура хранения данного типа (звенья, сцепление, барьер, переменная связи) называется `линейным` или `односвязным списком`. |
0 commit comments