std::set обычно представлен бинарным деревом поиска. У него есть методы begin и end, которые позволяют получить минимум и максимум, а также lower_bound и upper_bound для бинарного поиска. А что если мне надо получить итератор, указывающий на элемент в середине сета (или один из них, если в нём чётное число элементов)?
Есть ли эффективный способ сделать это (за O(lb(size)) вместо O(size))?
{1} => 1
{1,2} => 1 или 2
{1,2,3} => 2
{1,2,3,4} => 2 или 3 (но в ту же сторону от середины, что и с {1,2})
{1,312,10000,14000,152333} => 10000
PS: Этот вопрос на английском.
Или, если все-таки использовать set, то можно поддерживать итератор, указывающий на медианный элемент и число элементов k до этого итератора.
set пустой, итератор равен set.end(), k равно нулюset:
k * 2 + 3 <= set.size()) сдвигааем итератор на один вперед и увеличиваем k на единицу.k на единицу.set действуем аналогично, при необходимости двигаем итератор на единицу вперед/назадO(log n) на каждую операцию вставки/удаленияИ еще вот полезный вопрос на английском Stack Overflow примерно про это же (там без удаления, но идея такая же)
Если писать свое декартово дерево не хочется, то можно использовать встроенную в gcc структуру данных rope
Думаю, что нет. Ну смотрите, для поиска минимума в BST нужно всегда идти в левую ветку, максимума - в правую. И вот хотите Вы найти средний. И с самого начала неизвестно, что делать. Условно, у вас в корне дерева стоит "10", больше Вы ничего не знаете о содержимом. Куда пойдете?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей