我看到一个断言,说HashSet<T>.Contains()是一个O(1)的操作。这让我感到惊讶,因为我遇到的所有关于哈希的讨论都提到了可能会出现冲突,从而导致O(n)的运行时间。
出于好奇,我查看了HashSet<T>.Contains和HashTable.Contains的文档。这两个方法的文档都声称是O(1)操作。
然而,在反编译器中查看HashSet<T>.Contains(),它使用一个for循环来遍历包含具有相同哈希值的值的插槽列表。
现在可以承认的是,那些关于哈希的讨论也提到了一个良好的哈希算法避免了冲突,在这种情况下查找确实是O(1)。但是,我对大O符号的理解是它是最坏情况的运行时间,而不是最好情况。
那么,O(1)的声明是不正确的吗?还是我缺少了什么?