diff --git a/README.md b/README.md index 2db39de..b932a26 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ ## 1. Информация о студенте -**Номер группы**: 00-000 +**Номер группы**: 11-101 -**Фамилия и Имя**: Иванов Иван +**Фамилия и Имя**: Судаков Дмитрий ## 2. Описание задания diff --git a/src/chaining_hash_map.cpp b/src/chaining_hash_map.cpp index c50d641..06d772f 100644 --- a/src/chaining_hash_map.cpp +++ b/src/chaining_hash_map.cpp @@ -39,26 +39,26 @@ namespace assignment { // 4. Увеличиваем кол-во ключей в словаре. // 5. Если превышен коэффициент загрузки словаря, то расширяем словарь. - // ... (ниже представлена часть реализации) + 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 = buckets_.size() * kGrowthCoefficient; /* здесь должна быть ваше выражение */; resize(new_capacity); } - return true; } 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,6 +69,7 @@ namespace assignment { // удаляем элемент из списка по итератору (указателю) buckets_[index].erase(it); + num_keys_ -= 1; // возвращаем значение удаленного элемента return removed; @@ -81,12 +82,12 @@ 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 +105,10 @@ namespace assignment { } bool ChainingHashMap::Contains(int key) const { - // Напишите здесь свой код ... + const int index = hash(key, buckets_.size()); + for(const Node& node : buckets_[index]) { + if(node.key == key) return true; + } return false; }