我有一个篮子 list 。每个篮子包含 30 件元素。我还有一个购买历史记录列表,其中包含在特定日期购买的商品,无论是谁购买的。数据如下所示:
购物篮 1: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) 中是否有该元素,如果 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);
我很好奇是否有更有效的方法来执行更新或总体上处理此任务。
最佳答案
您应该能够通过使用一些智能数据结构来加快速度。
例如:
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);
}
哈希码查找应该比一直扫描列表快得多。
显然,这是简化的,因为它不考虑您关于天数等的规则,但希望您能明白这一点。
关于java - Java 集合的可扩展更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203256/