我會使用多尺度網格方法(相當於四叉樹的某種形式)。
我假設你使用整數座標(即像素),並有足夠的空間來容納所有的像素。
有一組矩形列表,每個像素一個。然後,bin兩個一個地再做一遍。再次,一次又一次,直到你有一個像素覆蓋了一切。
現在,關鍵是你插入你的矩形在水平,這是一個很好的匹配矩形的大小。這將像(像素大小)〜= min(高度,寬度)/ 2一樣。現在對於每個矩形,只有少數幾個插入要做列表(你可以用一個常量來限定它,例如選擇一個有4到16個像素的東西)。
如果你想在x,y上尋找所有的矩形,你可以看看最小像素的列表,然後在包含它的2x2 binned像素的列表中,然後在4x4等等。你應該有log2(像素數)步驟來查看。(對於較大的像素,您必須檢查(x,y)是否確實在矩形中;您預計其中大約一半的邊界會成功,並且所有矩形在矩形內都會成功,所以您期望沒有比直接查看像素多出2倍以上的工作)。
現在,怎麼樣插入?這非常便宜 - O(1)堅持在列表的前面。
刪除怎麼辦?這比較昂貴;您必須仔細查看並修復每個您輸入的像素的列表。大約相同大小的空間和中重疊的矩形數量大約爲O(n)。如果你有大量的矩形,那麼你應該使用其他數據結構來保存它們(散列集,RB樹等)。 (請注意,如果您的最小矩形必須大於一個像素,則不需要實際形成多尺度結構一直到像素級;只需向下,直到最小的矩形不會失去希望地丟失在您的binned像素中)
也許我錯過了一些東西,但是如何在亞線性時間插入?只要讀取每個矩形的座標就已經是一個O(n)操作。 – 2010-04-02 23:04:08
如果「屏幕」具有索引的所有對象(kd,quad,r/trees),則插入必須爲
TheCloudlessSky
2010-04-02 23:10:18
如果有一個界限有多快矩形可以移動,那麼詢問是否有辦法分攤重建過程並不是沒有道理的。 – user287792 2010-04-02 23:11:33