0

所以这是我面临的情况:我有称为节点的可迭代对象。(大约数千个)每个节点包含许多键和值对。我的算法创建了一个新节点(称为myNode)并检查可迭代集中的每个节点,以及可迭代集中的每个节点:对于节点中的每个对(键,值):如果myNode包含对的键:如果myNode 对应的值更大:替换为新值。否则:myNode.put(键,值)

目前,我为此使用 HashMap,它非常慢,在用 ArrayList 替换 HashMap 后,我实际上得到了更好的结果,这很奇怪。有人可以建议使用更好的数据结构来提高我的程序的性能吗?

谢谢 !

EDI:代码

        ArrayList<Long> newDist = new ArrayList<Long>();

        HashMap<Long, Long> myNode = new HashMap<Long, Long>();

        for (Node i : nodes){//copy neighbors to set
            Set<Long> view = i.keySet();
            for (Long j : view) {
                if (!(myNode.containsKey(j))) {
                    myNode.put(j, i.get(j));
                } else if (myNode.get(j) > i.get(j)) {
                    myNode.put(j, i.get(j));
                }
            }
        }

        context.write(key, myNode); 
4

1 回答 1

0

我不确定你的代码意图是什么,因为它引用了一些你没有包含的对象,但如果Node是,Map那么我会做类似的事情......

Map<Long, Long> lowScores = new HashMap<Long, Long>();

for (Node node : nodes){
  for (Entry<Long,Long> entry : node.entrySet()) {
    Long lowScore = lowScores.get(entry.getKey());
    if (lowScore == null || lowScore > entry.getValue()){
      lowScores.put(entry.getKey(), entry.getValue()); 
    }
  }
}

这里有一些优化限制了对大型数据结构执行的操作量,但我只运行会证明这是在优化编译器尚未为您优化的东西。关键优化是迭代 的Entry对象,Map而不是一直调用getand containsKey

于 2013-04-02T14:06:20.583 回答