Một phản ứng khách quan:
Mặc dù câu trả lời ban đầu của tôi cho câu hỏi này dựa trên kinh nghiệm thực nghiệm của tôi khi là một sinh viên CS sắp tốt nghiệp và ý kiến dự kiến của tôi về loại người tôi muốn làm việc trong lĩnh vực CS. Thực sự có một mục tiêu (liên quan đến các ý kiến chủ quan của câu trả lời ACM SIGCSE và xã hội điện toán IEEE). Cứ sau 10 năm , các cơ quan ACM và IEEE hợp tác trên một ấn phẩm chung có chi tiết đề xuất cho chương trình giảng dạy khoa học máy tính đại học dựa trên kiến thức chuyên môn về tình trạng của ngành công nghiệp điện toán. Thông tin chi tiết có thể được tìm thấy tại cs2013.org . Ủy ban xuất bản một báo cáo cuối cùng liệt kê khuyến nghị chương trình giảng dạy của họ .
Điều đó nói rằng, tôi vẫn nghĩ rằng danh sách của tôi là khá tốt.
Câu trả lời gốc dưới đây.
Tôi nên biết gì?
Tối thiểu
Tôi nghĩ rằng một lập trình viên lão luyện nên có ít nhất kiến thức trình độ đại học về Khoa học Máy tính. Chắc chắn, bạn có thể làm việc hiệu quả trong nhiều công việc chỉ với một tập hợp nhỏ của Khoa học Máy tính vì cộng đồng vững chắc của CS, và sự tập trung của hầu hết các vị trí chuyên nghiệp. Ngoài ra, nhiều người sẽ chuyên sâu hơn sau khi học đại học. Tuy nhiên, tôi không nghĩ một trong hai lý do để không bí mật về kiến thức CS nền tảng.
Để trả lời câu hỏi tiêu đề, đây là những gì một sinh viên CS đại học (nền tảng cho một lập trình viên lão luyện) nên biết khi tốt nghiệp:
Cấu trúc dữ liệu
- Đại diện dữ liệu máy
- Những người thân, bổ sung của hai và số học liên quan
- Từ, Con trỏ, Điểm nổi
- Truy cập bit, dịch chuyển và thao tác
- Danh sách liên kết
- Bảng băm (bản đồ hoặc từ điển)
- Mảng
- Cây
- Ngăn xếp
- Hàng đợi
- Đồ thị
- Cơ sở dữ liệu
Thuật toán
- Sắp xếp:
- Sắp xếp bong bóng (để biết tại sao nó xấu)
- Sắp xếp chèn
- Hợp nhất sắp xếp
- Sắp xếp nhanh chóng
- Sắp xếp kiểu Radix, Sắp xếp đếm và Sắp xếp nhóm
- Sắp xếp đống
- Sắp xếp lượng tử và lượng tử (=
- Đang tìm kiếm:
- Tìm kiếm tuyến tính
- Tìm kiếm nhị phân
- Độ sâu tìm kiếm đầu tiên
- Bề rộng tìm kiếm đầu tiên
- Thao tác chuỗi
- Lặp lại
- Cây thông
- Liệt kê danh sách
- Hàm băm
- Triển khai cụ thể Bảng Hash, Cây, Danh sách, Ngăn xếp, Hàng đợi, Mảng và Bộ hoặc Bộ sưu tập
- Thuật toán lập lịch
- Hệ thống tệp Traversal và Thao tác (ở mức inode hoặc mức tương đương).
Mẫu thiết kế
- Mô đun hóa
- Nhà máy
- Người xây dựng
- Người độc thân
- Bộ chuyển đổi
- Người trang trí
- Cân nặng
- Người quan sát
- Lặp lại
- Nhà nước [Máy]
- Bộ điều khiển xem mô hình
- Các mẫu lập trình và xử lý song song
Nghịch lý
- Bắt buộc
- Hướng đối tượng
- Chức năng
- Tuyên bố
- Lập trình tĩnh và động
- Đánh dấu dữ liệu
Lý thuyết phức tạp
- Không gian phức tạp
- Khả năng tính toán
- Ngôn ngữ hoàn chỉnh thông thường, không có ngữ cảnh và phổ biến
- Biểu thức chính quy
- Bộ đếm và kết hợp cơ bản
Vượt ra ngoài
Để tìm hiểu những gì bạn hỏi về câu hỏi sau này, nếu bạn quen thuộc với câu hỏi trên, bạn có thể dễ dàng xác định mô hình, thuật toán và cấu trúc dữ liệu phù hợp cho một kịch bản nhất định. Tuy nhiên, bạn nên nhận ra rằng thường không có giải pháp tốt nhất. Đôi khi bạn có thể được yêu cầu chọn ít hơn hai tệ nạn hoặc thậm chí chỉ cần chọn giữa hai giải pháp khả thi như nhau. Bởi vì điều này, bạn cần có kiến thức chung để có thể bảo vệ sự lựa chọn của bạn chống lại các đồng nghiệp của bạn.
Dưới đây là một số mẹo cho thuật toán và cấu trúc dữ liệu:
- Tìm kiếm nhị phân chỉ có thể (và nên) được sử dụng trên dữ liệu được sắp xếp.
- Các kiểu sắp xếp Radix là tuyệt vời, nhưng chỉ khi bạn có các lớp hữu hạn của những thứ được sắp xếp.
- Cây xanh tốt cho hầu hết mọi thứ như Bảng Hash. Chức năng của Bảng Hash có thể được ngoại suy và sử dụng để giải quyết nhiều vấn đề với chi phí hiệu quả.
- Mảng có thể được sử dụng để sao lưu hầu hết các cấu trúc dữ liệu cấp cao hơn. Đôi khi một "cấu trúc dữ liệu" không hơn một số phép toán thông minh để truy cập các vị trí trong một mảng.
- Sự lựa chọn ngôn ngữ có thể là sự khác biệt giữa việc nhổ tóc của bạn, hoặc lướt qua, một vấn đề.
- Bảng ASCII và mảng 128 phần tử tạo thành bảng băm ẩn (=
- Các biểu thức thông thường có thể giải quyết rất nhiều vấn đề, nhưng chúng không thể được sử dụng để phân tích HTML .
- Đôi khi cấu trúc dữ liệu cũng quan trọng như thuật toán.
Một số ở trên có vẻ như không có trí tuệ, và một số có vẻ mơ hồ. Nếu bạn muốn tôi đi vào chi tiết hơn, tôi có thể. Nhưng, hy vọng của tôi là khi gặp một câu hỏi cụ thể hơn, chẳng hạn như: "Thiết kế hàm đếm số lần xuất hiện của mỗi ký tự trong Chuỗi", bạn nhìn vào mẹo về bảng ASCII và 128 mảng phần tử tạo thành hàm băm gọn gàng bảng cho câu trả lời.
Dựa trên những ý tưởng này, tôi sẽ đề xuất một câu trả lời cho vấn đề tủ khóa được nêu trong câu hỏi của bạn.
Trả lời cho vấn đề đặt ra trong câu hỏi của bạn.
Đây có thể không phải là câu trả lời tốt nhất cho câu hỏi của bạn, nhưng tôi nghĩ đó là một câu hỏi thú vị không đòi hỏi bất cứ điều gì quá phức tạp. Và nó chắc chắn sẽ đánh bại sự phức tạp về thời gian của việc sử dụng hàng đợi hoặc ngăn xếp đòi hỏi thời gian tuyến tính để xác định xem khóa có miễn phí hay không.
Bạn có tủ khóa 0-999. Bây giờ, vì bạn có số lượng tủ khóa cố định, bạn có thể dễ dàng hình thành chức năng băm mà không có va chạm trong phạm vi 0-999. Hàm này chỉ đơn giản là h (x) = x mod 1000. Bây giờ, [về mặt khái niệm] xây dựng bảng băm với các khóa nguyên và nội dung của mảng char 1000 phần tử làm giá trị của bạn. Nếu khách hàng muốn dự trữ khóa 78 để sử dụng, chỉ cần đặt 78 vào hàm băm (trả về 78), sau đó thêm số đó vào con trỏ cơ sở của mảng - lưu trữ giá trị thực tại vị trí được chỉ ra bởi giá trị offset . Tương tự, nếu bạn cần kiểm tra xem 78 có được sử dụng hay không, chỉ cần đọc giá trị được lưu trữ tại vị trí đó và kiểm tra lại có đúng không.
Giải pháp này hoạt động trong thời gian không đổi cho việc tra cứu và lưu trữ trái ngược với lưu trữ thời gian (n) và tra cứu trong trường hợp hàng đợi ưu tiên được hỗ trợ bởi cây nhị phân. Mô tả có chủ ý dài dòng để bạn có thể thấy các khái niệm cao hơn được đưa vào một thuật toán hiệu quả.
Bây giờ, bạn có thể hỏi, nếu tôi cần biết tất cả các tủ khóa có sẵn, thì hàng đợi ưu tiên sẽ tốt hơn không? Nếu có k khóa có sẵn trong hàng ưu tiên, lặp đi lặp lại tất cả chúng sẽ thực hiện k bước. Hơn nữa, tùy thuộc vào việc thực hiện hàng đợi ưu tiên của bạn, bạn có thể phải xây dựng lại hàng đợi ưu tiên của mình khi bạn xem xét tất cả .. sẽ mất các bước k * log (k): (k <1000). Trong giải pháp mảng, bạn chỉ phải lặp lại một mảng 1000 phần tử và kiểm tra xem cái nào đang mở. Bạn cũng có thể thêm một danh sách có sẵn hoặc được sử dụng vào triển khai để chỉ kiểm tra thời gian k.