java集合的可伸缩更新

java集合的可伸缩更新,java,algorithm,collections,scalability,Java,Algorithm,Collections,Scalability,我有一张篮子清单。每个篮子装30件物品。我还有一个购买历史记录列表,其中包含在特定日期购买的物品,无论是谁购买的。数据如下所示: Iterator<String> itr=baskets.get(basket).iterator(); String item=null; while(itr.hasNext()){ item=itr.next();

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

            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:第1项、第2项、第3项、第4项。。项目30

第1天:项目x1、项目x2、项目x3。。。。项目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)
给定特定日期的某个项目的概率是平滑的。换句话说,无论物品是否在特定日期购买,都必须计算

这是为所有的篮子在所有的日子。我希望加快处理时间,我目前的做法如下:

            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-为每个特定日期的所有项目(15000个项目)打分,无论这些项目是否发生在当天。每天购买的物品数量比这要少(平均800件),但由于所有这些计算都是需要的,所以我只做了一次

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

            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);
a-检查每个篮子(b),如果篮子中有该物品,如果篮子中有t,则:

a、 1通过计算上述公式1更新篮子,不要再次检查或使用此篮子执行任何操作

项目分数存储在

 TObjectDoubleHashMap<String> itemScore;
TobjectDoubleHashMapItemScore;
篮得分存储在

 TObjectDoubleHashMap<String> basketScore;
TObjectDoubleHashMap篮球得分;
要更新篮子,请执行以下操作:

            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);
Iterator itr=baskets.get(basket.Iterator();
字符串项=null;
while(itr.hasNext()){
item=itr.next();
sum+=itemScore.get(项目);
}
sum=sum/(篮子.get(篮子).size()*1.00d);
篮筐得分(篮筐、总数);

我很好奇是否有一种更有效的方法来进行更新或处理这项任务

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

例如:

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

Map<Basket, Integer> basketCount; // populate with 0 for all baskets
哈希代码查找应该比一直扫描列表快得多


显然,这是简化了的,因为它不看你关于天数等的规则,但希望你能明白这一点。

关于提高效率的问题可能更适合这里:编写代码,分析它,看看你是否有问题。如果你这样做了,就把它修好;如果你不想,就别管它。它必须有多快或多高效?先决定。可能是纳米优化。蒂姆,谢谢你的建议。我同意你的意见,你的建议比我所做的要好,而且确实大大加快了过程。@DotNet很乐意帮忙。大多数情况下,正确组织数据是优化的关键。如果答案有帮助,不要忘记接受它:)接受,在多线程处理任务后,它将扩展到合理的速度。谢谢