2010-03-01 110 views
7

考虑场景 我分配了类似的这些位掩码操作

亚马逊-1

沃尔玛-2

目标-4

好事多-8

Bjs -16

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

面膜产品描述

1膝上型电脑可在亚马逊

17 iPhone可用在亚马逊 和BJ

24床垫可在 Costco和BJ的

像这些所有的产品都是面膜d并存储在数据库中。

如何检索基础上,屏蔽值的所有的零售商,例如 ,床垫的屏蔽值是24,那么我如何才能找到或列表Costco的& BJ的编程。任何算法/逻辑将受到高度赞赏。

+0

这绝对是你想要在Java代码中完成的事情,而不是将它作为数据库查询的一部分进行操作吗?通常情况下,数据库查询中的过滤效率更高... – 2010-03-01 00:22:56

回答

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仅为非零。对于每次迭代,我们将掩码位向左移动一个位置。

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

+0

如果不使用变量'mask'而是将'if'语句更改为“if(1 << i &mattress!= 0) – vedant1811 2013-06-12 10:12:38

1

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

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

1

在每种情况下,最多有两家零售商的库存总和为“蒙面”价值吗?如果是这样,你仍然必须检查所有对来检索它们,这将需要n²时间。只需使用嵌套循环。

如果该值代表任意数量零售商库存的总和,那么您试图解决subset-sum问题,所以很遗憾,您不能超过2^n次。

如果您能够利用信息来扩充您的原始数据结构以查找有助于总和的零售商,那么这将是理想的。但是由于您提出的问题是假设您在构建数据结构时无法访问该数据结构,因此要生成所有零售商的子集以进行检查,您需要查看Knuth's algorithm [pdf]以生成所有k-组合(运行1 ... k)在TAOCP第4a卷第7.2.1.3节中给出。

0

http://www.antiifcampaign.com/

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

在这种情况下,您可以使用位图遮罩操作的地图。

卢卡。