Ключевым моментом здесь является то, что целые числа одного и того же значения неразличимы.Таким образом, все, что вам нужно сделать, это сохранить количество каждого отдельного значения в контейнере .
Затем вы можете просто использовать std::map<int, size_t>
в качестве вспомогательной структуры, которая отображает каждое целое число (ключ) на количество раз, которое оно существует в вашей структуре данных (значение = количество).
Вставка и стирание отдельных элементов просто увеличивает и уменьшает (возможно, удаляет в последнем случае) значения для данного ключа (оба O(log(distinct_values_in_container))
для нахождения ключа).
Так как std::map
упорядочен, вы можете использовать lower_bound
и upper_bound
для выполнения двоичного поиска, поэтому поиск ключей в [from, to) очень эффективен (нахождение диапазона также O(log(distinct_values_in_container))
).Стирать их или суммировать их значения легко (тогда здесь время выполнения более сложное).
Если вы хотите получить дополнительный кредит, вам придется заплатить, чтобы понять ограничения асимптотического времени выполнения.Рассмотрим следующие моменты:
Что эти асимптотические среды выполнения означают на практике, во многом зависит от модели использования.Если дубликаты никогда не вставляются, мы находимся на O(n)
, но вы также можете получить произвольно хорошие времена (с точки зрения n
= количество вставок), если есть много идентичных элементов (например, если каждый ключ имеет O(exp(n))
значения, затем O(distinct_values_in_container) = O(log(n))
).В крайнем случае, когда все задействованные целые числа одинаковы, все операции являются O(1)
.
Как собеседник, я бы также говорил о том, значат ли эти асимптотические среды выполнения на практике.Может случиться так, что древовидная структура карты (которая является токсичной для кеша и предиктора ветвлений) проигрывает простому std::vector<std::pair<int, size_t>>
(если стирание всегда массово) или даже std::vector<size_t>
(если ключи "плотные") дляданное приложение.
Я думаю, что ваша главная ошибка (и почему вы были отклонены) не понимает, что нет необходимости хранить каждое вставленное целое число отдельно.Вы, к сожалению, также, похоже, упустили возможность сохранить список отсортированным, но я не вижу, откуда взялся O(n^2)
.