Quay lại Khóa học
AI028 Undergraduate

Phân tích Cấu trúc Dữ liệu và Thuật toán Python (ấn bản thứ 2)

Cuốn sách này là một tài liệu kinh điển về cấu trúc dữ liệu và thuật toán sử dụng Python. Bao gồm ôn tập nền tảng Python, phân tích thuật toán (ký hiệu O lớn), các cấu trúc dữ liệu cơ bản (ngăn xếp, hàng đợi, danh sách), đệ quy, tìm kiếm và sắp xếp, thuật toán cây và đồ thị. Thông qua các đoạn mã thực hành, giúp người đọc hiểu cách triển khai hiệu quả các kiểu dữ liệu trừu tượng khác nhau bằng Python.

4.7
24.0h
1028 học viên
0 lượt thích
Trí tuệ nhân tạo
Bắt đầu học

Tổng quan khóa học

📚 Tóm tắt nội dung

Cuốn sách này là giáo trình kinh điển về cấu trúc dữ liệu và thuật toán được trình bày bằng Python. Bao gồm ôn tập nền tảng Python, phân tích thuật toán (ký hiệu O lớn), các cấu trúc dữ liệu cơ bản (ngăn xếp, hàng đợi, danh sách), đệ quy, tìm kiếm và sắp xếp, thuật toán cây và đồ thị. Qua các ví dụ mã thực tế, giúp người đọc hiểu cách triển khai hiệu quả các kiểu dữ liệu trừu tượng (ADT) bằng Python.

Chỉ khi thấu hiểu sâu sắc cấu trúc dữ liệu và thuật toán, mới thực sự thành thạo Python.

Tác giả: Bradley Miller (Giáo sư danh dự Khoa Công nghệ thông tin, Trường Đại học Luther, Mỹ), David Ranum (Kỹ sư phần mềm nhận thức IBM Watson)

Lời cảm ơn: Cảm ơn đồng nghiệp Steve Hubbard đã cung cấp nhiều phản hồi cho bản đầu tiên và tài liệu mới cho bản cập nhật; cảm ơn các đồng nghiệp khắp nơi đã gửi email chỉ ra lỗi và đóng góp ý kiến. Cảm ơn các nhân viên Mary, Bob tại quán cà phê Java John's ở thành phố Decora, cho phép chúng tôi trở thành "nhà văn thường trú" trong thời gian nghỉ ngơi. Ngoài ra, xin gửi lời cảm ơn chân thành đến toàn thể nhân viên công ty xuất bản Franklin, Beedle & Associates (đặc biệt là Jim Leisy và Tom Sumner) vì sự hợp tác vui vẻ. Cuối cùng, xin đặc biệt cảm ơn hai người vợ của chúng tôi là Jane Miller và Brenda Ranum, những tình yêu và sự hỗ trợ của họ đã biến cuốn sách này thành hiện thực.

🎯 Mục tiêu học tập

  1. Hiểu mối quan hệ giữa khoa học máy tính, thuật toán và lập trình, nắm vững các khái niệm về kiểu dữ liệu trừu tượng (ADT) và ẩn giấu thông tin.
  2. Thành thạo sử dụng các kiểu dữ liệu tập hợp tích hợp trong Python (danh sách, bộ, tập hợp, từ điển) và các cấu trúc điều khiển (vòng lặp, nhánh, xử lý ngoại lệ).
  3. Nắm vững các yếu tố cốt lõi của lập trình hướng đối tượng (OOP) trong Python: định nghĩa lớp, phương thức khởi tạo, ghi đè toán tử (ví dụ như cộng hai phân số), ứng dụng thuật toán Euclid, và sự khác biệt giữa so sánh sâu và so sánh nông.
  4. So sánh đa phương án thuật toán: có thể giải thích bốn phương án phát hiện từ đảo (đếm, sắp xếp, bạo lực, đếm tần suất) và độ phức tạp tương ứng theo thời gian.
  5. Đo lường năng lực chứa đựng của Python: nắm vững hiệu suất O lớn của các thao tác chính trong danh sách (List) và từ điển (Dict) Python, phân biệt hiệu suất giữa pop()pop(i).
  6. Khả năng kiểm chứng hiệu năng: có thể sử dụng mô-đun timeit để thiết kế thí nghiệm, xác minh tính nhất quán giữa độ phức tạp lý thuyết và thời gian chạy thực tế.
  7. Hiểu và phân biệt được các đặc điểm logic của các cấu trúc tuyến tính (ngăn xếp, hàng đợi, hàng đợi kép, danh sách).
  8. Có thể sử dụng các tập hợp cơ bản của Python (như danh sách) để triển khai ngăn xếp, hàng đợi và hàng đợi kép tùy chỉnh.
  9. Nắm vững ứng dụng của ngăn xếp trong xử lý biểu thức (chuyển đổi trung tố sang hậu tố, đánh giá hậu tố) và hàng đợi trong mô phỏng hệ thống (mô phỏng máy in).
  10. Nắm vững ba nguyên tắc cốt lõi của đệ quy: có thể xác định chính xác và viết hàm đệ quy bao gồm trường hợp cơ sở, sự tiến hóa trạng thái và gọi tự thân.

🔹 Bài học 1: Cơ bản lập trình Python và trừu tượng hướng đối tượng

Tổng quan: Mô-đun bài học này nhằm dẫn dắt người học chuyển từ lý thuyết khoa học máy tính cơ bản sang thực hành lập trình Python. Bài học đầu tiên định nghĩa rõ ràng các khái niệm cốt lõi về khoa học máy tính, thuật toán và kiểu dữ liệu trừu tượng (ADT), sau đó đi sâu vào các tập hợp tích hợp, cấu trúc điều khiển và xử lý ngoại lệ trong Python. Cuối cùng, qua việc xây dựng lớp Fraction và cấu trúc kế thừa “cổng logic”, bài học minh họa sức mạnh của lập trình hướng đối tượng (OOP) trong trừu tượng hóa quá trình và trừu tượng hóa dữ liệu.

Kết quả học tập:

  • Hiểu mối quan hệ giữa khoa học máy tính, thuật toán và lập trình, nắm vững các khái niệm về kiểu dữ liệu trừu tượng (ADT) và ẩn giấu thông tin.
  • Thành thạo sử dụng các kiểu dữ liệu tập hợp tích hợp trong Python (danh sách, bộ, tập hợp, từ điển) và các cấu trúc điều khiển (vòng lặp, nhánh, xử lý ngoại lệ).
  • Nắm vững các yếu tố cốt lõi của lập trình hướng đối tượng (OOP) trong Python: định nghĩa lớp, phương thức khởi tạo, ghi đè toán tử (ví dụ như cộng hai phân số), ứng dụng thuật toán Euclid, và sự khác biệt giữa so sánh sâu và so sánh nông.

🔹 Bài học 2: Phân tích thuật toán và hiệu năng container Python

Tổng quan: Bài học này đi sâu vào việc đánh giá hiệu suất thuật toán bằng ký hiệu O lớn, lấy ví dụ “phát hiện từ đảo” để minh họa sự tiến hóa từ O(n!) đến O(n) với các mức độ phức tạp khác nhau. Đồng thời, bài học phân tích định lượng hiệu năng của các thao tác phổ biến trong các cấu trúc dữ liệu cốt lõi của Python (danh sách và từ điển), nhằm hỗ trợ nhà phát triển đưa ra lựa chọn tối ưu về container và thiết kế thuật toán trong thực tiễn lập trình.

Kết quả học tập:

  • So sánh đa phương án thuật toán: có thể giải thích bốn phương án phát hiện từ đảo (đếm, sắp xếp, bạo lực, đếm tần suất) và độ phức tạp thời gian tương ứng.
  • Đo lường năng lực chứa đựng của Python: nắm vững hiệu suất O lớn của các thao tác chính trong danh sách (List) và từ điển (Dict) Python, phân biệt hiệu suất giữa pop()pop(i).
  • Khả năng kiểm chứng hiệu năng: có thể sử dụng mô-đun timeit để thiết kế thí nghiệm, xác minh tính nhất quán giữa độ phức tạp lý thuyết và thời gian chạy thực tế.

🔹 Bài học 3: Các cấu trúc tuyến tính cơ bản: ngăn xếp, hàng đợi và danh sách liên kết

Tổng quan: Bài học này đi sâu vào bốn cấu trúc dữ liệu tuyến tính cơ bản: ngăn xếp (Stack), hàng đợi (Queue), hàng đợi kép (Deque) và danh sách (List). Điểm cốt lõi của các cấu trúc tuyến tính là duy trì thứ tự tương đối giữa các phần tử, sự khác biệt chủ yếu nằm ở cách thêm và loại bỏ phần tử. Thông qua việc triển khai các kiểu dữ liệu trừu tượng (ADT) bằng Python, người học sẽ nắm được cách áp dụng các nguyên tắc như LIFO (sau vào trước ra) và FIFO (trước vào trước ra) để giải quyết các vấn đề thuật toán thực tế như chuyển đổi biểu thức, mô phỏng hệ thống và quản lý bộ nhớ danh sách liên kết.

Kết quả học tập:

  • Hiểu và phân biệt được các đặc điểm logic của các cấu trúc dữ liệu tuyến tính (ngăn xếp, hàng đợi, hàng đợi kép, danh sách).
  • Có thể sử dụng các tập hợp cơ bản của Python (như danh sách) để triển khai ngăn xếp, hàng đợi và hàng đợi kép tùy chỉnh.
  • Nắm vững ứng dụng của ngăn xếp trong xử lý biểu thức (chuyển trung tố sang hậu tố, đánh giá hậu tố) và hàng đợi trong mô phỏng hệ thống (mô phỏng máy in).

🔹 Bài học 4: Nguyên lý thuật toán đệ quy và giới thiệu quy hoạch động

Tổng quan: Bài học này đi sâu vào nguyên lý cốt lõi của thuật toán đệ quy, bắt đầu từ ba nguyên tắc cơ bản của đệ quy, thông qua các ví dụ như chuyển đổi số, hình học fractal, giải đố kinh điển (tháp Hà Nội, mê cung), làm rõ cơ chế hoạt động bên dưới của lời gọi đệ quy — khung ngăn xếp (stack frame). Cuối cùng, bài học giới thiệu khái niệm quy hoạch động (Dynamic Programming), minh họa cách sử dụng kỹ thuật ghi nhớ (memoization) để giải quyết vấn đề tính toán trùng lặp trong đệ quy, từ đó đạt được bước nhảy vọt về hiệu suất thuật toán.

Kết quả học tập:

  • Nắm vững ba nguyên tắc cốt lõi của đệ quy: có thể xác định chính xác và viết hàm đệ quy bao gồm trường hợp cơ sở, sự tiến hóa trạng thái và gọi tự thân.
  • Hiểu rõ cơ chế thực thi bên dưới: hiểu cách khung ngăn xếp (Stack Frame) của Python quản lý biến cục bộ và đường trả về trong quá trình đệ quy.
  • Có khả năng mô hình hóa các vấn đề phức tạp: có thể sử dụng tư duy đệ quy và quay lui để giải quyết các bài toán phi tuyến tính như tháp Hà Nội, tìm đường trong mê cung.

🔹 Bài học 5: Kỹ thuật tìm kiếm, băm và thuật toán sắp xếp

Tổng quan: Mô-đun bài học này tập trung vào các kỹ thuật xử lý dữ liệu cốt lõi trong khoa học máy tính: tìm kiếm, băm (Hashing) và sắp xếp. Nội dung bao gồm từ tìm kiếm tuần tự cơ bản đến tìm kiếm nhị phân hiệu quả, đi sâu vào nguyên lý xây dựng bảng băm (Hash Tables), phương pháp xử lý xung đột và cách triển khai kiểu dữ liệu trừu tượng ánh xạ (Map). Đồng thời, phân tích chi tiết logic và hiệu suất của các thuật toán sắp xếp như sắp xếp nổi bọt, sắp xếp Shell và sắp xếp trộn.

Kết quả học tập:

  • Hiểu và có thể so sánh các trường hợp sử dụng và độ phức tạp thời gian giữa tìm kiếm tuần tự và tìm kiếm nhị phân (O(n) so với O(\log n)).
  • Nắm vững thiết kế hàm băm (phương pháp gập, phương pháp bình phương trung tâm) và cơ chế xử lý xung đột (khảo sát tuyến tính, khảo sát bình phương, phương pháp nối).
  • Có thể mô phỏng và triển khai bằng mã lệnh sắp xếp nổi bọt, sắp xếp Shell và sắp xếp trộn, hiểu rõ vai trò của chiến lược chia để trị trong sắp xếp.

🔹 Bài học 6: Cấu trúc cây:Heap nhị phân, cây tìm kiếm và cây cân bằng (AVL)

Tổng quan: Bài học này đi sâu vào cấu trúc dữ liệu cốt lõi nhất trong khoa học máy tính — cây. Chúng ta sẽ bắt đầu từ các thuật ngữ cơ bản và triển khai cây nhị phân, dần tiến tới các ứng dụng nâng cao của cây nhị phân, bao gồm cây phân tích biểu thức và các phương pháp duyệt cây. Sau đó, chúng ta học hai dạng biến thể hiệu quả: heap nhị phân dùng cho hàng đợi ưu tiên và cây tìm kiếm nhị phân (BST) dùng cho tìm kiếm hiệu quả. Cuối cùng, chúng ta nghiên cứu cây AVL, sử dụng thao tác xoay để duy trì hệ số cân bằng, giải quyết vấn đề suy giảm hiệu suất của BST trong trường hợp tệ nhất.

Kết quả học tập:

  • Có thể định nghĩa chính xác các thuật ngữ cốt lõi của cây (gốc, cạnh, đường đi, chiều cao...) và mô tả tính chất đệ quy của cây nhị phân.
  • Nắm vững các thuật toán cốt lõi để triển khai bằng Python: heap nhị phân, cây tìm kiếm nhị phân và cây AVL (như chèn, xóa, xoay, tái cân bằng).
  • Có thể thực hiện và giải thích ba thuật toán duyệt cây, đồng thời sử dụng cây phân tích để xử lý biểu thức toán học.

🔹 Bài học 7: Thuật toán lý thuyết đồ thị: Tìm kiếm, đường đi ngắn nhất và cây bao trùm nhỏ nhất

Tổng quan: Bài học này đi sâu vào lý thuyết cơ bản của lý thuyết đồ thị và cách triển khai hiệu quả trong Python. Nội dung bao gồm kiểu dữ liệu trừu tượng đồ thị (ma trận kề và danh sách kề), các thuật toán tìm kiếm cơ bản (BFS và DFS) cùng các ứng dụng điển hình. Cuối cùng, tiến đến các thuật toán đường đi ngắn nhất (Dijkstra) và cây bao trùm nhỏ nhất (Prim) trên đồ thị có trọng số.

Kết quả học tập:

  • Hiểu và có thể so sánh hiệu năng và trường hợp sử dụng của hai cách biểu diễn đồ thị chính (ma trận kề và danh sách kề).
  • Nắm vững nguyên lý thuật toán BFS và DFS, có thể giải quyết các bài toán tìm đường và du lịch vòng quanh.
  • Có thể áp dụng các thuật toán đồ thị để giải quyết các bài toán phụ thuộc logic phức tạp (sắp xếp topo) và tính liên thông mạng lưới (thành phần liên thông mạnh, cây bao trùm nhỏ nhất).

🔹 Bài học 8: Ôn tập chuyên đề: Mã hóa RSA, danh sách nhảy và nén màu ảnh bằng octree

Tổng quan: Bài học này đi sâu vào quá trình chuyển dịch ứng dụng từ cấu trúc dữ liệu cơ bản đến các thuật toán phức tạp trong khoa học máy tính. Nội dung bao gồm triển khai nền tảng của danh sách Python (ArrayList) và phân tích đều (Amortized Analysis), thuật toán đệ quy số học hỗ trợ mã hóa RSA, xây dựng danh sách nhảy để tăng hiệu suất tìm kiếm từ điển, và nguyên lý sử dụng octree để lượng hóa màu sắc ảnh số.

Kết quả học tập:

  • Hiểu bố cục bộ nhớ của ArrayList và suy luận toán học của phân tích đều (Amortized Analysis).
  • Nắm vững nguyên lý toán học cốt lõi của mã hóa RSA, bao gồm định lý đồng dư, số dư mũ và thuật toán Euclid mở rộng.
  • Có thể mô tả cấu trúc tầng lớp của danh sách nhảy, quá trình xây dựng ngẫu nhiên và hiệu suất tìm kiếm O(\log n) của nó.