¿Complejidad temporal de las operaciones de conjuntos de Python?

85

¿Cuál es la complejidad temporal de cada una de las operaciones de conjunto de Python en notación Big O ?

Estoy usando el tipo de conjunto de Python para una operación en una gran cantidad de elementos. Quiero saber cómo el rendimiento de cada operación se verá afectado por el tamaño del conjunto. Por ejemplo, agregue y la prueba de membresía:

myset = set()
myset.add('foo')
'foo' in myset

Buscar en Google no ha generado ningún recurso, pero parece razonable que la complejidad del tiempo para la implementación del conjunto de Python se haya considerado cuidadosamente.

Si existe, un enlace a algo como esto sería genial. Si no hay nada como esto, ¿quizás podamos solucionarlo?

Puntos extra por encontrar la complejidad temporal de todas las operaciones establecidas.

Stephen Emslie
fuente
2
Si bien el enlace de GWW es muy informativo, puede razonar sobre la complejidad temporal de los conjuntos de Python al comprender que son simplemente casos especiales del diccionario de Python (claves, pero no valores). Por lo tanto, si conoce la complejidad temporal de las operaciones en un mapa hash, prácticamente está ahí.
Wilduck

Respuestas:

73

Según Python wiki: complejidad de tiempo , el conjunto se implementa como una tabla hash . Por lo tanto, puede esperar buscar / insertar / eliminar en O (1) promedio. A menos que el factor de carga de su tabla hash sea demasiado alto, entonces enfrenta colisiones y O (n).

PD, por alguna razón, reclaman O (n) para la operación de eliminación que parece un error de escritura.

PPS Esto es cierto para CPython, pypy es una historia diferente .

Sergey Romanovsky
fuente
Establecer en Python también realiza clasificación automática. Entonces, ¿cree que insertar un nuevo valor sigue siendo O (1) complejidad de tiempo?
Naresh Thakur
3
@thakurinbox ¿podría apoyar su declaración con un enlace?
Sergey Romanovsky
5

La operación indebe ser independiente del tamaño del contenedor, es decir. O (1) : dada una función hash óptima. Esto debería ser casi cierto para las cadenas de Python. El hash de cadenas siempre es fundamental, Python debería ser inteligente allí y, por lo tanto, puede esperar resultados casi óptimos.

Towi
fuente
2

Las otras respuestas no hablan de 2 operaciones cruciales en conjuntos: Uniones e intersecciones. En el peor de los casos, la unión tomará O (n + m) mientras que la intersección tomará O (min (x, y)) siempre que no haya muchos elementos en los conjuntos con el mismo hash. Puede encontrar una lista de las complejidades temporales de las operaciones comunes aquí: https://wiki.python.org/moin/TimeComplexity

Fırat Kıyak
fuente