Я столкнулся с утверждением, что HashSet <T> .Contains() является операцией O (1). Это меня удивило, так как каждое обсуждение хеширования, с которым я столкнулся, упоминает о возможности коллизий, что потенциально приводит к времени выполнения O (n).
Будучи любопытным, я просмотрел документацию для HashSet <T> .Contains, а также HashTable.Contains. Документация для обоих методов делает то же утверждение.
Когда я смотрю в отражатель, HashSet <T> .Contains() реализуется с циклом for, проходя через список слотов, содержащих значения, которые имеют одинаковый хэш.
Теперь, по общему признанию, те же самые обсуждения хэширования также отметили, что хороший алгоритм хэширования позволяет избежать конфликтов, и в этих условиях поиск действительно будет O (1). Но мое понимание нотации Big O заключается в том, что это наихудшее время выполнения, а не лучше.
Итак, неверно ли утверждение O (1)? Или я что-то упускаю?