Cuando las personas dicen que los conjuntos tienen O (1) verificación de membresía, están hablando del caso promedio . En el peor de los casos (cuando todos los valores hash colisionan) la verificación de membresía es O (n). Vea el wiki de Python sobre la complejidad del tiempo .
El artículo de Wikipedia dice que la mejor complejidad de tiempo de caso para una tabla hash que no cambia de tamaño es O(1 + k/n)
. Este resultado no se aplica directamente a los conjuntos de Python ya que los conjuntos de Python usan una tabla hash que cambia el tamaño.
Un poco más adelante en el artículo de Wikipedia dice que para el caso promedio , y suponiendo una función de hashing uniforme simple, la complejidad del tiempo es O(1/(1-k/n))
, donde k/n
puede estar limitada por una constante c<1
.
Big-O se refiere solo al comportamiento asintótico como n → ∞. Como k / n puede estar limitado por una constante, c <1, independiente de n ,
O(1/(1-k/n))
no es más grande que lo O(1/(1-c))
que equivale a O(constant)
= O(1)
.
Entonces, suponiendo un hashing simple y uniforme, en promedio , la verificación de membresía para conjuntos de Python es O(1)
.
set
implementación original en realidad eradict
con valores ficticios, y se optimizó más tarde.