Eu encontrei muitos algoritmos de classificação durante meus estudos no ensino médio. No entanto, nunca sei qual é o mais rápido (para uma matriz aleatória de números inteiros). Então, minhas perguntas são:
- Qual é o algoritmo de classificação mais rápido atualmente conhecido?
- Teoricamente, é possível que existam ainda mais rápidos? Então, qual é a menor complexidade para classificar?
Respostas:
Em termos gerais, existem os algoritmos de classificação , como classificação de inserção, classificação de bolhas e classificação, que você normalmente deve usar apenas em circunstâncias especiais; Quicksort, que é o pior caso O ( n 2 ), mas muitas vezes O ( n log n ) com boas constantes e propriedades e que pode ser usado como um procedimento de classificação de uso geral; os algoritmos O ( n log n ) , como merge-sort e heap-sort, que também são bons algoritmos de classificação de uso geral; e o O ( nO ( n2) O ( n2) O ( n logn ) O ( n logn ) ou algoritmos de classificação lineares para listas de números inteiros, como classificação de raiz, intervalo e contagem, que podem ser adequados, dependendo da natureza dos números inteiros nas suas listas.O ( n )
Se os elementos em sua lista são tais que tudo que você sabe sobre eles é o relacionamento total de pedidos entre eles, os algoritmos de classificação ideais terão complexidade . Esse é um resultado bastante interessante e sobre o qual você poderá encontrar facilmente detalhes on-line. Os algoritmos de classificação linear exploram informações adicionais sobre a estrutura dos elementos a serem classificados, em vez de apenas o relacionamento total da ordem entre os elementos.Ω ( n logn )
De maneira ainda mais geral, a otimização de um algoritmo de classificação depende intimamente das suposições que você pode fazer sobre o tipo de lista que você classificará (bem como o modelo de máquina em que o algoritmo será executado, o que pode tornar a classificação ainda mais ruim) algoritmos a melhor escolha; considere a classificação de bolhas em máquinas com uma fita para armazenamento). Quanto mais fortes forem as suas suposições, mais chances o seu algoritmo poderá cortar. Sob suposições muito fracas sobre a eficiência com que você pode determinar a "classificação" de uma lista, a complexidade ideal do pior caso pode ser .Ω ( n ! )
Esta resposta lida apenas com complexidades. O tempo real de execução das implementações de algoritmos dependerá de um grande número de fatores que são difíceis de explicar em uma única resposta.
fonte
A resposta, como costuma ser o caso de tais perguntas, é "depende". Depende de coisas como (a) quão grandes são os números inteiros, (b) se a matriz de entrada contém números inteiros em uma ordem aleatória ou quase ordenada, (c) se você precisa que o algoritmo de classificação seja estável ou não, bem como outros fatores, (d) se a lista inteira de números se encaixa na memória (classificação na memória versus classificação externa) e (e) na máquina em que você a executa.
Na prática, o algoritmo de classificação na biblioteca padrão do seu idioma provavelmente será muito bom (bem próximo do ideal), se você precisar de uma classificação na memória. Portanto, na prática, basta usar qualquer função de classificação fornecida pela biblioteca padrão e medir o tempo de execução. Somente se você achar que (i) a classificação é uma grande fração do tempo de execução geral e (ii) o tempo de execução é inaceitável, você deve se preocupar em mexer no algoritmo de classificação. Se essas duas condições fazem espera, então você pode olhar para os aspectos específicos de seu domínio e experiência particular com outros algoritmos rápido de ordenação.
Mas, realisticamente, na prática, o algoritmo de classificação raramente é um grande gargalo de desempenho.
fonte
Além disso, respondendo sua segunda pergunta
Para classificação de uso geral, a complexidade do problema de classificação baseada em comparação é Ω (n log n) . Existem alguns algoritmos que executam a classificação em O (n), mas todos eles se baseiam em suposições sobre a entrada e não são algoritmos de classificação de uso geral.
Basicamente, a complexidade é dada pelo número mínimo de comparações necessárias para classificar a matriz (log n representa a altura máxima de uma árvore de decisão binária criada ao comparar cada elemento da matriz).
Você pode encontrar a prova formal para classificar o limite inferior da complexidade aqui :
fonte
O algoritmo de classificação inteira mais rápido em termos do pior caso que encontrei é o de Andersson et al. Ele tem o pior caso de , que é obviamente mais rápido que O ( n log n ) .O ( n logregistron ) O ( n logn )
fonte
Li as outras duas respostas no momento em que escrevi isso e não achei que nenhuma delas respondesse sua pergunta adequadamente. Outras respostas consideraram idéias estranhas sobre distribuições aleatórias e complexidade do espaço que provavelmente estão fora do escopo dos estudos do ensino médio. Então aqui está a minha opinião.
fonte
fonte
fonte
Como você não menciona nenhuma restrição no hardware e, como procura o "mais rápido", eu diria que você deve escolher um dos algoritmos de classificação paralela com base no hardware disponível e no tipo de entrada que você possui.
Em teoria, por exemplo,
quick_sort
éO(n log n)
. Com osp
processadores, o ideal é que isso ocorraO(n/p log n)
se o executarmos em paralelo.Para citar a Wikipedia: Complexidade temporal de ...
Na prática, para tamanhos de entrada massivos, seria impossível obter
O(log n)
devido a problemas de escalabilidade.Aqui está o pseudo-código para a classificação de mesclagem paralela . A implementação de
merge()
pode ser a mesma que na classificação de mesclagem normal:Veja também:
fonte