Как изменить ключ в unordered_map?

Мне нужно использовать структуру данных, которая в среднем поддерживает поиск с постоянным временем. Я думаю, что использование std::unordered_map — хороший способ сделать это. Мои данные представляют собой «коллекцию» чисел.

|115|190|380|265|

Эти числа не обязательно должны быть в определенном порядке. Мне нужно около O(1) времени, чтобы определить, существует ли заданное число в этой структуре данных. У меня есть идея использовать std::unordered_map, которая на самом деле является хэш-таблицей (я прав?). Таким образом, числа будут ключами, и тогда у меня будут просто фиктивные значения.

Итак, в основном мне сначала нужно определить, существует ли в структуре данных ключ, соответствующий заданному числу, и я запускаю некоторый алгоритм на основе этого условия. И независимо от этого условия я также хочу обновить определенный ключ. Допустим, 190, и я хочу добавить к нему 20, так что теперь ключ будет 210. И теперь структура данных будет выглядеть так:

|115|210|380|265|

Причина, по которой я хочу это сделать, заключается в том, что у меня есть рекурсивный алгоритм, который проходит по двоичному дереву поиска. Каждый узел имеет int value и два указателя на левый и правый узлы. Когда конечный узел достигнут, мне нужно создать новое поле в структуре данных «хеш-таблица», содержащее current_node->value. Затем, когда я возвращаюсь к дереву в рекурсии, мне нужно последовательно добавлять каждое значение узла к предыдущей сумме, хранящейся в ключе. И причина, по которой моя структура данных (которая, как я полагаю, должна быть std::unordered_map) имеет несколько полей чисел, заключается в том, что каждое из них представляет собой уникальный путь, идущий от листового узла вверх по дереву к определенному узлу в середине. Я проверяю, равна ли сумма всех значений узлов на пути от листа до заданного узла значению этого узла. Таким образом, в каждый ключ добавляется текущее значение узла, в котором хранится сумма всех узлов на этом пути. Мне нужно просканировать эту структуру данных, чтобы определить, равно ли какое-либо из полей или ключей значению текущего узла. Также я хочу вставлять новые значения в структуру данных практически за постоянное время. Это для соревновательного программирования, и я бы не стал использовать std::vector, потому что поиск элемента и вставка элемента занимает линейное время, я думаю. Это бы испортило мою временную сложность. Может быть, мне следует использовать другую структуру данных, отличную от std::unordered_map?


person Galaxy    schedule 25.09.2018    source источник


Ответы (1)


Вы можете использовать unordered_map::erase и unordered_map::insert для обновления ключа. Средняя временная сложность — O(1) (кстати, наихудшая — O(n)). Если вы используете C++17, вы также можете использовать unordered_map::extract для обновления ключа. Временная сложность одинакова.

Однако, поскольку вам нужен только набор чисел, я думаю, что unordered_set больше подходит для вашего алгоритма.

person donnyxia    schedule 25.09.2018
comment
среднее время обычно обозначается тета (Θ), а не большими буквами - person Evan Zhao; 08.07.2020