Eu já vi pessoas dizerem que set
objetos em python têm O (1) verificação de associação. Como eles são implementados internamente para permitir isso? Que tipo de estrutura de dados ele usa? Que outras implicações essa implementação tem?
Todas as respostas aqui foram realmente esclarecedoras, mas só posso aceitar uma, por isso vou com a resposta mais próxima da minha pergunta original. Obrigado a todos pela informação!
fonte
set
implementação original estavadict
com valores fictícios e foi otimizada mais tarde.Quando as pessoas dizem que os conjuntos têm O (1) verificação de associação, estão falando sobre o caso médio . Na pior das hipóteses (quando todos os valores de hash colidem), a verificação de associação é O (n). Veja o wiki do Python sobre complexidade de tempo .
O artigo da Wikipedia diz que a melhor complexidade de tempo para uma tabela de hash que não é redimensionada é
O(1 + k/n)
. Esse resultado não se aplica diretamente aos conjuntos Python, pois os conjuntos Python usam uma tabela de hash que é redimensionada.Um pouco mais adiante, no artigo da Wikipedia, diz que, para o caso médio , e assumindo uma função simples de hash uniforme, a complexidade do tempo é
O(1/(1-k/n))
ondek/n
pode ser limitada por uma constantec<1
.Big-O refere-se apenas ao comportamento assintótico como n → ∞. Como k / n pode ser limitado por uma constante, c <1, independente de n ,
O(1/(1-k/n))
não é maiorO(1/(1-c))
que o equivalente aO(constant)
=O(1)
.Portanto, assumindo um hash simples e uniforme, em média , a verificação de associação para conjuntos Python é
O(1)
.fonte
Eu acho que é um erro comum,
set
pesquisa (ou hashtable para esse assunto) não são O (1).da Wikipedia
Relacionado: Um hashmap Java é realmente O (1)?
fonte
Todos temos acesso fácil à fonte , onde o comentário anterior
set_lookkey()
diz:fonte
Para enfatizar um pouco mais a diferença entre
set's
edict's
, eis um trecho dassetobject.c
seções de comentários, que esclarecem a principal diferença entre sets e ditados.fonte no github
fonte