Sans raison particulière, j'ai décidé de rechercher un algorithme qui produit tous les choix possibles de k entiers entre 1 ... n, où le l'ordre parmi les k entiers n'a pas d'importance (les n choisissent k thingy). De la même raison, ce qui n'est pas une raison du tout, je l'ai également implémenté en C#. Ma question est:Liste toutes les combinaisons possibles de k entiers entre 1 ... n (n choisir k)
Voyez-vous une erreur dans mon algorithme ou mon code? Et, plus important, pouvez-vous suggérer un meilleur algorithme?
Veuillez accorder plus d'attention à l'algorithme que le code lui-même. Ce n'est pas le plus joli code que j'ai jamais écrit, mais dites-le si vous voyez une erreur.
EDIT: Alogirthm expliqué -
- Nous détenons des indices k.
- Ceci crée imbriqué pour les boucles, où l'index de la boucle i est index [i].
- Il simule k pour boucles où les indices [i + 1] appartiennent à une boucle imbriquée dans la boucle d'indices [i].
- indices [i] des indices [Runs i - 1] + 1 à n - k + i + 1.
CODE:
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);
}
}
}
}
Je présente mes excuses pour la longue question, il pourrait être en forme pour un blog, mais je veux l'opinion de la communauté ici.
Merci,
Asaf
en double de http: // s tackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n – ShreevatsaR