我有一个巨大的数据集,我将其存储到一个集合中,并且需要在那里找到任何重复的内容。
数据大小可能超过100万。我知道我可以将ArrayList
comapre中的更多元素存储到Map
。
我的问题是:
Map
中搜索关键字的速度比在排序ArrayList
HashMap
中的密钥比TreeMap
更快?n
元素所需的空间,这在TreeMap
和HashMap
实施之间更有效?答案 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)
Map
的类型。HashMap
具有恒定时间平均查找( O(1)),而TreeMap
的平均查找时间基于树的深度( O(log(n))),因此HashMap
更快。答案 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。