Все мы знаем, что std::set - это красно-чёрное дерево (соответственно со сложностью поиска O(log n)), а std::unordered_set - хэш-таблица с поиском за константу.
Какие вообще преимущества есть у set'а, не считая поддержание порядка элементов? Если мне не важен порядок, то всегда ли лучше выбрать хэш-таблицу?
Иногда,хранение именно в виде упорядоченного массива очень важно с точки зрения алгоритма. Например, найдите значение (int), ближайшее к заданному, если значения хранятся в unodered_set.
Иногда, написание адекватной задаче хеш функции - невозможно, например, при хранении double.
Иногда, ожидаемый набор данных достаточно мал. О(1) не всегда быстрее O(Log(n)), можно гарантировать только, что существует такой размер набора данных, на котором O(1) будет быстрее. На практике, часто встречаются ситуации, когда ожидаемое число значений 3-5 штук.
Также следует помнить, что стоимость одного вычисления хеша для строки O(k) (где k -длинна строки) - в среднем, а стоимость оператора сравнения O(k) - в худшем случае и O(log(n)) - в среднем, если строи случайные начиная с первых символов. При этом, в случае set будет произведено только одно "неудачное" сравнение, когда мы найдем искомый результат, но это дорогое сравнение на придется произвести и в случае unordered_set. Если ожидаемый набор строк для поиска, только с очень маленькой вероятностью содержит строки из set, то O(k) окажется дороже O(log(n)).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Столкнулся со следующей проблемой: Есть код, написанный не одним человеком, который работает с использованием MPIВ части последовательного...
Изобретаю велосипед, и столкнулась с проблемойЕсть код, в котором должны обрабатываться 2 клика
Есть элемент i при клике на который открывается меню и значек меняется на крестик путем замены класса, так же у элемента меняется id что бы я мог...