2010-09-02 19 views
17

Hãy nói rằng chúng ta có biểu thức thông thường:..Thuật toán tồn tại có thể xác định xem một ngôn ngữ thông thường có khớp với bất kỳ đầu vào nào mà một ngôn ngữ thông thường khác khớp không?

  • Xin chào W. * rld
  • Hello World
  • * Thế Giới
  • * W. *

Tôi muốn giảm thiểu số lượng các regex được yêu cầu để khớp với đầu vào tùy ý.

Để làm điều đó, tôi cần phải tìm hiểu xem một biểu thức chính quy có khớp với bất kỳ đầu vào nào khớp với một biểu thức khác hay không. Điều đó có thể không?

Billy3

+0

@skaffman: Tôi nghĩ rằng thẻ ngôn ngữ thông thường phù hợp với điều kiện một regex mô tả một ngôn ngữ thông thường - đó chỉ là một cách đơn giản để biểu thị nó "trên giấy". Nhưng câu hỏi là w.r.t. khoa học máy tính có nhiều việc phải làm với các ngôn ngữ thông thường hơn là các biểu thức thông thường. –

+1

eh, tiêu đề không khớp với mô tả? – maxschlepzig

+0

Tôi không chắc chắn nếu đủ điều kiện như là một "thuật toán", nhưng bằng cách sử dụng ". *" Phù hợp với đầu vào tùy ý với một biểu thức chính quy; Tôi nghi ngờ nó có thể được giảm thiểu đến ít hơn 1. :-) –

Trả lời

11

Mọi biểu thức chính quy đều có thể liên kết với DFA - bạn có thể giảm thiểu DFA và vì biểu mẫu tối thiểu là duy nhất, bạn có thể quyết định xem hai biểu thức có tương đương hay không. Dani Cricco chỉ ra thuật toán Hopcroft O (n log n). Có một thuật toán cải tiến khác của Hopcroft và Craft, nó kiểm tra sự tương đương của hai DFA trong O (n).

Để có một khảo sát tốt về vấn đề này và một cách tiếp cận thú vị cho vấn đề này, tôi khuyên bạn nên xem lại bài báo Testing the Equivalence of Regular Languages, từ arXiv.

Chỉnh sửa sau: nếu bạn quan tâm đến việc đưa vào thay vì tương đương với cụm từ thông dụng, tôi đã xem một bài báo có thể quan tâm: Inclusion Problem for Regular Expressions - Tôi chỉ lướt qua nó nhưng dường như có chứa thuật toán thời gian đa thức vấn đề.

+0

Hmmm .. thú vị. Mặc dù vậy, một vấn đề là '. *' Và 'Hello World' là không tương đương, mặc dù'. * 'Có thể khớp với bất kỳ thứ gì' Hello World' có thể khớp. –

+0

Tôi không chắc chắn về ý nghĩa của "trận đấu" cho bạn - có vẻ như bạn không muốn thử nghiệm sự tương đương mà đúng hơn là đưa vào. Bạn có thể chính xác hơn với câu hỏi của mình không? – Lawrence

+0

Khó khăn của tôi là tôi không biết chính xác làm thế nào để mô tả những gì tôi đang tìm kiếm - Tôi xin lỗi vì sự run rẩy ở đây. Tôi đã sửa đổi câu hỏi một chút - từ mô tả của Wikipedia về sự bao gồm lý thuyết tập hợp dường như những gì tôi cần. –

2

Có.

Vấn đề tương đương với hai ngôn ngữ thông thường là có thể giải quyết được.

Phác thảo của một thuật toán:

  • giảm thiểu cả hai séc DFAs
  • nếu họ isomorph
+0

Đồ thị đẳng cấu không thể giải được trong thời gian đa thức, vì vậy tôi không thấy nó giúp ích như thế nào. –

+0

@Billy: Tôi đoán câu trả lời của bạn là đây là một vấn đề về mặt lý thuyết có thể giải quyết được mà không phải là thực tế để giải quyết. – szbalint

+0

@szbalint: Vâng "về mặt lý thuyết" tôi có thể đặt ra mọi chuỗi đầu vào có thể cho các ngôn ngữ và xem chúng có khớp với cùng một thứ hay không. Nếu nó không thể giải quyết được trên phần cứng tiêu dùng hợp lý, thì có rất ít điểm. –

2

chắc !. Một biểu thức chính quy có thể được biểu diễn như một FSM (Máy trạng thái hữu hạn) và có số lượng FSM vô hạn có thể nhận ra cùng một chuỗi.

Isomorphism là tên mô tả nếu hai FSM là tương đương. Có một vài thuật toán để giảm thiểu FSM. Ví dụ: Hopcroft minimization algorithm có thể giảm thiểu tối đa hai FSM trong O (n log n), trên một automaton trạng thái n.

+0

@Dani: Cùng một vấn đề với câu trả lời của maxschlepzig. Đẳng cấu là trong lớp NP. –

+2

@Billy ONeal: Thứ nhất, (đồ thị) đẳng cấu là trong NP (đúng), nhưng được cho là không NP-complete, mặc dù không phải trong P. Tuy nhiên, chúng ta đang nói về DFA đẳng cấu, đó là một _completely_ khác nhau điều. – jpalecek

+0

@jpalecek: Sự đồng nhất DFA khác nhau như thế nào? DFA là gì hơn là một digraph? –

0

Vấn đề này được gọi là "bao gồm" hoặc "subsumption" của biểu thức chính quy, vì những gì bạn đang yêu cầu, là liệu tập hợp các từ phù hợp với một regexp bao gồm (hoặc subsumes) tập hợp các từ phù hợp với regex khác . Bình đẳng là một câu hỏi khác thường thường có nghĩa là hai regexps có khớp chính xác với cùng một từ hay không, tức là chúng tương đương về mặt chức năng. Ví dụ "a *" bao gồm "aa *", trong khi chúng không bằng nhau.

Tất cả các thuật toán đã biết để bao gồm regexp là trường hợp xấu nhất mất thời gian theo cấp số mũ trong kích thước của regexp.Tuy nhiên, thuật toán tiêu chuẩn là như thế này:

Input r1 và r2 Output Yes nếu r1 bao gồm r2

  1. Tạo DFA (r1) và DFA (r2)
  2. Tạo Neg (DFA (r1)) (khớp chính xác với những từ r1 không khớp)
  3. Tạo Neg (DFA (r1)) x DFA (r2) (khớp chính xác với những từ khớp với Neg (DFA (r1)) DFA (r2))
  4. Kiểm tra xem automaton được tạo trong 3. không khớp với bất kỳ từ nào

Tác phẩm này, vì những gì bạn đang kiểm tra là không có từ nào khớp với r2 không khớp với r1.

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