我读到了声明:
HashSet为基本操作提供恒定的时间性能(添加,删除,包含和大小)。
这里'包含'是真的吗? 虽然将存储桶短名单是一种持续时间的性能 - 没有找到存储桶中的元素o(n)操作吗?
我误解了什么吗?
答案 0 :(得分:2)
正如documentation所说,
此类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素
检查上面的假设部分。如果所有元素都在一个桶中结束,那么包含是o(n),这将是世界上最差的哈希函数之一的结果。 HashSet内部使用HashMap。
答案 1 :(得分:2)
n in(n)代表哈希中的元素数,而不是桶中的元素数。并且由于铲斗内的元件数量不会随着装置的尺寸线性增长而受到限制,因此可能需要一个恒定的最长时间。恒定时间不影响符号。至少如果你有一个完美的散列函数,这完全是另一个问题。
答案 2 :(得分:0)
HashSet
使用哈希函数来定位元素。评估它是O(1)。
例如,如果我们有一个用于存储员工姓名的哈希表,我们将使用该函数作为其中ASCII字符的总和:
f(name) = sum(ascii chars)
和 f('ahmed')='a'+'h'+'m'+'e'+'d'= 97 + 104 + 109 + 101 + 100 = 511。 因此,'ahmed'将被存储在位置511。 但是,之前的散列函数非常糟糕,并且当使用产生相同总和的名称进行评估时会导致很多冲突。因此,找到一个好的哈希函数是哈希表实现中非常关键的目标。
有关详细信息,请参阅Hash Table数据结构。
答案 3 :(得分:0)
是的,finding the elements within the bucket a o(n) operation
。
contains
操作性能为O(n)。它将目标对象与HashSet
内的所有其他对象等同。
答案 4 :(得分:0)
顾名思义HashSet
是通过hasing
技术实现的。
所以这意味着找到一个对象的复杂性是O(1)。这就是contains
花费O(1)时间的原因。但在最坏的情况下,如果所有对象都放在同一个桶中,那么复杂性就是O(n)。
如果此set包含指定的元素,则返回true。更正式地,当且仅当此集合包含元素e时才返回true(o == null?e == null:o.equals(e))。
public boolean contains(Object o) {
return map.containsKey(o);
}
上面是HashSet类的contains方法。请注意,它使用map来存储对象。
答案 5 :(得分:0)
找不到桶中的元素o(n)操作?
这真的取决于。如果有太多哈希冲突,算法必须遍历每个值并检索您感兴趣的值,那么在最坏的情况下时间是o(n)。但它根本不是一个好的哈希函数。良好的散列函数在其整个范围内均匀地分配指定的散列。
如果你一直返回相同的hashCode
,这也可能发生,这也不是一个好兆头。无论集合的基数如何,这都会给你相同的哈希值。