diff --git a/src/chaining_hash_map.cpp b/src/chaining_hash_map.cpp index c50d641..5dee69c 100644 --- a/src/chaining_hash_map.cpp +++ b/src/chaining_hash_map.cpp @@ -41,15 +41,19 @@ namespace assignment { // ... (ниже представлена часть реализации) + if (Contains(key)) { + return false; + } + // вычисление индекса ячейки словаря по ключу const int index = hash(key, buckets_.size()); // добавление пары "ключ-значение" в ячейку словаря (в конец связного списка) buckets_[index].push_back(Node(key, value)); - + num_keys_ += 1; // расширение словаря до новой емкости в случае превышения коэффициента заполнения 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 +62,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) { @@ -69,7 +73,7 @@ namespace assignment { // удаляем элемент из списка по итератору (указателю) buckets_[index].erase(it); - + num_keys_ -= 1; // возвращаем значение удаленного элемента return removed; } @@ -81,12 +85,15 @@ 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; @@ -105,7 +112,7 @@ namespace assignment { bool ChainingHashMap::Contains(int key) const { // Напишите здесь свой код ... - return false; + return static_cast(Search(key)); } bool ChainingHashMap::IsEmpty() const { @@ -133,7 +140,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); } }