我遇到了一个断言HashSet <T> .Contains()是一个O(1)操作.这令我感到惊讶,因为我遇到的每次哈希讨论都提到了碰撞的可能性,可能导致O(n)运行时间.
好奇,我查看了HashSet <T> .Contains和HashTable.Contains的文档.两种方法的文档都提出了同样的主张.
当我查看反射器时,HashSet <T> .Contains()是用for循环实现的,它通过一个包含具有相同散列值的槽列表.
现在可以肯定的是,那些关于哈希的讨论也提到了一个好的哈希算法可以避免冲突,在这种情况下查找确实是O(1).但我对Big O符号的理解是,它是最糟糕的运行时间,而不是最好的.
O(1)声明是否错误?或者我错过了什么?
一般来说,它是O(1).
不,Big O没有定义"最坏情况",它定义了一个限制.基于散列的查找(具有良好的散列算法,提供有效的值分布和低冲突率)随着项目数量的增加而向一个恒定值前进(它们永远不会达到或者是恒定值,但这就是它的限制点).