Map / ArrayList:搜索元素的速度更快

时间:2011-12-09 20:48:47

标签: java

我有一个巨大的数据集,我将其存储到一个集合中,并且需要在那里找到任何重复的内容。

数据大小可能超过100万。我知道我可以将ArrayList comapre中的更多元素存储到Map

我的问题是:

  1. Map中搜索关键字的速度比在排序ArrayList
  2. 中搜索更快
  3. 正在搜索HashMap中的密钥比TreeMap更快?
  4. 仅限于存储n元素所需的空间,这在TreeMapHashMap实施之间更有效?

3 个答案:

答案 0 :(得分:8)

1)是的。搜索ArrayList平均为O(n)。 Map中键查找的性能取决于具体实现。您可以编写Map的实现,如果您真的想要O(n)或更差,但标准库中的所有实现都比O(n)快。

2)是的。对于简单的密钥查找,HashMap平均为O(1)。 TreeMap是O(log(n))。

<强> Class HashMap<K,V>

  

此实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。

<强> Class TreeMap<K,V>

  

此实现为containsKey,get,put和remove操作提供了有保证的log(n)时间成本。算法是对Cormen,Leiserson和Rivest的算法导论的改编。

3)在两种情况下,空间要求都是O(n)。我猜测 TreeMap需要更多的空间,但只是一个常数因素。

答案 1 :(得分:3)

  1. 这取决于您使用的Map的类型。
  2. HashMap具有恒定时间平均查找( O(1)),而TreeMap的平均查找时间基于树的深度( O(log(n))),因此HashMap更快。
  3. 差异可能没有实际意义。这两种数据结构都需要通过设计在空间复杂性方面产生一定量的不断开销(两者都表现出 O(n)空间复杂度)。

答案 2 :(得分:0)

它只对hashmap和已排序的arraylist之间的查找性能进行了一些基准测试。答案是hashmap随着大小的增加而快得多。我说的速度提高10倍,20倍,30倍。我使用排序数组列表和散列映射对100万个条目进行了一些测试,并且数组列表get和add操作需要几秒钟才能完成,其中hashmap get和put只需要大约50ms。
以下是我发现或观察到的内容: 对于排序的arraylist,您必须先对其进行排序才能有效地使用搜索(例如binarySearch)。实际上,您并不只是拥有静态列表(意味着列表将通过添加或删除而更改)。考虑到这一点,你需要改变add和get方法来做&#34;二进制&#34;使其高效的操作(如binarySearch)。因此,即使使用二进制操作,随着列表的增长,add和get方法也会越来越慢。 另一方面,Hashmap在put和get操作中的时间方面没有显示出太大的变化。 Hashmap的问题是内存开销。如果你可以忍受,那就去使用hashmap。