Я полагаюсь на ответ @btilly, но я собираюсь попробовать другой способ описать структуру данных, которая имеет постоянное добавление и постоянную get (k). Это будет использовать много памяти, хотя.
Любая обратная связь приветствуется, я только придумываю это, пока иду вперед ...
Представьте, что мы говорим о наборе 8-битных целых чисел. Следовательно, существует 256 целых чисел, которые могут быть членами набора.
Теперь представьте сбалансированное бинарное дерево, содержащее все 256 целых чисел в виде листьев и 255 других неконечных узлов, что дает нам 9 уровней в целом. Форма этого дерева фиксирована, но мы будем хранить счетчик для каждого узла. Количество на каждом листовом узле будет просто равно 1
или 0
, в зависимости от того, является ли это целое число членом нашего набора. Количество в каждом не-листовом узле будет суммой листьев под ним.
Это даст нам O (1) добавление (и удаление). Каждый раз при добавлении (или удалении) элемента ровно 9 узлов (корневой узел, соответствующий листовой узел и 7 промежуточных узлов) должны будут увеличивать (уменьшать) их счет.
Я думаю, что это также даст нам постоянный поиск времени. Если вы хотите найти k-й наименьший элемент, просто начните с корневого узла и двигайтесь вниз по направлению к соответствующему листу, перемещаясь влево или вправо по необходимости.