1.8 — 7. Cấu Trúc Dữ Liệu Cơ Bản và Big-O
Mục tiêu bài học
- Nắm được ý chính của bài và mối liên hệ với module.
- Áp dụng được kiến thức vào bối cảnh CRM/.NET backend.
- Sẵn sàng chuyển sang bài kế tiếp với nền tảng chắc chắn.
Nội dung bài học
Big-O mô tả tốc độ tăng của thời gian chạy khi dữ liệu lớn hơn. Bạn không cần toán học — chỉ cần hiểu trực quan.
1.8.1 — O(1) — Hằng số, không phụ thuộc kích thước dữ liệu
// Tra Dictionary: dù có 10 hay 10 triệu khách hàng,
// tốc độ tra cứu đều như nhau
var diemKhach = new Dictionary<string, int> { { "KH001", 500 }, /* ... */ };
int diem = diemKhach["KH001"]; // O(1)
Giống như tra cứu từ điển theo chữ cái — bạn không đọc từ đầu đến cuối.
1.8.2 — O(n) — Tuyến tính, tỉ lệ thuận với kích thước
// Tìm khách hàng trong danh sách không được sắp xếp:
// phải duyệt từng phần tử một
List<string> danhSach = new List<string> { "An", "Bình", "Châu", /* ... */ };
string canTim = "Châu";
foreach (string ten in danhSach) // O(n)
{
if (ten == canTim)
{
Console.WriteLine("Tìm thấy!");
break;
}
}
Giống như tìm một tờ giấy trong xấp giấy chưa được sắp xếp — trung bình phải lật qua n/2 tờ.
1.8.3 — O(n²) — Bậc hai, cần cẩn thận với dữ liệu lớn
// So sánh mọi cặp khách hàng để tìm duplicate email:
// vòng lặp lồng nhau → O(n²)
var emails = new List<string> { "a@x.com", "b@x.com", "a@x.com" };
for (int i = 0; i < emails.Count; i++)
{
for (int j = i + 1; j < emails.Count; j++) // O(n²)
{
if (emails[i] == emails[j])
Console.WriteLine($"Duplicate: {emails[i]}");
}
}
// Với 1000 khách hàng: ~500,000 phép so sánh
// Với 10,000 khách hàng: ~50,000,000 phép so sánh — chậm!
Cách tốt hơn (O(n)) dùng HashSet:
var emailDaSeen = new HashSet<string>();
foreach (string email in emails)
{
if (!emailDaSeen.Add(email)) // Add trả về false nếu đã tồn tại
Console.WriteLine($"Duplicate: {email}");
}
// Chỉ duyệt 1 lần, bất kể có bao nhiêu email
1.8.4 — Ví dụ thực tế nhanh
- Một ví dụ áp dụng trực tiếp vào luồng CRM/ERP hiện tại.
- Một lỗi phổ biến dễ gặp khi triển khai thật.
- Một cách kiểm tra nhanh để tự xác nhận bạn đã hiểu đúng.
Bài tập áp dụng
- Tóm tắt bài học bằng ngôn ngữ của bạn.
- Liên hệ nội dung với một tình huống thực tế trong dự án.
- Đề xuất một cải tiến cụ thể sau khi học bài này.
Tự kiểm tra
- Bạn có thể giải thích lại nội dung chính trong 2 phút không?
- Bạn có ví dụ áp dụng thực tế chưa?
- Bạn biết bước tiếp theo cần học/triển khai là gì không?
Kết luận
Hoàn thành bài này giúp bạn có góc nhìn đầy đủ hơn trước khi đi tiếp trong module.
Điều hướng
- Bài trước: 1.7 — 6. Tư Duy Giải Bài Toán
- Bài tiếp theo: 1.9 — Mở rộng và đào sâu
- Về module: Trang mục lục