如何证明贪心算法的最优性

时间:2014-10-28 16:00:52

标签: algorithm intervals discrete-mathematics

  

S成为可能重叠的自然数的一组区间(包含n个区间),N是一个数字列表(包含n个数字)。

我想找到S的最小子集(让我们称之为P),以便每个数字 在我们的列表N中,P中至少存在一个包含它的间隔。允许P中的间隔重叠。

琐碎的例子:

S = {[1..4], [2..7], [3..5], [8..15], [9..13]}
N = [1, 4, 5]
// so P = {[1..4], [2..7]}

我找到了解决此问题的方法,如下所示

N = MergeSort (N)
upper, lower = infinity, -1
P = empty set
for each q in N do
     if (q>=lower and q<=upper)=False
          max_interval = [-infinity, infinity]
          for each r in S do
              if q in r then
                 if r.rightEndPoint > max_interval.rightEndPoint
                     max_interval = r
          P.append(max_interval)
          lower = max_interval.leftEndPoint
          upper = max_interval.rightEndPoint
          S.remove(max_interval)

我找到了这个解决方案,但我并不完全确定如何证明贪婪算法的最优性(证明,这将始终给出最佳结果)。

我的问题:如何证明这种贪婪解决方案的最优性?

提前致谢。

1 个答案:

答案 0 :(得分:0)

是的,您的算法达到最佳解决方案。我对正式证据不满意,但希望以下论点应该令人信服。

  1. 数组N按升序排序,您将以非递减顺序相应地访问元素。换句话说,当前元素始终是&gt; =前一个元素。
  2. 对于每个元素,我们首先检查它是否可以容纳在先前选择的区间中,如果不是,则我们继续执行步骤3,否则我们跳到下一个元素。
  3. 对于当前元素,我们选择S中的(到目前为止未选择的)间隔,以使其结束&#39;点数尽可能大。这是有道理的,因为我们可以容纳大多数跟随当前元素的元素。例如,如果当前元素是10,并且我们有两个候选区间[8,12]和[9,15],我们在任何情况下都不应选择前者,因为我们知道所有以下元素必须大于10