Вопрос

Рассмотрим сценарий У меня есть значения, присвоенные следующим образом

Амазонка -1

Walmart -2

Цель -4

Costco -8

Bjs -16

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

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

1 ноутбук Доступен на Amazon

17 iPhone доступны на Amazon и BJ

24 Матраса доступны в магазинах Costco и BJ's

Подобно этому, все продукты маскируются и хранятся в базе данных.

Как мне получить все розничные продавцы на основе скрытого значения., например, для матраса скрытое значение равно 24.Тогда как бы мне найти или перечислить Costco & BJ программно?Любой алгоритм / логика были бы высоко оценены.

Это было полезно?

Решение

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 оператор выравнивает биты, если значение матраса имеет тот же бит, что и установленная маска, то магазин, чья маска используется, продает матрасы.Значение AND для стоимости матраса и маски будет отличным от нуля только тогда, когда магазин продает матрасы.Для каждой итерации мы перемещаем маску на одну позицию влево.

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

Другие советы

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

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

Есть ли не более двух розничных продавцов, чьи запасы в сумме соответствуют "замаскированной" стоимости в каждом конкретном случае?Если это так, вам все равно придется проверить все пары, чтобы получить их, что займет n2 времени.Просто используйте вложенный цикл.

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

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

http://www.antiifcampaign.com/

Запомни это.Если вы можете удалить "если" с помощью другой конструкции (шаблон карты / стратегии), для меня вы можете оставить это там, в противном случае это "если" действительно опасно!!(Ф.Чирилло)

В этом случае вы можете использовать map of map с битовой маской.

Luca.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top