He visto a gente decir que los set
objetos en python tienen O (1) verificación de membresía. ¿Cómo se implementan internamente para permitir esto? ¿Qué tipo de estructura de datos utiliza? ¿Qué otras implicaciones tiene esa implementación?
Cada respuesta aquí fue realmente esclarecedora, pero solo puedo aceptar una, así que iré con la respuesta más cercana a mi pregunta original. ¡Gracias a todos por la información!
fuente
set
implementación original en realidad eradict
con valores ficticios, y se optimizó más tarde.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))
, dondek/n
puede estar limitada por una constantec<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 loO(1/(1-c))
que equivale aO(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)
.fuente
Creo que es un error común, la
set
búsqueda (o tabla hash) no son O (1).de la Wikipedia
Relacionado: ¿Es un hashmap de Java realmente O (1)?
fuente
Todos tenemos acceso fácil a la fuente , donde el comentario anterior
set_lookkey()
dice:fuente
Para enfatizar un poco más la diferencia entre
set's
ydict's
, aquí hay un extracto de lassetobject.c
secciones de comentarios, que aclara la principal diferencia de los conjuntos contra los dictados.fuente en github
fuente