Chúng ta có thể nói DFA hiệu quả hơn NFA không?


13

Tôi chỉ bắt đầu đọc về lý thuyết tính toán. Nếu chúng ta so sánh cái nào mạnh hơn (trong việc chấp nhận chuỗi), cả hai đều giống nhau. Nhưng còn hiệu quả thì sao? DFA sẽ nhanh so với NFA, vì nó chỉ có một cạnh ra & sẽ không có sự mơ hồ. Nhưng trong trường hợp NFA, chúng tôi phải kiểm tra tất cả các trường hợp có thể & điều đó chắc chắn sẽ mất thời gian. Vậy chúng ta có thể nói DFA hiệu quả hơn NFA không?

Nhưng, phần não khác của tôi cũng nghĩ rằng NFA chỉ tồn tại trên lý thuyết, vì vậy chúng ta không thể so sánh hiệu quả của nó với DFA.

Câu trả lời:


15

Có hai câu trả lời, tùy thuộc vào cách bạn xác định hiệu quả.

Nhỏ gọn của đại diện

Nói nhiều hơn với ít hơn : NFA hiệu quả hơn.

Chuyển đổi DFA thành NFA rất đơn giản và không làm tăng kích thước của đại diện.

Tuy nhiên, có những ngôn ngữ thông thường mà DFA nhỏ nhất lớn hơn theo cấp số nhân so với NFA nhỏ nhất. Một ví dụ điển hình là cho k cố định.(a|b)b(a|b)kk

Tính toán

Chạy nhanh : DFA hiệu quả hơn.

Các máy tính chúng ta sử dụng ngày nay có tính chất quyết định. Điều đó làm cho họ xấu trong việc đối phó với chủ nghĩa không xác định. Có hai cách phổ biến đối phó deterministically với NFAs: quay lui ở một bên, mà là khá tốn kém, hoặc theo dõi các tiểu bang hoạt động, có nghĩa là mỗi sự chuyển tiếp sẽ mất đến lần nữa (trong đó N là kích thước của NFA) .NN


Về sự nhỏ gọn, NFA không phải lúc nào cũng hiệu quả hơn! Đúng là có những ngôn ngữ mà DFA tối thiểu lớn hơn theo cấp số nhân so với NFA nhỏ gọn nhất nhưng phần nhỏ của các ngôn ngữ đó trong tập hợp tất cả các ngôn ngữ là gì?
saadtaame

2
@saadtaame Có vẻ kỳ lạ, nhưng theo nghĩa chặt chẽ nhất, NFA không phải là không xác định. DFA là một loại NFA đặc biệt, tức là NFA với một đơn vị là tập bắt đầu và chức năng chuyển đổi sao cho chỉ có một trạng thái hoạt động tại bất kỳ thời điểm nào.
Khaur

2
-1 "tăng kích thước của nó (có khả năng rất nhiều)". Mô phỏng các bộ trạng thái NFA bằng cách giữ một không gian chi phí danh sách được liên kết tối đa là trong số lượng trạng thái NFA. Mặt khác, DFA tương đương có thể có trạng thái O ( 2 N ) . O(N)O(2N)
Logic lang thang

@WanderingLogic Bạn nói đúng, việc chuyển đổi không cần phải rõ ràng (bạn vẫn đang sử dụng DFA tương đương, chỉ không ở dạng mở rộng). Tuy nhiên, điểm chính vẫn đứng vững, vì điều này đòi hỏi thời gian tính toán gấp nhiều lần so với việc chạy một DFA có cùng kích thước . Tôi sẽ sửa đoạn cuối để giải thích cho điều đó. O(N)
Khaur

Cảm ơn câu trả lời này, bởi vì tôi đã lập luận trong nghiên cứu của mình rằng NFA tốt hơn để đánh giá và tôi thấy rằng điểm này tinh tế hơn. Nhìn chung, NFA chắc chắn tốt hơn cho một ngôn ngữ cố định, bởi vì bất kỳ thuật toán đánh giá NFA thông minh nào cũng sẽ phù hợp với độ phức tạp đánh giá DFA trong trường hợp đặc biệt rằng NFA là DFA và vì NFA có thể gọn gàng hơn. Tuy nhiên, nếu lựa chọn là giữa việc tạo ra một NFA không đặc hiệu cao hoặc tìm ra một cách thông minh để có được một DFA có cùng kích thước thay vào đó, đối với một số ứng dụng cụ thể, DFA sẽ tốt hơn.
6005

4

Về sức mạnh, chúng tương đương như bạn đã nói và có một thuật toán (cấu trúc tập hợp con) để chuyển đổi NFA thành DFA tương đương. Như bạn có thể nói từ tên của thuật toán, nó xây dựng các tập hợp con của các trạng thái của NFA. Nếu NFA của bạn có trạng thái, thuật toán có thể xuất DFA với 2 n trạng thái nhưng đó là giới hạn trên. Đôi khi, số lượng trạng thái hoàn toàn không thay đổi hoặc thậm chí giảm. Vì vậy, trong thực tế, nó ít quan trọng để sử dụng cái nào.n2n

Kết hợp DFA là tuyến tính theo kích thước của chuỗi đầu vào. Kết hợp NFA liên quan đến quay lui để NFA làm được nhiều việc hơn. Do đó, DFA hiệu quả hơn.


Nhưng chúng ta có thể nói DFA hiệu quả hơn không?
avi

1
@avi Tôi đã chỉnh sửa câu hỏi! Và nhân tiện, lý thuyết của NFA không tồn tại trên lý thuyết: kiểm tra cái này: swtch.com/~rsc/regapid/regapid1.html
saadtaame

@avi Vấn đề ở đây là DFA tương đương với NFA sẽ (thường) sẽ lớn hơn nhiều. Vì vậy, mặc dù bạn có thể kiểm tra DFA nhanh hơn nhiều, bạn thường sẽ phải kiểm tra DFA lớn hơn.
Peter

@Peter, rằng DFA lớn hơn không thành vấn đề: Điều đó chỉ có nghĩa là mảng cung cấp chức năng chuyển đổi lớn hơn.
vonbrand

1
@Khaur, đúng rồi. Nhưng nếu bạn nhận được vào đó loại vấn đề, bạn có một DFA khổng lồ.
vonbrand

2

Chỉ cần thêm vào câu trả lời ở trên:

NFA có thể được tính toán hiệu quả hơn so với DFA, theo nghĩa là chúng có thể được mô phỏng trên bộ xử lý song song.

BTW: Tôi thấy mọi người nói rằng NFA không thể tồn tại trong thực tế. Tôi có ý kiến ​​khác. Một máy tính có số lượng lớn bộ xử lý có thể chạy song song nhiều tác vụ và có thể được coi là một máy không xác định. Người ta có thể gán từng nhánh tính toán cho một bộ xử lý mới và tạm dừng tất cả chúng bất cứ khi nào một trong số chúng chấp nhận.


1
Cả DFA và NFA đều không tồn tại trong thực tế, cả hai chỉ là quan hệ toán học và cả hai đều có thể được mô phỏng bằng thuật toán.
jmite

1

ϵ


ϵ

1
ϵ

nhưng không phải DFA miễn phí từ các chuyển đổi?
avi

@avi, vâng. Vui lòng chỉnh sửa câu trả lời nếu nó không rõ ràng ở đó.
vonbrand

không, tôi đang hỏi bạn Tôi cũng không chắc về điều đó
avi

1

Như những người khác đã lưu ý, bạn phải xác định "hiệu quả" nghĩa là gì. Để minh họa điều này, tôi đưa ra một mô hình hợp lý với một câu trả lời khác.

Chỉ nhìn vào (các) mô hình tự động, cụ thể là bỏ qua cách bạn thực hiện chúng trên các máy thực, biện pháp hiệu quả rõ ràng là "số lần chuyển đổi được thực hiện trong một lần chạy (chấp nhận ngắn nhất)".

ε


1

Về mặt kỹ thuật, nói NFA là một khái niệm tổng quát hơn sau đó là DFA, vì không bắt buộc phải sử dụng thuyết không điều kiện. Nói cách khác: mỗi DFA là một NFA. Từ quan điểm này, đối với mọi ngôn ngữ, một NFA có hiệu quả ít nhất là DFA hiệu quả nhất, cho bất kỳ biện pháp hiệu quả nào mà bạn ủng hộ.

Khác với điều này tôi đồng ý với Raphael rằng nó phụ thuộc rất nhiều vào ý nghĩa của bạn với hiệu quả và vào việc thực hiện.


-3

Như chúng ta đã biết về Automata tức là cỗ máy có thể thực hiện bất kỳ hành động nào mà không cần bất kỳ sức mạnh nào của con người hoặc không có sự tham gia trực tiếp của con người. vd: máy giặt. Finite Automata có nghĩa là chúng ta biết sate của nhiệm vụ thực hiện bằng máy như 1 nhấn ON 2 nhấn OFF để chỉ có 2 trạng thái tức là gọi là automata hữu hạn. Bây giờ hãy đến với DFA tức là tự động hữu hạn xác định. chính thức có nghĩa là chúng ta có thể dễ dàng xác định các trạng thái không có sự mơ hồ và không chính thức nó chỉ cần 1 chuyển tiếp được phép trên 1 biểu tượng. NFA: automata hữu hạn không xác định. cần có thêm thời gian để tính toán trạng thái thực tế và có sự mơ hồ và không chính thức nói rằng có nhiều chuyển đổi được phép trên 1 ký hiệu. trong trường hợp thời gian để đến đích NFA mất nhiều thời gian hơn DFA nhưng NFA có thể tải nhiều dữ liệu hơn DFA. * DFA và NFA có cùng sức mạnh để nhận ra chuỗi. cảm ơn bạn .. Deepali kaushik


1
Máy tự động hữu hạn không có gì để làm với máy giặt.
David Richerby

2
@DavidR Richby. Có lẽ cụm từ "không có gì" là một chút mạnh mẽ. Xét cho cùng, chúng ta có thể nói một chiếc máy giặt có các trạng thái sẵn sàng , giặt , xảvắt với sự chuyển tiếp thích hợp giữa các trạng thái. Một phép ẩn dụ tốt hơn, mặc dù, sẽ là một máy bán nước soda hoạt động bằng tiền xu.
Rick Decker

1
@RickDecker Đồng ý nhưng dành thời gian thảo luận về mức độ liên quan nhỏ sẽ là một ví dụ về những gì Wikipedia gọi là " trọng lượng không đáng có ". Và, trong mọi trường hợp, phần của câu trả lời tôi đang nói đến là thảo luận về automata như các máy tự cấp nguồn, không phải là thiết bị tính toán.
David Richerby

1
Tôi không nghĩ câu trả lời này thêm bất cứ điều gì đáng giá vào câu hỏi. Cụ thể, bạn không rõ ràng về thước đo hiệu quả của mình và dường như trộn lẫn một số mối quan tâm.
Raphael

Tho những câu trả lời khác gần như làm cạn kiệt mọi thứ cần nói và thật không may câu trả lời của bạn hơi khó hiểu.
Ác
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.