Sin ninguna razón en particular, decidí buscar un algoritmo que produjera todas las elecciones posibles de k enteros entre 1 ... n, donde el orden entre los k enteros no importa (el n elige k cosa).Listar todas las combinaciones posibles de k enteros entre 1 ... n (n elegir k)
Por el mismo motivo, que no es ninguna razón, también lo implementé en C#. Mi pregunta es:
¿Ve algún error en mi algoritmo o código? Y, más importante aún, , ¿puede sugerir un mejor algoritmo?
Preste más atención al algoritmo que el código en sí. No es el código más bonito que he escrito, aunque digo si ves un error.
EDIT: Alogirthm explicó -
- Sostenemos índices k.
- Esto crea k anidados para bucles, donde el índice del bucle i es índices [i].
- Simula k para bucles donde los índices [i + 1] pertenecen a un bucle anidado dentro del bucle de índices [i].
- índices [i] va desde los índices [i - 1] + 1 a n - k + i + 1.
CÓDIGO:
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);
}
}
}
}
Me disculpo por la pregunta larga, podría estar en forma para una publicación de blog, pero sí quiero la opinión de la comunidad aquí.
Gracias,
Asaf
duplicados de http: // s tackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n – ShreevatsaR