Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a314e67

Browse files
authoredJun 18, 2024··
Теория (#43)
1 parent 56842a2 commit a314e67

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed
 

‎doc/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@
7575
- Хеш-функции. Остаток от деления, мультипликативная.
7676
- Деление многочленов - CRC.
7777
- Полиномиальная. Ее использование для строк. Метод Горнера для уменьшения количества операций умножения при ее вычислении.
78-
- Хеш-таблицы. Понятие коллизии.
79-
- Метод цепочек (открытое хеширование).
78+
- [Хеш-таблицы. Понятие коллизии.](topic4/question4.md)
79+
- [Метод цепочек (открытое хеширование).](topic4/question5.md)
8080
- Метод прямой адресации (закрытое хеширование).
8181
- Линейное пробирование. Проблема кластеризации.
8282
- Квадратичное пробирование.

‎doc/topic4/question4.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# **Хеш-таблицы. Понятие коллизии.**
2+
>**Хеш-табли́ца** (англ. hash-table) — структура данных, реализующая интерфейс ассоциативного массива. В отличие от деревьев поиска, реализующих тот же интерфейс, обеспечивают меньшее время отклика в среднем. Представляет собой эффективную структуру данных для реализации словарей, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу.
3+
4+
Особенность этой структуры данных в том, что стандартные операции: вставка, чтение и удаление данных, она, в среднем, выполняет за константное время **O(1)**, то есть, быстро и не зависимо от размера таблицы (объема данных):
5+
6+
![](https://i.imgur.com/yjgw3Tf.png)
7+
8+
Существуют два основных варианта хеш-таблиц: с **открытой адресацией** и [**списками**](Метод цепочек(открытое хеширование).md "Метод цепочек"). Хеш-таблица является массивом элементы которого есть пары (хеш-таблица с открытой адресацией) или списки пар (хеш-таблица со списками).
9+
10+
Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. Получающееся хеш-значение
11+
```i = hash(key)```
12+
13+
играет роль индекса в массиве ```H[]```. Затем выполняемая операция (добавление, удаление или поиск) перенаправляется объекту, который хранится в соответствующей ячейке массива. Затем выполняемая операция (добавление, удаление или поиск) перенаправляется объекту, который хранится в соответствующей ячейке массива ```H[i]```
14+
15+
16+
Ситуация, когда для различных ключей получается одно и то же хеш-значение, называется коллизией. Такие события не так уж и редки — например, при вставке в хеш-таблицу размером 365 ячеек всего лишь 23 элементов вероятность коллизии уже превысит 50% (если каждый элемент может равновероятно попасть в любую ячейку). Поэтому механизм разрешения коллизий — важная составляющая любой хеш-таблицы.
17+
18+
В некоторых специальных случаях удаётся избежать коллизий вообще. Например, если все ключи элементов известны заранее (или очень редко меняются), то для них можно найти некоторую совершенную хеш-функцию, которая распределит их по ячейкам хеш-таблицы без коллизий. Хеш-таблицы, использующие подобные хеш-функции, не нуждаются в механизме разрешения коллизий, и называются хеш-таблицами с прямой адресацией.
19+
20+
> Число хранимых элементов, делённое на размер массива ```H[]``` (число возможных значений хеш-функции), называется **коэффициентом заполнения хеш-таблицы** (load factor) и является важным параметром, от которого зависит среднее время выполнения операций.
21+
22+

‎doc/topic4/question5.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# **Метод цепочек (открытое хеширование).**
2+
Хэш-таблицы представляют собой эффективную структуру данных, позволяющую осуществлять хранение и поиск информации. Однако, при использовании хэш-таблиц возможно возникновение ситуаций, когда два или более ключей отображаются в одну и ту же ячейку таблицы, что называется коллизией. Для разрешения подобных проблем существует ряд методов, среди которых особое место занимает метод цепочек.
3+
4+
Идея метода цепочек заключается в том, что в случае если хеш-функция выделяет один индекс сразу двум элементам, то храниться они будут в одном и том же индексе, но уже с помощью двусвязного списка.
5+
> Если ```j``` — ячейка для нескольких элементов, то она содержит указатель на первый элемент списка. Если же ```j``` пуста, то она содержит ```NULL```.
6+
![](https://lh3.googleusercontent.com/Yd-JtIVQlDI9U9b7N3miEc_McdYR2nTT2ruVNPA3cQ0dJ-Rn8OPmkMHjrQGNqUh39hoBV8En3-pGpmvuLYA1OQ1pcCc--EaOQXmDSdDrKBsNYNoBYh5jzSIxY6kRLSMnlOSCrIWr)
7+
***
8+
**Псевдокод операций**
9+
```python
10+
class HashTable:
11+
size: int
12+
table[]: list
13+
def Insert(value):
14+
index = hash(value)
15+
table[index].push_front(value)
16+
17+
def Search(value):
18+
index = hash(value)
19+
for elem in table[index]:
20+
if elem == value:
21+
return True
22+
return False
23+
24+
def Remove(value):
25+
index = hash(value)
26+
for elem in table[index]:
27+
if elem == value:
28+
previous_elem = elem->prev
29+
next_elem = elem->next
30+
previous_elem->next = next_elem
31+
32+

0 commit comments

Comments
 (0)
Please sign in to comment.