如果我在HashSet<T>
中为通用System.Collections.Generic
定义我自己的比较器,并且其运行时为O(1),那么哈希集的查找时间是否为O(1)?
我认为不仅仅是因为似乎没有办法设置比较器。
答案 0 :(得分:3)
常规散列集的查找时间为O(1)的原因是因为它使用开放寻址将对象放入数组中,因此即使使用自己的比较器也不会改变。
答案 1 :(得分:1)
在最好的情况下,它将插入一个摊销的O(1)和一个O(1)的查找。
在更糟糕的情况下,它将插入一个摊销的O(n)和一个O(n)的查找。
一个好的比较器可以通过一个好的哈希方法帮助保持真实情况更接近最坏的情况。
糟糕的比较器会很糟糕。 (写一个故意不好的比较器,为每个哈希码返回相同的值[有效,但没有意义],你将能够看到这个O(n)行为。)
一个好的比较器可能会运气不好,但在大多数情况下,真实情况足够接近O(1),我们可以将其视为O(1)而不是被引导到很远的地方。
编辑:
错过了“没有办法设置比较器”。有,HashSet有一个构造函数,只需要一个。