Python中的计划优化列表列表[区间计划]

时间:2014-12-12 18:36:07

标签: python algorithm sorting

在python中做了一些学习问题,我遇到了一个挑战,我遇到了麻烦。

REQS

  • 我有一个列表列表,其中第一个和最后一个项目分别是会议的开始和结束时间。

  • “可能的会议”是会议1和2的开始和结束时间可以相同或者1< 2,但它们不能重叠。所以在: [[0,1][1,2][2,3],[2,5]]有3次可能的会议,因为第1次,第2次和第3次会议都可以按顺序发生,但最后一次不能 - 或者至少如果最后一次会议可能发生,第3次会议不能。

  • 我需要返回可能的会议次数

  • 没有任何适当算法的特殊知识,这些知识在这里运行良好(仍然在学习),我的方法是对列表列表进行排序,并将它们与下一个列表进行比较,以查看是否有会议是可能的。问题的所有给定集合至少可以召开一次会议(因为必须至少召开一次会议)。

这是我到目前为止在python3.4中所拥有的:

def answer(meetings):
    index = 0
    nextIndex = index + 1
    possibleMeetings = 1
    impossibleMeetings = 0
    sortedMeetings = sorted(meetings)

    for item in sortedMeetings:
        firstItem = item[1]
        secondItem = sortedMeetings[nextIndex][0]

        if firstItem <= secondItem:
             possibleMeetings +=1
             nextIndex+=1
         elif firstItem > secondItem:
             impossibleMeetings +=1
             nextIndex+=1
        if nextIndex == len(sortedMeetings):
            break
    index +=1
return possibleMeetings, impossibleMeetings

问题:

  • 我觉得这是一种蛮力的方式来排序和比较它们

  • 我认为它不会很好地扩展

  • 有可能会破坏它

这里的任何帮助将不胜感激!希望扩展我对这类问题可能性的概念。谢谢!

1 个答案:

答案 0 :(得分:3)

区间调度优化是{{​​3}}:

中描述的贪婪算法的标准问题
  

以下贪婪算法确实找到了最佳解决方案:

     
      
  1. 选择间隔x,以最早的结束时间。

  2.   
  3. 从候选区间集合中删除x,以及与x相交的所有区间。

  4.   
  5. 继续,直到候选区间组为空。

  6.   

您当前的解决方案只需要O(nlogn)进行排序,加上循环的O(n)操作,因此这是一种非常有效的方法,可以很好地扩展。

然而,这并不完全正确,因为:

  1. 按开始时间排序,而不是结束时间
  2. 您比较每一对连续的会议
  3. 您可以使用以下代码解决这些问题:

    def answer(meetings):
        last_end = -1
        ans = 0
        for end,start in sorted( (end,start) for start,end in meetings ):
            if start >= last_end:
                last_end = end
                ans += 1
        return ans, (len(meetings) - ans)