P16: itertools¶
Tác giả: Hà Trí Kiên
Chủ đề: permutations, combinations, product, accumulate, chain
1. Tổng quan¶
itertools là module cung cấp các công cụ lặp hiệu quả. Rất hữu ích cho thi đấu.
2. permutations — Hoán vị¶
Số hoán vị
- \(n\) phần tử: \(n!\) hoán vị
- \(n\) phần tử, chập \(k\): \(\frac{n!}{(n-k)!}\) hoán vị
- Cẩn thận khi \(n\) lớn (\(10! = 3{,}628{,}800\))
3. combinations — Tổ hợp¶
So sánh¶
| Hàm | Toán học | Mô tả | Ví dụ (arr=[1,2,3], k=2) |
|---|---|---|---|
combinations |
\(C(n,k)\) | Tổ hợp, không lặp, không xét thứ tự | (1,2), (1,3), (2,3) |
combinations_with_replacement |
\(C(n+k-1,k)\) | Tổ hợp, có lặp (chọn lại được) | (1,1), (1,2), (1,3), (2,2), (2,3), (3,3) |
permutations |
\(P(n,k)\) | Hoán vị, không lặp, xét thứ tự | (1,2), (2,1), (1,3), (3,1), (2,3), (3,2) |
Tại sao tổ hợp có lặp là \(C(n+k-1,k)\)?
Khi chọn \(k\) phần tử từ \(n\) phần tử có thể chọn lại, ta quy về bài toán: đếm số nghiệm không âm của \(x_1 + x_2 + \cdots + x_n = k\) (trong đó \(x_i\) là số lần chọn phần tử thứ \(i\)). Số nghiệm này bằng \(C(n+k-1, k)\).
4. product — Tích Descartes¶
Ứng dụng: Sinh tất cả bitmask¶
5. accumulate — Tích lũy¶
6. chain — Nối iterators¶
7. cycle — Lặp vô hạn¶
8. repeat — Lặp giá trị¶
9. groupby — Nhóm phần tử liên tiếp¶
groupby yêu cầu dữ liệu đã sắp xếp
groupby chỉ nhóm các phần tử liên tiếp giống nhau. Phải sắp xếp trước nếu muốn nhóm tất cả.
10. islice — Slicing iterator¶
11. Ứng dụng trong thi đấu¶
11.1. Sinh tất cả hoán vị¶
11.2. Sinh tất cả tổ hợp¶
11.3. Sinh tất cả bitmask¶
11.4. Prefix sum¶
12. So sánh với C++¶
| Python | C++ | Ghi chú |
|---|---|---|
permutations |
next_permutation |
C++ chỉ sinh từng cái |
combinations |
Không có | Phải tự cài |
product |
Không có | Phải tự cài |
accumulate |
partial_sum |
Cùng chức năng |
chain |
Không có | Phải tự cài |
13. Lưu ý / Cạm bẫy hay gặp¶
Bẫy 1: permutations tăng rất nhanh¶
Bẫy 2: groupby chỉ nhóm liên tiếp¶
Bẫy 3: Iterator chỉ dùng 1 lần¶
14. Bài tập thực hành¶
Bài 1: Sinh hoán vị¶
Cho n. Sinh tất cả hoán vị của 1, 2, ..., n.
???? tip "Lời giải"
Bài 2: Sinh tổ hợp¶
Cho n, k. Sinh tất cả tổ hợp chập k của 1, 2, ..., n.
???? tip "Lời giải"
Bài 3: Prefix sum¶
Cho mảng arr. Tính prefix sum.
???? tip "Lời giải"
15. Bài tập luyện tập¶
| Bài | Nền tảng | Độ khó | Chủ đề |
|---|---|---|---|
| CSES - Creating Strings | CSES | ⭐⭐ | permutations |
| CSES - Apple Division | CSES | ⭐⭐ | product, bitmask |
Bài viết liên quan¶
Bài trước: P15: heapq
Bài tiếp theo: P17: bisect →