【问题标题】:Dynamic programming: design an algorithm that is in O(n log n) time动态规划:设计一个 O(n log n) 时间的算法
【发布时间】:2015-06-23 07:29:02
【问题描述】:

请考虑以下问题:

会议上有n 的演示文稿,每个演示文稿都有开始时间和结束时间。你不能参加所有这些,因为其中一些重叠。每个演示文稿都有与您参加的愿望相对应的值。

O(n log n)时间,使用动态规划算法找到一组具有最大总价值的演示文稿,使得它们的时间都不重叠。

我的想法:

通过使用动态编程,我们将检查每个演示文稿,存储其开始时间、结束时间、值,一次一个(并比较是否与之前存储的数据重叠)。但是,如何在O(n log n) 时间内做到这一点?

【问题讨论】:

    标签: algorithm big-o dynamic-programming mergesort


    【解决方案1】:

    按结束时间排序间隔(这是O(nlogn)),然后应用遵循递归公式的DP解决方案:

    Let start[1,...,n] be an array containing start times
    Let end[1,....,n] be an array containing end times
    Let values[1,...,n] be an array containing values of each presentations
    Assume arrays are already sorted, such that the `i`th element in all arrays refer to the same presentation, and the array end is in ascending order.
    
    
        D(0) = 0
        D(i) = max { D(i-1), D(j) + values[i] } where j is the highest index such that end[j] <= end[i]
    

    在上面的递归公式中:

    • 通过二分搜索很容易找到j 的所需值(因为end 已排序)。
    • 递归函数的参数i 是当前的“候选”表示。
    • 一般的想法是 - 你要么参加这个会议(然后不能去任何其他重叠的会议,因此递归到D(j)) - 或者你不参加,然后继续下一个候选人。
    • 可能的最大值由D(n) 表示。
    • 在 DP 解决方案之后,通过追溯您的选择来查找您参加的实际演示文稿 - 如果您决定在 max{} 函数中转到 D(j)+values[i] - 添加 i,否则 - 您不需要参加。

    【讨论】:

    • 请您解释一下如何按结束时间对间隔进行排序是 O(nlogn) 吗?
    • @JamestheGreat 这是一个常规排序,例如使用快速排序或合并排序在 O(nlogn) 中完成。
    【解决方案2】:

    这可以在 O(nlgn) 时间内完成:

    1. 构造一个开始时间数组并对其进行排序。每个开始时间的结束时间和相应值可以使用哈希表、具有相同表示值的相同索引的单独数组来维护,或者可以将它们扩充到开始时间数组。此操作需要 O(nlgn) 时间。
    2. 使用 DP。现在我们构造一个长度为 n 的数组,比如数组,它的第 i 个元素存储索引 i 到 n 的演示文稿的最佳值,就像演示文稿的排序起始数组一样。(1-indexed)将所有数组元素初始化为 0。O(n) 时间.
    3. 将数组[n] 分配给值[n],即开始时间数组中第n 个表示的值。 O(1)
    4. 使用二分搜索在 start_time 数组中找到 end_time[n-1] 位置,即哪个开始时间索引刚好大于这个结束时间,让这个索引为 k。那么

      Array[n-1] =max(value[n-1] + Array[k], Array[n])
      

      步骤 4 的 O(lg(n)) 时间。

    5. 对 Array[n-1] 重复步骤 3 和 4 以获得 Array[0],这是可以达到的最佳值。 O(nlgn) 时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 2015-12-03
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2011-07-09
      相关资源
      最近更新 更多