7

N個の正の数のセットと、次元XYの長方形があり、次のようにN個の小さな長方形に分割する必要があります。

  • それぞれの小さい長方形の表面積は、与えられたセットの対応する数に比例します
  • 大きな長方形のすべてのスペースが占有され、小さな長方形の間に残りのスペースはありません
  • それぞれの小さな長方形は、可能な限り正方形に近い形にする必要があります
  • 実行時間は適度に短くする必要があります

これについての指示が必要です。Webで説明されているそのようなアルゴリズムを知っていますか?何かアイデアはありますか(擬似コードで問題ありません)?

ありがとう。

4

2 に答える 2

9

あなたが説明することはツリーマップのように聞こえます:

ツリーマップは、ネストされた四角形のセットとして階層 (ツリー構造) データを表示します。ツリーの各ブランチには四角形が与えられ、サブブランチを表す小さな四角形でタイル張りされます。リーフ ノードの四角形には、データの指定された次元に比例する面積があります。

そのウィキペディアのページはBen Shneiderman によるページにリンクしており、Java 実装への素晴らしい概要とリンクを示しています。

で、教職員ラウンジであれこれと頭を悩ませているうちに、アハハ!レベルを下に移動するときに、画面を水平方向と垂直方向に交互に長方形に分割する経験。この再帰アルゴリズムは魅力的に思えましたが、常に機能することを確信し、6 行のアルゴリズムを作成するのに数日かかりました。

ウィキペディアから、Mark Bruls、Kees Huizing、および Jarke J. van Wijk による「Squarified Treemaps」 (PDF) にも、1 つの可能なアルゴリズムが示されています。

縦横比 (たとえば、最大 (高さ/幅、幅/高さ)) ができるだけ 1 に近づくように、長方形を再帰的に長方形に分割するにはどうすればよいでしょうか? 可能なテッセレーションの数は非常に多くなります。この問題は、NP 困難な問題のカテゴリに分類されます。ただし、このアプリケーションでは最適解は必要ありません。短時間で計算できる優れた解が必要です。

質問では再帰について言及していないため、状況はツリーマップの 1 つのレベルにすぎない可能性があります。しかし、アルゴリズムは一度に 1 つのレベルで動作するため、これは問題になりません。

于 2010-03-28T15:20:54.193 に答える
1

私は似たようなことに取り組んできました。アスペクト比をできるだけ同じにするよりも、シンプルさを優先しています。これは(理論的には)うまくいくはずです。1 から 10 の間の N のいくつかの値について、紙の上でテストしました。

N = 作成する四角形の総数、Q = max(幅、高さ) / min(幅、高さ)、R = N / Q

Q > N/2 の場合、四角形を最も長い辺に沿って N 個の部分に分割します。Q <= N/2 の場合、四角形をその最短辺に沿って R (丸められた整数) 部分に分割します。次に、短辺に沿ってサブレクトを N/R (int で切り捨て) 部分に分割します。次の subrects 除算の結果から、切り捨てられた値を減算します。すべてのサブレクトに対して、または必要な数のレクトが作成されるまで繰り返します。

于 2010-06-16T22:34:55.130 に答える