哪一个是更快? List.contains()或Map.containsKey()(Which

2019-07-30 14:02发布

我正在写一个算法,我找这当加在一起的结果我在寻找另一个值的值对。

我想通了,使用Map将加快从O(N²)我的算法。 后来我才意识到,我真的不使用包含在我的价值观Map这样一个List就足够了。

我做了一个谷歌搜索的功率,但我没有找到关于我的问题的标题这些方法的渐近运行时间的任何信息。

你能指出我应该在哪里找这些资料?

Answer 1:

list.contains是O(n),而map.containsKey为包含HashMap是O(1),O(logn)时间为树状图。 对于包含HashMap,谷歌的哈希表。 对于树状图,谷歌的二叉树或类似。 维基百科对这些主题的好项目。

如果你不需要一张地图,你可以使用相应的设置。 里面他们在相应的地图,其中值仅仅是一些虚拟的单一对象的条款得到落实。

但是要注意,避免类Hashtable 。 它在现代图书馆的考古人工制品。 对于你的情况HashSet可能是最好的选择。



Answer 2:

MapList的接口,所以其执行和他们的表现的信息。 但是,如果你使用最新的实现( LinkedListArrayListList ,并HashMapMap ),将contains()方法必须在最坏的情况下,经过整个列表,你的元素与每个条目进行比较。 这是一个为O​​(n)的操作。

如果使用HashMap ,实现如下根本不同: HashMap包含具有比它元素的详细条目的阵列(在实践中,必须的4N / 3的3N / 2之间,用于在地图上n个元素的数组的大小)。 它计算的关键,这是一个int的哈希值,并且0和您的数组大小之间把它包装(让我们说这个数字是i )。 然后它会把元素的索引在i的数组(或i+1i+2 ...如果先前的索引已经采取)。 所以,当您检查与重点存在containsKey ,它会重新计算哈希和i价值,并检查ii+1 ...索引,直到它找到一个空数组单元。 Theorically,你可以有一个O(n)的最坏情况下,如果阵列几乎爆满,都是所有按键几乎identicals i的值,但一个好的哈希函数,你有固定时间containsget功能。 (然而,添加元素是快,如果你没有需要调整的数组,这实在是太慢了-我想你需要重新计算每个键的索引)。

所以地图真的是更快,如果你需要检查集合中的关键外观,并且不需要保留订单(有一个SortedHashMap对于这一点,但我不知道它的性能),但还需要更多的内存。

另外,如果你不需要的键值的东西,你可以用一个HashSet (这是内部一样的HashMap )。



Answer 3:

Map.containsKey()考虑到你正在使用一个HashMap,因为在搜索HashMap的是,在O3完成(1)。

List.contains()一般应诉诸顺序搜索或二进制搜索这样的复杂性将是ATLEAST O(log n)的



文章来源: Which one is faster? List.contains() or Map.containsKey()