Tiago Alves Macambira
2003.1
Isso é simplesmente o somatório dos n primeiros elementos elementos
de uma progressão geométrica, com
. A dedução é trivial
e encontra-se em qualquer livro de 2
grau. De qualquer
forma, vamos a ela:
Introduzindo
em ambos os lados
Assim
para
.
Para
,
Usando aproximação por integrais[1, p50]
A margem inferior:
Para margem superior, derivamos a inequação:
O que dá a margem:

Usando a ``Aproximação de Stirling''[1,3], chegamos em

Caso Base:

Aplicando o Master Theorem[1, p62], tendo que
,
e
, chegamos
ao resultado que
de qualquer forma, pelo método da substituição:
Ora, chegaremos ao fim da recursão quando
![]() |
(8) | ||
| (9) | |||
| (10) |
Logo,
![]() |
(11) | ||
![]() |
(12) | ||
![]() |
(13) | ||
![]() |
(14) |
Vamos inicialmente ver a condição inicial dessa recursão

Para
qualquer, a expressão de tempo desse algoritmo fica
Ora, a expressão acima é a função de recorrência que devolve o
-ésimo
numero de Fibonacci. Logo, a complexidade de tempo desse algoritmo
será, para uma entrada
, o valor do
-ésimo número
de Fibonacci, cujo valor é dado pela fórmula:
Ou, arredondando para o inteiro mais próximo:

Onde
A demonstração completa da obtenção de
pode ser obtida
em[3, p.212-219]
Finalmente, para fechar esse item, seria bom resaltar que
O algoritmo é o merge-sort, que é
De qualquer forma, vamos à análise desse algoritmo.
Antes de prosseguirmos, precisamos saber a complexidade de tempo do
procedimento MERGE. É sabido que dá para se construir sem
muito esforço um algoritmo que fazer intercalação de dois vetores
de tamanho iguais, cada um deles ordenados, em
. Para provar,
propomos um algoritmo que faça isso e calcularemos a sua complexidade:
No algoritmo 1, acima o laco while mais externo
garante que não haja sobreposição dos dois vetores que estão sendo.
A cada iteração desse laço, os dois laços internos vão linearmente
percorrendo e inserindo, ordenadamente, os elementos contidos nas
respectivas partições de A que cada laço trata:
Uma vez sabendo a complexidade de tempo do procedimento MERGE, sigamos para o cálculo da complexidade de tempo do algoritmo Sort1 como um todo.
Aplicando o Master Theorem[1, p62], tendo que
,
e
,
chegamos ao resultado que
Já temos uma idéia do que procurar. Desenvolvamos a equação recursiva por substituições:

Fazendo

Esse algoritmo é muito parecido com o anterior.
A sua fórmula de recorrência é:
Aplicando o Master Theorem[1, p62], tendo que
,
e
,
chegamos ao resultado que
Ordenações através de comparações podem ser vistas abstratamente em termos de árvores de decisão.Uma arvore de decisão representa as comparações realizadas pelo algoritmo de ordenação quando ele trabalha em uma entrada de um dado tamanho.
O tamanho do caminho mais longo partindo da raíz de uma árvore de decisão para qualquer um de suas folhas representa o pior-caso no número de comparações que um algoritmo de ordenação realiza. Conseqüentemente, o pior-caso no número de comprarações para uma ordenação por comparação corresponde à altura da sua árvore de decisão.
Assim, achar o limite inferior para a altura de uma árvore de decisão equivale a achar o limite inferior para o tempo de execução de qualquer algoritmo de ordenação por comparação.
Considere a arvore de decisão de altua
que ordena
elementos. Como existem
permutações dos
elementos,
cada permutação representa uma ordem de ordenação distinta, a árvore
tem que ter pelo menos
folhas. Já que uma árvore binária
de altura
tem não maus do que
folhas, temos:
que, através do uso de logaritmos, fica
onde
é a base dos logaritmos naturais; assim:

Em anexo, no documento estatisticas/tempo.txt, há um lista com os médios tempos de execução de vários algoritmos, para vários valores de n e k.
Também em anexo, gráficos relativos a essas estatisticas em graficos/time_graph_*.ps.
Os algoritmos originados de algoritmos
perdem muito tempo fazendo comparações. O partital_Selection é destes
aquele que mais realiza comparaçõe, seguido do insertion ( também
originado de um algoritmo
Heap e quick
sort realizam um número bem parecido de movimentações de regi:stros.
Em relação a comparação de registros, partial_insertion sort é o que mais se destaca quando do crescimento do n. Todos os outros ficam relativamente estáveis.
É interessante notar que os algoritmos descendentes de algoritmos
, a exceção de
muito pequenos,
a medida que
aumenta, sua performance diminui drasticamente.
A perforamance desses algoritmos, contudo, ainda dá margens para interessantes
surpresas: o partial_selection é disparadoo melhor algoritmo para
. Mas também esse é o unico caso onde ele se dá bem. O partial_insertion_sort
também apresenta uma acelerada taxa de crescimento com um aumento
de
. Ainda assim é, para valores de
proximos de
uma boa opção, rivalizando nas faixas iniciais de
até com
o quicksort.
Enrtre os algoritmos cujos originais eram
o quicksort
é sempre a melhor opção. O partial_heapsort apresente, em alguns
momentos, um custo inicial de montar a heap alto demais, em comparação
com os algoritmos cujos originais são
. Não pouca vezes
perdeu para o insetion_sort com valores pequenos de k.
o que difere este algoritmo do original é que ele
Logo, esse algoritmo, com L pequenos é bom, pois o fator
fica minimizado. Mas, aumentos em
acarreta um crescimento
muito grande na parcela
O que difere esse do original é que o laço externo é limitado a rodar k vezes. Complexidade:

Pela fórmula analítica fica fácil de ver pq o selection decresce tanto em relação ao insertion: apeser de ser inicialmente menor do que o insertions, k tem um grande peso nesse algoritmo.
Aqui nada de estranho: apenas u heap_invertido. AO final da ordenação dos k elementos , estes, que etavam em ordem reversa ao no final do vertor, são copiado de volta.
O custo para montar o heap é o mesmo:
O custo apra retirar os k primeiros:
m)
Total:
:w
Melhor algoritmo para
e
grandes.
This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -no_subdir -split 0 -show_section_numbers /tmp/lyx_tmpdir970vyiGPS/lyx_tmpbuf970nJ6gwv/novorel.tex
The translation was initiated by Tiago Macambira on 2003-05-23