Hay varias maneras de resolver esto. La respuesta de Ashish Gaurav a Dado un conjunto de tamaño n, ¿cómo encuentra todos los subconjuntos posibles del conjunto de tamaño k? hace esto al encontrar todos los números de k dígitos que, cuando se escriben en base n, tienen todos los dígitos únicos. Su solución hace esto iterando manualmente sobre todos esos números de k dígitos. Este enfoque funciona para valores pequeños, pero podemos hacerlo mucho mejor.
En primer lugar, tenga en cuenta que hay [matemáticas] n ^ {k + 1} – n ^ k – 1 [/ matemáticas] tales números. Esto escala muy rápidamente. En particular, si [math] k [/ math] es grande, entonces esto también generará todas las permutaciones [math] k! [/ Math]. Un truco estándar para evitar lidiar con las permutaciones es usar máscaras de bits. En particular, podemos ver el problema como querer generar todos los números [math] n [/ math] -bit donde exactamente [math] k [/ math] bits son 1. Esto implica hacer [math] O (n \ cdot 2 ^ n) [/ math] funciona, que es mucho mejor, y mueve la dependencia de [math] n [/ math] de estar en la base de un exponencial a solo ser un exponente.
Ahora, utilizando el truco de Gosper, podemos generar todos los números con [math] k [/ math] 1-bit menos que [math] 2 ^ n [/ math] que se ejecuta en [math] O \ left (\ binom {n} {k} \ right) [/ math] tiempo, suponiendo que las operaciones de bit en números de n bits toman [math] O (1) [/ math] time. Tenga en cuenta que de esta lista, es sencillo extraer todos los subconjuntos iterando sobre cada número y extrayendo los elementos que corresponden a bits que son 1 en lugar de 0.
- ¿Cómo utiliza la informática el método científico?
- ¿Qué motor basado en reglas sirve mejor al campo de IoT teniendo en cuenta el aspecto de procesamiento de eventos distribuidos (CEP)?
- ¿Pytest y Selenium WebDriver (python) son diferentes?
- Cómo aumentar el rendimiento de mi computadora manualmente
- En teoría, ¿podría una máquina Turing de inteligencia sobrehumana no ser un desarrollo de un solo hombre? ¿Podría ser construido solo por varias personas juntas?
Paso 1: El número más pequeño es obviamente [matemática] 2 ^ k-1 [/ matemática].
Paso 2: Si bien no ha generado todos los números, tome el más grande generado, llámelo x y calcule lo siguiente.
u = x & (-x);
v = x + u;
y = v + (((v ^ x) / u) >> 2);
y ahora es el siguiente entero más grande con [math] k [/ math] bits como 1.