Chuyên đề: Duyệt toàn bộ các trường hợp trong lập trình

Kỹ thuật duyệt tuần tự, duyệt tổ hợp, hoán vị, tập con từ cơ bản đến nâng cao

By Hoàng Hà

Giới thiệu

Duyệt toàn bộ các khả năng là kỹ thuật nền tảng trong lập trình thuật toán. Hiểu rõ cách duyệt tuần tự, duyệt mọi cặp, bộ ba, tập con, hoán vị… giúp học sinh tự tin giải quyết các bài toán yêu cầu liệt kê, kiểm tra, hoặc tối ưu nghiệm trên tập nhỏ.

Bài viết này tổng hợp hướng dẫn từng kiểu duyệt, kèm ví dụ minh họa và bài tập tự luyện.


1. Duyệt tuần tự

Mô tả

  • Duyệt lần lượt qua tất cả các phần tử trong một tập hợp (mảng, vector).

Ví dụ mẫu

for (int i = 0; i < n; ++i) {
    cout << a[i] << " ";
}

Bài tập tự luyện

Gợi ý: Dùng vòng for đơn để duyệt từ 0 đến n-1.


2. Duyệt mọi cặp (2 phần tử)

Mô tả

  • Duyệt tất cả các cặp $(i, j)$ với $i < j$.

Ví dụ mẫu

for (int i = 0; i < n; ++i)
    for (int j = i+1; j < n; ++j)
        cout << a[i] << ", " << a[j] << endl;

Bài tập tự luyện

Gợi ý: Duyệt hai vòng lồng nhau, chỉ xét $j>i$.


3. Duyệt mọi bộ ba (3 phần tử)

Mô tả

  • Duyệt tất cả các bộ ba $(i, j, k)$ với $i < j < k$.

Ví dụ mẫu

for (int i = 0; i < n; ++i)
    for (int j = i+1; j < n; ++j)
        for (int k = j+1; k < n; ++k)
            cout << a[i] << ", " << a[j] << ", " << a[k] << endl;

Bài tập tự luyện

Gợi ý: Ba vòng for lồng nhau.


4. Duyệt mọi bộ 4, 5, 6 phần tử

  • Duyệt tương tự bộ 2, bộ 3, thêm vòng lặp cho mỗi thành phần.
  • Độ phức tạp tăng rất nhanh: $O(n^k)$ với bộ $k$ phần tử.
  • Chỉ áp dụng khi $n$ nhỏ.

Bài tập tự luyện (Bộ 4)

Gợi ý: Duyệt 4 vòng for hoặc tối ưu bằng map.


5. Duyệt mọi tập con (Subset)

Mô tả

  • Với tập $n$ phần tử, có $2^n$ tập con.

Ví dụ mẫu

for (int mask = 0; mask < (1 << n); ++mask) {
    for (int i = 0; i < n; ++i)
        if (mask >> i & 1)
            cout << a[i] << " ";
}

Bài tập tự luyện

Gợi ý: Duyệt bằng bitmask, mỗi bit ứng với chọn/không chọn.


6. Duyệt mọi hoán vị (Permutation)

Mô tả

  • Với tập $n$ phần tử, có $n!$ hoán vị.

Ví dụ mẫu

sort(a, a+n);
do {
    for (int i = 0; i < n; ++i) cout << a[i] << " ";
} while (next_permutation(a, a+n));

Bài tập tự luyện

Gợi ý: Dùng next_permutation hoặc đệ quy backtracking.


Kết luận

Hiểu và thành thạo các kỹ thuật duyệt toàn bộ sẽ giúp học sinh:

  • Tự tin giải quyết các bài toán nhỏ.
  • Làm nền tảng để học thuật toán tối ưu hơn (quy hoạch động, backtracking).
  • Rèn luyện khả năng phân tích độ phức tạp.

Chúc bạn luyện tập vui vẻ và tiến bộ vững chắc! 🚀

Tags: Duyệt
Share: Facebook