Tôi muốn bắt đầu bằng cách nói rằng đây KHÔNG phải là một câu hỏi bài tập về nhà. Tôi đang đọc Giới thiệu về Thuật toán - văn bản CLRS nổi tiếng để trở thành một lập trình viên tốt hơn. Tôi đang cố gắng tự mình giải quyết các vấn đề và bài tập được đưa ra trong cuốn sách.
Tôi đang cố gắng giải quyết Excercise 10.1-2 từ Chương 10 Cấu trúc dữ liệu cơ bản từ CLRS Phiên bản thứ hai. Đây là những gì trạng thái của nó:
Giải thích cách thực hiện hai ngăn xếp trong một mảng A [1..n] theo cách sao cho ngăn xếp không bị tràn trừ khi tổng số phần tử trong cả hai ngăn xếp là n . Các hoạt động PUSH và POP sẽ chạy trong thời gian O (1) .
Giải pháp mà tôi đã đưa ra cho đến nay là:
Đặt mảng A [1..n] thực hiện hai ngăn xếp: S1 [1..i] và S2 [i..n] .
Đối với các hoạt động PUSH-S1 và PUSH-S2 , nếu ngăn xếp 'đầy' thì bắt đầu đẩy các phần tử sang ngăn xếp khác (ví dụ: nếu ngăn xếp S1 đầy khi một phần tử mới đang cố gắng được đẩy vào, sau đó đẩy phần tử đó vào chồng S2 và ngược lại).
Vấn đề với cách tiếp cận này là tôi sẽ không thể tin cậy vào POP-S1 hoặc POP-S2 vì không có cách nào để 'nhớ' phần tử nào thuộc về ngăn xếp nào. Nếu các phần tử của ngăn xếp là cặp (khóa, giá trị) , thì khóa là số ngăn xếp, sau đó để bật một phần tử tôi sẽ phải tìm kiếm, trong trường hợp xấu nhất, i hoặc (ni) lần - sẽ là O (n ) (vui lòng sửa tôi nếu tôi sai ở đây), đó không phải là O (1) .
Tôi đã đập đầu vào câu hỏi khá lâu rồi. Có phải tôi đang trên đường ray bên phải không? Ai đó có thể cho tôi gợi ý có thể để giải quyết vấn đề này?
Nói chung, tôi nên 'nghĩ' về những vấn đề này như thế nào? Hay chỉ những người thực sự thông minh mới có thể giải quyết những loại vấn đề này? Liệu việc giải quyết / giải quyết các vấn đề như thế này (tức là tích lũy kinh nghiệm) sẽ giúp tôi trở nên tốt hơn trong việc này?
Tôi chờ đợi sự giác ngộ.