Ma trận và bảng dữ liệu trong thuật toán

Làm chủ ma trận và bảng dữ liệu dạng hàng cột cùng độ phức tạp thao tác: hàng là điểm dữ liệu, cột là thuộc tính, trục xác định hướng tính toán.
DễCấu trúc dữ liệu ~45 phút

Giới thiệu

Bài này học bảng hàng-cột và ma trận số. Bạn lọc đúng hàng cột cần dùng.

Kiến thức cần nhớ

Bảng dữ liệu hàng và cột

  • Mỗi hàng là 1 điểm dữ liệu.
  • Mỗi cột là 1 thuộc tính.
  • Gọi tên cột là lấy được cột.
  • Ví dụ đời thường: bảng lương mỗi dòng 1 nhân viên.

Lọc cột và lọc hàng

  • Lọc cột là chọn vài cột quan tâm.
  • Lọc hàng là chọn hàng thỏa điều kiện.
  • Kết hợp cả 2 được lát cắt chính xác.
  • Ví dụ đời thường: lọc học sinh giỏi toán.
  • Chọn đặc trưng là lọc cột, chọn mẫu là lọc hàng.

Ma trận và chi phí

  • Ma trận là bảng số chữ nhật.
  • Cộng 2 ma trận thì duyệt từng ô.
  • Nhân 2 ma trận rất đắt, bậc 3.
  • Ví dụ đời thường: bảng điểm nhân trọng số.
  • Lưu theo cột thì thêm cột chỉ tốn O(n)O(n) để tạo dữ liệu cột mới, không phải chép lại cả bảng.
Thao tác bảngChi phí thường
Chọn cột theo tênO(1)O(1)
Thêm cột mớiO(n)O(n) cho cột mới
Lọc hàngO(n)O(n) theo số hàng
Cộng ma trậnTheo số ô

Ví dụ

  • Input: bảng 3 nhân viên, trích cột lương. Output: đúng 3 con số đúng thứ tự.
  • Giải thích: gọi tên cột là lấy được vector cột.

💻 Bài tập

Ngôn ngữ: Python 3, chỉ dùng thư viện chuẩn (csv) cho Bài 1-2. Bài 3 dùng thêm NumPy. Nộp vào day-014/.

Tạo file employees.csv:

name,dept,salary,years
An,IT,25000000,3
Bình,HR,15000000,5
Chi,IT,32000000,7
Dũng,Sales,18000000,2
Hà,IT,21000000,1
Khoa,Sales,27000000,6

Bài 1: Lớp Table tối giản

Cài Table lưu dữ liệu theo cột: dict[str, list].

Phương thứcYêu cầu
Table.from_csv(path)Đọc file, tự đổi cột số thành int
shape()Trả (số hàng, số cột)
column(name)Trả list giá trị của cột. Sai tên thì KeyError rõ ràng
select(*names)Trả Table mới chỉ có các cột đó
where(pred)pred nhận dict một hàng, trả Table mới gồm hàng thỏa
add_column(name, values)Thêm cột. Sai độ dài thì ValueError
row(i)Trả dict của hàng i
t.shape()                                      -> (6, 4)
t.column("salary")[:2]                         -> [25000000, 15000000]
t.where(lambda r: r["salary"] > 20e6).shape()  -> (4, 4)
t.select("name", "dept").shape()               -> (6, 2)

Bài 2: Group-by và xếp loại

  1. group_mean(table, key, value) trả dict trung bình theo nhóm. group_mean(t, "dept", "salary")["IT"] = 26000000.
  2. Thêm cột level: years >= 5 là "senior", >= 2 là "mid", còn lại "junior".
  3. In bảng dạng text căn cột thẳng hàng.

Bài 3: Ma trận (nâng cao)

  1. Tự viết mat_add(A, B) và mat_mul(A, B) bằng list lồng nhau. Sai kích thước thì ValueError.
  2. Đếm số phép nhân trong mat_mul cho ma trận n×nn \times n. Kiểm tra bằng n3n^3.
  3. Đo thời gian mat_mul tự viết và numpy.matmul với n=50,100,200n = 50, 100, 200.
mat_add([[1,2],[3,4]], [[5,6],[7,8]]) -> [[6,8],[10,12]]
mat_mul([[1,2],[3,4]], [[5,6],[7,8]]) -> [[19,22],[43,50]]

✅ Tiêu chí hoàn thành

  • Test mẫu viết bằng assert trong test_table.py pass.
  • where và select trả bảng mới, không sửa bảng gốc.
  • Bảng thời gian Bài 3 có số thật và 2 câu giải thích vì sao NumPy nhanh hơn.
  • Giải thích được vì sao lưu theo cột giúp column() rẻ, còn row() đắt hơn.

❓ Câu hỏi ôn tập

  • Hàng và cột trong bảng là gì?
  • Lọc cột khác lọc hàng thế nào?
  • Thêm cột tốn bao nhiêu?
  • Ma trận nhân nhau có đắt không?

🌕 Bạn đã hoàn thành ngày 14. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.