我花了好几个小时试图理解这个问题的答案。我只是不明白。有人可以给我一些算法的伪代码(最好是类似Java的伪代码),根据答案解决这个问题吗?这将有助于我理解答案所说的内容。
问答:
不是全部输入,而是在这个PDF中更好地设计了它。问题是pdf上的第一个问题,即练习16.1-4
http://mitpress.mit.edu/algorithms/solutions/chap16-solutions.pdf
(澄清一下,他不是家庭作业,我正在做书籍,想要了解这个问题。链接是问题的解决方案,但我不明白。我不明白这意味着什么时候它说:“要做到这一点,请按照事件开始和活动完成的一系列事件,按事件时间顺序......”以及其余的解释。这就是为什么,如果有人理解它,我想如果他们可以向我展示这个解释的伪代码。我可以通过这种方式阅读和理解它。就像函数的参数是什么,函数内部发生了什么,如何迭代活动,它们是如何迭代的在两个繁忙和免费的演讲厅列表之间移动,等等) 谢谢
答案 0 :(得分:1)
好吧,我不会用正确的代码回答这个问题,最多我会尝试伪代码来定义我对问题的理解。我还假设您将使用整数倍,而不是浮点时间,但我确信它不会在一天结束时产生巨大的差异。
这里贪婪的解决方案是简单地分配到一个免费的演讲厅,并始终使用以前使用过的演讲厅。也就是说,我很确定,解决方案要求你做什么。
所以,首先,我会创建某种struct
或class
来保存所有“事件”,我们将“事件”定义为活动的开始或结束时间。此struct
/ class
也会引用它作为开始/结束时间的活动。
也许有点像(C ++语法因为它更容易而且我很懒惰):
struct evt
{
int activityID;
int time;
bool isStart;
};
下一步是为每个活动的开始/结束时间构建此struct
或class
的实例,然后将其放入某种列表数据结构(如果这是C ++,我使用vector
,我猜Java ArrayList
然后根据time
排序事件。因此,对于Java,您需要某种比较函数来根据时间确定这些事件的顺序。此外,在比较器中,作为开始事件的事件将比完成事件的事件晚(请记住,间隔是半开的)。我会拨打ArrayList
“eventList
”。
接下来,您有两个我认为是 n 大厅的列表(您最多需要 n 大厅来运行所有活动)。所有大厅都有一个清单。这是未使用的大厅列表。另一个清单是空的。这将是正在使用的大厅列表。这些列表可以从它们的前面删除(我认为Java ArrayList
可以这样做。)
您可以通过某种方式识别大厅,也可以使用某种参考阵列,以便将每个活动分配到大厅。这部分有点不清楚,我宁愿把实现细节留给你,但如果 n 不是太大,我可能会(再次用C ++)a vector<int>
大小为 n ,而vector
中的 i -th元素将是大厅标识符,如果尚未分配,则为-1
然而。如果我在Java中尝试这个,那么这将是一个int[n]
数组。
然后我将遍历eventList
,并在每个事件中,我会检查它是完成时间还是开始时间。如果这是一个开始时间,我会采取“免费大厅”列表的前面元素,并将其放入“使用中”的大厅。如果是结束时间,我会选择刚刚完成的大厅,将其从“使用中”列表中删除,然后将放回“免费大厅”列表的前面。请记住,您还需要更新我之前谈到的参考数组。
最后,通过一些修补,你可以找到使用了多少个大厅。线性通过阵列或在你使用大厅时运行的计数器就足够了。我认为有效的一种方法是记录列表的最大大小,该列表一次可以容纳多少个大厅,尽管这可能是不正确的(没有彻底测试过)。
我只是从头脑中做到这一点,所以这个解决方案目前可能有点令人困惑。对于那个很抱歉。我将在这里尝试总结一下:
由于这是一篇相当长的帖子,并且我没有提供太多代码(我尝试删除提示但我不知道它是否有用)如果您有更多问题请告诉我,我会尝试帮助尽我所能。
看到here的“活动选择”问题可以通过选择最早完成的活动以贪婪的方式解决。我认为这有点不同,但我只是把它包括在内,因为它可能很有趣。
答案 1 :(得分:0)
这是我使用Java集合的Java实现演讲厅贪婪选择器算法