Thuật toán để chuyển đổi NFA rất lớn sang DFA


12

Tôi có máy tự động hữu hạn không xác định thực sự lớn và tôi cần chuyển đổi nó sang DFA.

Theo ý tôi, lớn hơn 40 000 tiểu bang. Cho đến nay tôi đã thực hiện một số thử nghiệm và lập trình thuật toán mặc định tìm kiếm thông qua bảng (như được mô tả ở đây ), nhưng ngay cả sau khi tối ưu hóa khá chậm và rất tốn bộ nhớ. Tôi nhận thức được thực tế rằng, số lượng trạng thái có thể tăng theo cấp số nhân, nhưng sau khi giảm thiểu, DFA kết quả có khoảng 9 000 trạng thái và điều đó có thể chịu được.

Vì vậy, câu hỏi của tôi là, có một số thuật toán, sẽ nhanh hơn hoặc thân thiện hơn với bộ nhớ?


video rõ ràng là trên thuật toán xác định tiêu chuẩn. xem ví dụ: giảm thiểu NFA mà không cần xác định, stackoverflow
vzn

Nếu bạn thực hiện chuyển đổi NFA-> DFA ngây thơ (sử dụng cấu trúc sản phẩm), kết quả DFA lớn đến mức nào? (trước khi giảm thiểu)
DW

2
Bạn muốn làm gì với DFA? Nếu bạn quan tâm đến kiểm tra bao gồm, có các thuật toán để làm điều đó trực tiếp.
Vijay D

Cảm ơn bạn đã trả lời rất nhanh. Về kích thước, tôi không thể biết chính xác vì RAM của tôi đã hết, nhưng tôi sẽ cho nó xem xét kỹ hơn và mở rộng câu hỏi. Đối với những gì tôi muốn làm, tôi không chắc chắn, liệu tôi có thể trò chuyện cởi mở về điều đó không, vì đó là một chút bí quyết vững chắc của tôi. Nhưng tôi chắc chắn có thể nói rằng tôi thực sự cần DFA kết quả.
Jendas

1
Bạn đã thử chạy thuật toán Angluin để học DFA từ các truy vấn thành viên và tương đương chưa? Phần thành viên rất dễ dàng (chỉ cần chạy DFA của bạn trên chuỗi cần thiết); tương đương, bạn có thể vẽ nhiều chuỗi ngẫu nhiên hoặc thử tất cả các chuỗi có độ dài nhất định. Đây chỉ là một heuristic vì bạn sẽ không bao giờ thực sự biết khi nào bạn hoàn thành, nhưng tôi đã thấy rằng thủ thuật này hoạt động tốt trong thực tế ...
Aryeh

Câu trả lời:


6

Bạn đã thử thuật toán của Brzozowski chưa? Đó là thời gian chạy tệ nhất là theo cấp số nhân, nhưng tôi thấy một số tài liệu tham khảo cho thấy rằng nó thường hoạt động rất tốt, đặc biệt là khi bắt đầu với NFA mà bạn muốn chuyển đổi thành DFA và giảm thiểu.

Bài viết sau đây có vẻ phù hợp:

Nó đánh giá một số thuật toán khác nhau để giảm thiểu DFA, bao gồm cả ứng dụng của chúng vào tình huống của bạn khi chúng tôi bắt đầu với NFA và muốn chuyển đổi nó thành DFA và giảm thiểu nó.

Sự phân tách các thành phần được kết nối mạnh (SCC) của NFA của bạn (coi nó như một biểu đồ có hướng) trông như thế nào? Liệu nó có nhiều thành phần, trong đó không có thành phần nào quá lớn? Nếu vậy, tôi tự hỏi liệu có thể đưa ra thuật toán phân chia và chinh phục, trong đó bạn lấy một thành phần duy nhất, chuyển đổi nó từ NFA sang DFA và sau đó thu nhỏ nó, sau đó thay thế bản gốc bằng phiên bản xác định mới. Điều này nên có thể cho các thành phần nhập đơn (trong đó tất cả các cạnh vào thành phần đó dẫn đến một đỉnh duy nhất, đỉnh nhập). Tôi không ngay lập tức xem liệu có thể làm điều gì đó như thế này cho các NFA tùy ý hay không, nhưng nếu bạn kiểm tra cấu trúc của SCC trông như thế nào, thì bạn có thể xác định liệu hướng này có đáng để khám phá hay không .


Thuật toán của Brzozowski có vẻ đầy hứa hẹn, nhưng kỹ thuật phân chia và chinh phục thậm chí còn nhiều hơn nữa! Trong trường hợp của tôi, điều này thực sự dễ thực hiện và không yêu cầu thay đổi mã lớn. Tôi sẽ làm điều đó và nếu điều đó làm việc, tôi sẽ chấp nhận câu trả lời của bạn.
Jendas

2
Tôi đến, tôi hỏi, tôi chia, tôi đã chinh phục
Jendas

2

đây rõ ràng không phải là một vấn đề được nghiên cứu nhiều theo nghĩa các thuật toán đã biết / có sẵn ngoài chiến lược ban đầu / từ lâu về "xác định theo DFA / giảm thiểu DFA". bạn dường như chỉ ra bước xác định là bước có vấn đề nhưng tất nhiên đây là điển hình cho rằng nó có trường hợp xấu hơn theo không gian / thời gian theo cấp số nhân. lưu ý rằng trung bình có một số thuật toán tối thiểu hóa DFA có thể thay đổi đáng kể về hiệu suất.

nó còn được gọi một cách không chính thức là "tối thiểu hóa NFA mà không cần xác định" . điều này được biết là khó theo nghĩa là về cơ bản thậm chí không có thuật toán gần đúng trừ khi P = Pspace như trong bài viết này:

Tuy nhiên nghiên cứu này không xem xét các trường hợp thường hiếm khi tìm hiểu về một số thuật toán mà không dựa vào việc tìm kiếm các determinized DFA 1 st :

Chúng tôi trình bày các kỹ thuật khác nhau để giảm số lượng trạng thái và chuyển tiếp trong automata không điều kiện. Những kỹ thuật này dựa trên hai phần trước của tập hợp các trạng thái, liên quan đến việc bao gồm các ngôn ngữ trái và phải. Vì tính toán chính xác của chúng là NP-hard, chúng tôi tập trung vào các xấp xỉ đa thức cho phép giảm NFA như nhau.

lưu ý một gói công bố công khai / thực hiện có thể xử lý lớn NFA / chuyển đổi DFA / minimizations vv nói chung một cách hiệu quả nhất có thể là các thư viện của AT & T FSM .

nó có một chiến lược fsmcompactđôi khi có thể đủ:

Trong trường hợp bộ chuyển đổi hoặc bộ chấp nhận có trọng số không thể được xác định hoặc phát triển rất lớn, một tối ưu hóa khác nhau có thể hữu ích - fsmcompact. Thao tác này mã hóa từng bộ ba nhãn đầu vào, nhãn đầu ra và chi phí thành một nhãn mới, thực hiện xác định và giảm thiểu cổ điển (không chấp nhận), sau đó giải mã các nhãn được mã hóa trở lại giá trị ban đầu của chúng. Điều này có lợi thế là nó luôn được xác định và nó không di chuyển nhãn đầu ra hoặc chi phí dọc theo đường dẫn. Nó có nhược điểm là kết quả có thể không xác định hoặc tối thiểu.


xem thêm Về việc giảm NFA Ilie, Navarro, Yu
vzn 17/07/13
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.