2010-03-01 8 views
7

en cuenta la situación Tengo valores asignados como estosoperación BitMask en Java

Amazon -1

Walmart -2

Objetivo -4

Costco -8

Bjs -16

En DB, los datos se almacenan enmascarando estos valores en función de su disponibilidad para cada producto. por ejemplo.,

Máscara descripción del producto

1 portátil Disponible en Amazon

17 iPhone Disponible en Amazon y BJ

24 Colchón Disponible en Costco y BJ

Como estos todos los productos son mascaras d y almacenado en el DB.

¿Cómo recupero todos los minoristas basados ​​en el valor enmascarado., por ejemplo., Para el colchón del valor enmascarado es 24. Entonces, ¿cómo iba yo a encontrar o lista de Costco & BJ mediante programación. Algún algoritmo/lógica sería muy apreciado.

+0

¿Es esto definitivamente algo que desea hacer en código Java en lugar de hacerlo como parte de su consulta de base de datos? Suele suceder que el filtrado en la consulta de la base de datos es más eficiente ... –

Respuesta

9
int mattress = 24; 
int mask = 1; 
for(int i = 0; i < num_stores; ++i) { 
    if(mask & mattress != 0) { 
     System.out.println("Store "+i+" has mattresses!"); 
    } 
    mask = mask << 1; 
} 

Los if líneas de la cuenta hasta los los bits, si el valor colchón tiene el mismo bit como el conjunto máscara, a continuación, la tienda cuya máscara que se vende colchones. Una AND del valor del colchón y el valor de la máscara solo serán diferentes de cero cuando la tienda venda colchones. Para cada iteración, movemos el bit de máscara una posición hacia la izquierda.

Tenga en cuenta que los valores de la máscara deben ser positivos, no negativos, si es necesario, puede multiplicar por uno negativo.

+0

es el resultado igual si no se usa la variable 'máscara' y en su lugar se cambia la declaración 'if' a "if (1 << i & colchón! = 0) – vedant1811

1

Suponiendo que quiere decir en una base de datos SQL, en su SQL de recuperación, generalmente puede agregar, p. DONDE (MyField Y 16) = 16, WHERE (MyField Y 24) = 24, etc.

Sin embargo, tenga en cuenta que si intenta optimizar tales recuperaciones, y el número de filas que normalmente coinciden con una consulta es mucho menor que el número total de filas, entonces probablemente esta no sea una buena forma de representar estos datos. En ese caso, sería mejor tener una tabla separada "ProductStore" que contenga los pares (ProductID, StoreID) que representan esta información (e indexados en StoreID).

1

¿Hay a lo sumo dos minoristas cuyos inventarios se suman al valor "enmascarado" en cada caso? Si es así, igual deberás verificar todos los pares para recuperarlos, lo que tomará n² tiempo. Solo usa un ciclo anidado.

Si el valor representa la suma de cualquier número de inventarios de los minoristas, entonces está tratando de intentar resolver el problema subset-sum, por lo que desafortunadamente no puede hacerlo en un tiempo superior a 2^n.

Si puede aumentar su estructura de datos original con información para buscar los minoristas que contribuyen a la suma, entonces sería ideal. Pero ya que está haciendo la pregunta, supongo que no tiene acceso a la estructura de datos mientras se está creando, por lo que para generar todos los subconjuntos de minoristas para verificar, querrá consultar Knuth's algorithm [pdf] para generar todos los k- combinaciones (y ejecútelo para 1 ... k) dado en TAOCP Vol 4a Sec 7.2.1.3.

0

http://www.antiifcampaign.com/

recordar esto. Si puede eliminar el "si" con otro constructo (patrón de mapa/estrategia), para mí puede dejarlo allí, de lo contrario, "si" es realmente peligroso. (F.Cirillo)

En este caso, puede usar el mapa del mapa con la operación de máscara de bits.

Luca.