在本文中,我们将讨论贪婪算法的各种调度算法。使用贪婪算法可以解决许多调度问题。
问题陈述:给定N个事件及其开始和结束时间,请找到包含尽可能多事件的时间表。无法部分选择事件。请考虑以下事件:
- 在这种情况下,事件的最大数量为两个。作为选择的事件B和d如下:
- 有可能为这个问题发明几种贪婪算法。
适用于每种情况的算法:
算法1 :
- 第一个想法是选择尽可能短的事件。在示例中,此算法选择以下事件:
- 但是,选择短事件并不总是正确的策略。例如,在以下情况下该算法将失败:
- 如果选择短事件,则只能选择一个事件。但是,有可能同时选择两个长事件。
算法2 :
- 另一个想法是始终选择下一个尽可能早开始的可能的事件。该算法选择以下事件:
- 但是,给出了该算法的反例。在这种情况下,该算法仅选择一个事件:
- 如果选择了第一个事件,则无法选择任何其他事件。但是,可以选择其他两个事件。
算法3 :
- 第三个想法是始终选择下一个可能尽早结束的事件。该算法选择以下事件:
- 事实证明,该算法始终会产生最佳解决方案。
- 这样做的原因是,首先选择一个尽早结束的事件始终是最佳选择。
- 此后,使用相同的策略等选择下一个事件,直到无法选择任何其他事件,这是一个最佳选择。
- 该算法起作用的一种方式是考虑如果首先选择一个事件的发生时间早于该事件的发生时间,那么会发生什么情况。
- 现在,通过最多具有相等数量的选择,可以如何选择下一个事件。
- 因此,选择一个以后结束的事件永远不会产生更好的解决方案,并且贪婪算法是正确的。