Com o que quero dizer uma estrutura com:
- O (log n) complexidade para
x.push()
operações - O (log n) complexidade para encontrar um elemento
- O (n) complexidade para calcular
list(x)
qual será classificado
Eu também tive uma pergunta relacionada sobre o desempenho, list(...).insert(...)
que agora está aqui .
memcpy
ainda é uma operação O (n) . Não tenho certeza de como o Python implementa listas exatamente , mas minha aposta seria que elas sejam armazenadas na memória contígua (certamente não como uma lista vinculada). Se assim é, a inserçãobisect
que você demonstra terá complexidade O (n) .Respostas:
A lista padrão do Python não está classificada de nenhuma forma. O módulo heapq padrão pode ser usado para anexar em O (log n) a uma lista existente e remover o menor em O (log n), mas não é uma lista classificada em sua definição.
Existem várias implementações de árvores equilibradas para Python que atender às suas necessidades, por exemplo rbtree , RBTree , ou pyavl .
fonte
Existe uma razão específica para os seus requisitos de grande porte? Ou você só quer que seja rápido? O módulo ordenado de contêineres é Python puro e rápido (como nas implementações rápidas como C, como blist e rbtree).
A comparação de desempenho mostra os benchmarks mais rapidamente ou a par do tipo de lista classificada do blist. Observe também que rbtree, RBTree e PyAVL fornecem tipos de ditado e conjunto classificados, mas não têm um tipo de lista classificada.
Se o desempenho é um requisito, lembre-se sempre de fazer benchmark. Um módulo que comprove a alegação de ser rápido com a notação Big-O deve ser suspeito até que também mostre comparações de benchmark.
Isenção de responsabilidade: eu sou o autor do módulo de contêineres classificados do Python.
Instalação:
Uso:
fonte
0.0845024989976
para SortedList.add () vs0.596589182518
para bisect.insort (), portanto, uma diferença de 7x na velocidade! E espero que a diferença de velocidade aumente com o tamanho da lista, pois a classificação de inserção de contêineres classificados funciona em O (log n) enquanto bisect.insort () em O (n).O(n)
Embora eu ainda nunca tenha verificado as velocidades "grandes O" das operações básicas da lista Python,
bisect
provavelmente vale a pena mencionar o módulo padrão neste contexto:PS. Ah, desculpe,
bisect
é mencionado na pergunta referenciada. Ainda assim, acho que não será muito prejudicial se essa informação estiver aqui)PPS. E as listas CPython são na verdade matrizes (não, digamos, skiplists ou etc). Bem, acho que eles devem ser algo simples, mas quanto a mim, o nome é um pouco enganador.
Portanto, se não me engano, as velocidades de bissecção / lista provavelmente seriam:
Upd. Após uma discussão nos comentários, deixe-me vincular aqui estas perguntas de SO: Como a lista do Python é implementada e qual é a complexidade do tempo de execução das funções da lista do python
fonte
fonte
Embora ainda não forneça uma função de pesquisa personalizada, o
heapq
módulo pode atender às suas necessidades. Ele implementa uma fila de heap usando uma lista regular. Você teria que escrever seu próprio teste eficiente de associação que faz uso da estrutura interna da fila (que pode ser feita em O (log n) , eu diria ...). Há uma desvantagem: extrair uma lista classificada tem complexidade O (n log n) .fonte
Eu usaria o
biscect
ousortedcontainers
módulos. Eu realmente não tenho experiência, mas acho que oheapq
módulo funciona. Contém umHeap Queue
fonte
Pode não ser difícil implementar sua própria lista de classificação no Python. Abaixo está uma prova de conceito:
========= Resultados ============
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]
101
3
50.
fonte