Iterar sobre todos los subpatrones de una máscara dada


Sucede que es necesario enumerar todas las secuencias de bits de cierta longitud. O, en otras palabras, iterar sobre todas las opciones posibles, donde para cada objeto se selecciona uno de los dos estados posibles.

En tales situaciones, es posible implementar la enumeración utilizando máscaras de bits. La ventaja de este enfoque es que dicho código funciona de forma no recursiva y opera con números en lugar de colecciones o similares, lo que mejora enormemente el rendimiento.

El código general que usa máscaras de bits se proporciona a continuación: interno; // número de oobjects (longitud de la secuencia de bits) for (int mask = 0; mask < (1 << n); mask++) { // recorrer todos los números del 0 al 2^n - 1, donde cada número corresponde a una máscara de bits // la máscara de número actual es una máscara de bits, donde el i-ésimo bit especifica el estado del i-ésimo objeto for (int i = 0; i < n; i++) { // iterar sobre n bits para comprender qué estado tiene cada objeto if ((1 << i) & mask) { // comprueba si el i-ésimo bit es igual a uno // procesa la opción de que el i-ésimo objeto tiene el estado '1' } else { // caso cuando el i-ésimo bit es cero // procesar la opción de que el i-ésimo objeto del estado '0' } } }
Este código se ejecuta en O(2^n * f(n)), donde f(n) es el tiempo que le lleva procesar un iterable en particular.

Sucede que es necesario enumerar todas las secuencias de bits de cierta longitud. O, en otras palabras, iterar sobre todas las opciones posibles, donde para cada objeto se selecciona uno de los dos estados posibles.

En tales situaciones, es posible implementar la enumeración utilizando máscaras de bits. La ventaja de este enfoque es que dicho código funciona de forma no recursiva y opera con números en lugar de colecciones o similares, lo que mejora enormemente el rendimiento.

El código general que usa máscaras de bits se proporciona a continuación: interno; // número de oobjects (longitud de la secuencia de bits) for (int mask = 0; mask < (1 << n); mask++) { // recorrer todos los números del 0 al 2^n - 1, donde cada número corresponde a una máscara de bits // la máscara de número actual es una máscara de bits, donde el i-ésimo bit especifica el estado del i-ésimo objeto for (int i = 0; i < n; i++) { // iterar sobre n bits para comprender qué estado tiene cada objeto if ((1 << i) & mask) { // comprueba si el i-ésimo bit es igual a uno // procesa la opción de que el i-ésimo objeto tiene el estado '1' } else { // caso cuando el i-ésimo bit es cero // procesar la opción de que el i-ésimo objeto del estado '0' } } }
Este código se ejecuta en O(2^n * f(n)), donde f(n) es el tiempo que le lleva procesar un iterable en particular.