作者:卖火柴的茹公主 | 来源:互联网 | 2023-02-04 09:56
我有一个HashMap,有800万Point2D映射到LinkedList.
private Map> adjacencyList;
一切都按预期工作,但我需要很长时间才能从HashMap获取数据.有没有其他选择,我可以用来优化数据输出?
我愿意妥协所需的时间来put()
支持所需的时间get()
.
1> Eugene..:
首先要检查哈希码的分布.首先检查一下,但稍作修改.的散列码Key
的地图内是重新散列经由内部:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
因此,您应该使用此函数重新哈希哈希码,然后再检查它的分布方式.
通常在良好的分发情况下,您的TreeNodes
(这是多少条目的桶设置方式)很快就能找到.对于具有Integer.MAX_VALUE
条目的存储桶,在大多数32
步骤中都需要查找它.发生这种情况是因为垃圾箱被转换成完美平衡的红黑树.
在内部搜索Map
一般是O(1)
.搜索一个二进制位TreeNodes
是O(logn)
.在LinkedList中搜索O(n)
- 比以前更糟糕.
但这是在地图中查找单个条目所需的时间.如果你还需要从中获取元素LinkedList
那意味着额外的时间(更糟糕的是在地图中找到条目)
此外,对于这么多条目,在将元素放入地图之前指定loadFactor
和initialCapacity
最初(至少是initialCapacity)是至关重要的.这是因为为另一个桶(可能)重新散列和移动元素.如果你首先把它们全部放在一起而不是只是试图找到它们而不改变Map
- 这在搜索时不会成为问题......
但一般情况下,除非您正确测量和测量,否则这可能不是您所面临的问题.你可能正在寻找错误的方向.
首先要检查的是实际瓶颈在哪里,例如使用分析器.如果我在声明中看到`LinkedList`,我不愿意接受*hashmap*是问题的声明,没有任何证明......