Khu phức hợp của tháp Hà Nội


20

Tôi vấp phải những nghi ngờ sau đây về sự phức tạp của Tháp Hà Nội , trên đó tôi muốn nhận xét của bạn.

  • Có phải trong NP? Câu trả lời đã cố gắng: Giả sử Peggy (người hoạt ngôn) giải quyết vấn đề & gửi nó cho Victor (người xác minh). Victor có thể dễ dàng thấy rằng trạng thái cuối cùng của giải pháp là đúng (theo thời gian tuyến tính) nhưng anh ta sẽ không có lựa chọn nào khác ngoài việc thực hiện từng động tác của Peggy để đảm bảo rằng cô ta không thực hiện một động thái bất hợp pháp. Vì Peggy phải tạo tối thiểu 2 ^ | đĩa | - 1 động tác (có thể chứng minh), Victor cũng phải làm theo. Do đó, Victor không có xác minh thời gian đa thức (định nghĩa về NP) và do đó không thể có trong NP.

  • Có phải trong PSPACE ? Có vẻ như vậy, nhưng tôi không thể nghĩ làm thế nào để mở rộng lý do trên.

  • Nó đã hoàn thành PSPACE chưa? Có vẻ không, nhưng tôi chỉ có một ý tưởng mơ hồ. Lập kế hoạch tự động, trong đó ToH là một ví dụ cụ thể, là PSPACE-Complete. Tôi nghĩ rằng Lập kế hoạch có nhiều trường hợp khó khăn hơn ToH.

Đã cập nhật : Input = , số lượng đĩa; Đầu ra = cấu hình đĩa ở mỗi bước. Sau khi cập nhật, tôi nhận ra rằng định dạng đầu vào / đầu ra này không phù hợp với vấn đề quyết định. Tôi không chắc chắn về việc chính thức hóa để nắm bắt các khái niệm về NP, PSPACE, v.v. cho loại vấn đề này.n

Cập nhật # 2 : Sau những bình luận của Kaveh và Jeff, tôi buộc phải làm cho vấn đề chính xác hơn:

Đặt đầu vào là cặp số nguyên trong đó là số lượng đĩa. Nếu chuỗi di chuyển được thực hiện bởi các đĩa được ghi theo định dạng (số đĩa, từ chốt, đến chốt) (số đĩa, từ chốt, đến chốt) ... từ lần di chuyển đầu tiên đến cuối cùng, và được mã hóa dưới dạng nhị phân, xuất ra bit thứ .n tôi(n,i)ni

Hãy cho tôi biết nếu tôi cần phải cụ thể hơn về mã hóa. Tôi cho rằng bình luận của Kaveh áp dụng trong trường hợp này?


5
bạn có thể vui lòng xác định vấn đề Tháp Hà Nội hoặc liên kết đến một định nghĩa?
Kaveh

1
PKG, tôi biết nó là gì của Hà Nội. Tôi có nghĩa là vấn đề tính toán mà bạn muốn biết sự phức tạp của nó là gì? Đầu vào là gì? Đầu ra là gì?
Kaveh

@Kaveh: Ý định của bạn không rõ ràng từ bình luận đầu tiên của bạn
PKG

lấy làm tiếc. Btw, có các lớp phức tạp chức năng, chúng thường có F trước hoặc sau tên, kiểm tra sở thú phức tạp để tìm định nghĩa.
Kaveh

1
Vì vậy, số nguyên cũng là một phần của đầu vào? i
JeffE

Câu trả lời:


9

Không, vấn đề bạn mô tả thực sự khá dễ dàng. Lý do cấp cao là chỉ số dài khoảng bit, vì vậy chúng ta thực sự có thể đủ khả năng dành thời gian cho đa thức trong .n ninn

Xem xét các vấn đề liên quan sau: Cho hai số nguyên và , mô tả động tác thứ trong lời giải của câu đố -disk. Kích thước đầu vào là , nhưng trên thực tế, chỉ có một chút quan trọng nhất của vấn đề. Vì vậy, ngay cả khi nhỏ hơn đáng kể so với , chúng ta có thể giải quyết vấn đề này theo đa thức thời gian trong .k k n lg n + lg k < n + lg k n lg k n O ( log k )nkknlgn+lgk<n+lgknlgknO(logk)

Giả sử các đĩa được đánh số từ đến bất cứ thứ gì theo thứ tự tăng dần theo kích thước và các chốt được đánh số 0 = nguồn, 1 = đích và 2 = dự phòng. Hãy để chúng tôi viết cho một số số nguyên và . Rồi bật :k = ( 2 p + 1 ) 2 d p d0k=(2p+1)2dpdk

  • Nếu là số lẻ, thì đĩa chuyển từ chốt sang chốt .d+nd(pmod3)((p+1)mod3)
  • Nếu là chẵn thì đĩa sẽ chuyển dạng chốt sang chốt .d+nd(pmod3)((p1)mod3)

Chúng ta có thể dễ dàng tính và trong thời gian bằng cách lặp qua biểu diễn nhị phân của từ bit có ý nghĩa nhỏ nhất trở lên. Đó là nó.pdO(logk)k

Bây giờ giả sử bạn thực sự muốn bit thứ trong chuỗi đầu ra, trong đó là một phần của đầu vào thay vì . Nếu mỗi lượt được mã hóa bằng cùng một số bit - cụ thể, bit cho số đĩa, bit cho chốt từ và bit cho chốt - thì chúng ta chỉ cần tính toán các thứ di chuyển, nơi , và sau đó trích xuất các bit thích hợp. (Lưu ý rằng là tuyến tính trong kích thước đầu vào, vì chúng ta cần biết để xác định đầu ra.)iiklg(n+1)22kk=i/(lg(n+1)+4)lg(n+1)+4n

Mặt khác, nếu chúng ta đang sử dụng biểu diễn có độ dài thay đổi cho các số đĩa, thì chúng ta có thể tìm thấy số di chuyển trong thời gian đa thức bằng cách tìm kiếm nhị phân. Chúng ta cần biết tổng số lượt cần thiết để di chuyển các đĩa trên cùng , cho tất cả , nhưng điều này được đưa ra bởi sự lặp lại mà chúng ta có thể đánh giá trong thời gian đa thức bằng lập trình động. Các chi tiết còn lại được để lại như một bài tập nhàm chán cho người đọc.kmmk

M(m)=2M(m1)+(\#bits to record moving disk m)

(Tôi cho rằng tôi đã mắc ít nhất một lỗi sai hoặc chẵn lẻ, nhưng hy vọng ý chính là rõ ràng.)

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.