2012-02-13 36 views
12

Dưới đây là một vấn đề thú vị mà tôi gặp phải trong một cuộc thi lập trình:Phát hiện khi nhân ma trận có thể

tuyên bố Vấn đề: Do kích thước của n ma trận, xác định xem có tồn tại một trật tự như vậy mà các ma trận có thể nhân lên. Nếu có, in ra kích thước (sản phẩm của kích thước) của ma trận kết quả.

Quan sát của tôi: Điều này giảm xuống vấn đề đường dẫn Hamilton-NP nếu bạn xem mỗi ma trận là một đỉnh và vẽ một cạnh đạo giữa các ma trận có thể nhân lên. Tôi giải quyết điều này bằng cách đơn giản là brute-buộc vấn đề nhưng điều này rõ ràng là rất chậm. Tôi đã tự hỏi nếu có bất kỳ tối ưu hóa thông minh cho trường hợp cụ thể của vấn đề này.

+3

Tất cả các vấn đề có thể giải quyết (và có thể kiểm tra) hiệu quả đều giảm xuống các vấn đề NP-complete. Nó là giảm từ một vấn đề NP-hoàn thành vấn đề của bạn mà nên gây phiền nhiễu. – aelguindy

+0

Như @ElKamina nói, đó là một vấn đề đường mòn Euler, xem thêm câu trả lời của tôi [ở đây] (http://stackoverflow.com/a/9046177/1011995). –

Trả lời

14
  1. Tạo nút cho mỗi chiều dài thứ nguyên. Tức là, nếu có ma trận kích thước (m, n), thì m và n sẽ là đỉnh trong biểu đồ.

  2. Đối với mọi ma trận có kích thước (m, n), kết nối các nút m và n với cạnh được chỉ đạo (có thể có nhiều cạnh giữa hai nút).

  3. Bây giờ, tìm một đường mòn eular sẽ cung cấp thứ tự nhân.

Xem http://en.wikipedia.org/wiki/Euler_path để tìm đường mòn Eularian. Độ phức tạp là khá gần với tuyến tính (O (nlog^3n loglogn) trong đó n là số cạnh = số ma trận).

+0

+1 bravo! Tôi ước mình sẽ tự mình sáng tạo ra nó. – Gangnus

0

Tạo ma trận tương thích (hãy gọi nó là CM) chẳng hạn như CM [x, y] = 1 nếu ma trận x có thể được multuplied bởi y, 0 nếu không. nếu yếu tố quyết định (CM) <> 0 có một đơn đặt hàng.

Nó chỉ là một trực giác, tôi xin lỗi nếu tôi sai (tiếc là tôi không thể tìm thấy một bằng chứng vững chắc).

+0

Chắc chắn là không đúng sự thật. Xem xét trường hợp của hai ma trận 2x2. Sau đó ma trận của bạn là [[1,1] [1,1]], có yếu tố quyết định 0. –

+0

Đó là sự thật, nhưng điều này cũng có nghĩa là bạn xem xét rằng ma trận có thể được nhân với chính nó. Trong trường hợp của một ma trận vuông, điều đó hoàn toàn đúng, nhưng trong trường hợp cụ thể này, chúng ta đang tìm kiếm một chuỗi các ma trận nhân với nhau, có nghĩa là chúng ta nên xem xét một ma trận không tương thích với chính nó. Điều này rõ ràng không phải là bằng chứng cho thấy tôi đúng, chỉ là một cân nhắc. Cảm ơn mặc dù cho bình luận, nếu bạn tìm thấy một counterexample khác, tôi sẽ đánh giá cao. – loscuropresagio

+0

Điểm tốt. Làm thế nào về một ma trận 1x2 và 2x3. Sau đó, tôi nghĩ ma trận của bạn là [[0,1] [0,0]], cũng có một yếu tố quyết định là 0, mặc dù bạn có thể nhân các phần tử này lại với nhau. –

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