Skip to content

Теория #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Jun 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions doc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@
- Хеш-функции. Остаток от деления, мультипликативная.
- Деление многочленов - CRC.
- Полиномиальная. Ее использование для строк. Метод Горнера для уменьшения количества операций умножения при ее вычислении.
- Хеш-таблицы. Понятие коллизии.
- Метод цепочек (открытое хеширование).
- [Хеш-таблицы. Понятие коллизии.](topic4/question4.md)
- [Метод цепочек (открытое хеширование).](topic4/question5.md)
- Метод прямой адресации (закрытое хеширование).
- Линейное пробирование. Проблема кластеризации.
- Квадратичное пробирование.
Expand Down
22 changes: 22 additions & 0 deletions doc/topic4/question4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# **Хеш-таблицы. Понятие коллизии.**
>**Хеш-табли́ца** (англ. hash-table) — структура данных, реализующая интерфейс ассоциативного массива. В отличие от деревьев поиска, реализующих тот же интерфейс, обеспечивают меньшее время отклика в среднем. Представляет собой эффективную структуру данных для реализации словарей, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу.

Особенность этой структуры данных в том, что стандартные операции: вставка, чтение и удаление данных, она, в среднем, выполняет за константное время **O(1)**, то есть, быстро и не зависимо от размера таблицы (объема данных):

![](https://i.imgur.com/yjgw3Tf.png)

Существуют два основных варианта хеш-таблиц: с **открытой адресацией** и [**списками**](Метод цепочек(открытое хеширование).md "Метод цепочек"). Хеш-таблица является массивом элементы которого есть пары (хеш-таблица с открытой адресацией) или списки пар (хеш-таблица со списками).

Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. Получающееся хеш-значение
```i = hash(key)```

играет роль индекса в массиве ```H[]```. Затем выполняемая операция (добавление, удаление или поиск) перенаправляется объекту, который хранится в соответствующей ячейке массива. Затем выполняемая операция (добавление, удаление или поиск) перенаправляется объекту, который хранится в соответствующей ячейке массива ```H[i]```


Ситуация, когда для различных ключей получается одно и то же хеш-значение, называется коллизией. Такие события не так уж и редки — например, при вставке в хеш-таблицу размером 365 ячеек всего лишь 23 элементов вероятность коллизии уже превысит 50% (если каждый элемент может равновероятно попасть в любую ячейку). Поэтому механизм разрешения коллизий — важная составляющая любой хеш-таблицы.

В некоторых специальных случаях удаётся избежать коллизий вообще. Например, если все ключи элементов известны заранее (или очень редко меняются), то для них можно найти некоторую совершенную хеш-функцию, которая распределит их по ячейкам хеш-таблицы без коллизий. Хеш-таблицы, использующие подобные хеш-функции, не нуждаются в механизме разрешения коллизий, и называются хеш-таблицами с прямой адресацией.

> Число хранимых элементов, делённое на размер массива ```H[]``` (число возможных значений хеш-функции), называется **коэффициентом заполнения хеш-таблицы** (load factor) и является важным параметром, от которого зависит среднее время выполнения операций.


32 changes: 32 additions & 0 deletions doc/topic4/question5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# **Метод цепочек (открытое хеширование).**
Хэш-таблицы представляют собой эффективную структуру данных, позволяющую осуществлять хранение и поиск информации. Однако, при использовании хэш-таблиц возможно возникновение ситуаций, когда два или более ключей отображаются в одну и ту же ячейку таблицы, что называется коллизией. Для разрешения подобных проблем существует ряд методов, среди которых особое место занимает метод цепочек.

Идея метода цепочек заключается в том, что в случае если хеш-функция выделяет один индекс сразу двум элементам, то храниться они будут в одном и том же индексе, но уже с помощью двусвязного списка.
> Если ```j``` — ячейка для нескольких элементов, то она содержит указатель на первый элемент списка. Если же ```j``` пуста, то она содержит ```NULL```.
![](https://lh3.googleusercontent.com/Yd-JtIVQlDI9U9b7N3miEc_McdYR2nTT2ruVNPA3cQ0dJ-Rn8OPmkMHjrQGNqUh39hoBV8En3-pGpmvuLYA1OQ1pcCc--EaOQXmDSdDrKBsNYNoBYh5jzSIxY6kRLSMnlOSCrIWr)
***
**Псевдокод операций**
```python
class HashTable:
size: int
table[]: list
def Insert(value):
index = hash(value)
table[index].push_front(value)

def Search(value):
index = hash(value)
for elem in table[index]:
if elem == value:
return True
return False

def Remove(value):
index = hash(value)
for elem in table[index]:
if elem == value:
previous_elem = elem->prev
next_elem = elem->next
previous_elem->next = next_elem


Loading