Ключом к этому вопросу является строка, которая гласит:
"определение количества раз, которое число появляется в данном наборе"
Заданная структура данных будет неспособна вести подсчет того, сколько раз число появляется в общем наборе данных, и список будет чрезвычайно дорогостоящим для итерации. Что оставляет словарь в качестве единственного жизнеспособного варианта.
Разбивка опций:
Set:
Набор автоматически восстанавливает значения, добавленные к уже существующему набору. Поэтому было бы невозможно запросить частоту появления числа в сохраненном наборе данных, используя набор, потому что ответ для всех сохраненных чисел будет равен 1.
- Сложность времени для запроса: O (1)
- Пространство для хранения: O (n)
Список:
Список может быть повторен, чтобы определить частоту данного числа в списке. Однако это будет операция O (n), и для 10 миллионов целых чисел не будет эффективным.
- Сложность времени для запроса: O (n)
- Пространство для хранения: O (n)
Словарь:
Словарь позволяет хранить пару ключ-значение. В этом случае вы должны сохранить число для поиска в качестве ключа и счетчик того, сколько раз оно было сохранено в качестве связанного значения. Из-за способа, которым словари будут хэшировать ключи в различные сегменты (могут быть коллизии, но давайте пока предположим, что теоретический словарь не является коллизией), время поиска для данного ключа приближается к O (1). Однако подсчет количества замедлит словарь; для вычисления количества всех ключей потребуется O (n) временных сложностей (поскольку каждый ключ должен быть нажат по крайней мере один раз, чтобы добавить его счет к текущему количеству, сохраненному в значении).
- Сложность времени для запроса: O (1)
- Сложность времени для хранения: O (n)
- Пространство для хранения: O (2n) = O (n)