Để tìm tất cả các tập con của một tập hợp trong JavaScript, bạn có thể sử dụng phương pháp đệ quy hoặc phương pháp duyệt tổ hợp. Một trong những cách tiếp cận phổ biến là sử dụng backtracking để sinh ra tất cả các tập con của tập hợp.
Mã Nguồn:
function subsets(nums) {
let result = [];
function backtrack(start, currentSubset) {
result.push([...currentSubset]);
for (let i = start; i < nums.length; i++) {
currentSubset.push(nums[i]);
backtrack(i + 1, currentSubset);
currentSubset.pop();
}
}
backtrack(0, []);
return result;
}
// Ví dụ kiểm tra
console.log(subsets([1, 2, 3]));
/*
[
[], [ 1 ],
[ 1, 2 ], [ 1, 2, 3 ],
[ 1, 3 ], [ 2 ],
[ 2, 3 ], [ 3 ]
]
*/
Giải Thích:
-
Hàm Backtrack:
- Hàm
backtrackđược sử dụng để sinh ra các tập con bằng cách thêm từng phần tử vào tập con hiện tại và gọi đệ quy để tiếp tục thêm các phần tử khác.
- Hàm
-
Thêm Tập Con Hiện Tại vào Kết Quả:
- Mỗi khi gọi hàm
backtrack, tập con hiện tại (currentSubset) được sao chép và thêm vào mảngresult.
- Mỗi khi gọi hàm
-
Duyệt Qua Các Phần Tử:
- Vòng lặp
forduyệt qua các phần tử từ vị trístartđến cuối mảngnums. - Từng phần tử được thêm vào
currentSubsetvà hàmbacktrackđược gọi đệ quy với vị trí bắt đầu mới (i + 1). - Sau khi đệ quy hoàn thành, phần tử cuối cùng được loại bỏ (backtracking) để thử các tổ hợp khác.
- Vòng lặp
Tổng Quan:
- Backtracking: Kỹ thuật đệ quy mạnh mẽ, hữu ích trong việc sinh ra các tổ hợp hoặc hoán vị.
- Độ Phức Tạp Thời Gian: O(2^n), do có 2^n tập con có thể có từ một tập hợp n phần tử.
- Ứng Dụng: Thích hợp cho các bài toán tổ hợp và sinh tập con trong các ngôn ngữ lập trình.
Ví Dụ Thực Tế:
console.log(subsets([1, 2, 3]));
/*
[
[], [ 1 ],
[ 1, 2 ], [ 1, 2, 3 ],
[ 1, 3 ], [ 2 ],
[ 2, 3 ], [ 3 ]
]
*/
Trong ví dụ trên, tập hợp [1, 2, 3] có tất cả các tập con được sinh ra, bao gồm cả tập rỗng.
Comments