让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