From 83373ca46adb918f9204a0032ba9b2883f387b2d Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 1 Jun 2022 19:59:20 +0000 Subject: [PATCH 1/2] Setting up GitHub Classroom Feedback From 9dfd6da3ce6e25f2b01e1c7d44430a7232e3c576 Mon Sep 17 00:00:00 2001 From: Radmir Salimov Date: Wed, 1 Jun 2022 23:07:48 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A1=D0=B0=D0=BB=D0=B8=D0=BC=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=A0=D0=B0=D0=B4=D0=BC=D0=B8=D1=80=2011-109?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/chaining_hash_map.cpp | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2db39de..3f0c1cc 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ ## 1. Информация о студенте -**Номер группы**: 00-000 +**Номер группы**: 11-109 -**Фамилия и Имя**: Иванов Иван +**Фамилия и Имя**: Салимов Радмир ## 2. Описание задания diff --git a/src/chaining_hash_map.cpp b/src/chaining_hash_map.cpp index c50d641..bf732d1 100644 --- a/src/chaining_hash_map.cpp +++ b/src/chaining_hash_map.cpp @@ -39,6 +39,9 @@ namespace assignment { // 4. Увеличиваем кол-во ключей в словаре. // 5. Если превышен коэффициент загрузки словаря, то расширяем словарь. + if (Contains(key)) { + return false; + } // ... (ниже представлена часть реализации) // вычисление индекса ячейки словаря по ключу @@ -46,10 +49,10 @@ namespace assignment { // добавление пары "ключ-значение" в ячейку словаря (в конец связного списка) buckets_[index].push_back(Node(key, value)); - + num_keys_++; // расширение словаря до новой емкости в случае превышения коэффициента заполнения if (num_keys_ / static_cast(buckets_.size()) > load_factor_) { - const int new_capacity = 0 /* здесь должна быть ваше выражение */; + const int new_capacity = capacity() * kGrowthCoefficient; resize(new_capacity); } @@ -58,7 +61,7 @@ namespace assignment { std::optional ChainingHashMap::Remove(int key) { - const int index = 0 /* напишите здесь свой код */; + const int index = hash(key, buckets_.size()); // здесь используется итератор (по сути указатель на узел списка) for (auto it = buckets_[index].begin(); it != buckets_[index].end(); ++it) { @@ -81,12 +84,14 @@ namespace assignment { std::optional ChainingHashMap::Search(int key) const { // вычисление индекса ячейки для указанного ключа - const int index = 0 /* напишите здесь свой код */; + const int index = hash(key, buckets_.size()); // Проходимся по всем элемента в ячейке словаря. // В худшем случае все элементы попали в одну ячейку словаря и сложность поиска ~ O(N). for (const Node& node : buckets_[index]) { - // напишите здесь свой код ... + if (node.key == key) { + return node.value; + } } return std::nullopt; @@ -104,7 +109,13 @@ namespace assignment { } bool ChainingHashMap::Contains(int key) const { - // Напишите здесь свой код ... + int index = hash(key, buckets_.size()); + const Bucket& bucket = buckets_[index]; + for (const Node& node : bucket) { + if (node.key == key) { + return true; + } + } return false; } @@ -133,7 +144,7 @@ namespace assignment { // пересчитываем индексы элементов словаря, учитывая новую емкость for (const Bucket& bucket : buckets_) { for (const Node& node : bucket) { - const int new_index = 0 /* напишите здесь свой код */; + const int new_index = hash(node.key, buckets_.size()); new_buckets[new_index].push_back(node); } }