7 Stimmen

BitMask-Operation in java

Betrachten Sie das Szenario Ich habe Werte wie diese zugewiesen

Amazon -1

Walmart -2

Ziel -4

Costco -8

Bjs -16

In der DB werden die Daten gespeichert, indem diese Werte entsprechend ihrer Verfügbarkeit für jedes Produkt maskiert werden. z. B.,

Produktbeschreibung der Maske

1 Laptop verfügbar bei Amazon

17 iPhone verfügbar und BJ

24 Matratze Avai Costco und BJ's

Auf diese Weise werden alle Produkte maskiert und in der DB gespeichert.

Wie kann ich alle Einzelhändler basierend auf dem maskierten Wert abrufen? z. B. für Matratze ist der maskierte Wert 24. Wie würde ich dann Costco & BJ's programmatisch finden oder auflisten. Für jeden Algorithmus/jede Logik wären wir sehr dankbar.

9voto

David Kanarek Punkte 12533
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;
}

En if Anweisung die Bits aneinander, wenn der Wert der Matratze das gleiche Bit wie die Maske gesetzt hat, dann verkauft das Geschäft, dessen Maske das ist, Matratzen. Eine UND-Verknüpfung von Matratzenwert und Maskenwert ist nur dann ungleich Null, wenn das Geschäft Matratzen verkauft. Bei jeder Iteration wird das Maskenbit um eine Position nach links verschoben.

Beachten Sie, dass die Maskenwerte positiv und nicht negativ sein sollten, notfalls können Sie mit einem negativen Wert multiplizieren.

1voto

Neil Coffey Punkte 21238

Angenommen, Sie meinen eine SQL-Datenbank, dann können Sie in Ihrem Abfrage-SQL z. B. WHERE (MeinFeld AND 16) = 16, WHERE (MeinFeld AND 24) = 24 usw. hinzufügen.

Beachten Sie jedoch, dass, wenn Sie versuchen, solche Abfragen zu optimieren, und die Anzahl der Zeilen, die typischerweise auf eine Abfrage passen, viel kleiner ist als die Gesamtzahl der Zeilen, dann ist dies wahrscheinlich kein sehr guter Weg, diese Daten darzustellen. In diesem Fall wäre es besser, eine separate Tabelle "ProductStore" zu haben, die Paare (ProductID, StoreID) enthält, die diese Informationen darstellen (und auf StoreID indiziert sind).

1voto

Imran Punkte 11472

Gibt es höchstens zwei Einzelhändler, deren Bestände sich jeweils zum "maskierten" Wert addieren? Wenn ja, müssen Sie trotzdem alle Paare überprüfen, um sie abzurufen, was n² Zeit in Anspruch nimmt. Verwenden Sie einfach eine verschachtelte Schleife.

Wenn der Wert die Summe der Bestände einer beliebigen Anzahl von Einzelhändlern darstellt, dann versuchen Sie, die Frage Teilmenge Problem, so dass man es leider nicht in mehr als 2^n Zeit schaffen kann.

Wenn Sie in der Lage sind, Ihre ursprüngliche Datenstruktur mit Informationen zu erweitern, um die Einzelhändler, die zur Summe beitragen, nachzuschlagen, dann wäre dies ideal. Aber da Sie diese Frage stellen, gehe ich davon aus, dass Sie keinen Zugriff auf die Datenstruktur haben, während sie aufgebaut wird, so dass Sie alle Teilmengen von Einzelhändlern für die Überprüfung generieren möchten Knuths Algorithmus [pdf] zur Erzeugung aller k-Kombinationen (und führen Sie es für 1...k aus), die in TAOCP Band 4a Abschnitt 7.2.1.3.

0voto

neuromancer977 Punkte 1

http://www.antiifcampaign.com/

Denken Sie daran. Wenn Sie das "wenn" mit einem anderen Konstrukt (Karte/Strategiemuster) entfernen können, können Sie es für mich stehen lassen, ansonsten ist das "wenn" wirklich gefährlich!!! (F.Cirillo)

In diesem Fall können Sie map of map mit Bitmask-Operation verwenden.

Luca.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X