我有一个字符串列表,我希望从中获得所有可能的对, 所以例如
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,但这仍然没有帮助。
任何建议都将受到赞赏。
答案 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