• Save
Análise de desempenho de algoritmos de ordenação
Upcoming SlideShare
Loading in...5
×
 

Análise de desempenho de algoritmos de ordenação

on

  • 901 views

Análise de desempenho de algoritmos de ordenação - Artigo elaborado para a disciplina Projeto e Análise de Algoritmos na UFPI

Análise de desempenho de algoritmos de ordenação - Artigo elaborado para a disciplina Projeto e Análise de Algoritmos na UFPI

Statistics

Views

Total Views
901
Views on SlideShare
882
Embed Views
19

Actions

Likes
2
Downloads
0
Comments
0

1 Embed 19

http://localhost 19

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Análise de desempenho de algoritmos de ordenação Análise de desempenho de algoritmos de ordenação Document Transcript

  • An´alise de Desempenho de Algoritmos de Ordenac¸˜aoGustavo de Carvalho Sales11Departamento de Inform´atica e Estat´ıstica – Universidade Federal do Piau´ı (UFPI)Teresina – PI – Brasilgt.salles@gmail.comAbstract. This paper is intended to evaluate the performance of six sorting al-gorithms of vectors through a software that performs the tests and generates achart to be analyzed. Also in the article, it will be analyzed the complexity ofeach algorithm and associated with the result obtained in the tests.Resumo. Este artigo destina-se a avaliar o desempenho de seis algoritmos deordenac¸˜ao de vetores atrav´es de um software que realiza os testes e gera umgr´afico a ser analisado. Ainda no artigo, ser´a analisada a complexidade decada algoritmo e esta, associada com o resultado obtido nos testes.1. Introduc¸˜aoO objetivo desse trabalho ´e realizar a implementac¸˜ao e comparac¸˜ao de desempenho dosprincipais algoritmos de ordenac¸˜ao existentes.O c´odigo fonte foi escrito na linguagem de programac¸˜ao Python, utilizando asbibliotecas PyQt e Matplotlib para a interface gr´afica e para a criac¸˜ao dos gr´aficos respec-tivamente e a IDE Eclipse.O Computador onde foram desenvolvidos os testes possui a seguinte configurac¸˜ao:• Processador Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz• 4GB de mem´oria RAM com frequˆencia de 1333Mhz• Microsoft Windows 7 Ultimate 64 Bits2. Especificac¸˜oesO problema consiste em avaliar o desempenho dos seguintes algoritmos de ordenac¸˜ao devetores: Insertion Sort, Selection Sort, Bubble Sort, Merge Sort, Heap Sort e Quick Sort.A avaliac¸˜ao ´e feita considerando o tempo de execuc¸˜ao dos algoritmos nasseguintes condic¸˜oes:• Vetores crescentes, decrescentes e aleat´orios• O teste ´e realizado cinco vezes e ´e considerado como tempo final a m´edia dostempos das cinco execuc¸˜oes.• Os algoritmos s˜ao executados para vetores com as seguintes quantidades de ele-mentos: 1000, 5000, 10000, 20000, 30000 e 50000.O software desenvolvido executa uma interface gr´afica onde ´e selecionado o al-goritmo a ser utilizado. Uma vez que a execuc¸˜ao ´e iniciada, todo o resto do processo ´eautomatizado, o software executa para o algoritmo selecionado a ordenac¸˜ao dos trˆes tiposde vetores e com as seis quantidades predefinidas. Ao final da execuc¸˜ao, s˜ao geradostrˆes arquivos para cada algoritmo e ´e chamado o m´odulo que constr´oi o gr´afico lendo osarquivos gerados pelo programa.
  • 3. DesenvolvimentoOrdenar corresponde ao processo de rearranjar um conjunto de objetos em ordem as-cendente ou descendente. O objetivo principal da ordenac¸˜ao ´e facilitar a recuperac¸˜aoposterior de itens do conjunto ordenado.A ordenac¸˜ao ´e uma operac¸˜ao fundamental em ciˆencia da computac¸˜ao (muitos pro-gramas a utilizam como uma etapa intermedi´aria) e, como resultado, um grande n´umerode bons algoritmos de ordenac¸˜ao tem sido desenvolvido. O melhor algoritmo para umadeterminada aplicac¸˜ao depende - entre outros fatores - do n´umero de itens a serem or-denados, da extens˜ao em que os itens j´a est˜ao ordenados de algum modo, de poss´ıveisrestric¸˜oes sobre os valores de itens e da esp´ecie de dispositivo de armazenamento a serusado: mem´oria principal, discos ou fitas [Cormen et al. ].3.1. Insertion SortInsertion sort ´e um algoritmo de ordenac¸˜ao simples, uma ordenac¸˜ao por comparac¸˜ao naqual uma nova lista ´e constru´ıda um valor por vez. Isso ´e muito menos eficiente emgrandes listas do que outros algoritmos como quick sort, heap sort ou merge sort.A complexidade do insertion sort no melhor caso ´e de Ω(n) de acordo com[Ziviani 2004], visto que ele ir´a fazer n comparac¸˜oes e ver que o vetor j´a est´a ordenado.No pior caso e no no caso m´edio a complexidade do insertion sort ´e de Θ(n2).Figure 1. Gr´afico de desempenho Insertion sortAtrav´es do gr´afico percebe-se o desempenho incrivelmente superior para os ve-tores ordenados, j´a que o algoritmo tem complexidade de Θ(n) no melhor caso. Con-siderando que o vetor j´a est´a ordenado, a execuc¸˜ao apenas compara todos os elementoscom o elemento anterior, e n˜ao faz nenhuma troca.
  • 1000 5000 10000 20000 30000 50000Crescente 0.0 0.0 0.00199 0.00199 0.00419 0.00819Decrescente 0.02800 0.68200 2.73639 11.41419 24.33819 73.61080Aleat´orio 0.09866 0.99893 1.36220 5.45020 12.33840 34.30399Table 1. Tabela de desempenho Insertion sortNo vetor decrescente (pior caso) ocorre o contr´ario do vetor crescente, j´a que acomplexidade ´e de Θ(n2) o algoritmo compara todos os elementos do vetor com o ele-mento anterior e faz todas as trocas poss´ıveis, assim o desempenho ca´ı consideravelmente,por exemplo, no vetor crescente com 50000 elementos o tempo de execuc¸˜ao foi de 0.008segundos enquanto no decrescente o tempo subiu para 73.61 segundos.No vetor aleat´orio, que possui desempenho Θ(n2) foi analisado atrav´es do gr´aficoque o desempenho fica entre o crescente e o decrescente.Pode-se concluir ent˜ao que o algoritmo insertion sort ´e eficiente apenas para ve-tores com pequenas entradas, por exemplo, a partir de 10000 elementos o algoritmo j´a setorna bastante lento em relac¸˜ao a outros algoritmos.3.2. Selection SortO selection sort ´e um algoritmo de ordenac¸˜ao baseado em se passar sempre o menor valordo vetor para a primeira posic¸˜ao (ou o maior dependendo da ordem requerida), depois ode segundo menor valor para a segunda posic¸˜ao, e assim ´e feito sucessivamente com os(n − 1) elementos restantes, at´e os ´ultimos dois elementos.Figure 2. Gr´afico de desempenho Selection sort
  • 1000 5000 10000 20000 30000 50000Crescente 0.04000 1.05019 4.53920 21.07679 54.80159 199.60179Decrescente 0.04400 1.03819 4.84339 22.37839 62.41919 218.79639Aleat´orio 0.04400 1.028201 4.79580 22.62439 61.91779 158.87400Table 2. Tabela de desempenho Selection sortO algoritmo selection sort tem complexidade Θ(n2) em todos os casos, ent˜ao odesempenho vai ser bastante parecido em todos os tipos de vetores, com um desempenhoum pouco inferior nos vetores aleat´orios, por exemplo, at´e 30000 elementos o tempo deexecuc¸˜ao do algoritmo ´e praticamente igual independente do tipo de vetor, a diferenc¸a s´ocomec¸a a ser notada a partir de 50000 elementos.Assim como o algoritmo insertion sort, o selection sort tamb´em s´o se mostra efi-ciente com vetores com quantidades pequenas de elementos.3.3. Bubble SortO bubble sort, ou ordenac¸˜ao por flutuac¸˜ao, ´e um algoritmo de ordenac¸˜ao dos mais simples.A ideia ´e percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topoo maior elemento da sequˆencia. Essa movimentac¸˜ao lembra a forma como as bolhas emum tanque de ´agua procuram seu pr´oprio n´ıvel, e disso vem o nome do algoritmo.No melhor caso, o algoritmo executa n operac¸˜oes relevantes, onde n representa on´umero de elementos do vetor. No pior caso, s˜ao feitas O(n2) operac¸˜oes. A complexidadedesse algoritmo ´e de ordem quadr´atica. Por isso, ele n˜ao ´e recomendado para programasque precisem de velocidade e operem com quantidade elevada de dados.Figure 3. Gr´afico de desempenho Bubble sort
  • 1000 5000 10000 20000 30000 50000Crescente 0.0 0.0 0.0 0.00533 0.0 0.00500Decrescente 0.10933 2.32466 9.08533 36.18733 82.94066 237.40766Aleat´orio 0.06766 1.49266 5.9179 23.69166 54.61099 170.46166Table 3. Tabela de desempenho Bubble sortO algoritmo bubble sort possui um desempenho bastante parecido com o algo-ritmo insertion sort. Analisando o gr´afico nota-se que o tempo de execuc¸˜ao para vetorescrescentes ´e sempre muito baixo, sempre pr´oximo a zero segundos.No pior caso, quando o vetor ´e decrescente, o algoritmo precisar´a percorrer ovetor inteiro e ir´a fazer o m´aximo de trocas poss´ıveis, diminuindo consideravelmente odesempenho.As posic¸˜oes dos elementos no bubble sort desempenham um papel fundamentalpara determinar a performance da execuc¸˜ao do algotimo. Por exemplo, grandes elementosno in´ıcio da lista n˜ao demonstram um problema t˜ao grande, eles podem ser facilmentetrocados de posic¸˜ao, ao contr´ario de pequenos elementos no final da lista, pois a suamovimentac¸˜ao para o in´ıcio ser´a muito lenta. Esses tipos de elementos s˜ao chamados delebres e tartarugas respectivamente.Sobre este algoritmo conclui-se que a sua utilizac¸˜ao s´o em vantajosa em vetorescom entradas pequenas e de preferˆencia aleat´orios. O tempo de execuc¸˜ao para vetoresdecrescente e consideravelmente maior em relac¸˜ao a vetores aleat´orios e mais ainda emrelac¸˜ao a vetores crescentes.3.4. Merge SortO merge sort, ou ordenac¸˜ao por mistura, ´e um exemplo de algoritmo de ordenac¸˜ao do tipodividir-para-conquistar.Sua id´eia b´asica ´e muito f´acil: criar uma sequˆencia ordenada a partir de duasoutras tamb´em ordenadas. Para isso, ele divide a sequˆencia original em pares de dados,ordena-as; depois as agrupa em sequˆencias de quatro elementos, e assim por diante, at´eter toda a sequˆencia dividida em apenas duas partes.Os trˆes passos ´uteis dos algoritmos dividir-para-conquistar, que se aplicam aomerge sort s˜ao:• Dividir: Dividir os dados em subsequˆencias pequenas;• Conquistar: Classificar as duas metades recursivamente aplicando o merge sort;• Combinar: Juntar as duas metades em um ´unico conjunto j´a classificado.1000 5000 10000 20000 30000 50000Crescente 0.01566 0.03099 0.06233 0.13533 0.20800 0.36400Decrescente 0.01033 0.03133 0.08833 0.13533 0.20799 0.36933Aleat´orio 0.01033 0.03133 0.08333 0.14033 0.21333 0.37433Table 4. Tabela de desempenho Merge sortO algoritmo merge sort possui complexidade Θ(n log n) para todos os casos.Como a estrat´egia do algoritmo consiste em dividir o problema em problemas menores
  • Figure 4. Gr´afico de desempenho Merge sortat´e que a soluc¸˜ao seja trivial, o desempenho vai ser o mesmo independente do tipo devetor, assim, os desempenhos dos trˆes tipos de vetores s˜ao bastante pr´oximos.Analisando o gr´afico e as tabelas percebe-se que o tempo de execuc¸˜ao mais lentono algoritmo merge sort que foi para um vetor aleat´orio de 50000 posic¸˜oes foi de 0.37segundos, um tempo consideravelmente melhor em relac¸˜ao aos outros algoritmos j´a anal-isados at´e o momento.3.5. Heap SortHeap sort ´e um m´etodo de ordenac¸˜ao cujo princ´ıpio de funcionamento ´e o mesmoprinc´ıpio utilizado para a ordenac¸˜ao por selec¸˜ao, a saber: selecione o menor item dovetor e a seguir troque-o com o item que est´a na primeira posic¸˜ao do vetor; repita estasduas operac¸˜oes com os n − 1 itens restantes, depois com os n − 2 itens, e assim suces-sivamente. O custo para encontrar o menor (ou o maior) item entre n itens custa n − 1comparac¸˜oes. [Ziviani 2004]De acordo com [Ziviani 2004] o algoritmo heap sort possui complexidadeO(n log n) independente da entrada. Esse ´e um limite superior, mas n˜ao ´e assintotica-mente restrito segundo [Cormen et al. ] que afirma que no melhor caso o desempenho ´ede Ω(n log n) em todas as situac¸˜oes.A execuc¸˜ao deste algoritmo de d´a da seguinte forma:• O primeiro passo ´e construir o heap a partir dos dados.• Depois disso s˜ao retirados os maiores valores da heap e colocados no novo arrayordenado. Para esse primeiro elemento, ele deve ser a posic¸˜ao 0 do array.
  • • O pr´oximo passo ´e a reconstruc¸˜ao do heap e a remoc¸˜ao do pr´oximo maior ele-mento e a inserc¸˜ao deste elemento no array ordenado.• Depois de removidos todos os elementos da heap, o array est´a ordenado.A direc¸˜ao dos elementos sorteados pode variar atrav´es da escolha do heap m´ınimo ouheap m´aximo no primeiro passo.Figure 5. Gr´afico de desempenho Heap sort1000 5000 10000 20000 30000 50000Crescente 0.02066 0.05733 0.10900 0.23900 0.37966 0.65533Decrescente 0.01566 0.07300 0.11433 0.24966 0.36899 0.63433Aleat´orio 0.01033 0.06233 0.11433 0.25466 0.36933 0.66566Table 5. Tabela de desempenho Heap sortApesar de o heap sort e o merge sort possu´ırem a mesma complexidade o algo-ritmo merge sort possui um desempenho um pouco melhor em relac¸˜ao ao heap sort. Porexemplo para qualquer tipo de vetor com 50000 elementos o algoritmo merge sort executaquase que na metade do tempo do heap sort.3.6. Quick SortO quick sort ´e um algoritmo de ordenac¸˜ao cujo tempo de execuc¸˜ao do pior caso ´e de Θ(n2)sobre um arranjo de entrada de n n´umeros. Apesar desse tempo de execuc¸˜ao lento no piorcaso, o quick sort com frequˆencia ´e a melhor opc¸˜ao pr´atica para ordenac¸˜ao, devido a suanot´avel eficiˆencia na m´edia: seu tempo de execuc¸˜ao esperado ´e Θ(n lg n), e os fatoresconstantes ocultos na notac¸˜ao Θ(n lg n) s˜ao bastante pequenos. Ele tamb´em apresenta
  • a vantagem da ordenac¸˜ao local e funciona bem at´e mesmo em ambientes de mem´oriavirtual. [Cormen et al. ]Figure 6. Gr´afico de desempenho Quick sort1000 5000 10000 20000 30000 50000Crescente 0.01033 0.02066 0.03133 0.07266 0.08833 0.18699Decrescente 0.0 0.01566 0.03133 0.06766 0.09366 0.19233Aleat´orio 0.00533 0.02066 0.04133 0.07799 0.11966 0.21833Table 6. Tabela de desempenho Quick sortO algoritmo quick sort ´e de longe o melhor algoritmo de ordenac¸˜ao existente, a suaexecuc¸˜ao dura menos do que a metade do tempo em relac¸˜ao a qualquer outro algoritmoem qualquer outra condic¸˜ao.4. Conclus˜aoFeitas todas as an´alises pode-se concluir que:• A relac¸˜ao Heap sort / Quick sort se mant´em constante para todos os tamanhos,sendo o Heap sort mais lento.• O algoritmo Insertion sort ´e o mais r´apido para qualquer tamanho se os elementosest˜ao ordenados e ´e o mais lento para qualquer tamanho se os elementos est˜ao emordem decrescente.• Entre os algoritmos de complexidade O(n2), o insertion sort ´e melhor para todosos tamanhos aleat´orios experimentados.
  • ReferencesCormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. Algoritmos: Teoria e pr´atica.Campus, 2nd edition.Ziviani, N. (2004). Projeto de Algoritmos: com implementac¸˜oes em Pascal e C. CengageLearning (Thomson / Pioneira), S˜ao Paulo, 1st edition.