Escolar Documentos
Profissional Documentos
Cultura Documentos
- Estrutura de Dados
- Uma estrutura de dados � um modo particular de armazenamento e
organiza��o dos dados que possibilite o uso
dos mesmos de forma eficiente.
- As estruturas de dados diferem umas das outras pela disposi��o ou
manipula��o de seus dados. A disposi��o
dos dados em uma estrutura obedece a condi��o preestabelecida e
caracteriza a estrutura.
- Nenhuma estrutura de dados �nica funciona bem para todas as
finalidades. Dessa forma, � importante conhecer
seus pontos fortes e suas limita��es. (Ex: se eu tenho a
necessidade de inserir elementos em ordem
eu preciso de uma estrutura de dados que comporte isso. Temos que
verificar qual estrutura de dados
utilizar em cada cen�rio)
- Algoritmos
- Um algoritmo � qualquer procedimento computacional bem definido que
toma algum valor ou conjunto de valores
como entrada e produz algum valor ou conjunto de valores como
sa�da. (Algoritmo � um processo
sistem�tico apra resolver um problema)
- Um algoritmo � uma sequencia de etapas computacionais que transformam
a entrada na sa�da.
ENTRADA -> PROCESSAMENTO -> SA�DA (Entrada � processada e ao
final deste � dada uma sa�da)
- Representa��o de Algoritmos
- Fluxograma: Trata-se de uma representa��o esquem�tica de um processo
ou uma sequencia de passos, feito atrav�s
de gr�ficos que ilustram de forma descomplicada a transi��o de
informa��es entre os elementos que
o comp�e. Ele mostra o fluxo de um programa atrav�s de diagramas,
ex: INICIO -> L� um N�mero ->
Se > 5 -> Encerra. O Le um numero esta num ret�gulo que indica um
comando, a condi��o � um los�ngulo.
- Pseudoc�digo / Pseudolinguagem: O pseudoc�digo permite que o
programador possa se concentrar na l�gica e
nas estruturas de controle e n�o com as regras de uma linguagem
espec�fica. Ao contr�rio de uma
linguagem de programa��o n�o existe um formalismo r�gido de como
deve ser escrito o algoritmo.
O algoritmo deve ser f�cil de se interpretar e f�cil de
codificar, por�m, sem ambiguidades. (Inicialmente
esses pseudoc�digo eram apenas em ingl�s, mas com a sua
dissemina��o tb existe em portugu�s, o portugues
estruturado ou portugol.)
- Complexidade de algoritmos
- Principais caracter�sticas
- Para ser capaz de classificar um algoritmo como sendo bom, s�o
necess�rias formas de analisar o mesmo.
Analisar um algoritmo significa prever os recursos de que o
algoritmo necessita. (Esses recursos
podem ser mem�ria, largura de banda, processador, etc)
- Em geral, pela an�lise de v�rios algoritmos candidatos para um
problema, pode-se identificar o mais
eficiente. (Podemos ter mais de um candidato, mas sempre
descartamos os menos eficientes)
- O tempo de execu��o de um algoritmo pode ser determinado por:
- M�todos emp�ricos - obter o tempo de execu��o atrav�s da
execu��o propriamente dita do
algoritmo, considerando-se entradas diversas. (� a execu��o
do algoritmo, ou seja, implementar,
compilar e executar esse algoritmo. O problema � que temos
influ�ncias externas nessa
execu��o como a linguagem utilizada, compilador, sisop,
al�m de influencia de hardware.)
- M�todos anal�ticos - O objetivo dos m�todos anal�ticos �
determinar uma express�o matem�tica
que traduza o comportamento de tempo de um algoritmo. Esse
m�todo visa aferir o tempo de
execu��o de forma independente das condi��es locais de
processamento. (N�o executaremos o
algoritmo, a ideia � analisa-lo e chegar a uma expressao
que represente o seu comportamento).
- Nota��o Assint�tica
- Quando observamos tamanhos de entradas suficientemente grandes
para tornar relevante apenas a ordem
de crescimento do tempo de execu��o de um algoritmo,
estamos estudando a efici�ncia assint�tica.
(Estamos preocupados com o modo como o tempo de execu��o do
algoritmo aumento com a entrada no
limite, na que essa entrada aumenta sem limita��es).
- Em geral, um algoritmo que � assintoticamente mais eficiente
(menor complexidade que o outro, qto maior
a sua eficiencia menor a sua complexidade) ser� a melhor
escolha para todas as entradas, exceto
as muito pequenas. (Assim, essa analise vale para entradas
suficientemente grandes)
- A efici�ncia assint�tica observa apenas as entradas grandes o
suficiente para tornar relevante apenas
a ordem de crescimento do tempo de execu��o.
- N�o ser�o consideradas constantes aditivas ou multiplicativas
na express�o matem�tica obtida. (Isso
retira essas constantes para tornar mais simlificada a
express�o)
- Depois de simplificar a express�o, ficaremos apenas com a parte
da fun��o de maior complexidade.
- Por exemplo:
- Um valor de n�mero de passos igual a 3n ser� aproximado
para n. (retira a constante aditiva
ou multiplicativa, nesse caso a multiplicativa).
- Um valor de n�mero de passos igual n^2 + 2 ser�
aproximado para n^2. (fica apenas com a parte
de maior complexidade representando a ordem de
crescimento desse algoritmo).
- Nota��o O (�micron)
- A nota��o O (Big O Notation) � �til para descrever limites
superiores de complexidade. (Limites
superiores de complexidade refere-se ao tempo de execu��o
do algoritmo no sentido do seu pior
caso, assim, o limite superior � o pior caso de execu��o
daquele algoritmo para qualquer entrada).
- Defini��o: Sejam f e g fun��es positivas. Diz-se que f esta na
ordem O de g, escrevendo-se f = O(g),
quando existir uma constante c > 0 e um valor n
suficientemente grande, tal que: f(n) <= c.g(n)
(Ou seja, temos duas fun��es f e g, se f � da ordem O(g) o
g vai ser maior ou igual a f, mas sempre
considerando uma entrada muito grande).
- A fun��o g atua como um limite superior para valores
assint�ticos. (O g seria o pior caso, � o topo
do grafo)
- Exemplo:
# 5n^2 + 3nlogn + 2 � da ordem de O(n2) (desconsidera
constantes multiplicativas e aditivas. Assim
em 5*n^2 descarta o 5, em 3nlogn tira o 3 e o + 2
vira 1. Mas ficamos com o valor de
maior complexidade que � n^2).
5n^2 + 3nlogn + 2 � O(n3) (Essa afirmativa � correta
lembrando que f tem que ser <= g, nesse
caso o f vai dar n^2 e o g � n^3, assim f <= g essa
afirmativa � correta.)
- Obs: No slide 24 do EDA01 podemos verificar que no inicio do
gr�fico qdo a entrada ainda � pequena
tem-se f maior que g, mas depois com entradas maiores tem-
se que g fica maior que f.
- Obs 2: Cuidar com a confus�o, Ex de como isso pode ser cobrado
em exerc�cio:
Considere os seguintes algoritmos e suas complexidades na
nota��o Big O:
- Algoritmo A: O(log n)
- Algoritmo B: O(n2)
- Algoritmo C: O(n . log n)
Considerando-se o pior caso de execu��o destes algoritmos,
� correto afirmar que o algoritmo:
(A) A � o menos eficiente.
(B) C � o menos eficiente.
(C) A n�o � o mais eficiente nem o menos eficiente.
(D) B � o menos eficiente. (CORRETA)
(E) C � o mais eficiente.
- Nota��o ? (theta)
- A nota��o ? � �til para exprimir limites superiores justos.
- Defini��o: Sejam f e g fun��es positivas. Diz-se que f � ?(g),
escrevendo-se f = ?(g), quando ambas
as condi��es f = O(g) e g = O(f) forem verificadas. A
nota��o ? exprime o fato de que duas
fun��es possuem a mesma ordem de grandeza assint�tica. (f e
g devem ser iguais)
- A nota��o ? permite dizer que duas fun��es crescem � mesma
taxa, at� fatores constantes.
- Exemplo:
5n^3 + 3n^2 + 2000 � ? (n3)
- Nota��o O (�mega)
- A nota��o O, descrita a seguir, � �til para descrever limites
inferiores assint�ticos.
- Defini��o: Sejam f e g fun��es positivas. Diz-se que f � O(g),
escrevendo-se f = O(g) quando existir
uma constante c > 0 e um valor n suficientemente grande,
tal que: f(n) >= c.g(n).
- A nota��o O fornece uma maneira assint�tica de dizer que uma
fun��o cresce a uma taxa que � "maior ou
igual" a de uma outra fun��o.
- Exemplo: 3nlogn + 2 � (n3) (Tira-se o multiplicativo 3 e o + 2
vira + 1. Assim, tem-se nlogn + 1.
Portanto, essa express�o est� errada, n^3 � maior que
nlogn, por isso est� errada.)
- Obs: No slide 26 do EDA01 podemos verificar que no inicio do
gr�fico qdo a entrada ainda � pequena
tem-se g maior que f, mas depois com entradas maiores tem-
se que f fica maior que g.
- Nota��o Assint�tica
- A complexidade de tempo de PIOR CASO corresponde ao n�mero de
passos que o algoritmo efetua no seu pior
caso de execu��o, isto �, para a entrada mais desfavor�vel.
A complexidade de pior caso fornece
um LIMITE SUPERIOR para o n�mero de passos que o algoritmo
pode efetuar, em qualquer caso.
Aumento da complexidade
-----------------------------------------------> (+)
-----------------------------------------------------------
------------------
|CONSTANTE | LOGARITMO | LINEAR | NLOGN | QUADR�TICA |
C�BICA | EXPONENCIAL |
|1 | logn | n | nlogn | n^2 | n^3
| a^n |
-----------------------------------------------------------
------------------
(-) <-----------------------------------------------
Diminui��o da complexidade
- A fun��o constante
- Caracteriza algoritmos de complexidade 1,
independentemente do tamanho n de entradas. � o �nico
caso onde as instru��es dos algoritmos s�o executadas
num tamanho fixo de vezes.
(� a fun��o de menor nivel de complexidade, ex � um
algoritmo que identifica se
um numero � par ou impar. Ao entrar com um n�mero
verifica-se o resto para verificar
se � par ou impar. Sempre executa-se o mesmo conjunto
de instru��es.)
- A fun��o logaritmo
- Caracteriza algoritmos de complexidade logn. Ocorre
tipicamente em algoritmos que dividem
problemas em problemas menores. (Como exemplo o
algoritmo de busca bin�ria que tem
como objetivo buscar um elemento num vetor que deve
estar com os elementos ordenados.
Busca-se os elementos comparando-se com o elemento
central, se a entrada � maior
que o central descarta-se a parte inferior do vetor
pq o elemento n�o est� nela,
e isso faz-se recursivamente. O problema � dividido
em problemas menor e isso
caracteriza uma fun��o logaritmica.)
- A fun��o linear
- Caracteriza algoritmos de complexidade n. Uma opera��o
b�sica � executada em cada elemento
de entrada do algoritmo. (Ex: se temos dez elementos
na entrada executariamos 10
vezes no pior caso. Ex: pesquisa sequencial numa
lista que percorre-se da primeira
posi��o at� a �ltima posi��o do vetor no pior caso.)
- A fun��o nLogn
- S�o algoritmos de complexidade nLogn. Ocorre tipicamente
em algoritmos que dividem problemas
em problemas menores, por�m juntando posteriormente a
solu��o dos problemas menores.
(Ex: mergesort � um exemplo. Divis�o e conquista,
onde pega-se os elementos menores e
trabalha em cima deles).
- A fun��o quadr�tica
- S�o os algoritmos de complexidade n^2. Nesses algoritmos,
os itens s�o processados aos pares,
com la�os aninhados. (Ex: somat�rio de duas matrizes
que tem dois la�os aninhados
que identificam os elementos de cada matriz, e dentro
temos a soma dos elementos.
Tr�s la�os aninha � fun��o c�bica.)
- A fun��o c�bica
- S�o algoritmos de complexidade n^3. Nesses algoritmos, os
Itens s�o processados tr�s a tr�s,
com tr�s la�os aninhados. (Ex: multiplica��o de
matrizes com 3 loops)
- A fun��o exponencial
- S�o algoritmos de complexidade a^n. Por se tratar de
algoritmos muito custosos, possuem pouca
aplica��o pr�tica. (Ex: algoritmos de for�a bruta que
testam todas as possibilidades).
- Consideramos um algoritmo mais eficiente que outro se o tempo
de execu��o do seu pior caso apresenta
uma ordem de crescimento mais baixa. Quanto mais complexo,
menos eficiente.
- Arrays
- Principais caracter�sticas
- Um array � uma estrutura de dados que armazena um conjunto de
elementos de forma que os mesmos s�o
acessados por um �ndice.
- Os arrays podem ser unidimensionais (vetores) ou
multidimensionais (matrizes).
- Os arrays s�o agregados homog�neos, ou seja, todos os seus
elementos s�o de um mesmo tipo.
- Os vetores possuem tamanho fixo e suas posi��es s�o cont�guas
na mem�ria. (O compilador realiza
essa aloca��o contigua na mem�ria. Ele calcula a partir do
tamanho do vetor e do seu tipo
corrrespondente a qtdade necess�ria de mem�ria e ap�s esse
c�lcula ele aloca efetivamente).
- O �ndice inicial de um vetor � zero. Dessa forma, ao se
realizar uma varredura em um array, sempre
devemos considerar o intervalo de 0 ao tamanho do vetor
menos 1;
- Manipulando vetores
- Definindo vetores: int [] inteiros = new int [10];
- Acessando elementos em vetores: int terceiroElemento =
inteiros[2];
- Percorrendo todos os elementos de um vetor:
for (int indice = 0; indice < inteiros.length; indice++) {
int elemento = inteiros[indice];
//...
}
- Manipulando matrizes
- Definindo matrizes em java: int inteiros[][] = new int[5][5];
Linha com as suas respectivas colunas:
0[0,1,2,3,4] 1[0,1,2,3,4] 2[0,1,2,3,4] 3[0,1,2,3,4]
4[0,1,2,3,4]
- Acessando elementos em matrizes: int elemento = inteiros[2][3];
0 1 2 3 4
0
1
2 X
3
4
- Percorrendo todos os elementos de uma matriz
for (int linha = 0; linha < 5; linha++) {
for (int coluna = 0; coluna < 5; coluna++) {
int elemento = inteiros[linha][coluna];
//...
}
}
(Entra na primeira linha e percorre TODAS as suas colunas)
- Obs: Cuidar com a diferen�a entre vetores (unidimencionais) e
matrizes (multidimencionais) conforme
a quest�o: "Vetores s�o utilizados quando estruturas indexadas
necessitam de mais que um �ndice
para identificar um de seus elementos." Nesse caso est� errada
essa quest�o, ela est� tratando de
matrizes.
- Obs: Mais um exemplo entre vetores e matrizes:
� uma estrutura de dados dividida em linhas e colunas. Desta
forma, pode-se armazenar diversos valores
dentro dela. Para obter um valor � necess�rio identific�-lo por
meio do n�mero da linha e da coluna onde
est� armazenado. Trata-se de
(A) �rvore.
(B) matriz.
(C) pilha.
(D) fita.
(E) deque.
return valorFactorial;
}
- Pesquisa em Vetores
- Pesquisa Sequencial
- Principais caracter�sticas
- M�todo de busca mais simples. Percorre o vetor
sequencialmente, desde o seu primeiro elemento,
at� que o valor seja encontrado ou que os elementos do
vetor se esgotem. (Dado um vetor e um
elemento procura-se este valor desde a primeira posi��o do
vetor at� encontra-lo.)
- A ideia b�sica do algoritmo seria folhear, por exemplo,
uma lista telef�nica p�gina a p�gina,
at� encontrar o nome desejado ou constatar que o mesmo n�o
existe. (N�o � muito eficiente)
- Algoritmo possui complexidade no pior caso O(n). (O pior
caso � qdo o elemento est� na �ltima
posi��o do vetor, dessa forma, ter�amos que percorrer e
fazer compara��es com todos elementos
do vetor. Outro caso � se o elemento n�o existe no vetor,
assim tb percorreriamos todo vetor)
- Implementa��o
public static int buscaLinear(int[] vetor, int
valorProcurado) {
for (int i=0; i<vetor.length; i++) {
if (vetor[i]==valorProcurado) {
return i;
}
}
return -1;
}
- Pesquisa Bin�ria
- Principais caracter�sticas
- A ideia b�sica do algoritmo � percorrer o vetor como se
folheia, por exemplo, uma lista
telef�nica. Abandonando-se as partes do cat�logo onde o
nome procurado, com certeza, n�o ser�
encontrado. Assim, abrimos a metade do cat�logo e
verificamos o nome, se for maior descarta-se
o primeira meta e segue.
- Para a realiza��o desse tipo de busca, o vetor deve estar
ordenado.
- Esse m�todo exige acesso aleat�rio aos elementos do
conjunto.
- Algoritmo possui complexidade no pior caso O(logn).
(Inferior que o da busca sequencial, ent�o
� mais eficiente que a pesquisa sequencial. O pior caso �
qdo n�o � encontrado ou � o ultimo
elemento.)
- O pior caso ocorre quando o elemento procurado � o �ltimo
a ser verificado, ou mesmo n�o �
encontrado.
- Funcionamento do Algoritmo
- O vetor � dividido ao meio.
- � verificado se o valor procurado � igual ao valor que
corresponde � linha de divis�o. (Avalia
o elemento central primeiramente aqui)
- Caso elemento encontrado, fim da busca.
- Caso valor n�o seja o procurado, � verificado se esta
acima ou abaixo da linha de divis�o.
- Caso esteja abaixo, a parte superior � descartada,
caso contr�rio, a parte inferior �
descartada.
- Isso � feito sistematicamente at� que o valor seja
encontrado ou at� que seja identificado que
o valor n�o esta na lista. A cada compara��o metade dos
elementos da lista s�o descartados.
(Veja que estamos sempre cortando o array no meio e n�o
apenas uma �nica vez)
- Implementa��o iterativa
public int buscaBinaria(int[] array, int valorProcurado) {
int indiceEsq = 0;
int indiceDir = array.length - 1; //tamanho do menor
- 1, � o ultimo elem do vetor
int indiceMeio; //incide central do vetor
- Implementa��o recursiva
private int buscaBinariaRecursiva(int[] array, int
indiceEsq, int indiceDir, int valorProcurado) {
int indiceMeio = (indiceDir + indiceEsq) / 2;
- Algoritmos de Ordena��o
- Principais caracter�sticas
- Os algoritmos de ordena��o s�o de fundamental import�ncia na
ci�ncia da computa��o.
- O melhor algoritmo para determinada aplica��o depende, entre
outros fatores, do n�mero de itens a
ordenar e do grau de ordena��o j� apresentado por esses
itens. (Alguns algoritmos s�o melhores
numa lista de elementos maiores do que outros que s�o
melhor para poucos elementos. Alguns
tb se beneficiam qdo alguns elementos j� est�o ordenados.)
- Ao se ordenar um conjunto de valores, uma quest�o relevante � o
tratamento de elementos que possuem o
mesmo valor. Um algoritmo de ordena��o � est�vel se n�o
altera a posi��o relativa de elementos
que t�m um mesmo valor. (Algumas listas de elementos podem
ter elementos repetidos. Outra
situa��o � n�o alterar a posi��o relativa.)
- Considerando um vetor desordenado com os elementos abaixo:
[44 , 55, 22(1), 66, 77, 33, 11, 22(2), 88] (O valor 22
aparece duas vezes)
- Quando o vetor � ordenado por um algoritmo est�vel, a ordem
relativa dos itens com chaves iguais
mant�m-se inalterada ap�s a ordena��o.
Vetor ordenado com algoritmo est�vel
[11, 22(1), 22(2), 33, 44, 55, 66, 77, 88]
(Ou seja, a ocorrencia do primeiro 22 encontrado ainda
encontr-se na frente da ocorr�ncia do
segundo 22 encontrado)
- Quando o vetor � ordenado por um algoritmo n�o est�vel, a ordem
relativa dos itens com chaves iguais �
alterada ap�s a ordena��o.
Vetor ordenado com algoritmo n�o est�vel
[11, 22(2), 22(1), 33, 44, 55, 66, 77, 88]
(Nesse caso, a segunda ocorr�ncia do 22 aparece na frente
da primeira ocorr�ncia do 22.)
- Selection Sort
- � um tipo de ordena��o por sele��o que consiste em trocar o
menor elemento de uma lista com o elemento
posicionado no inicio da lista, depois o segundo menor
elemento para a segunda posi��o e assim
sucessivamente. (Ou seja, seleciona inicialmente o menor
elemento da lista, esse elemento
vai ser trocado com o elemento da posi��o 0 do vetor, em
seguida vamos trabalhar com o elemento
do indice 1 selecionando o segundo menor elemento da lista
e trocando pelo indice 1 e assim
por diante...)
- Essa algoritmo admite uma varia��o onde a troca � baseada no
maior elemento que � posicionado no final
da lista. (Seria o processo inverso do anterior onde
seleciona o maior elemento que � trocado
com a ultima posi��o do vetor, depois o segundo maior que
troca com a penultima posi��o do
vetor e assim por diante...)
- Algoritmos de ordena��o n�o est�vel. (N�o mantem a ordem dos
elementos com chaves iguais)
- Complexidade O(n^2). (n^2 caracterizada por loop aninhados)
- Implementa��o do Selection Sort:
public void selectionSort(int [] valores) { //array de
inteiros
int menorValor; //armazena o indice com menor chave
- Bubble Sort
- O algoritmo de ordena��o bubble sort � um m�todo simples de
ordena��o por troca.
- O vetor � percorrido do inicio ao fim onde cada elemento
� comparado com o elemento posterior.
- Caso o elemento posterior seja menor, ocorre uma troca
entre os dois elementos.
- Esse procedimento garante que o maior elemento ficar� no
final do vetor.
(Compara o elemento da posi��o 1 com o da 2, se o da 1 �
maior faz a troca, depois compara
o elemento da posi��o 2 com o da 3, se maior faz a troca e
assim por diante.)
- Baixo desempenho para grandes quantidades de informa��es. (Bom
para poucas qtdades de informacoes)
- Na primeira itera��o s�o feitas n-1 compara��es, assim se temos
9 elementos faremos 8 comparacoes,
e o maior valor vai para o final do vetor. Na segunda
itera��o s�o feitas n-2 compara��es e o
segundo maior valor vai para o final do vetor, e assim por
diante. Isso ocorre por que a cada
itera��o o maior valor que ainda n�o foi para sua posi��o,
vai para o final do vetor.
- Algoritmos de ordena��o est�vel.
- Complexidade no pior caso: O(n^2).
- Implementa��o do Bubble Sort:
void bubbleSort(int valores[]) {
//a cada iteracao desse loop temos o maior valor no
fim do array
for (int i = valores.length - 1; i>0; i--) { //i
recebe o vetor todo, ele vai da ordem
//decrescente.
//esse loop coloca o maior no fim do array,
depois o i vai comprimir mais uma
//posicao e de novo temos o maior valor no
final.
for (int j=0; j<i; j++) { //vai de 0 at� o i-1
//compara o atual com o posterior
if (valores[j] > valores[j+1]) {
int aux = valores[j];
valores[j] = valores[j+1];
valores[j+1] = aux;
}
}
}
}
- Heap Sort
- Esse algoritmo de ordena��o faz uso de uma estrutura de dados
chamada heap para gerenciar as
informa��es. (Usa o heap para ordenar os elementos)
- A estrutura de dados heap pode ser vista como uma �rvore
bin�ria quase completa. (numa �rvore bin�ria
cada n� pode ter at� no m�ximo dois filhos e no m�nimo zero
filhos)
- Existem dois tipos de heaps (heap de minimo e heap de m�ximo),
o algoritmo de ordena��o por heap
utiliza heaps de m�ximo. Nesse tipo de heap, o valor de um
n� deve ser no m�ximo o valor do
seu pai. (N�o podemos ter um n� com valor superior ao seu
pai)
- Heap sort � um algoritmo de ordena��o n�o est�vel. (chaves
iguais tem a ordem alterada apos a ordenacao)
- Possui complexidade O(nlogn).
- Opera��es de um heap:
- Max-Heapify � essa opera��o � usada para manter a
propriedade de um heap de m�ximo (essa
propriedade � aquele que um n� pode ser no m�ximo o
valor do seu pai). Ela possui
como entrada o arranjo A e o �ndice i para o arranjo.
Essa opera��o permite que A[i]
obede�a � propriedade do heap de m�ximo. (Garantimos
que passando determinado elemento
do array vamos garantir que ele mantenha um heap
integro com a propriedade de heap max.)
Ex de um heap:
16
14 10
08 07
- Build-Max-Heap � essa opera��o converte um arranjo em um
heap de m�ximo. (usa o Max-Heapify. Mas
o que ela faz � construir de fato o heap. � como
passar um array e ela constr�i um heap
integro)
- Representa��o de um heap de m�ximo:
16
14 10
8 7 9 3
2 4 1
|16|14|10|08|07|09|03|02|04|01|
|16|14|10|08|07|09|03|02|04|01|
Chamamos o maxHeapify(valores,0,--
comprimento); e ficamos com
|10|08|09|04|07|01|03|02| -> Esta nova
disposi��o do array � pq agora
temos um novo elemento raiz que
ter� novos filhos que ter�o seus
filhos, por isso muda-se a
disposi��o desse array.
- De novo troca: |02|08|09|04|07|01|03|10|
Chamamos Maxheapify e obtemos: |09|08|03|
04|07|01|02|->|10||14|16|
- De novo troca e o 9 sai do heap; |02|08|03|
04|07|01|09|->|10||14|16|
Chamamos Maxheapify e obtemos: |08|07|03|
04|02|01|->|09|10||14|16|
- Merge Sort (Ver outro material, ficou muito confuso a aula 11)
- Esse algoritmo segue o paradigma divis�o e conquista.
- Funcionamento do merge sort:
- Divis�o: Divide a sequ�ncia de n elementos que deve ser
ordenada em subsequ�ncias de n/2
elementos cada uma.
- Conquista: Ordena as duas sequencias recursivamente. A
recurs�o termina quando a sequ�ncia a
ser ordenada tiver apenas um elemento. (Resolve cada
parte dividida com recursao)
- Combina��o: Intercala as duas subsequ�ncias ordenadas
para produzir a resposta ordenada.
- A opera��o mais importante desse algoritmo � conhecida como
merge. Ela consiste da intercala��o de
duas sequencias j� ordenadas. (Merge � feita na combina��o
e trabalha nas duas seq. ja ordenadas)
- A opera��o merge recebe duas subsequ�ncias j� ordenadas e
mescla todos os valores mantendo o resultado
ordenado em um �nico subarranjo.
- Merge sort � um algoritmo de ordena��o est�vel.
- Possui complexidade O(nlogn).
- Implementa��o do Merge Sort em java:
Inicio e fim delimitam a faixa que ser� trabalhada por esse
m�todo
private void mergesort(int[] valores, int inicio, int fim)
{
if (inicio < fim) { //caso base qdo tivermos um unico
elemento
int meio = (inicio + fim) / 2; //divide o
problema em dois
mergesort(valores, inicio, meio); //ordena a
primeira metade do vetor
mergesort(valores, meio+1, fim); //ordena a
segunda metade
merge(valores,inicio,meio,fim); //mescla
}
}
- Quick Sort
- O quick sort � um m�todo de ordena��o por troca que aplica o
paradigma de divis�o e conquista.
- Funcionamento:
- Um elemento do arranjo inicialmente ser� escolhido como
piv�. (N�o h� um concenso de como ele
deve ser escolhido. Aqui adotou-se que o ultimo
elemento do vetor ser� o pivo)
- Em seguida o arranjo � dividido em 2 subarranjos:
- Elementos menores ou iguais ao piv�.
- Elementos maiores que o piv�
(O pivo � usado no particionamento, a parte mais
importante do algoritmo. Elementos
menores para esquerda e maiores para direita)
- Os dois arranjos do passo anterior s�o ordenados
recursivamente com o quick sort.
- Observa��o: Caso base ocorre quando o vetor possui
somente um elemento.
- Esse algoritmo n�o requer uma estrutura complementar para sua
execu��o, todo o processamento ocorre no
mesmo arranjo de origem. (mergesort precisa de uma
estrutura complementar)
- Algoritmo de ordena��o n�o est�vel.
- Complexidade no pior caso O(n^2).
- Complexidade no melhor caso O(nlogn).
- Implementa��o do Quick Sort em java:
private void quicksort(int[] valores, int i, int f) {
if (i<f) { //verifica se o indice inicial � menor que
o indice final
int q = partition(valores, i, f);
quicksort(valores, i, q-1); //chamada recursiva
para o elementos inferiores
quicksort(valores, 1+1, f);
}
}
pivo = 4;
Ap�s a execu��o do particionamento tem-se:
|03|01|02|04|09|07|08|05| - antes do 4 os menores, depois
os maiores
- Tabela Resumo (Em ordem de efici�ncia. Os pior caso tem tudo n^2
menos o mais eficiente dos piores que � a
inser��o direta. J� os mais eficientes tem uma
exce��o que � o pior dos mais eficientes
que possui n^2.)