贪心活动 - 选择器算法:和最少量的演讲厅伪代码活动

时间:2012-01-30 07:07:50

标签: java algorithm pseudocode greedy

我花了好几个小时试图理解这个问题的答案。我只是不明白。有人可以给我一些算法的伪代码(最好是类似Java的伪代码),根据答案解决这个问题吗?这将有助于我理解答案所说的内容。

问答:

不是全部输入,而是在这个PDF中更好地设计了它。问题是pdf上的第一个问题,即练习16.1-4

http://mitpress.mit.edu/algorithms/solutions/chap16-solutions.pdf

(澄清一下,他不是家庭作业,我正在做书籍,想要了解这个问题。链接是问题的解决方案,但我不明白。我不明白这意味着什么时候它说:“要做到这一点,请按照事件开始和活动完成的一系列事件,按事件时间顺序......”以及其余的解释。这就是为什么,如果有人理解它,我想如果他们可以向我展示这个解释的伪代码。我可以通过这种方式阅读和理解它。就像函数的参数是什么,函数内部发生了什么,如何迭代活动,它们是如何迭代的在两个繁忙和免费的演讲厅列表之间移动,等等) 谢谢

2 个答案:

答案 0 :(得分:1)

好吧,我不会用正确的代码回答这个问题,最多我会尝试伪代码来定义我对问题的理解。我还假设您将使用整数倍,而不是浮点时间,但我确信它不会在一天结束时产生巨大的差异。

这里贪婪的解决方案是简单地分配到一个免费的演讲厅,并始终使用以前使用过的演讲厅。也就是说,我很确定,解决方案要求你做什么。

所以,首先,我会创建某种structclass来保存所有“事件”,我们将“事件”定义为活动的开始或结束时间。此struct / class也会引用它作为开始/结束时间的活动。

也许有点像(C ++语法因为它更容易而且我很懒惰):

struct evt
{
    int activityID;
    int time;
    bool isStart;
};

下一步是为每个活动的开始/结束时间构建此structclass的实例,然后将其放入某种列表数据结构(如果这是C ++,我使用vector,我猜Java ArrayList然后根据time 排序事件。因此,对于Java,您需要某种比较函数来根据时间确定这些事件的顺序。此外,在比较器中,作为开始事件的事件将比完成事件的事件晚(请记住,间隔是半开的)。我会拨打ArrayListeventList”。

接下来,您有两个我认为是 n 大厅的列表(您最多需要 n 大厅来运行所有活动)。所有大厅都有一个清单。这是未使用的大厅列表。另一个清单是空的。这将是正在使用的大厅列表。这些列表可以从它们的前面删除(我认为Java ArrayList可以这样做。)

您可以通过某种方式识别大厅,也可以使用某种参考阵列,以便将每个活动分配到大厅。这部分有点不清楚,我宁愿把实现细节留给你,但如果 n 不是太大,我可能会(再次用C ++)a vector<int>大小为 n ,而vector中的 i -th元素将是大厅标识符,如果尚未分配,则为-1然而。如果我在Java中尝试这个,那么这将是一个int[n]数组。

然后我将遍历eventList,并在每个事件中,我会检查它是完成时间还是开始时间。如果这是一个开始时间,我会采取“免费大厅”列表的前面元素,并将其放入“使用中”的大厅。如果是结束时间,我会选择刚刚完成的大厅,将其从“使用中”列表中删除,然后将放回“免费大厅”列表的前面。请记住,您还需要更新我之前谈到的参考数组。

最后,通过一些修补,你可以找到使用了多少个大厅。线性通过阵列或在你使用大厅时运行的计数器就足够了。我认为有效的一种方法是记录列表的最大大小,该列表一次可以容纳多少个大厅,尽管这可能是不正确的(没有彻底测试过)。

我只是从头脑中做到这一点,所以这个解决方案目前可能有点令人困惑。对于那个很抱歉。我将在这里尝试总结一下:

  1. 声明一个将开始/结束时间概括为事件的类
  2. 将所有开始和结束时间排序到一个数组中,较早时间在列表中较早,并且在开始时间之前出现完成时间
  3. 列出一个大厅,另一个(空列表)将是所有正在使用的大厅
  4. 处理每个事件,如果是开始时间将大厅移动到使用中的列表,如果是结束时间则移动到空闲列表
  5. 由于这是一篇相当长的帖子,并且我没有提供太多代码(我尝试删除提示但我不知道它是否有用)如果您有更多问题请告诉我,我会尝试帮助尽我所能。

    看到here的“活动选择”问题可以通过选择最早完成的活动以贪婪的方式解决。我认为这有点不同,但我只是把它包括在内,因为它可能很有趣。

答案 1 :(得分:0)

这是我使用Java集合的Java实现演讲厅贪婪选择器算法

https://github.com/pratikmp/LectureHallGreedyAlgorithm