讓S爲舞臺的面積。設A是我們想繪製的最小矩形的面積。令N = S/A
一個可能的確定性方法:
當你畫上一個空的舞臺矩形,這種劃分的階段進入,能適合你的下一個矩形最多4個地區。繪製下一個矩形時,將一個或兩個區域分割成最多4個可以適合矩形的子區域(每個)。您將不會創建超過N個區域,其中S是舞臺區域,並且A是最小矩形的面積。保留一個區域清單(未排序很好),每個區域由四個角點表示,每個區域用其面積標記,並使用區域加權的reservoir sampling,其庫容大小爲1,以選擇與其面積成比例的區域在最多一次通過列表。然後在該區域的隨機位置放置一個矩形。 (從該區域的左下角部分選擇一個隨機點,允許您用該點繪製矩形作爲其左下角而不會觸及頂部或右側牆)。
如果您不是從空白階段開始,只需在O(N)中構建可用區域列表(例如,通過在任何順序中重新繪製空白舞臺上的所有現有矩形),然後搜索您的第一個點以繪製新的矩形。
注意:您可以將水庫大小更改爲k,以一步完成所有k個矩形的選擇。注意2:您也可以將可用區域存儲在樹中,使每個邊權重等於階段區域內子樹中區域面積的總和。然後在O(logN)中選擇一個區域,我們遞歸地選擇根區域/ S的概率區域的根,或者每個子樹的概率邊權重爲S.然而,在重新平衡樹時更新權重將是煩人的。
運行時間:O(N)
空間:O(N)
一種可能的隨機化的方法:
隨機舞臺上選擇一個點。如果您可以繪製一個或多個包含該點的矩形(不只是將該點作爲其左下角),然後返回一個隨機定位的包含該點的矩形。有可能在沒有偏見的情況下放置矩形,並留下一些微妙之處,但我會將其留給你。
在最壞的情況下,有一個空間對我們的矩形來說足夠大,剩下的階段就會被填滿。所以這種方法成功的概率大於1/N,或者失敗的概率爲< 1-1/N。重複N次。我們現在失敗的概率爲<(1-1/N)^ N < 1/e。我們的失敗意味着我們的矩形有一個空間,但我們沒有找到它。通過成功我們的意思是我們找到了一個空間,如果存在的話爲了獲得合理的成功概率,我們重複Nlog(N)次,1/N失敗概率,或N/2次,1/e^N失敗概率。
摘要:嘗試隨機點,直到找到空格,在NlogN(或N²)嘗試後停止,在這種情況下,我們可以確信沒有空間存在。
運行:O(NlogN)成功的概率高,
O(N²)成功的概率非常高
空間:O(1)
我沒有Karma對您選擇的答案發表評論,但您選擇作爲正確答案的確定性版本不起作用,因爲它不允許您放置跨越多個區域的矩形。你需要首先應用上面提到的轉換。 – 2009-01-28 23:54:22