DDevArchive
Đăng nhập

Cấu trúc dữ liệu & thuật toán cơ bản

Mảng và object là hai "kho" dữ liệu cơ bản nhất. Nhưng nắm thêm Hash Map, Stack/Queue và vài thuật toán sắp xếp sẽ quyết định bạn giải quyết được bài toán khó hay chỉ "đủ chạy".

Array vs Hash Map: đổi không gian lấy thời gian

Tìm một phần tử trong mảng theo giá trị phải quét lần lượt — O(n). Hash Map (object/Map trong JS) lưu theo cặp khoá–giá trị, tìm được ngay — O(1). Đây là đổi đổi lấy tốc độ, bài toán kinh điển nhất của CS.

// File: hashmap.js
// Mảng: phải quét hết để tìm
const users = [];
const byId = new Map();           // khoá = id

for (const u of fetchedUsers) {
  users.push(u);                  // mảng thêm cuối nhanh
  byId.set(u.id, u);             // map: tra theo id tức thì
}

// users.find(x => x.id === 42)  -> O(n)
// byId.get(42)                  -> O(1)
💡 Khi nào dùng cái nào

Cần giữ thứ tự, đếm, duyệt tuần tự → mảng. Cần “tra cứu nhanh theo khoá”, đánh dấu đã thấy chưa, đếm tần suất → Map/Set. Nhớ điều này là ăn điểm mọi vòng phỏng vấn.

Stack và Queue: hai hàng đợi phổ biến nhất

Cấu trúcNguyên tắcVí dụ thực tế
StackLIFO — vào sau ra trướcNút Back của trình duyệt, undo, ngăn xếp lời gọi hàm
QueueFIFO — vào trước ra trướcHàng đợi in, xử lý tác vụ nền, message queue

Trong JS, array.push/pop mô phỏng stack; array.push/shift mô phỏng queue (nhưng shift chậm, trong thực tế dùng cấu trúc chuyên dụng hơn).

Thuật toán sắp xếp: biết một cách nhanh, hiểu tại sao

Với người đi làm, bạn hiếm khi tự viết sắp xếp (JS đã có sort). Điều quan trọng là hiểu độ phức tạp: một giải thuật O(n²) như bubble sort chết với 100.000 phần tử, trong khi O(n log n) như quicksort/merge sort chạy mượt.

Thuật toánTốt nhấtTrung bìnhKhi nào dùng
Bubble sortO(n)O(n²)Chỉ để học khái niệm
Merge sortO(n log n)O(n log n)Dữ liệu lớn, cần ổn định
QuicksortO(n log n)O(n log n)Phổ biến trong thư viện thực tế
sort() của JSO(n log n)Dùng mặc định, đừng tự viết lại

❓ Bạn cần kiểm tra nhanh một email đã từng đăng ký chưa trong danh sách 1 triệu email. Nên lưu danh sách đó ở đâu?

  • Phân biệt O(n) và O(1) bằng lời
  • Dùng được Map để tra cứu theo id
  • Nói được Stack khác Queue thế nào
  • Không tự viết lại sort() của ngôn ngữ