2011-06-06 73 views
11

Tôi đang gặp phải sự cố ngay bây giờ, tôi cần đếm số lần ma trận MxM nhất định xuất hiện bên trong một ma trận NxN (cái này phải lớn hơn số đầu tiên). Bất kỳ gợi ý nào về cách thực hiện điều này? Tôi sẽ thực hiện nó trong C và không có tùy chọn để thay đổi nó.Thuật toán đếm số lần xuất hiện của ma trận bên trong một lớn hơn

Revision 1

Hi tất cả mọi người, tôi thực sự muốn nói lời cảm ơn đến tất cả các câu trả lời và ý kiến ​​về vấn đề này. Tôi nên nói với bạn rằng sau nhiều giờ làm việc vất vả, chúng tôi đã đi đến một giải pháp không hoàn toàn giống như cách tiếp cận Boyer-Moore, mà đúng hơn là một thuật toán của riêng tôi. Tôi đang lên kế hoạch xuất bản nó một lần được kiểm tra và hoàn thành. Các giải pháp hiện đang được điều chỉnh để được paralelized để tối ưu hóa tốc độ bằng cách sử dụng cụm trường đại học với MPI C Library.

+0

Bạn đã nghĩ gì về điều này? –

+0

@Oli_Charlesworth tôi đã suy nghĩ về các biểu diễn ma trận tuyến tính, cách c triển khai chúng và tìm kiếm các thuật toán khớp vector patter nhưng có rất nhiều điều cần lưu ý rằng cần một số con trỏ để bắt đầu với ít nhất một trong số chúng – guiman

Trả lời

13

Hm, có vẻ giống như phiên bản chuỗi 2 chiều khớp. Tôi tự hỏi nếu có một phiên bản 2D của Boyer-Moore?

A Boyer-Moore Approach for Two-Dimensional Matching

Ah, rõ ràng là có. :-)

+0

Liên kết bị hỏng. – Davidann

+0

Hm, liên kết hoạt động cho tôi ...Bạn cũng có thể [thực hiện tìm kiếm tiêu đề] (http://www.google.com/search?q=a+boyer-moore+approach+to+two-dimensional+matching). – Nemo

2

Một cách tiếp cận ngay lập tức lóe lên trong óc:

Hãy đối xử với ma trận lớn như là một chuỗi tuyến tính của N * N "ký tự" và ma trận nhỏ như một biểu thức chính quy tuyến tính của thời gian (M + 1) * M có "ký tự chữ" ở vị trí M đầu tiên của mỗi "hàng" và tương đương với .{N-M} ở vị trí còn lại của mỗi hàng. Biên dịch cụm từ thông dụng thành DFA và chạy nó.

Thời gian tìm tất cả các kết quả phù hợp là O (N * N). Tôi nghi ngờ có những thuật toán fancier mà sẽ làm việc (thích ứng của fancier 1-d thuật toán tìm kiếm chuỗi con) nhưng điều này không phải là quá xấu.

1

Gần đây, các thuật toán nhanh đã được phát triển để xây dựng cây hậu tố 2D. Đây có thể được sử dụng để tìm thấy bất kỳ submatrix vuông trong một ma trận lớn hơn trong thời gian không phụ thuộc vào kích thước của ma trận lớn hơn:

Bạn có thể cần phải là một thuê bao để xem những giấy tờ đó.

Tôi cũng tìm thấy một cách tự do có sẵn này, trong đó mô tả một thuật toán xây dựng ngẫu nhiên đó là dự kiến ​​ tuyến tính thời gian:

Tôi hy vọng rằng việc xây dựng một cây hậu tố 2D và tìm kiếm với nó sẽ nhanh hơn nếu bạn cần phải tìm kiếm nhiều submatric khác nhau trong một ma trận đơn, nhưng nó có thể chậm hơn 2D Boyer-Moore nếu bạn sẽ tìm kiếm bên trong một ma trận khác nhau mỗi lần.

+0

"Độc lập với kích thước của ma trận lớn hơn" chắc chắn là sai. Cân nhắc tìm kiếm một submatrix 1x1 trong ma trận NxN. Không có cách nào để tìm thấy nó trong ít hơn N^2 thời gian. Có lẽ bạn có nghĩa là độc lập với kích thước của ma trận nhỏ hơn ... ?? –

+0

@R .: Bạn đang quên thời gian xây dựng chỉ mục, tất nhiên cần xem xét tất cả các phần tử NxN. Khi nó được xây dựng, một cây hậu tố 2D sẽ cho phép bạn tìm kiếm một submatrix 1x1 trong ma trận NxN trong khoảng một bước, giống như cây hậu tố 1D sẽ cho bạn biết liệu "chuối" có xuất hiện trong tất cả các tác phẩm của Shakespeare trong khoảng 6 bước hay không . (Đó là thời gian phức tạp cho việc tìm kiếm một lần xuất hiện - để liệt kê tất cả các lần xuất hiện cần thêm thời gian.) –

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