Có những máy nhỏ nào có thể phù hợp với các biểu thức chính quy?


30

Người ta biết rằng một biểu thức chính quy có thể được nhận ra bởi một máy tự động hữu hạn không xác định có kích thước tỷ lệ thuận với biểu thức chính quy hoặc bởi FA xác định có khả năng lớn hơn theo cấp số nhân. Hơn nữa, với một chuỗi s và biểu thức chính quy r , NFA có thể kiểm tra tư cách thành viên theo thời gian tỷ lệ với |s||r|và DFA có thể kiểm tra tư cách thành viên theo thời gian tỷ lệ với |s|. Sự chậm lại của NFA phát sinh từ thực tế là về cơ bản chúng ta cần theo dõi các tập hợp các trạng thái có thể có của máy tự động, và sự bùng nổ theo cấp số nhân của DFA phát sinh từ thực tế là các trạng thái của nó là các yếu tố của quyền hạn của các trạng thái của NFA.

Là nó có thể có hiệu quả (ví dụ, trong thời gian tốt hơn so với O(|r||s|) , và không gian tốt hơn so với O(2|r|) ) công nhận biểu thức thông thường, nếu chúng ta cho phép sử dụng máy mạnh mẽ hơn automata hữu hạn? (Ví dụ: có sự tăng trưởng ngắn gọn để nhận ra các ngôn ngữ thông thường với máy tự động đẩy xuống hoặc máy phản ứng không?)


2
Khi bạn nói rằng "NFA có thể kiểm tra thành viên trong thời gian tỉ lệ với " bạn có nghĩa là một (xác định) máy RAM mà mô phỏng NFA theo cách rõ ràng phải mất rất nhiều thời gian? Hoặc có một số cách khác để xác định "thời gian chạy của NFA" không đề cập đến một mô hình tính toán khác? (Ngoài định nghĩa hợp lý nhưng không hữu ích nói rằng thời gian chạy của bất kỳ NFA nào cho chuỗi s| s | .)|s||r|s|s|
Radu GRIGore

Vâng, đó là cách giải thích đúng cho câu hỏi của tôi.
Neel Krishnaswami

2
Sau đó, nó dường như với tôi tự nhiên hơn để chỉ cần yêu cầu này: Có một thuật toán (trên một máy RAM) mà quyết định nếu một chuỗi là bằng ngôn ngữ được định nghĩa bởi biểu thức chính quy r mà công trình trong o ( | s || r | ) thời gian và o ( 2 | r | ) không gian? (Đặc biệt nếu bạn xác định thời gian chạy của máy tự động đẩy xuống cũng theo máy RAM.)sro(|s||r|)o(2|r|)
Radu GRIGore

1
Tôi không hiểu chính xác vấn đề. Là đầu vào một chuỗi s và một biểu thức chính quy r, và vấn đề là quyết định xem s có trong ngôn ngữ được xác định bởi biểu thức chính quy r không?
Robin Kothari

@Robin: đúng vậy Tôi muốn biết liệu bạn có thể kết hợp các biểu thức thông thường hiệu quả hơn so với automata hữu hạn có thể bằng cách sử dụng nhiều sức mạnh tính toán hơn hay nếu các tính năng bổ sung (ví dụ: stack, RAM) đơn giản là không giúp ích.
Neel Krishnaswami

Câu trả lời:


20

Nó đủ dễ dàng để đánh đổi thời gian cho không gian, như sau.

Chuyển đổi biểu thức chính quy để một NFA - cho concreteness trong thuật toán so sánh, chúng tôi sẽ giả định rằng là số tiểu bang NFA, do đó bạn O ( r s ) thời gian ràng buộc cho trực tiếp mô phỏng NFA là hợp lệ và bạn O ( 2 r ) không gian bị ràng buộc để chạy DFA được chuyển đổi cũng hợp lệ bất cứ khi nào bạn làm việc trong RAM có thể giải quyết nhiều bộ nhớ đó.rO(rs)O(2r)

Bây giờ, phân vùng các tiểu bang của NFA (tùy ý) vào tập con S i ít nhất r / k khẳng định mỗi người. Trong mỗi tập con S i , chúng ta có thể chỉ mục các tập con A i của S i bởi các số từ 0 để 2 r / k - 1 .kSir/kSiAiSi02r/k1

Xây dựng bảng trong đó ij nằm trong phạm vi từ 0 đến k - 1 , c là ký hiệu đầu vào và A i là (chỉ số số của) một tập con của S i . Giá trị được lưu trong bảng là (chỉ số bằng số) một tập hợp con của S j : trạng thái y nằm trong T [ i , j , c , A i ] khi và chỉ khiT[i,j,c,Ai]ijk1cAiSiSjyT[i,j,c,Ai] thuộc S j và có một trạng thái trong A i chuyển sang y trên ký hiệu đầu vào c .ySjAiyc

Để mô phỏng NFA, duy trì chỉ số, mỗi chỉ số cho mỗi S i , chỉ định tập hợp con A i của các trạng thái trong S i có thể đạt được bằng một số tiền tố của đầu vào. Đối với mỗi ký hiệu đầu vào c , sử dụng các bảng để tra cứu, đối với mỗi cặp i , j , tập hợp các trạng thái trong S j có thể đạt được từ trạng thái trong A i bằng cách chuyển đổi trên c , sau đó sử dụng nhị phân bit hoặc hoạt động trên các chỉ số số của các tập hợp trạng thái này để kết hợp chúng thành một tập hợp con các trạng thái của S jkSiAiSici,jSjAicSj. Vì vậy, mỗi bước của mô phỏng cần có thời gian và tổng thời gian cho mô phỏng là O ( s k 2 ) .O(k2)O(sk2)

Không gian cần thiết là không gian cho tất cả các bảng, đó là . Phân tích thời gian và không gian là hợp lệ trên bất kỳ RAM nào có thể giải quyết nhiều bộ nhớ đó và có thể thực hiện các thao tác nhị phân trên các từ đủ lớn để giải quyết nhiều bộ nhớ đó.O(k22r/k)

Sự đánh đổi không gian thời gian bạn nhận được từ điều này không hoàn toàn khớp với mô phỏng NFA, vì sự phụ thuộc bậc hai vào . Nhưng sau đó, tôi hoài nghi rằng O ( r s ) là thời điểm thích hợp ràng buộc đối với các mô phỏng NFA: làm thế nào để bạn mô phỏng một bước duy nhất của NFA nhanh hơn so với nhìn vào tất cả các (có thể hiện bậc hai nhiều) chuyển tiếp cho phép từ một hiện trạng thái hoạt động sang trạng thái khác? Không phải là O ( r 2 s ) sao?kO(rs)O(r2s)

Trong mọi trường hợp bằng cách để thay đổi, bạn có thể có giới hạn thời gian liên tục giữa giới hạn DFA và NFA, với ít không gian hơn DFA.k


Tôi nghĩ rằng sự điều chỉnh của bạn là chính xác và câu trả lời của bạn trả lời câu hỏi của tôi. Tuy nhiên, câu hỏi tôi muốn hỏi là sức mạnh tính toán bổ sung giúp được bao nhiêu. (Ví dụ: với bộ đếm, bạn có thể ghép chuỗi trong không gian O (1).) Nếu bạn không phiền, tôi sẽ để câu hỏi mở thêm một lúc nữa để xem có ai biết câu trả lời cho điều đó không. ...ak
Neel Krishnaswami

@Neel: Nếu giải pháp của David là giải pháp tốt nhất mà máy RAM có thể làm, thì ngăn xếp, bộ đếm, v.v. sẽ không giúp ích gì. (Nhưng, tất nhiên, anh ta chỉ đưa ra giới hạn trên chứ không phải giới hạn dưới.)
Radu GRIGore

1
Theo như tôi có thể nói, giải pháp của tôi sử dụng "sức mạnh bổ sung": nó dựa trên các tra cứu bảng và chỉ số nguyên, một thứ không có sẵn trong các mô hình DFA hoặc NFA. Vì vậy, tôi không thực sự hiểu làm thế nào nó không trả lời phần đó của câu hỏi.
David Eppstein

Đây là một cách khác để parametrize này. Giả sử chúng ta đang ở trên một máy RAM có chiều rộng từ , trong đó w lg r . Sau đó, mô phỏng NFA mất thời gian O ( s r 2 ) và không gian O ( r / w ) . Mô phỏng DFA là không thể nếu r w (không đủ không gian có sẵn). Việc xây dựng trong câu trả lời này bộ k r / w và mất O ( s r 2 / w 2wwlgrO(sr2)O(r/w)rwkr/wO(sr2/w2)2w

4

Đây không phải là một câu trả lời, nhưng quá dài cho một bình luận. Tôi đang cố gắng giải thích tại sao câu hỏi, như được đặt ra, có thể khó hiểu.

Có hai cách để xác định độ phức tạp tính toán cho một thiết bị X .

Cách đầu tiên và tự nhiên nhất là nội tại . Người ta cần nói cách thiết bị X sử dụng đầu vào, để sau này chúng ta có thể xem kích thước n của đầu vào ảnh hưởng đến thời gian chạy của thiết bị. Người ta cũng cần nói những gì được tính là một hoạt động (hoặc bước ). Sau đó, chúng tôi chỉ cần để thiết bị chạy trên các hoạt động đầu vào và đếm.

The second is extrinsic. We define computational complexity for another device Y and then we program Y to act as a simulator for X. Since there may be multiple ways for Y to simulate X, we need to add that we are supposed to use the best one. Let me say the same with other words: We say that X takes O(f(n)) time on an input of size n if there exists a simulator of X implemented on machine Y that takes f(n) time.

For example, an intrinsic definition for NFA says that it takes n steps to process a string of length n; an extrinsic definition that uses a RAM machine as device Y says that the best known upper bound is probably what David Eppstein answered. (Otherwise it would be strange that (1) the best practical implementation pointed in the other answer does not use the better alternative and (2) no one here indicated a better alternative.) Note also that strictly speaking your device X is the regular expression, but since the NFA has the same size it is safe to take it as being the device X you are looking at.

Now, when you use the second kind of definition it makes little sense to ask how restricting the features of device X affects the running time. It does however make sense to ask how restricting the features of device Y affects the running time. Obviously, allowing more powerful machines Y might allow us to simulate X faster. So, if we assume one of the most powerful machines that could be implemented (this rules out nondeterministic machines, for example) and come up with a lower bound Ω(f(n)), then we know that no less powerful machine could do better.

So, in a sense, the best answer you could hope for is a proof in something like the cell probe model that simulating an NFA needs a certain amount of time. (Note that if you take into account the conversion NFA to DFA you need time to write down the big DFA, so memory isn't the only issue there.)


4

Even if you believe that there's nothing new or old to be learned about regular expression matching, check out one of the most beautiful papers I've come across for a long time: A play on regular expressions by S Fischer, F Huch, and T Wilke, ICFP 2010.

(MMT Chakravarty deserves the credit for recommending this paper.)

EDIT: Lý do tại sao bài báo này có liên quan là vì nó mô tả một kỹ thuật mới (dựa trên Glushkov từ những năm 60) để tránh xây dựng NFA đầy đủ (chứ đừng nói đến DFA) tương ứng với RE. Những gì được thực hiện thay vì giống như chạy một thuật toán đánh dấu tương tự như thuật toán nổi tiếng để quyết định chấp nhận một từ bởi một NFA trên cây cú pháp của RE. Các phép đo hiệu suất cho thấy rằng điều này là cạnh tranh, ngay cả với thư viện re2 được xuất bản gần đây của google.


Một tờ giấy đẹp để đọc !!
Hsien-Chih Chang 張顯

1

Hãy xem bài viết này của Russ Cox. Nó mô tả một cách tiếp cận NFA dựa trên, đầu tiên được sử dụng bởi Ken Thompson, nhờ đó một chuỗi đầu vào s có thể được kết hợp với một biểu thức chính quy r trong thời gian O (| s |. C ) và không gian O (| r |. D ), nơi cd là hằng số giới hạn trên. Bài viết cũng chi tiết thực hiện C của kỹ thuật.


2
I'm not convinced that's an accurate description of the article. It appears to be building the DFA from the NFA on an as-needed basis and caching the results. But the cache size could be exponential in r.
David Eppstein
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.