2016-07-18 18 views
9

Natknąłem się na ten problem, który wydaje się całkiem interesujący. Istnieje kilka filmów, które chcemy oglądać wszystkie z nich, ale pokazują one tylko w następujących godzinach:Zobacz wszystkie algorytmy filmów

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

Możemy oglądać w 15, B w 14 C na 17 i D na 20, więc jest to można oglądać je wszystkie. Pamiętaj, że nie możesz oglądać C w wieku 15 lat, nie można tego zrobić.

Jak można się domyślić, problem polega na tym, czy możemy obejrzeć je wszystkie.

Oczywiście możemy to rozwiązać poprzez cofnięcie, wypróbowanie wszystkich możliwości. Czy istnieje lepszy sposób na zrobienie tego? Mam pomysł na rozpoczęcie od filmów z najmniejszą liczbą dostępnych czasów, dzięki czemu możemy szybciej znaleźć rozwiązanie, jeśli istnieje rozwiązanie, w najgorszym przypadku złożoność czasu jest wciąż taka sama.

Czy istnieje lepszy algorytm dla tego problemu?

P.S. Jak prosił @gen, zapomniałem zaznaczyć, że każdy film ma 1 godzinę, więc jeśli obejrzysz go o 14:00, nie przegapisz tego o 15:00. Dzięki, że pytasz.

+1

Jak długi jest film? – gen

+0

@gen każdy film to godzina, więc nie musisz się martwić, jeśli obejrzysz film o 14:00, możesz pominąć ten o 15:00. Świetne pytanie! – Arch1tect

+0

Wygląda na problem z dopasowaniem maksymalnym na wykresie dwudzielnym. –

Odpowiedz

7

W zależności od granic liczby filmów i liczby możliwych różnych czasów dla każdego filmu, można utworzyć dwustronny wykres z filmami po jednej stronie i czasami po drugiej stronie i uruchomić algorytm maksymalnego przepływu w celu określenia maksymalne dopasowanie. Jeśli film i może być oglądany w czasie j, dodaj krawędź między odpowiednimi węzłami na wykresie.

+0

Podoba mi się ten aproach, ale mimo to - algorytm maksymalnego przepływu ma ogromną złożoność. – xenteros

+0

@xenteros Co masz na myśli przez "ogromną złożoność"? Jeśli używasz Hopcroft-Karp, możesz uzyskać najgorszy przypadek 'O (M * sqrt (N))' gdzie 'M' to liczba krawędzi, a' N' to liczba węzłów (w tym przypadku liczba filmów + liczba różnych czasów); to będzie działać pod sekundą dla tysięcy filmów + razy. Co więcej, wiele algorytmów przepływu ma duży wpływ na strukturę sieci i może w wielu przypadkach działać znacznie szybciej. W końcu OP poprosił o coś lepszego niż wycofanie. – ale64bit

+0

Nie jestem zaznajomiony z algorytmem maksymalnego przepływu, więc muszę poświęcić nieco więcej czasu, aby się go nauczyć, zanim odpowiem.Ale wspaniale jest wiedzieć, że istnieje ten algorytm o lepszej złożoności. Dzięki! – 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 próba:

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

Niestety to może nie znaleźć rozwiązania, nawet jeśli takie istnieje. W przypadku kontrprzykładu zobacz kontrprzykład, który podaję bardzo podobnemu rozwiązaniu do równoważnego problemu tutaj: http://stackoverflow.com/a/37864372/47984 –

1

Wygląda maksymalnej problemu z dopasowaniem na dwustronnym wykresie. Wierzchołki wykresu to dwa niezależne zestawy "godziny dnia" i "tytuły filmów". Krawędzie wykresu to pokazy konkretnego filmu w określonym czasie.

Zgodnie z algorytmem projektowania algorytmem Steven Skiena, najbardziej znanym algorytmem jest algorytm Hopcroft-Karp, który działa w trybie O (E * sqrt (V)). E to liczba krawędzi, tj. liczba pokazów. V to liczba wierzchołków, tj. liczba filmów plus liczba różnych godzin, podczas których wyświetlane są filmy. W przykładzie, E = 8 pokazy, V = 4 + 4 odrębne filmy razy = 8.

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

Note preparat dopasowanie jest możliwe tylko dlatego, że Twoje filmy wszyscy zaczynają na godzinę i trwać dokładnie jedną godzinę. Są albo dokładnie zbieżne, albo w ogóle się nie pokrywają.