我会使用多尺度网格方法(相当于某种形式的四叉树)。
我假设您使用的是整数坐标(即像素)并且有足够的空间来容纳所有像素。
有一个矩形列表数组,每个像素一个。然后,将 2×2 分箱,然后再做一次。一次又一次,一次又一次,直到你有一个像素覆盖一切。
现在,关键是您将矩形插入到与矩形大小非常匹配的级别。这将类似于 (pixel size) ~= min(height,width)/2。现在,对于每个矩形,您只需要在列表中进行少量插入操作(您可以在上面用一个常量将其绑定,例如选择具有 4 到 16 个像素之间的东西)。
如果要在 x,y 处查找所有矩形,请查看最小像素列表,然后查看包含它的 2x2 合并像素列表,然后查看 4x4 等;你应该有 log2(# of pixel) 步骤来查看。(对于较大的像素,您必须检查 (x,y) 是否真的在矩形中;您希望大约一半的像素在边界上成功,并且所有像素都在矩形内成功,所以您会期望不比直接查找像素多 2 倍的工作量。)
现在,插入呢?这非常便宜——O(1) 就可以将自己排在列表的前面。
删除呢?那更贵;您必须查看并修复您输入的每个像素的每个列表。在空间中该位置重叠且大小大致相同的矩形数量中,这大约是 O(n)。如果您有大量的矩形,那么您应该使用其他一些数据结构来保存它们(散列集、RB 树等)。
(请注意,如果您的最小矩形必须大于一个像素,则您不需要实际形成一直到像素级别的多尺度结构;只需向下直到最小的矩形不会在您的合并像素内无可救药地丢失.)