2016-07-18 17 views
9

Tôi gặp phải vấn đề này có vẻ khá thú vị. Có một vài bộ phim mà chúng tôi muốn xem tất cả chúng nhưng chúng chỉ hiển thị vào những thời điểm sau:Xem tất cả thuật toán phim

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

Chúng tôi có thể xem A ở 15, B ở 14, C ở 17 và D ở 20, vì vậy, có thể xem tất cả. Lưu ý rằng bạn không thể xem C ở mức 15, không thể thực hiện được.

Vấn đề như bạn đã đoán, liệu chúng tôi có thể xem tất cả không.

Rõ ràng là chúng tôi có thể giải quyết nó bằng tính năng backtracking, thử tất cả các khả năng. Có cách nào tốt hơn để làm điều đó không? Tôi có ý tưởng bắt đầu với các bộ phim có ít nhất số lần có sẵn trước tiên, theo cách đó chúng tôi có thể tìm giải pháp nhanh hơn nếu có giải pháp, độ phức tạp của trường hợp xấu nhất vẫn như cũ.

Có thuật toán nào tốt hơn cho vấn đề này không?

P.S. Khi @gen hỏi, tôi quên chỉ ra rằng mỗi bộ phim là 1 giờ, vì vậy nếu bạn xem một lúc 14:00, bạn sẽ không bỏ lỡ một lúc 15:00. Cam ơn vi đa hỏi.

+1

phim dài bao lâu? – gen

+0

@gen mỗi bộ phim là một giờ, vì vậy bạn không cần phải lo lắng nếu bạn xem một bộ phim lúc 14:00, bạn có thể bỏ lỡ một lúc 15:00. Câu hỏi tuyệt vời! – Arch1tect

+0

Trông giống như một vấn đề phù hợp tối đa trên biểu đồ hai bên. –

Trả lời

7

Tùy thuộc vào giới hạn về số lượng phim và số lần có thể khác nhau cho mỗi phim, bạn có thể tạo biểu đồ hai chân với các phim ở một bên và thời gian ở phía bên kia và chạy thuật toán dòng tối đa để xác định kết hợp tối đa. Nếu phim i có thể được xem tại thời điểm j, sau đó thêm một cạnh giữa các nút tương ứng trong biểu đồ.

+0

Tôi thích aproach này, nhưng vẫn - thuật toán dòng chảy tối đa có độ phức tạp rất lớn. – xenteros

+0

@xenteros Bạn có ý nghĩa gì bởi "sự phức tạp lớn"? Nếu bạn sử dụng Hopcroft-Karp bạn có thể gặp trường hợp xấu nhất 'O (M * sqrt (N))' trong đó 'M' là số cạnh và' N' là số lượng nút (trong trường hợp này, số lượng phim + số lần khác nhau); điều này sẽ chạy dưới một giây cho hàng nghìn bộ phim + lần. Hơn nữa, nhiều thuật toán dòng chảy bị ảnh hưởng nặng nề bởi cấu trúc của mạng và có thể chạy nhanh hơn nhiều trong nhiều trường hợp. Cuối cùng, OP yêu cầu điều gì đó tốt hơn là quay ngược lại. – ale64bit

+0

Tôi không quen thuộc với thuật toán dòng chảy tối đa, vì vậy tôi sẽ cần phải dành thêm một chút thời gian để tìm hiểu nó trước khi tôi trả lời bạn ..Nhưng thật tuyệt khi biết có tồn tại thuật toán này với độ phức tạp cao hơn. Cảm ơn! – 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 nỗ lực:

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

Thật không may điều này có thể không tìm thấy một giải pháp mặc dù một tồn tại. Đối với một counterexample, xem counterexample tôi đưa ra một giải pháp rất giống với một vấn đề tương đương ở đây: http://stackoverflow.com/a/37864372/47984 –

1

Trông giống như một vấn đề phù hợp tối đa trên một đồ thị hai phía. Các đỉnh của biểu đồ là hai tập hợp độc lập 'giờ trong ngày' và 'tiêu đề phim'. Các cạnh của biểu đồ là các phần trình chiếu của một bộ phim cụ thể tại một thời điểm cụ thể.

Theo Hướng dẫn thiết kế thuật toán của Steven Skiena, thuật toán được biết đến nhiều nhất là thuật toán Hopcroft-Karp chạy trong O (E * sqrt (V)). E là số cạnh, tức là. số lần chiếu. V là số đỉnh, tức là. số lượng phim cộng với số giờ riêng biệt trong thời gian chiếu phim. Trong ví dụ của bạn, E = 8 chiếu, V = 4 bộ phim +4 biệt lần = 8.

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

Lưu ý việc xây dựng phù hợp chỉ có thể vì bộ phim của bạn tất cả bắt đầu vào giờ và kéo dài đúng một tiếng đồng hồ. Chúng trùng khớp chính xác hoặc không trùng lặp.

Các vấn đề liên quan