2016-07-18 4 views
9

私はかなり面白そうなこの問題を遭遇しました。私たちはそれらのすべてを見たいが、彼らは唯一の次の回で示したいくつかの映画があります。すべての映画のアルゴリズムを見る

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

それはですので、私たちは、20で17とDで、14時、15時にCをBを見ることができますそれらをすべて見ることができます。実行可能ではなく15でCを見ることはできません。

あなたが推測したように、私たちはすべてを見ることができるかどうかです。

明らかに、私たちはバックトラックですべての可能性を試して解決することができます。それを行う良い方法はありますか?利用可能な時間が最も少ない映画から始めて、ソリューションがあればもっと速く見つけることができます。最悪の場合の時間の複雑さは同じです。

そこにこの問題のアルゴリズムがありますか?

P.S. @genが尋ねるように、各映画は1時間であることを指摘するのを忘れていたので、14:00に見ると15:00にそれを見逃すことはありません。質問してくれてありがとう。

+1

映画はどれくらいですか? – gen

+0

@gen各映画は1時間ですので、14:00に映画を見ると心配する必要はありません.15:00に映画を見逃すことがあります。素晴らしい質問! – Arch1tect

+0

二部グラフの最大一致問題のように見えます。 –

答えて

7

ムービー数の上限とムービーごとの可能な時間数によっては、一方の側のムービーと他方の側のムービーを持つ2部グラフを作成し、最大フローアルゴリズムを実行して最大一致。時間jで映画iを見ることができる場合は、グラフの対応するノードの間にエッジを追加します。

+0

私はこのaproachが好きですが、最大フローアルゴリズムは非常に複雑です。 – xenteros

+0

@xenteros「巨大な複雑さ」とはどういう意味ですか? Hopcroft-Karpを使うと、最悪のケースの 'O(M * sqrt(N))'を得ることができます。ここで 'M'はエッジ数、' N'はノード数です(この場合、異なる時間の数)。これは何千もの映画+秒の間に実行されます。さらに、多くのフローアルゴリズムはネットワークの構造の影響を強く受け、多くの場合、より高速に動作することができます。最後に、OPはバックトラッキングよりも優れたものを求めた。 – ale64bit

+0

私は最大の流れのアルゴリズムに慣れていないので、私はあなたに返信する前にそれを学ぶためにもう少し時間を費やす必要があります..しかし、このアルゴリズムがより複雑に存在することを知ってうれしいです。ありがとう! – Arch1tect

0
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) 
+1

残念ながら、これは存在していても解決策を見つけることができません。反例については、私がここで同等の問題と非常に似通った解決策に与える反例を見てください:http://stackoverflow.com/a/37864372/47984 –

1

は二部グラフの最大マッチング問題のように見えます。グラフの頂点は「時間帯」と「映画タイトル」の2つの独立したセットです。グラフのエッジは、特定の時間における特定のフィルムの表示である。

Steven Skienaのアルゴリズム設計マニュアルによれば、最もよく知られているアルゴリズムはO(E * sqrt(V))で動作するHopcroft-Karpアルゴリズムです。 Eはエッジの数である。ショーの数Vは頂点の数です。フィルム数とフィルムが表示されている別の時間数を足したものです。あなたのフィルムはすべて時間に開始し、正確に一つの時間続くので、あなたの例では、E = 8回の上映、= 4つの膜+ 4明確倍= 8

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

注マッチング処方Vにのみ可能です。それらは正確に一致するか、まったく重複しません。

関連する問題