【问题标题】:Watch all movies algorithm看电影算法
【发布时间】:2016-11-20 18:51:39
【问题描述】:

我遇到了这个看起来很有趣的问题。有几部电影我们想全部观看,但它们只在以下时间放映:

movieA : 15
movieB : 14, 15, 17
movieC : 15, 17
movieD : 15, 20

我们可以在 15 点观看 A,在 14 点观看 B,在 17 点观看 C,在 20 点观看 D,因此可以全部观看。请注意,您不能在 15 岁时观看 C,这是不可行的。

如你所料,问题是我们能否全部观看。

显然我们可以通过回溯来解决它,尝试所有可能性。有更好的方法吗?我有一个想法,首先从可用次数最少的电影开始,这样如果有解决方案,我们可以更快地找到解决方案,最坏情况的时间复杂度仍然相同。

有没有更好的算法来解决这个问题?

附: 正如@gen 所问,我忘了指出每部电影是 1 小时,所以如果您在 14:00 观看一部,您将不会错过 15:00 的一部。谢谢提问。

【问题讨论】:

  • 一部电影有多长?
  • @gen 每部电影都是一个小时,所以你看14:00的电影不用担心,你可能会错过15:00的电影。好问题!
  • 看起来像二分图上的最大匹配问题。

标签: algorithm sorting dynamic-programming greedy


【解决方案1】:

根据电影数量的界限和每部电影可能的不同时间的数量,您可以创建一个一边是电影,另一边是时间的二分图,然后运行最大流量算法来确定最大匹配。如果电影i 可以在时间j 观看,则在图中的相应节点之间添加一条边。

【讨论】:

  • 我喜欢这种方法,但仍然 - 最大流算法非常复杂。
  • @xenteros 你所说的“巨大的复杂性”是什么意思?如果你使用 Hopcroft-Karp,你可以得到最坏的情况O(M*sqrt(N)),其中M 是边数,N 是节点数(在这种情况下,电影数 + 不同次数);这将在一秒钟内运行数千部电影+次。此外,许多流算法受网络结构的影响很大,并且在许多情况下可以运行得更快。最后,OP 要求提供比回溯更好的方法。
  • 我对最大流量算法不是很熟悉,所以在回复你之前我需要花更多的时间来学习它。但是很高兴知道有这个算法更好复杂。谢谢!
【解决方案2】:
WHILE list of movie times isn't empty 
    1. Sort movie showtime list in order of the number of showtimes.
    2. Watch next movie according to this sort at the first available time.
    3. Remove respective time from each movie showtime list and movie 
       from the movie list.

Python 尝试:

A=[15,'A']
B=[14,15,17,'B']
C=[15,17,'C']
D=[15,20,'D']

movies=[A,B,C,D]


watchOrder = []

def f(x):
    while x: # while x isnt empty
        x=sorted(x, key=len)
        watchOrder.append(x[0])
        r = x[0][0]
        x.remove(x[0])
        for l in x:
            if r in l:
                l.remove(r)
f(movies)
print(watchOrder)

【讨论】:

  • 不幸的是,即使存在解决方案,也可能无法找到解决方案。有关反例,请参阅我在此处给出的与等效问题非常相似的解决方案的反例:stackoverflow.com/a/37864372/47984
【解决方案3】:

看起来像二分图上的最大匹配问题。该图的顶点是两个独立的集合“一天中的时间”和“电影标题”。图表的边缘是特定时间特定电影的放映。

根据 Steven Skiena 的算法设计手册,最著名的算法是 Hopcroft-Karp 算法,它的运行时间为 O(E*sqrt(V))。 E 是边数,即。放映次数。 V是顶点的数量,即。电影的数量加上放映电影的不同小时数。在您的示例中,E = 8 次放映,V = 4 部电影 + 4 次不同时间 = 8。

https://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm

请注意,匹配的公式是唯一可能的,因为您的电影都是从整点开始并持续整整一小时。它们要么完全重合,要么根本不重叠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多