Sunteți pe pagina 1din 25

Programao Linear - 2o.

Semestre 2017

Turma Quinto ADS Fatec Taubat


Segundo Semestre de 2017

SISTEMAS DISTRIBUDOS
Divani Barbosa
http://professoradivani.blogspot.com.br/

Aula 2

AULA 2
Reviso aula anterior
Vantagens e Desvantagens de uso das Classes Vetor e
VetorOrdenado

Fila de Prioridade
Algoritmo
Implementao em Java

Atividades Fixao Vetor e Fila Prioridades

HeapSort
Algoritmo
Implementao em Java
2

Atividades Fixao HeapSort

profa. Divani Barbosa Gavinier 1


Programao Linear - 2o. Semestre 2017

VANTAGENS
O que ganhamos ao usar vetores ordenados?

Estrutura Insero Eliminao Pesquisa


Vetor O(1) O(n) O(n)
Vetor Ordenado O(n) O(n) O(log n)

A principal vantagem que o tempo de pesquisa


muito mais rpido do que num vetor no ordenado.
A desvantagem que a insero leva mais tempo,
porque todos os itens de dados com valores maiores que
a chave devem ser movidos para cima para criar
espao.
As remoes so lentas tanta nos vetores ordenados 3

como no ordenados.

VANTAGENS
O que ganhamos ao usar vetores ordenados?

Estrutura Insero Eliminao Pesquisa


Vetor O(1) O(n) O(n)
Vetor Ordenado O(n) O(n) O(log n)

Vetores Ordenados so uteis em situaes nas quais as


pesquisas so frequentes, mas, remoo e insero no.

Exemplo: Uma base de dados de funcionrios de uma


empresa. Contratar e despedir funcionrios so
ocorrncias pouco frequentes em comparao com o
acesso ao registro de funcionrios existentes para obter
informaes ou atualiza-las como alterao de endereo 4e
salrio.

profa. Divani Barbosa Gavinier 2


Programao Linear - 2o. Semestre 2017

FILA DE PRIORIDADE
Estrutura de Armazenamento de Dados de Propsito Especial

Usa o princpio de que o primeiro que entra o


primeiro que sai.

First In, First Out (FIFO)


Incio
Excluses posio
e zero Final
Consultas Inseres

Necessita de controle de acesso do elementos do fim e


inicio (zero)

FILA DE PRIORIDADE
Estrutura de Armazenamento de Dados de Propsito Especial

Igual a Fila comum, tem uma frente e um final, os


itens so inseridos no final e removidos da frente.

Porem, uma fila de prioridades, os itens so adicionados


pelo valor chave, de modo que o item com a chave mais
baixa esteja sempre na frente.

Itens so inseridos na devida posio para manter a


ordem
43 109 320 632 841

frente fim
500
6
43 109 320 500 632 841
frente fim

profa. Divani Barbosa Gavinier 3


Programao Linear - 2o. Semestre 2017

Uma fila precisa de uma classe de objetos N, assim


como na lista simplesmente encadeada.

Classe N:
class No {
espao para armazenamento
public long item;
da informao
public No prox;

public No(long v) { Um espao para armazenar uma


item = v; referncia da localizao na
} memria onde o prximo N se
encontra.
}

7
construtor

FILA DE PRIORIDADE
Ao contrrio do vetor, na estrutura de dados do tipo fila
(simplesmente encadeada) os itens so adicionados
dinamicamente, ou seja, conforme a necessidade do usurio
e da capacidade do sistema onde ela ser operada.

frente final

No No No No

PROX = NULL PROX= NULL PROX = NULL PROX = NULL


item = 10 item = 27 item = 30 item = 45

ESTRUTURA (todos os elementos ou)

profa. Divani Barbosa Gavinier 4


Programao Linear - 2o. Semestre 2017

Classe FilaPrior:
Campos Construtor
private No frente; public FilaPrior() {
private No fim; frente = null;
fim = null;
}
Mtodos
front: Retorna o item da frente.
end: Retorna o item do final.
empty: Retorna verdadeiro se fila vazia.
push: Insere itens de maneira ordenada na
fila. 9

pop: Remove itens da fila.

class FilaPrior {
private No frente;
private No fim;

public FilaPrior() {
frente = null;
fim = null;
}

public long front() { return frente.item; }


public long end() { return fim.item; }
public boolean empty() { return ( fim == null ); }

public void pop() {


if (empty()) return;
if (frente.prox == null) fim = null;
frente = frente.prox;
}
10

profa. Divani Barbosa Gavinier 5


Programao Linear - 2o. Semestre 2017

// Insere itens com prioridade


public void push(long valor) {

No novo = new No(valor);

if (empty()) { // Se primeiro item


novo.prox = null;
frente = novo;
fim = novo;
}

else { // Se NAO for o primeiro item

// Insere aqui tratamento

} // fim da classe FilaPrior


11

No atual = frente;
No anterior = null;
while (atual != null) { // caminha para a posio de inserir
if (atual.item > valor) break; Quando sair do lao while,
anterior = atual; atual ser a posio a ser
atual = atual.prox; inserido o item e anterior o
item anterior ao atual.
}
if (anterior == null) { // Se o No ser inserido no inicio
novo.prox = atual;
frente = novo;
}
else if (atual == null) { // Se o No ser inserido no fim
novo.prox = null;
anterior.prox = novo;
fim = novo;
}
else { // Se No ser inserido no meio
novo.prox = atual;
anterior.prox = novo; 12
}
}

profa. Divani Barbosa Gavinier 6


Programao Linear - 2o. Semestre 2017

Adicionando N na frente
if (anterior == null)
{
novo.prox = atual; anterior = null
frente = novo;
}

atual
novo frente fim

No No No No

PROX = PROX= NULL PROX = NULL PROX = NULL


item = 10 item = 27 item = 30 item = 45

13
N a ser ESTRUTURA
adicionado

Adicionando N na frente
if (anterior == null)
{
novo.prox = atual; anterior = null
frente = novo;
}

atual
novo frente fim

No No No No

PROX = NULL PROX= NULL PROX = NULL PROX = NULL


item = 10 item = 27 item = 30 item = 45

14

ESTRUTURA

profa. Divani Barbosa Gavinier 7


Programao Linear - 2o. Semestre 2017

Adicionando N na frente
if (anterior == null)
{
novo.prox = atual; anterior = null
frente = novo;
}

frente
novo atual fim

No No No No

PROX = NULL PROX= NULL PROX = NULL PROX = NULL


item = 10 item = 27 item = 30 item = 45

15

ESTRUTURA

Adicionando N no fim
if (atual == null) {
novo.prox = null; atual = null
anterior.prox = novo;
fim = novo;
}
anterior
frente fim novo

No No No No

PROX= NULL PROX = NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 45 item = 70

16
ESTRUTURA N a ser
adicionado

profa. Divani Barbosa Gavinier 8


Programao Linear - 2o. Semestre 2017

Adicionando N no fim
if (atual == null) {
novo.prox = null; atual = null
anterior.prox = novo;
fim = novo;
}
anterior
frente fim novo

No No No No

PROX= NULL PROX = NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 45 item = 70

ESTRUTURA

Adicionando N no fim
if (atual == null) {
novo.prox = null; atual = null
anterior.prox = novo;
fim = novo;
}

fim
frente anterior novo

No No No No

PROX= NULL PROX = NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 45 item = 70

18

ESTRUTURA

profa. Divani Barbosa Gavinier 9


Programao Linear - 2o. Semestre 2017

Adicionando N no meio novo


else {
novo.prox = atual; No
anterior.prox = novo;
}
PROX =
item = 45

19
atual
frente anterior N a ser fim
adicionado

No No No

PROX= NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 70

ESTRUTURA

Adicionando N no meio novo


else {
novo.prox = atual; No
anterior.prox = novo;
}
PROX = NULL
item = 45

20
atual
frente anterior N a ser fim
adicionado

No No No

PROX= NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 70

ESTRUTURA

profa. Divani Barbosa Gavinier 10


Programao Linear - 2o. Semestre 2017

Adicionando N no meio novo


else {
novo.prox = atual; No
anterior.prox = novo;
}
PROX = NULL
item = 45

21
atual
frente anterior N fim
adicionado

No No No

PROX= NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 70

ESTRUTURA

Adicionando N no meio
else {
novo.prox = atual;
anterior.prox = novo;
}

22
atual
frente anterior novo fim

No No No No

PROX= NULL PROX = NULL PROX = NULL PROX = NULL


item = 27 item = 30 item = 45 item = 70

ESTRUTURA

profa. Divani Barbosa Gavinier 11


Programao Linear - 2o. Semestre 2017

Exemplo de uso da classe FilaPrior:

23

VANTAGENS
O que ganhamos ao usar fila de prioridade?

Estrutura Insero Eliminao Pesquisa


Vetor O(1) O(n) O(n)
Vetor Ordenado O(n) O(n) O(log n)
Fila de
O(n) O(1) -
Prioridade

A principal vantagem que o tempo eliminao


muito rpido (valor mximo e mnimo).
A desvantagem que a insero leva mais tempo, pois
deve se encontrar posio ideal para inserir o item.
Exemplo: Fila de prioridades podem ser usadas para 24

escalonamento de tarefas em computadores

profa. Divani Barbosa Gavinier 12


Programao Linear - 2o. Semestre 2017

ATIVIDADES FIXAO
Escrever programas para resolver os projetos de programao
ajuda a solidificar sua compreenso do material e demonstra
como aplicar os conceitos da aula.

1. Para a classe VetorOrdenado adicione um mtodo que retorne


o valor da chave mais alta ou -1 caso o vetor esteja vazio.
Adicione algum cdigo em main() para exercitar esse mtodo.

2. Modifique o mtodo implementado no exerccio 2 para que o


item com a chave mais alta no seja apenas retornado pelo
mtodo, mas tambm removido do vetor. Chame o mtodo de
removeMax().

3. Implemente sua prpria classe Vetor. Se o usurio da classe


estiver para transbordar o vetor interno nesta classe, o algoritmo
de insero criar um novo vetor de tamanho maior, copiar o
contedo do antigo vetor para o novo vetor e ento inserir o
novo item. Esse processo inteiro seria invisvel para o usurio da
classe.

4. Modifique a classe VetorOrdenado para que o mtodo


remover, assim como o buscar, use a pesquisa binria.

5. Escreva um mtodo para a classe Fila de Prioridades que


exiba todo o contedo da fila (do inicio ao fim) sem retirar itens.
Adicione algum cdigo em main() para exercitar esse mtodo.

26

profa. Divani Barbosa Gavinier 13


Programao Linear - 2o. Semestre 2017

HEAPS
Estrutura de Armazenamento de Dados de Propsito Especial

Uma heap uma estrutura de dados do tipo rvore.


Ela oferece insero e eliminao num tempo O(log n).

Assim ele no to rpido para eliminao como a fila


de prioridades, porm, muito mais rpido para
insero.

o mtodo ideal para implementar filas de prioridades


onde velocidade seja importante e haja muita
inseres.

27

Uma Heap uma arvore binria com as seguintes


caractersticas:
1. completo. Isso significa que ele fica
completamente preenchido, lendo da esquerda
para direita cada linha, embora a ltima linha no
precise estar cheia.

Exemplo:

Arvore binria completa Arvore binria incompleta

profa. Divani Barbosa Gavinier 14


Programao Linear - 2o. Semestre 2017

2. implementado como vetor. Usa-se vetor para


armazenamento do contedo, ao invs de referencias
para conectar os Ns.
Vetor
da Heap Heap

O vetor armazenado na memria, a Heap


apenas uma representao conceitual.

O fato de que a Heap uma arvore binria completa


implica na inexistncia de buracos no vetor usado para
representa-la. Cada clula esta preenchida de 0 a n-1.
Vetor
da Heap Heap

profa. Divani Barbosa Gavinier 15


Programao Linear - 2o. Semestre 2017

3. Cada N de uma Heap satisfaz a condio de


Heap, que estabelece que a chave de todo N maior
ou igual que as chaves de seus filhos.

Fracamente ordenado:
Uma Heap fracamente ordenado em comparao a
uma arvore binria de busca (que usa algoritmo
simples).
Em uma Heap percorrer os Ns em ordem difcil
porque o principio de organizao (condio de Heap)
no to forte.
S se pode afirmar que em
todo caminho da raiz at a
folha os Ns esto
ordenados em ordem
descendente.

Como Heaps so
fracamente ordenados,
algumas operaes so 32

difceis ou impossveis.

profa. Divani Barbosa Gavinier 16


Programao Linear - 2o. Semestre 2017

Uma Heap no permite uma busca conveniente para uma


chave especifica. Isso porque no h informao suficiente
para decidir qual dos dois filhos de um N selecionar para
descer num nvel mais baixo durante a busca.
Portanto um N com uma chave especificada no pode ser
eliminado num tempo O(log n), porque no h maneira de
encontra-lo.
A organizao de uma
Heap esta prxima de um
estado de aleatoriedade.

Entretanto, a ordem
suficiente apenas para
permitir remoo rpida
do N mximo e insero
rpida de novos Ns. 33

Remoo
Remoo significa remover um N com a chave mxima.
Esse N sempre a raiz e ela esta no ndice 0 do vetor da
Heap, poranto remove-lo fcil.

O problema que restara um buraco que tem de ser


preenchido. Para isso usa-se os seguintes passos:

1. Remova a raiz
2. Mova o ultimo N para raiz

vHeap[0] = vHeap[n-1];
n--;

3. Passe para baixo o ultimo N at que ele fique abaixo 34


de
um N maior e acima de um N menor.

profa. Divani Barbosa Gavinier 17


Programao Linear - 2o. Semestre 2017

3.a) 3.b)

Troca
pelo filho
maior

3.c) 3.d)

35

3.e)

Move para baixo:


A cada posio do N destino o algoritmo de passagem
para baixo verifica qual o filho maior. Ele ento troca o N
destino com o filho maior. Se ele tentasse trocar com o
filho menor, esse filho se tornaria pai de um filho maior, o
que viola a condio da Heap.

36

ERRADO CORRETO

profa. Divani Barbosa Gavinier 18


Programao Linear - 2o. Semestre 2017

Insero
A insero usa passagem para cima, ao invs de para
baixo. Inicialmente o N a ser inserido colocado na
primeira posio aberta no final do vetor.

vHeap[n] = novo;
n++;

Logo aps, caso se faa necessrio para se manter a


condio de Heap, o novo N ser passado para cima at
que fique abaixo de um N com uma chave maior e acima
de um N com uma chave menor.

37

a) b)

N a ser
inserido

c) d)

38

profa. Divani Barbosa Gavinier 19


Programao Linear - 2o. Semestre 2017

e)

Move para cima:


O algoritmo de passagem para cima mais simples que
para baixo, pois h somente uma comparao (dois filhos
no precisam ser comparados).

39

CDIGO JAVA PARA HEAPS


Na implementao do cdigo em Java sero levadas em
considerao as seguintes relaes para um N no ndice x
do vetor: Seu pai (x-1)/2
Seu filho a esquerda 2*x+1
Seu filho a direita 2*x+2

40

profa. Divani Barbosa Gavinier 20


Programao Linear - 2o. Semestre 2017

Classe N:
class No {
private int item; espao para
armazenamento da
public No(int v) { informao (chave)
item = v;
} Construtor insere itens

public int getItem() { Mtodo que


return item; retorne o item
} chave (consultas)

public void setItem(int v) { Mtodo que altera


item = v; o contedo do item
} (mover acima ou
41
} abaixo)

Classe Heap:
Campos Construtor
private No[] vHeap; public Heap(int v) {
private int tam_max; tam_max = v;
private int n; n = 0;
vHeap = new No[tam_max];
}
Mtodos
vazio: retorna verdadeiro se vazio.
cheio: retorna verdadeiro se cheio.
insere: insere itens.
remove: remove itens retornando-os.
MoveAcima e MoveAbaixo: move itens 42

(usado pelos mtodos insere e remove).

profa. Divani Barbosa Gavinier 21


Programao Linear - 2o. Semestre 2017

class Heap {
private No[] vHeap;
private int tam_max;
private int n;

public Heap(int v) {
tam_max = v;
n = 0;
vHeap = new No[tam_max];
}

public boolean vazio() { return n==0; }


public boolean cheio() { return n==(tam_max-1); }

public boolean insere(int v) {


if (cheio()) return false;
No novo = new No(v);
vHeap[n] = novo;
MoveAcima(n); n++;
43
return true;
}

public int remove() { // Elimina item com a chave mxima


No root = vHeap[0]; // (assume Heap no vazia)
vHeap[0] = vHeap[n-1];
n--;
MoveAbaixo(0);
return root.getItem();
}

public void MoveAcima(int indice) {


int pai = (indice-1)/2;
No guarda = vHeap[indice];
while (indice>0 && vHeap[pai].getItem()<guarda.getItem())
{
vHeap[indice] = vHeap[pai];
indice = pai;
pai = (pai-1)/2;
}
vHeap[indice] = guarda;
}
44

profa. Divani Barbosa Gavinier 22


Programao Linear - 2o. Semestre 2017

public void MoveAbaixo(int indice) {


int filhoMaior, filhoEsq, filhoDir;
No topo = vHeap[indice];
while (indice < n/2) { // enquanto No tiver pelo menos um filho
filhoEsq = 2*indice+1;
filhoDir = filhoEsq+1;
if (filhoDir<n && vHeap[filhoEsq].getItem() <
vHeap[filhoDir].getItem())
filhoMaior = filhoDir;
else
filhoMaior = filhoEsq;
if (topo.getItem() >= vHeap[filhoMaior].getItem())
break;
vHeap[indice] = vHeap[filhoMaior];
indice = filhoMaior;
}
vHeap[indice] = topo;
}
45
} // fim classe Heap

Exemplo de uso da Classe Heap:

46

profa. Divani Barbosa Gavinier 23


Programao Linear - 2o. Semestre 2017

VANTAGENS
O que ganhamos ao usar heapsort?

Estrutura Insero Eliminao Pesquisa


Vetor O(1) O(n) O(n)
Vetor Ordenado O(n) O(n) O(log n)
Fila de
O(n) O(1) -
Prioridade
HeapSort O(log n) O(log n) -
A principal vantagem que o tempo de insero mais
rpido que o da Fila de Prioridades.

Uma Heap uma implementao eficiente de uma


47
fila de prioridades

ATIVIDADES FIXAO
Continuao...

6. Modifique o mtodo de remoo de itens da classe Heap


para que o mesmo verifique antes se a Heap esta vazia.

7. Um problema da implementao da Heap baseado em


vetor o tamanho fixo do vetor. Se os seus dados
extrapolarem o vetor, voc precisar expandi-lo. Evite esse
problema implementando no algoritmo de insero uma
verificao, caso o usurio da classe estiver para
transbordar o vetor interno, o algoritmo de insero criar
um novo vetor com o dobro do tamanho atual, copiar o
contedo do antigo vetor para o novo vetor e ento inserir
o novo item. Esse processo inteiro seria invisvel para o
48
usurio da classe.

profa. Divani Barbosa Gavinier 24


Programao Linear - 2o. Semestre 2017

8. O mtodo insere da classe Heap alm de inserir itens,


assegura que a condio de heap seja preservada. Escreva
um mtodo (toss()) que coloque um novo N no vetor da
heap sem tentar manter a condio de heap.

9. Escreva um novo mtodo chamado restore() que restaure


a condio de heap no vetor inteiro. Use toss()
repetidamente para inserir itens e depois um nico
restore() para restaurar a condio de heap.
Um nico mtodo restore() ser mais eficiente que usar
insert() repetidamente quando uma grande quantidade de
dados tiver que ser inserida de uma s vez.

49

profa. Divani Barbosa Gavinier 25

S-ar putea să vă placă și