java - Java 集合的可扩展更新

标签 java algorithm collections scalability

我有一个篮子 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/

相关文章:

Java 输入/输出

Swift 错误初始化嵌入类型的数组/字典

java - 使用简单的核心java代码检索hashmap的值

c - 有符号整数的谓词 "less than or equal"的高效并行字节计算

java - Head First Java,第 16 章,Be The Compiler 练习查询

java - 在 Spring Boot 2.0/Hibernate 5 中获取 SessionFactory

java - Janino动态编译接口(interface)类

java - Android 欢迎界面等待时间太长?

python - 用Python编写一个高效的算法来解决数学问题

算法:在二维整数数组中搜索整数的有效方法?