Je revisite un vieux problème sur lequel je travaillais il y a quelque temps.
Un scénario typique est «3 bits sont définis dans un entier de 8 bits», c'est-à-dire 00000111.
Toutes les combinaisons uniques avec 3 bits définis peuvent facilement être générées (dans l'ordre) par des boucles imbriquées. Ce qui m'intéresse, c'est la combinaison d'index de mappage <->, c'est-à-dire que "00001011" serait la deuxième combinaison (ou la valeur "1" dans un index de base zéro).
Jusqu'à présent, j'ai parcouru toutes les combinaisons et les ai stockées dans une table, faisant de l'index de recherche -> conversation une opération O (1). L'autre direction est O (ln (n)) avec recherche de bissecte.
L'inconvénient, cependant, est que cela est évidemment lourd sur la mémoire si nous augmentons le domaine, jusqu'à un point où ce n'est pas possible.
Quelle serait une manière simple de calculer la nième combinaison ou l'indice d'une combinaison donnée? L'ordre des combinaisons serait bien, mais n'est pas obligatoire.
Réponses:
La génération de la n-ième combinaison est appelée un algorithme "non classé". Notez que les permutations et les combinaisons peuvent souvent être assimilées par la façon dont le problème est paramétré. Sans savoir exactement quel est le problème, il est difficile de recommander la bonne approche exacte, et en fait, pour la plupart des problèmes combinatoires, il existe généralement plusieurs algorithmes de classement / classement différents.
Une bonne ressource est "Algorithmes combinatoires" de Kreher et Stinson. Ce livre a de nombreux algorithmes de bon classement et non classés clairement expliqués. Il existe des ressources plus avancées, mais je recommanderais Kreher comme point de départ. À titre d'exemple d'algorithme non classé, considérez ce qui suit:
Il s'agit d'une permutation sans classement, mais comme mentionné ci-dessus, dans de nombreux cas, vous pouvez convertir une combinaison sans classement en un problème de permutation équivalent.
la source