Outlook や Google カレンダーの月表示のように、終日/複数日のイベント バナーを効率的に配置するアルゴリズムを探しています。開始日と終了日が指定されたイベントが多数あり、開始日 (および終了日) の昇順に並べられています (または、データベース テーブルからイベントを収集しています)。イベントバナーの後には、その日だけ他のイベントを配置する必要があるため、使用される垂直方向のスペースの平均量を最小限に抑えたいと考えています (これらは常に、特定の日付のバナーの後に配置されます)。したがって、たとえば、1/10-1/11 と 1/11-1/15 の 2 つのイベントがある場合、次のように配置することをお勧めします (各列は 1 日です)。
bbbbb
aa
そして好きではない:
aa
bbbbb
その日 (x、y、および z) だけのイベントを追加すると、これを行うことができるためです (最初のほうが好きで、2 番目は必要ありません)。
bbbbb vs. aa
aa xyz bbbbb
xyz
しかし、長いイベントを最初に配置するほど単純ではありません。
aa cc
bbb
とは対照的に:
bbb
aa cc
これは、イベント x および y を許可するためです。
aa cc vs. bbb
xbbby aa cc
x y
そしてもちろん、私はこれを 1 回のパスで行うことを好みます。データ構造については、現在、日付からリストへのマップを使用しており、イベントの日ごとに対応するリストにイベントを追加しています。そのため、3 日間のイベントが 3 つのリストに表示され、それぞれがマップ内の 1 日の下に表示されます。これは、結果を視覚的な出力に変換するための便利な構造ですが、他のデータ構造も受け入れています。私は現在、各イベントを順番に追加する貪欲なアルゴリズムを使用していますが、次のような不要なアーティファクトが生成される可能性があります。
aa ccc
bbbbb
dd
eeeeeeeeeeeeeeeee
これにより、ほとんどの「e」イベント日で多くのスペースが無駄になります。
何か案は?