【发布时间】:2008-12-30 13:51:51
【问题描述】:
我正在寻找一种算法来有效地放置全天/多天事件横幅,就像 Outlook 或 Google 日历中的月视图一样。我有许多具有开始和结束日期的事件,按增加开始(然后结束)日期(或您喜欢的任何其他顺序,我正在从数据库表中收集事件)排序。我想尽量减少垂直空间的平均使用量,因为在事件横幅之后,我需要只为那一天放置其他事件(这些总是在给定日期的横幅之后)。因此,例如,如果我有两个事件,一个 1/10-1/11 和一个 1/11-1/15,我更愿意像这样安排它们(每一列是一天):
bbbbb
aa
不喜欢:
aa
bbbbb
因为当我只添加当天的事件(x、y 和 z)时,我可以这样做(我更喜欢第一个,不想要第二个):
bbbbb vs. aa
aa xyz bbbbb
xyz
但这并不像将较长的事件放在首位那么简单,因为对于 1/10-1/11、1/13-1/14 和 1/11-1/13,我想要:
aa cc
bbb
相对于:
bbb
aa cc
因为这将允许事件 x 和 y:
aa cc vs. bbb
xbbby aa cc
x y
当然,我更愿意一次性完成。对于数据结构,我目前正在使用从日期到列表的映射,其中对于事件的每一天,我将事件添加到相应的列表中。因此,一个为期三天的事件出现在三个列表中,每个列表都位于地图中的某一天之下。这是将结果转换为可视输出的便捷结构,但我也对其他数据结构持开放态度。我目前使用的是贪心算法,我只是按顺序添加每个事件,但这会产生不需要的伪影,例如:
aa ccc
bbbbb
dd
eeeeeeeeeeeeeeeee
这在“e”事件的大部分时间里浪费了 很多 空间。
有什么想法吗?
【问题讨论】:
-
我不太明白示例 1&2 和 3&4 之间的区别。例如5 - 我看不到任何其他安排事件的方式会占用更少的垂直空间。因为无论如何 b/c/d/e 中没有两个可以在同一行,所以至少需要 4 行。
-
你说得对,我的意图根本不清楚。我刚刚做了一些修改,希望能更清楚。
-
对于#5,问题是短事件总是低于长事件,因此底部有“e”意味着在任何“e”天添加短事件将增加五分之一排。如果 e 在顶行,则可以将短事件添加到除“d”天之外的任何一天,而无需使用额外的行。
标签: algorithm calendar minimize