Java:在一个巨大的列表中散列每个可能的对

时间:2014-02-03 03:13:13

标签: java performance hashmap

我有一个字符串列表,我希望从中获得所有可能的对, 所以例如

items_List = [ "A","B","C","D" ]

对将是

A-B
A-C
A-D
B-C
B-D
C-D

我想得到所有这些对并将它们放在

HashMap<String, Double>

这样“A-B”就是这样一个字符串,Double就是我要在一个单独的函数中计算的一些数字。 我在做的是

for(int i=0; i< itemsList.length-1;i++){
        for(int j = i+1;j<itemsList.length;j++){
                a = itemsList[i];
                b = itemsList[j];
                Double w = compute_w(a,b);
                if(w>0) map.put(a+'-'+b, w);
        }

问题是我的itemsList长度大约是n = 400k项,所以那些(n选择2)需要在max上进行散列的对数(在很多情况下w可能是0),尽管如此对的数量很大,计算所有对需要很长时间(注意:compute_w(a,b)是一个简单的函数,所以它不需要那么多才能完成)。 所以我的问题是,有什么方法可以有效和快速地做到这一点? 我已经尝试将hashmap初始长度设置为Integer.Max并将因子设置为1.0,但这仍然没有帮助。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

尝试将查找结构拆分为多个地图

Map<String, Map<String, Double>> map = new HashMap<>(550000);
for (int i = 0; i < itemsList.length - 1; i++) {
    String a = itemsList[i];
    Map<String, Double> m = new HashMap<>();
    map.put(a, m);
    for (int j = i + 1; j < itemsList.length; j++) {
            String b = itemsList[j];
            double w = compute_w(a, b);
            if (w > 0) m.put(b, w);
    }
}

答案 1 :(得分:0)

您可以尝试某种类似“特里”的树状结构来节省记忆。如果你存储A-B,A-C,A-D等对的巨大列表/散列图,你就会不必要地复制'A'。如果这些对很长,它可能会浪费很多浪费的空间。相反,你可以有一个根“A”节点,而后代节点将是由“A”产生的有效组合,它们将存储计算出的w值。

http://www.toptal.com/java/the-trie-a-neglected-data-structure