2010-03-01 4 views
7

Si consideri lo scenario ho valori assegnati come questioperazione BitMask in java

Amazon -1

Walmart -2

target -4

Costco -8

Bjs -16

In DB, i dati vengono archiviati mascherando questi valori in base alla disponibilità per ciascun prodotto. ad es.,

Maschera descrizione del prodotto

1 laptop Disponibile in Amazzonia

17 iPhone Disponibile in Amazon e BJ

24 materasso Disponibile in Costco e BJ

Come questi tutti i prodotti sono maske d e memorizzati nel DB.

Come faccio a recuperare tutti i rivenditori in base al valore mascherato., ad es., Per materasso il valore mascherato è 24. E allora come avrei trovato o un elenco Costco & BJ di programmazione. Qualsiasi algoritmo/logica sarebbe molto apprezzato.

+0

Questo è sicuramente qualcosa che si vuole fare nel codice Java invece di farlo come parte della query del database? Di solito il filtraggio nella query del database è più efficiente ... –

risposta

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; 
} 

Le linee if economico fino i bit, se il valore materasso ha lo stesso bit come l'insieme maschera, poi il negozio cui maschera cioè vende materassi. Un valore AND del valore del materasso e del valore della maschera sarà solo diverso da zero quando il negozio vende materassi. Per ogni iterazione spostiamo il bit della maschera una posizione a sinistra.

Si noti che i valori della maschera devono essere positivi, non negativi, se necessario è possibile moltiplicarli per uno negativo.

+0

è il risultato lo stesso se non si utilizza la variabile 'mask' e invece si modifica l'istruzione 'if' in "if (1 << i & materasso! = 0) – vedant1811

1

Supponendo che si intenda in un database SQL, quindi nel proprio SQL di recupero, in genere è possibile aggiungere ad es. WHERE (MyField AND 16) = 16, WHERE (MyField AND 24) = 24 ecc.

Tuttavia, si noti che se si sta tentando di ottimizzare tali recuperi e il numero di righe che corrispondono di solito a una query è molto più piccolo di il numero totale di righe, quindi questo probabilmente non è un ottimo modo per rappresentare questi dati. In tal caso, sarebbe meglio avere una tabella "ProductStore" separata che contenga (ProductID, StoreID) coppie che rappresentano queste informazioni (e indicizzate su StoreID).

1

Ci sono al massimo due rivenditori i cui inventari sommano il valore "mascherato" in ciascun caso? Se è così, dovrai comunque controllare tutte le coppie per recuperarle, il che richiederà tempo n². Basta usare un ciclo annidato.

Se il valore rappresenta la somma di qualsiasi numero di scorte di rivenditori, si sta tentando di risolvere il problema subset-sum, quindi sfortunatamente non è possibile farlo in un tempo migliore di 2^n.

Se si è in grado di aumentare la struttura dati originale con le informazioni per cercare i rivenditori che contribuiscono alla somma, questo sarebbe l'ideale. Ma dal momento che mi stai ponendo la domanda, suppongo che tu non abbia accesso alla struttura dati mentre è in fase di costruzione, quindi per generare tutti i sottoinsiemi di rivenditori al dettaglio vorrai esaminare Knuth's algorithm [pdf] per generare tutti i k- combinazioni (ed eseguirlo per 1 ... k) indicato in TAOCP Vol 4a Sec 7.2.1.3.

0

http://www.antiifcampaign.com/

ricordare questo. Se riesci a rimuovere il "se" con un altro costrutto (schema mappa/strategia), per me puoi lasciarlo lì, altrimenti "se" è veramente pericoloso !! (F.Cirillo)

In questo caso è possibile utilizzare la mappa della mappa con l'operazione di maschera di bit.

Luca.