Imaginemos dos máscaras de bits, sólo voy a usar 8 bits por simplicidad:¿Necesita una manera de recoger un poco común en dos máscaras de bits al azar
01101010
10111011
El 2º, 4º, 6º y bits son ambos 1. I desea elegir uno de esos bits "en" comunes al azar. Pero quiero hacer esto en O (1).
La única forma que he encontrado de hacer esto hasta ahora es elegir un bit aleatorio "encendido" en uno, luego verificar el otro para ver si también está activado, luego repetir hasta encontrar una coincidencia. Esto sigue siendo O (n), y en mi caso la mayoría de los bits están desactivados en ambas máscaras. Lo hago, por supuesto, & juntos para verificar inicialmente si hay bits comunes en absoluto.
¿Hay alguna manera de hacerlo? Si es así, puedo aumentar la velocidad de mi función en alrededor del 6%. Estoy usando C# si eso importa. ¡Gracias!
Mike
Una forma de mejorarlo podría ser almacenar esa primera prueba ANDed que realiza y simplemente elegir un bit de conjunto aleatorio a partir de allí en lugar de saltar hacia adelante y hacia atrás entre los números más adelante. – jwsample
¿Para qué necesitas esto? ¿Sería suficiente una solución aproximada? –
Además, su mayor aumento de velocidad puede provenir de la paralelización. Mira esto: http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ –