0

私が直面している状況は次のとおりです。ノードと呼ばれる反復可能なオブジェクトがあります。(約数千) 各ノードには、キーと値のペアが多数含まれています。そして、私のアルゴリズムは新しいノード (myNode と呼びます) を作成し、反復可能なセット内の各ノードと、反復可能なセット内の各ノードをチェックします: ノード内の各ペア (キー、値): myNode にペアのキーが含まれている場合: myNode の対応する値が大きい: 新しい値に置き換えます。それ以外: myNode.put(キー、値)

現在、私はこれに HashMap を使用していますが、かなり遅く、HashMap を ArrayList に置き換えた後、実際にはより良い結果が得られましたが、これは非常に奇妙です。誰かが私のプログラムのパフォーマンスを向上させるために使用するより良いデータ構造を提案できますか??

ありがとうございました !

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オブジェクトを反復処理することです。MapgetcontainsKey

于 2013-04-02T14:06:20.583 に答える