Để đơn giản, tôi sẽ bắt đầu bằng cách chỉ xem xét các vấn đề "quyết định", có câu trả lời có / không. Các vấn đề về chức năng hoạt động theo cùng một cách, ngoại trừ thay vì có / không, có một từ đầu ra cụ thể được liên kết với mỗi từ đầu vào.
Ngôn ngữ : một ngôn ngữ chỉ đơn giản là một chuỗi các chuỗi. Nếu bạn có một bảng chữ cái, chẳng hạn như
, thì là tập hợp tất cả các từ chỉ chứa các ký hiệu trong . Ví dụ: là tập hợp tất cả các chuỗi nhị phân có độ dài bất kỳ. Một bảng chữ cái không cần phải là nhị phân. Nó có thể là unary, ternary, vvΣΣ∗Σ{0,1}∗
Một ngôn ngữ trên bảng chữ cái là bất kỳ tập hợp con nào của .ΣΣ∗
Vấn đề : Một vấn đề là một số câu hỏi về một số đầu vào mà chúng tôi muốn trả lời. Cụ thể, một vấn đề quyết định là một câu hỏi đặt ra: "Đầu vào đã cho của chúng tôi có đáp ứng thuộc tính không?X
Một ngôn ngữ là nhận thức chính thức của một vấn đề. Khi chúng ta muốn lý luận về một vấn đề quyết định, chúng ta thường kiểm tra ngôn ngữ tương ứng. Đối với một vấn đề , ngôn ngữ tương ứng là:X
L={w∣w là mã hóa của đầu vào cho vấn đề và câu trả lời cho đầu vào cho vấn đề là "Có" yXyX}
Xác định xem câu trả lời cho đầu vào cho vấn đề quyết định là "có" có tương đương với việc xác định liệu mã hóa của đầu vào đó qua bảng chữ cái có bằng ngôn ngữ tương ứng hay không.
Thuật toán : Thuật toán là một cách từng bước để giải quyết vấn đề. Lưu ý rằng có một thuật toán có thể được thể hiện bằng nhiều cách và nhiều ngôn ngữ, và có nhiều thuật toán khác nhau giải quyết bất kỳ vấn đề nào.
Máy Turing : Máy Turing là tương tự chính thức của thuật toán. Một máy Turing trên một bảng chữ cái nhất định, cho mỗi từ, sẽ hoặc sẽ không dừng lại ở trạng thái chấp nhận. Do đó, đối với mỗi Turing Machine , có một ngôn ngữ tương ứng:M
L(M)={w∣M dừng lại ở trạng thái chấp nhận đầu vào .w}
(Có một sự khác biệt tinh tế giữa các máy Turing tạm dừng trên tất cả các đầu vào và tạm dừng trên các đầu vào có, điều này xác định sự khác biệt giữa các lớp phức tạp và .)RRE
Mối quan hệ giữa các ngôn ngữ và Turing Machines như sau
Mỗi máy Turing chấp nhận chính xác một ngôn ngữ
Có thể có nhiều hơn một Turing Machine chấp nhận một ngôn ngữ nhất định
Có thể không có máy Turing nào chấp nhận một ngôn ngữ nhất định.
Chúng ta có thể nói gần giống nhau về các thuật toán và các vấn đề: mọi thuật toán đều giải quyết một vấn đề duy nhất, nhưng có thể có 0 hoặc nhiều thuật toán giải quyết một vấn đề nhất định.
Độ phức tạp thời gian : Một trong những nguồn gây nhầm lẫn phổ biến nhất giữa các thuật toán và các vấn đề liên quan đến các lớp phức tạp. Phân bổ chính xác có thể được tóm tắt như sau:
- Một thuật toán có độ phức tạp về thời gian
- Một vấn đề thuộc về một lớp phức tạp
Một thuật toán có thể có độ phức tạp thời gian nhất định. Chúng tôi nói rằng một thuật toán có độ phức tạp giới hạn trên trong trường hợp xấu nhất
nếu thuật toán tạm dừng ở hầu hết các bước cho bất kỳ đầu vào nào có kích thước .f(n)f(n)n
Các vấn đề không có thời gian chạy, vì một vấn đề không liên quan đến một thuật toán cụ thể thực sự chạy. Thay vào đó, chúng tôi nói rằng một vấn đề thuộc về một lớp phức tạp, nếu tồn tại một số thuật toán giải quyết vấn đề đó với độ phức tạp thời gian nhất định.
P X X P X X PP,NP,PSPACE,EXPTIME v.v ... đều là các lớp phức tạp. Điều này có nghĩa là chúng chứa các vấn đề, không phải thuật toán. Một thuật toán không bao giờ có thể có trong , nhưng nếu có thuật toán đa thức thời gian giải một bài toán , thì nằm trong . Cũng có thể có một loạt các thuật toán theo thời gian hàm mũ chấp nhận , nhưng vì tồn tại một thuật toán đa thức thời gian chấp nhận , nên nó nằm trong .PXXPXXP