设 S 为舞台面积。令 A 为我们要绘制的最小矩形的面积。令 N = S/A
一种可能的确定性方法:
当您在空舞台上绘制一个矩形时,这会将舞台划分为最多 4 个可以适合您的下一个矩形的区域。当您绘制下一个矩形时,一个或两个区域被分成最多 4 个子区域(每个)可以适合一个矩形等。您永远不会创建超过 N 个区域,其中 S 是您的舞台面积,并且A 是最小矩形的面积。保留区域列表(未排序即可),每个区域由其四个角点表示,每个区域都标有其面积,并使用按面积加权的水库采样使用 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² 次以获得 1/e^N 的失败概率。
总结:尝试随机点直到我们找到一个空间,在 NlogN(或 N²)次尝试后停止,在这种情况下,我们可以确信不存在空间。
运行时间:O(NlogN)表示成功概率高,O(N²)表示成功概率非常高
空间:O(1)