可扩展的Java集合更新

时间:2014-08-08 12:12:47

标签: java algorithm collections scalability

我有一个篮子清单。每个篮子包含30个项目。我还有一个购买历史列表,其中包含在特定日期购买的商品,无论是谁购买的。数据如下所示:

Basket1:item1,item2,item3,item4 .. item30

第1天:item_x1,item_x2,item_x3 .... item_xn

篮子总数为4000.不同物品的总数为15000。

我想根据主导特定日子的篮子的概率每天得分。

p(basket_1|day_1) = p(basket1_item1|day_1) * p(basket1_item2|day_1) * p(basket1_item3|day_1) * ...* p(basket1_item30|day_1) ---> (Formula 1)

平滑给定特定日期的项目的概率。换句话说,无论该项目是否在该特定日期购买,都必须计算。

这对所有日子的所有篮子都有效。我想加快处理时间,目前的方法如下:

1-对每个特定日期的所有项目(15000项)进行评分,无论它们是否在当天发生。每天购买的商品数量小于此数(平均800件),但由于需要进行所有这些计算,我只需要一次。

2-迭代每个项目(t)并执行以下操作:

a-如果 b 包含 t ,请检查每个购物篮(b)是否包含 t

a.1通过计算上面的公式1更新篮子,不要再次检查或对此篮子做任何事情。

项目分数存储在

 TObjectDoubleHashMap<String> itemScore;

篮子得分存储在

 TObjectDoubleHashMap<String> basketScore;

要更新购物篮,请执行以下操作:

            Iterator<String> itr=baskets.get(basket).iterator();
            String item=null;
            while(itr.hasNext()){
                    item=itr.next();
                    sum+= itemScore.get(item);
            }
            sum= sum / (baskets.get(basket).size() * 1.00d);
            basketScore.put(basket, sum);

我很好奇是否有更有效的方法来进行更新或解决此任务。

1 个答案:

答案 0 :(得分:1)

您应该能够通过使用一些智能数据结构加快速度。

例如:

Map<Item, List<Basket>> basketsForItems; // populate for all baskets

Map<Basket, Integer> basketCount; // populate with 0 for all baskets

然后对于你刚才做的每件事:

for (Basket b: basketsForItems.get(item)) {
   basketCount.put(basket, basketCount.get(basket)+1);
}

Hashcode查找应该比扫描列表要快得多。

显然这是简化的,因为它没有查看关于天等的规则,但希望你能得到这个想法。