ステージの面積をSとします。描きたい最小の長方形の面積を A とします。N = S/A とする
考えられる決定論的アプローチの 1 つ:
空のステージに四角形を描画すると、次の四角形に収まる最大 4 つの領域にステージが分割されます。次の長方形を描くと、1 つまたは 2 つの領域が、長方形に収まる最大 4 つのサブ領域 (それぞれ) に分割されます。S がステージの領域である場合、N 個を超える領域を作成することはありません。 A は最小の長方形の面積です。地域のリストを保持し (ソートされていなくても問題ありません)、それぞれが 4 つのコーナー ポイントで表され、それぞれがその面積でラベル付けされ、面積ごとに重み付けされたリザーバー サンプリングを使用しますリザーバーのサイズが 1 の場合、最大で 1 回のリストのパスで、その面積に比例する確率で領域を選択します。次に、その領域のランダムな位置に長方形を配置します。(領域の左下部分からランダムなポイントを選択すると、そのポイントを左下隅として上または右の壁にぶつかることなく長方形を描くことができます。)
空白のステージから始めていない場合は、描画する最初のポイントを検索する前に、使用可能な領域のリストを O(N) で作成します (たとえば、空白のステージに既存のすべての長方形を任意の順序で再描画します)。新しい長方形。
注: リザーバーのサイズを k に変更して、次の k 個の四角形をすべて 1 ステップで選択できます。
注 2: 別の方法として、使用可能な領域をツリーに格納することもできます。各エッジの重みは、ステージの領域にわたるサブツリー内の領域の領域の合計に等しくなります。次に、O(logN) 内の領域を選択するために、ルート領域 / S の確率領域でルートを再帰的に選択するか、確率エッジの重み / S で各サブツリーを選択します。
ランタイム: O(N)
スペース: O(N)
考えられるランダム化されたアプローチの 1 つ:
ステージ上のポイントをランダムに選択します。ポイントを含む 1 つ以上の四角形 (左下隅にポイントを持つ四角形だけでなく) を描画できる場合は、ポイントを含むランダムに配置された四角形を返します。多少の微妙な工夫で偏りなく四角形を配置することは可能ですが、お任せします。
最悪の場合、四角形に丁度十分な大きさのスペースが 1 つあり、ステージの残りの部分は埋まっています。したがって、このアプローチは確率 > 1/N で成功するか、確率 < 1-1/N で失敗します。N 回繰り返します。ここで、確率 < (1-1/N)^N < 1/e で失敗します。失敗とは、長方形のためのスペースがあることを意味しますが、それが見つかりませんでした。成功とは、スペースが存在する場合にスペースを見つけたことを意味します。合理的な成功確率を達成するために、1/N の確率で失敗する場合は Nlog(N) 回、1/e^N の確率で失敗する場合は N² 回繰り返します。
要約: スペースが見つかるまでランダムなポイントを試し、NlogN (または N²) の試行後に停止します。この場合、スペースが存在しないと確信できます。
実行時:成功する確率が高い場合はO(NlogN) 、成功する確率が非常に高い場合はO(N²)
スペース: O(1)