我发现Java的HashSet的remove(Object o)需要O(1)常量时间,而ArrayList的remove(Object o)操作需要O(N),其中N是ArrayList的大小
有人可以详细解释一下为什么会这样吗?
答案 0 :(得分:2)
HashSet
' remove()
需要O(1)
个预定时间才能找到要删除的元素 - hashCode()
会将您带到包含该元素的bin中,并且每个bin应该具有少量条目,因此在bin中找到元素并将其删除应该花费一些时间。
另一方面,在ArrayList
中,您必须迭代所有元素,直到找到要删除的元素 - 这需要O(n)
。即使在找到元素之后,删除本身也会涉及移动索引比删除元素更高的所有元素 - 这也需要O(n)
。
答案 1 :(得分:0)
ArrayList: -
Java中的ArrayList是一个由数组支持的List。
在操作中移除(i)arraylist移除列表中指定位置的元素,将任何后续元素移到左侧。
因此,在最坏的情况下,如果删除第一个元素,则需要将剩余的n-1个元素向左移动。因此,复杂性是o(n)。
<强> HashSet的: - 强>
Java内部使用hashmap来存储set的元素。 hashset的元素是hashmap中的关键,值是一些虚拟对象。
hashmap中的remove操作如下: -
在最坏的情况下,存储桶可以包含所有密钥,复杂性似乎是o(n)。但在现实生活中,任何可靠的哈希映射实现,加上一半体面的哈希函数,在预期的情况下具有非常小的因子(实际上是2)的O(1)的检索性能,在非常窄的方差范围内