Documente Academic
Documente Profesional
Documente Cultură
Abstract. The asymptotic analysis is not enough to clarify the performance
differences of some arrangement algorithms. Therefore, this work is an
experimental analysis of the same with the purpose of showing which one has
a better performance in ordering arrangements and proposing a hybrid
algorithm.
Resumo. A análise assintótica não é suficiente para esclarecer as diferenças de
desempenho de alguns algoritmos de ordenação de arranjos. Por conta disso,
este trabalho trata-se de uma análise experimental dos mesmos com o objetivo
mostrar qual deles possui um melhor desempenho na ordenação de arranjos e
propor um algoritmo híbrido.
1. Introdução
Imagine como seria buscar um número em um catálogo telefônico se os nomes das
pessoas não estivessem listados em ordem alfabética? Seria muito complicado. A
ordenação ou classificação de registros consiste em organizá-los em ordem crescente ou
decrescente e assim facilitar a recuperação desses dados. A ordenação tem como
objetivo facilitar as buscas e pesquisas de ocorrências de determinado elemento em um
conjunto ordenado.
Como visto em [Cormen et al. 2001], [Brassard & Bratley 1996], [Bentley
2000], [Kleinberg & Tardos 2005] e [Manber 1989], a Análise de Algoritmos [Knuth
2000] estuda certos problemas computacionais recorrentes, ou seja, problemas que
aparecem, sob diversos disfarces, em uma grande variedade de aplicações e de
contextos. A análise de um algoritmo para um dado problema trata de: i) provar que o
algoritmo está correto; ii) estimar o tempo que a execução do algoritmo consome. A
estimativa do espaço de memória usado pelo algoritmo também é importante em muitos
casos. Dados dois algoritmos para um mesmo problema, a análise permite decidir qual
dos dois é mais eficiente.
Pode-se dizer que a Análise de Algoritmos é uma disciplina de engenharia, pois
ela procura prever o comportamento de um algoritmo antes que ele seja efetivamente
implementado e colocado “em produção”. Num nível mais abstrato, a análise de
algoritmos procura identificar aspectos estruturais comuns a algoritmos diferentes e
estudar paradigmas de projeto de algoritmos.
2. Fundamentação Teórica
Nesta seção vamos descrever os algoritmos usados nos testes, assim como a sua
complexidade em casos melhor, pior e médio.
estratégia de divisão e conquista. Em seguida o quicksort ordena as duas sublistas de
chaves menores e maiores recursivamente até que a lista completa se encontre ordenada.
Segundo [Sara 1988], os passos são: i)Escolha um elemento da lista,
denominado pivô; ii)Particiona: rearrange a lista de forma que todos os elementos
anteriores ao pivô sejam menores que ele, e todos os elementos posteriores ao pivô
sejam maiores que ele. Ao fim do processo o pivô estará em sua posição final e haverá
duas sub listas não ordenadas; iii)Recursivamente ordene a sublista dos elementos
menores e a sublista dos elementos maiores.
No seu melhor caso sua complexidade é O(n log n), no seu pior caso s ua
complexidade é O(n²), já no seu caso médio a sua complexidade é O(n log n).
.
3. Metodologia
Os algoritmos foram implementados e na linguagem Python fazendo uso do compilador
Python 3.6.3. Foram testados em uma máquina com o processador Intel(R) Core(TM)
i5-7400 CPU @ 3.00GHz, 8 Gbs de memoria ram com 2600Mhz de velocidade e
Sistema Operacional Windows 10 Home Single Language.
3.2 Arquitetura
A Figura 1 mostra uma visão geral do protótipo desenvolvido para realizar os testes
propostos neste trabalho.
Figura 1. Arquitetura dos testes realizados.
Na primeira etapa, chamada de “Vetor”, 9 vetores foram criados variando o
comprimento, as quantidades escolhidas foram: i)100; ii)500; iii)1.000; iv)5.000;
4. Resultados
Nesta seção iremos exibir os resultados dos testes para cada algoritmo.
4.1 Ordenação pelo método da bolha(bubblesort)
Na Figura 3, mostramos o comportamento do algoritmo bubblesort. Tanto em questão
de comparações executadas para cada tamanho de vetor, quanto em questão de tempo
gasto para a conclusão do algoritmo. Como podemos ver no gráfico a esquerda, quando
tratamos de comparação, o bubblesort executa a mesma quantidade de execução por
tamanho de vetor, não importando a forma que esteja ordenado. Já quando falamos de
tempo de execução, ele possui tempos semelhantes até o vetor de 30.000 posições. Daí
em diante, ele gasta mais tempo computacional no arranjo de ordem decrescente,
seguido pelo arranjo aleatório e por fim o arranjo crescente. Como mostrado no gráfico
a direita. Na Tabela 2 podemos observar o resultado médio de 3 execuções do
Bubblesort.
4.2 Ordenação por inserção(insertionsort)
No Insertionsort a disparidade entre os números de comparações entre cada tipo de
arranjo é facilmente notada. Vendo a Figura 4, no gráfico a direita, a partir do arranjo
com 30.000 posições, o número de comparações do vetor decrescente cresce quase que
o dobro do vetor aleatório. Enquanto o crescente se mantém em um valor de
comparações relativamente pequeno. Um comportamento semelhante se aplica ao
tempo, como podemos ver no gráfico a direita, o vetor decrescente continua com o
maior crescimento e o vetor crescente apresenta a menor variação.Na Tabela 3 podemos
observar o resultado médio de 3 execuções do Insertionsort.
5. Conclusão
A análise desses algoritmos nos remeteu a resultados semelhantes aos resultados obtidos
com as equações de recorrência de cada algoritmo. Ou seja, os resultados estão dentro
do escopo de tempo estabelecido com a análise assintótica para cada um deles. Mas, por
se tratar de uma análise experimental, fomos capazes de descobrir qual algoritmo
consumia mais tempo, mesmo dentre aqueles que possuíam uma equação de recorrência
semelhante.
References