Không có lý do cụ thể nào tôi quyết định tìm một thuật toán tạo tất cả các lựa chọn có thể có của k số nguyên giữa 1 ... n, trong đó thứ tự trong số nguyên k không quan trọng (n chọn k thingy).Liệt kê tất cả các kết hợp có thể có của k số nguyên giữa 1 ... n (n chọn k)
Từ cùng một lý do, không có lý do gì cả, tôi cũng đã triển khai nó trong C#. Câu hỏi của tôi là:
Bạn có thấy bất kỳ sai lầm nào trong thuật toán hoặc mã của tôi không? Và quan trọng hơn, bạn có thể đề xuất thuật toán tốt hơn không?
Vui lòng chú ý nhiều hơn đến thuật toán so với chính mã. Đó không phải là đoạn mã đẹp nhất mà tôi từng viết, mặc dù bạn biết nếu bạn gặp lỗi.
EDIT: Alogirthm giải thích -
- Chúng tôi giữ chỉ số k.
- Điều này tạo k lồng nhau cho vòng lặp, trong đó chỉ số vòng lặp i là chỉ mục [i].
- Nó mô phỏng k cho vòng nơi chỉ mục [i + 1] thuộc về vòng lặp được lồng trong vòng lặp của chỉ mục [i].
- chỉ số [i] chạy từ chỉ số [i - 1] + 1 đến n - k + i + 1.
Mã sản phẩm:
public class AllPossibleCombination
{
int n, k;
int[] indices;
List<int[]> combinations = null;
public AllPossibleCombination(int n_, int k_)
{
if (n_ <= 0)
{
throw new ArgumentException("n_ must be in N+");
}
if (k_ <= 0)
{
throw new ArgumentException("k_ must be in N+");
}
if (k_ > n_)
{
throw new ArgumentException("k_ can be at most n_");
}
n = n_;
k = k_;
indices = new int[k];
indices[0] = 1;
}
/// <summary>
/// Returns all possible k combination of 0..n-1
/// </summary>
/// <returns></returns>
public List<int[]> GetCombinations()
{
if (combinations == null)
{
combinations = new List<int[]>();
Iterate(0);
}
return combinations;
}
private void Iterate(int ii)
{
//
// Initialize
//
if (ii > 0)
{
indices[ii] = indices[ii - 1] + 1;
}
for (; indices[ii] <= (n - k + ii + 1); indices[ii]++)
{
if (ii < k - 1)
{
Iterate(ii + 1);
}
else
{
int[] combination = new int[k];
indices.CopyTo(combination, 0);
combinations.Add(combination);
}
}
}
}
Tôi xin lỗi vì câu hỏi dài, nó có thể phù hợp cho một bài đăng blog, nhưng tôi muốn ý kiến của cộng đồng ở đây.
Cảm ơn,
Asaf
Bản sao của http: // s tackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n – ShreevatsaR