Ich würde einen Multi-Skalen-Gitteransatz verwenden (entsprechend Quad-Bäumen in irgendeiner Form).
Ich gehe davon aus, dass Sie ganzzahlige Koordinaten (d. h. Pixel) verwenden und genügend Platz haben, um alle Pixel zu speichern.
Haben Sie ein Array von Listen von Rechtecken, eins für jedes Pixel. Dann fügen Sie zwei mal zwei ein und machen es wieder. Und wieder, und wieder, und wieder, bis Sie ein Pixel haben, das alles abdeckt.
Jetzt ist der Schlüssel, dass Sie Ihre Rechtecke auf der Ebene einfügen, die gut zur Größe des Rechtecks passt. Das wird ungefähr wie (Pixelgröße) ~= min(Höhe, Breite)/2 sein. Nun haben Sie nur eine Handvoll Einfügungen in die Listen zu machen (Sie könnten es nach oben durch eine Konstante begrenzen, z. B. etwas zwischen 4 und 16 Pixel wählen).
Wenn Sie alle Rechtecke bei x,y suchen möchten, suchen Sie in der Liste des kleinsten Pixels und dann in der Liste des 2x2 gebinnten Pixels, der es enthält, und dann in der 4x4 usw.; Sie sollten log2(# der Pixel) Schritte durchsuchen müssen. (Für größere Pixel müssen Sie dann überprüfen, ob (x,y) wirklich im Rechteck war; Sie erwarten, dass ungefähr die Hälfte von ihnen an den Grenzen erfolgreich ist, und alle im Inneren des Rechtecks erfolgreich sind, sodass Sie nicht mit mehr als der doppelten Arbeit rechnen müssen, als wenn Sie das Pixel direkt nachschauen.)
Und was ist mit Einfügen? Das ist sehr kostengünstig - O(1), um sich selbst an den Anfang einer Liste zu setzen.
Was ist mit Löschen? Das ist teurer; Sie müssen sich durch jede Liste kämpfen und für jedes Pixel, in das Sie eingetreten sind, die Heilung durchführen. Das entspricht ungefähr O(n) in der Anzahl der sich überschneidenden Rechtecke an dieser Position im Raum und ungefähr derselben Größe. Wenn Sie wirklich große Zahlen von Rechtecken haben, sollten Sie dann eine andere Datenstruktur verwenden, um sie zu halten (Hash-Set, RB-Baum usw.).
(Beachten Sie, dass, wenn Ihr kleinstes Rechteck größer sein muss als ein Pixel, Sie die Multiskalenstruktur nicht tatsächlich bis auf die Pixelebene bilden müssen; gehen Sie einfach so weit hinunter, bis das kleinste Rechteck nicht hoffnungslos in Ihrem gebinnten Pixel verloren geht.)