Деятельность BitMask в Java

Рассмотрите сценарий, у меня есть значения, присвоенные как они

Amazon-1

Walmart-2

Цель-4

Costco-8

Bjs-16

В DB данные хранятся путем маскирования этих значений на основе их доступности для каждого продукта. например,

Описание продукта маски

1 ноутбук, Доступный на Amazon

17 iPhone Available на Amazon и BJ

24 матраса, доступные в Costco и BJ's

Как эти все продукты маскируются и хранятся в DB.

Как я получаю всех Ритейлеров на основе значения Маскированного., например, Для Матраса значение маскированное равняется 24. Затем, как я нашел бы или перечислил бы Costco & BJ программно. Любой алгоритм/логика высоко ценился бы.

7
задан Anand 1 March 2010 в 00:16
поделиться

3 ответа

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

Оператор if выравнивает биты: если значение матраса имеет тот же бит, что и набор маски, то магазин, чья маска является, продает матрасы. И для значения матраса и значения маски будет отличным от нуля, только если в магазине продаются матрасы. Для каждой итерации мы перемещаем бит маски на одну позицию влево.

Обратите внимание, что значения маски должны быть положительными, а не отрицательными, при необходимости вы можете умножить их на отрицательные.

9
ответ дан 6 December 2019 в 23:04
поделиться

Предполагая, что вы имеете в виду базу данных SQL, а затем в своем поисковом SQL, вы обычно можете добавить, например, WHERE (MyField AND 16) = 16, WHERE (MyField AND 24) = 24 и т. Д.

Однако обратите внимание, что если вы пытаетесь оптимизировать такие извлечения, и количество строк, обычно соответствующих запросу, намного меньше, чем общее количество строк, то это, вероятно, не очень хороший способ представления этих данных. В этом случае было бы лучше иметь отдельную таблицу «ProductStore», содержащую пары (ProductID, StoreID), представляющие эту информацию (и проиндексированные по StoreID).

1
ответ дан 6 December 2019 в 23:04
поделиться

Есть ли не более двух розничных торговцев, сумма запасов которых в каждом случае равна «замаскированной» стоимости? В этом случае вам все равно придется проверять все пары, чтобы получить их, что займет n² времени. Просто используйте вложенный цикл.

Если значение представляет собой сумму любого количества запасов розничных продавцов, значит, вы пытаетесь решить задачу subset-sum , поэтому, к сожалению, вы не можете сделать это быстрее, чем за 2 ^ n раз. .

Если вы можете дополнить исходную структуру данных информацией для поиска розничных продавцов, вносящих вклад в эту сумму, то это будет идеальным вариантом. Но поскольку вы задаете вопрос, я предполагаю, что у вас нет доступа к структуре данных, пока она строится, поэтому для создания всех подмножеств розничных продавцов для проверки вам нужно будет изучить алгоритм Кнута [ pdf] для генерации всех k-комбинаций (и запуска их для 1 ... k), приведенных в TAOCP Vol 4a Sec 7.2.1.3.

1
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: