Когда люди говорят, что наборы имеют O (1) проверку членства, они говорят о среднем случае. В наихудшем случае (когда все хэшированные значения сталкиваются) проверка членства - это O (n). Смотрите вики Python о сложности времени .
В статье Википедии говорится, что лучшая сложность времени для хеш-таблицы без изменения размера O(1 + k/n)
. Этот результат не применяется напрямую к наборам Python, поскольку наборы Python используют хеш-таблицу с изменяемым размером.
Чуть дальше по статье Википедии говорится , что для среднего случая, и предполагая простую функцию хэширования равномерного, время сложность O(1/(1-k/n))
, где k/n
может быть ограничена константой c<1
.
Big-O относится только к асимптотическому поведению при n → ∞. Так как k / n может быть ограничено константой, c <1, независимо от n ,
O(1/(1-k/n))
не больше, чем O(1/(1-c))
эквивалентно O(constant)
= O(1)
.
Таким образом, при условии равномерного простого хеширования, проверка членства для наборов Python в среднем такова O(1)
.
set
реализация на самом деле былаdict
с фиктивными значениями, и позже она была оптимизирована.