7

考虑我有像这样分配的值的场景

亚马逊-1

沃尔玛-2

目标-4

好市多-8

Bjs -16

在 DB 中,通过根据每个产品的可用性屏蔽这些值来存储数据。例如。,

面膜产品说明

1 台笔记本电脑可在亚马逊购买

17 款 iPhone 在亚马逊和北京有售

Costco 和 BJ 提供 24 种床垫

像这些一样,所有产品都被屏蔽并存储在数据库中。

如何根据掩码值检索所有零售商。例如,对于床垫,掩码值为 24。那么我将如何以编程方式查找或列出 Costco & BJ's。任何算法/逻辑都将受到高度赞赏。

4

4 回答 4

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

if语句将位对齐,如果床垫值与掩码集具有相同的位,则其掩码是销售床垫的商店。仅当商店出售床垫时,床垫价值和面具价值的 AND 才会非零。对于每次迭代,我们将掩码位向左移动一个位置。

请注意,掩码值应该是正数,而不是负数,如果需要,您可以乘以负数。

于 2010-03-01T00:21:48.317 回答
1

假设您的意思是在 SQL 数据库中,那么在您的检索 SQL 中,您通常可以添加例如 WHERE (MyField AND 16) = 16、WHERE (MyField AND 24) = 24 等。

但是,请注意,如果您尝试优化此类检索,并且通常与查询匹配的行数远小于总行数,那么这可能不是表示此数据的好方法。在这种情况下,最好有一个单独的“ProductStore”表,其中包含表示此信息的 (ProductID, StoreID) 对(并在 StoreID 上编制索引)。

于 2010-03-01T00:44:58.620 回答
1

在每种情况下,最多有两个零售商的库存总和为“掩蔽”值吗?如果是这样,您仍然需要检查所有对以检索它们,这将花费 n² 时间。只需使用嵌套循环。

如果该值代表任意数量的零售商库存的总和,那么您正在尝试解决子集总和问题,所以不幸的是,您无法在 2^n 时间内完成。

如果您能够使用信息来扩充您的原始数据结构以查找对总和做出贡献的零售商,那么这将是理想的。但是,由于您要问这个问题,我假设您在构建数据结构时无权访问它,因此要生成所有零售商子集以进行检查,您将需要查看Knuth 的算法[pdf] 以生成所有 k -TAOCP Vol 4a Sec 7.2.1.3中给出的组合(并运行 1...k) 。

于 2010-03-01T01:13:25.607 回答
0

http://www.antiifcampaign.com/

记住这一点。如果你可以用另一个构造(地图/策略模式)删除“if”,对我来说你可以让它在那里,否则“if”真的很危险!(F.Cirillo)

在这种情况下,您可以使用带有位掩码操作的 map 的 map。

卢卡。

于 2013-04-22T15:06:34.860 回答