Я бы использовал многоуровневый сеточный подход (эквивалентный квад-деревьям в некоторой форме).
Я предполагаю, что вы используете целочисленные координаты (то есть пиксели) и имеете достаточно места для размещения всех пикселей.
Иметь массив списков прямоугольников, по одному на каждый пиксель. Затем, бин два на два и сделайте это снова. И снова, и снова, и снова, пока у вас не будет одного пикселя, который покрывает все.
Теперь ключ заключается в том, что вы вставляете свои прямоугольники на уровне, который соответствует размеру прямоугольника . Это будет что-то вроде (размер пикселя) ~ = min (высота, ширина) / 2. Теперь для каждого прямоугольника у вас есть только несколько вставок, которые нужно вставить в списки (вы можете связать его сверху константой, например, выбрать что-то от 4 до 16 пикселей).
Если вы хотите найти все прямоугольники в точке x, y, вы посмотрите в список наименьшего пикселя, а затем в список двоичного пикселя 2x2, который его содержит, а затем в 4x4 и т. Д .; у вас должно быть log2 (количество пикселей) шагов для просмотра. (Для больших пикселей вы должны проверить, действительно ли (x, y) было в прямоугольнике; вы ожидаете, что около половины из них будут успешными на границах, и все они будут успешными внутри прямоугольника, так что вы ожидаете не хуже, чем в 2 раза больше работы, чем если бы вы смотрели прямо на пиксель.)
А как насчет вставки? Это очень недорого - O (1), чтобы поставить себя в начале списка.
А как насчет удаления? Это дороже; вам нужно просмотреть и вылечить каждый список для каждого пикселя, в который вы ввели. Это примерно O (n) в количестве прямоугольников, перекрывающих эту позицию в пространстве и примерно одинакового размера. Если у вас действительно большое количество прямоугольников, вам следует использовать некоторую другую структуру данных для их хранения (хэш-набор, дерево RB и т. Д.).
(Обратите внимание, что если ваш самый маленький прямоугольник должен быть больше пикселя, вам не нужно фактически формировать многомасштабную структуру вплоть до уровня пикселя; просто опускайтесь, пока самый маленький прямоугольник не будет безнадежно потерян внутри ваш бин-пиксель.)