电影调度_问题_

Dav*_*owe 6 algorithm schedule

目前我正在阅读Skiena的"算法设计手册"(好了,开始阅读)

他问一个他称之为"电影调度问题"的问题:

问题:电影调度问题

输入:线上n个区间的集合I.

输出:可以从I中选择的相互非重叠区间的最大子集是什么?

示例:(每条虚线都是一部电影,您想要找到电影数量最多的一组)

                      ----a---
-----b----    -----c---    ---d---
        -----e---  -------f---
            --g--  --h--
Run Code Online (Sandbox Code Playgroud)

我想要解决它的算法是这样的:我可以抛出"最坏的罪犯"(与大多数其他电影相交),直到没有最严重的罪犯(零交叉点).我看到的唯一问题是,如果有一个平局(比如两部不同的电影,每部电影与其他3部电影相交),我扔出哪一部电影是否重要?

基本上我想知道我是如何将这个想法变成"数学"以及如何证明它是正确/不正确的.

pka*_*zak 11

算法不正确.让我们考虑以下示例:

           |----F----|       |-----G------| 

        |-------D-------|  |--------E--------|

|-----A------|    |------B------|    |------C-------|
Run Code Online (Sandbox Code Playgroud)

你可以看到有一个大小至少为3的解决方案,因为你可以pick A, B and C.

首先,让我们计算每个区间的交叉点数量:

A = 2    [F, D]
B = 4    [D, F, E, G]
C = 2    [E, G]
D = 3    [A, B, F]
E = 3    [B, C, G]
F = 3    [A, B, D]
G = 3    [B, C, E]
Run Code Online (Sandbox Code Playgroud)

现在考虑一下你的算法.在第一步中,我们删除B因为它与最多的invervals相交,我们得到:

           |----F----|       |-----G------| 

        |-------D-------|  |--------E--------|

|-----A------|                      |------C-------|
Run Code Online (Sandbox Code Playgroud)

很容易看出,现在{A, D, F}你可以只选择一个,因为每对相交.同样的情况{G, E, C},所以删除后B,你最多可以选择一个{A, D, F},最多一个{G, E, C},以获得总数2,小于的大小{A, B, C}.

结论是,在删除B与最多次数相交的删除后,您无法获得最大数量的非相交电影.

正确的解决方案

问题是众所周知的,一种解决方案是选择首先结束的间隔,删除与其相交的所有间隔并继续直到没有要检查的间隔.这是贪婪方法的一个例子,您可以找到或开发一个正确的证明.