một máy trạng thái nhận đầu vào có thể hoặc không thể chuyển đổi trạng thái của nó thành một trong các tập hợp hữu hạn của các trạng thái khác. Nó khác với bất kỳ chương trình máy tính nào khác?
Một số câu trả lời ở đây nhấn mạnh rằng trong vũ trụ hữu hạn (có thể) của chúng ta, mọi thứ đều hữu hạn, tất cả các chương trình máy tính đều chạy trong thời gian hữu hạn, do đó về mặt kỹ thuật, mọi thứ đều là một cỗ máy trạng thái hữu hạn. Đó là "đúng về mặt kỹ thuật (loại đúng nhất)", nhưng cũng hoàn toàn thiếu điểm.
Bản chất là thế này: - Một số chương trình máy tính đòi hỏi nhiều bộ nhớ làm việc hơn khi chúng nhận được đầu vào lớn hơn và phức tạp hơn. Một số thì không.
Nếu bạn nhận ra điều này, bạn sẽ có được một cái nhìn sâu sắc về lý thuyết - thông tin có thể cho phép bạn viết các chương trình hiệu quả và thanh lịch hơn khi bạn gặp phải loại vấn đề nhất định. Nó cũng sẽ cho phép bạn nhận ra loại vấn đề mà điều này có thể áp dụng.
Dưới đây là hai ví dụ về đồ chơi:
Vấn đề 1: Một chương trình nhận được một danh sách các ký tự trên đầu vào tiêu chuẩn. Sau khi tất cả các nhân vật được xử lý, chương trình phải in cho dù số lượng "x" nhân vật trong các đầu vào là lẻ hoặc thậm chí .
Vấn đề 2: Một chương trình nhận được một danh sách các ký tự trên đầu vào tiêu chuẩn. Sau khi tất cả các ký tự được xử lý, chương trình phải in xem số lượng ký tự "x" trong đầu vào có nhỏ hơn , bằng hoặc lớn hơn số ký tự "y" hay không.
Bạn có thể muốn ngừng đọc ngay bây giờ, giải quyết các vấn đề bằng ngôn ngữ lập trình yêu thích của bạn (hoặc chỉ là mã giả) và quay lại sau.
...
Điều quan trọng bạn có thể nhận thấy là như sau: Để thực hiện giải pháp cho vấn đề 1 đúng cách, bạn chỉ cần một bit bộ nhớ. Bạn không phải tính toán số lượng "x" bạn đã xử lý - chỉ cho dù số lượng "x" được xử lý cho đến nay là số lẻ hay số chẵn. Khi bạn gặp một "x" khác, lật bit. Vào cuối chương trình, nhìn vào bit và in câu trả lời.
Đầu vào của bạn có chứa hàng tá ký tự không? Hàng ngàn nhân vật? Nhân vật Googolplex (tất nhiên là nói theo giả thuyết)? Không quan trọng; một chút của bộ nhớ làm việc vẫn sẽ là đủ.
Bạn không thể làm điều tương tự với vấn đề 2. Khi đọc các ký tự, bạn phải nhớ sự khác biệt giữa số lượng "x" 's và "y" đã được xử lý; nếu không bạn không thể in câu trả lời đúng một cách đáng tin cậy. Bạn có thể nhận ra rằng bạn thực sự không cần phải nhớ cả hai số "x" và "y" - chỉ khác biệt của chúng, cho đến nay; một giá trị số nguyên mà bạn sẽ tăng khi gặp "x" khác và giảm khi bạn gặp "y" khác - nhưng vẫn vậy, nếu bạn quyết định sử dụng ví dụ 32 bit bộ nhớ để giữ giá trị này, bạn có thể nhận được đầu vào ( dài vài tỷ ký tự) mà bạn không thể xử lý chính xác với số lượng bộ nhớ giới hạn nhất định.
Đây là những gì chúng tôi muốn nói khi nói rằng vấn đề 1 có thể được giải quyết bằng "máy trạng thái" và vấn đề 2 không thể giải quyết được. Một lượng bộ nhớ hạn chế là đủ cho đầu vào có kích thước bất kỳ.
(Tất nhiên, bạn cũng có thể viết một giải pháp không hiệu quả cho vấn đề 1, trong đó bạn sẽ cố gắng đếm tất cả các "x", và sau đó bạn cũng có thể gặp vấn đề ngoài bộ nhớ. Nhưng sự khác biệt là giải pháp hiệu quả cho vấn đề 1 tồn tại , trong khi giải pháp hiệu quả tương tự cho vấn đề 2 thì không .)
Tại sao điều này quan trọng trong cuộc sống thực?
Đầu tiên, không giống như hai ví dụ đồ chơi này, tình huống khó xử có thể không nằm giữa nghĩa đen một bit và một giá trị nguyên, mà là giữa một số cấu trúc dữ liệu lớn và một số thậm chí lớn hơn. Đôi khi, cấu trúc dữ liệu "thậm chí lớn hơn" không vừa với bộ nhớ máy tính hoặc làm chậm chương trình, thậm chí cho các đầu vào thực tế.
Thứ hai, giải pháp sử dụng máy trạng thái có thể sẽ nhanh hơn nhiều. Ngoài ra, nó sẽ mở rộng tuyến tính với độ dài của đầu vào; nghĩa là, xử lý đầu vào dài hơn 10 lần sẽ cần thời gian gấp 10 lần (trái ngược với thời gian gấp 100 lần). Đó là một thuộc tính mong muốn khi bạn cần xử lý nhiều dữ liệu.
Thứ ba, hạn chế so với việc sử dụng bộ nhớ không giới hạn có ảnh hưởng đến bảo mật . Nếu bạn viết một chương trình chỉ yêu cầu bộ nhớ hạn chế, bạn không phải lo lắng về việc tràn bộ nhớ và làm thế nào chúng có thể bị lạm dụng để làm tổn hại đến bảo mật của toàn hệ thống.
Thứ tư, đây là một phần của chương trình khoa học máy tính tiêu chuẩn ở bất kỳ trường học đàng hoàng nào: ngôn ngữ chính thức , authomata , độ phức tạp tính toán , et cetera. Để hiểu bức tranh lớn hơn đằng sau thiết kế máy tính, trái ngược với chỉ "uhh, tôi đặt một số đoạn mã từ internet, tôi thực sự hy vọng nó hoạt động, nhưng tôi không thể chắc chắn".
Để tận dụng lý thuyết này, bạn không thực sự cần bất kỳ máy móc đặc biệt, khung hoặc thư viện nào ... bạn chỉ cần nhận ra "ồ, phần này của vấn đề thực sự có thể được giải quyết bằng cách sử dụng một lượng bộ nhớ hữu hạn" và viết chương trình của bạn (bằng ngôn ngữ lập trình yêu thích của bạn) phù hợp. Nhưng trong một số trường hợp, tốt hơn là sử dụng một thư viện hiện có, vì vậy bạn không phải phát minh lại bánh xe.