Você está na página 1de 6

Algoritmos e Estruturas de Dados

12 de Junho de 2015

ISCTE - Instituto Universitrio de Lisboa


Licenciatura em Informtica e Gesto de Empresas (IGE)
Licenciatura em Engenharia de Telecomunicaes e Informtica (ETI)
Licenciatura em Engenharia Informtica (EI)

Algoritmos e Estruturas de Dados


(Exame de 1 poca)
Durao: 2 horas
(1) (6 valores) Enriquea os tipos Java com a especificao de um tipo abstrato de dados de listas
de caracteres que inclua as seguintes operaes: nova (denotando a lista vazia), acr (que dada
uma lista e um carcter coloca este no fim da lista), primeiro (que dada uma lista indica qual o
primeiro elemento da lista), retiraprim (que dada uma lista retira o primeiro elemento da lista),
vazia (que dada uma lista indica se esta est vazia), junta (que dadas duas listas coloca uma
frente da outra), existe (que dada uma lista e um caracter verifica se este existe na lista), inverte
(que dada uma lista devolve essa lista com os elementos por ordem inversa) e retiratodos (que
dada uma lista e um caracter retira todas as ocorrncia desse caracter da lista).
(2) (3 valores) Esboce em Java uma implementao esttica para o tipo abstrato de dados
especificado na alnea (1). Indique, apenas, a representao escolhida para o gnero e para as
operaes nova, acr, retiraprim e existe.
(3) (3 valores) Repita a implementao anterior mas utilizando agora uma gesto dinmica do
espao em memria.
(4) (5 valores) Implemente, utilizando heaps binrios, o seguinte interface correspondente a uma
fila prioritria de inteiros:
public interface FilaPri{
void nova();
void insere(int n);
int menor();
void retira();
}

// inicializa a fila
// insere um inteiro na fila
// devolve o menor inteiro na fila
// retira o menor inteiro na fila

(5) (3 valores) Implemente o mtodo void ordena(int[] v, int n) que ordena uma matriz v de n
inteiros por ordem crescente, de acordo com o algoritmo de seleo direta. Analise a eficincia
do algoritmo justificando os resultados indicados.

Algoritmos e Estruturas de Dados


ISCTE - Instituto Universitrio de Lisboa
Licenciatura em Informtica e Gesto de Empresas (IGE)
Licenciatura em Engenharia de Telecomunicaes e Informtica (ETI)
Licenciatura em Engenharia Informtica (EI)

Algoritmos e Estruturas de Dados


Resoluo do exame de 1 poca
(1) (6 valores)
especificao lista de caracteres = char boolean
gneros
lista
operaes
construtoras
nova: lista ;
acr: lista char lista
acessrias;
primeiro: lista char;
retiraprim: lista lista;
vazia: lista boolean;
junta: lista lista lista;
existe: lista char boolean;
inverte: lista lista;
retiratodos: lista char lista
axiomas
( L, L1, L2 lista) ( I,I1,I2char)
primeiro(acr(nova,I)) = I ;
primeiro(acr(acr(L,I1),I2)) = primeiro(acr(L,I1));
ultimo(acr(L,I)) = I ;
retiraprim(acr(nova,I)) = nova ;
retiraprim(acr(acr(L,I1),I2)) = acr(retiraprim(acr(L,I1)),I2);
vazia(nova) = true ;
vazia(acr(L,I)) = false;
junta(L, nova) = L;
junta(L1, acr(L2,I)) = acr(junta(L1,L2),I);
existe(nova, I) = false;
existe(acr(L,I1), I2) = se I1 == I2 ento true
seno existe(L, I2)
inverte(nova) = nova;
inverte(acr(L,I)) = junta(acr(nova,I),inverte(L)) ;
retiratodos(nova,I) = nova ;
retiratodos(acr(L,I1),I2) = se I1 == I2 ento retiratodos(L,I2)
seno acr(retiratodos(L,I2),I1);
pr-condies
( Llista)
primeiro(L) requer
!vazia(L);
retiraprim(L) requer
!vazia(L)
fim

12 de Junho de 2015

Algoritmos e Estruturas de Dados

12 de Junho de 2015

ISCTE - Instituto Universitrio de Lisboa


Licenciatura em Informtica e Gesto de Empresas (IGE)
Licenciatura em Engenharia de Telecomunicaes e Informtica (ETI)
Licenciatura em Engenharia Informtica (EI)

(2) (3 valores)
public class lista{
protected static final int lim=100;
protected char [] ve=new char[lim];
protected int prim, ult;
protected static int seg(int i){return (i+1)%lim;}
public void nova(){
prim=-1;
ult= -1;
}
public void acr(char n){
if(seg(ult)== prim) throw new IllegalStateException (
"Erro: capacidade da fila excedida!");
else {
ult=seg(ult);
ve[ult]=n;
if(prim==-1) prim=0;
}
}
void retiraprim(){
if(prim==-1) throw new IllegalStateException ("Erro: fila vazia!");
else {
if(prim!=ult)
prim=seg(prim);
else{
prim=-1;
ult=-1;
}
}
}
boolean existe(char c){
if(prim==-1) return false;
else { boolean encontrei = ve[k] == c;
int k = seg(prim);
while(k!=seg(ult) && !encontrei){
if(ve[k] == c) encontrei == true;
k=seg(k);
}
return encontrei;
}
}

Algoritmos e Estruturas de Dados


ISCTE - Instituto Universitrio de Lisboa
Licenciatura em Informtica e Gesto de Empresas (IGE)
Licenciatura em Engenharia de Telecomunicaes e Informtica (ETI)
Licenciatura em Engenharia Informtica (EI)

(3) (3 valores)
public class lista{
protected class NO{
char val;
NO seg;
}
protected NO prim, ult;
public void nova(){
prim=null;
ult= null;
}
public void acr(char n){
No aux=new No();
aux.val=n;
aux.seg= null;
if(prim != null) ult.seg = aux;
else prim=aux;
ult=aux;
}
void retiraprim(){
if(prim != null){
prim = prim.seg;
if(prim == null) ult = null;
}
else throw new IllegalStateException (Erro: lista vazia!);
}
boolean existe(char c){
if(prim==null) return false;
else { boolean encontrei = false;
int k = prim;
while(k!=null && !encontrei){
if(ve[k] == c) encontrei == true;
k= k.seg;
}
return encontrei;
}
}

12 de Junho de 2015

Algoritmos e Estruturas de Dados

12 de Junho de 2015

ISCTE - Instituto Universitrio de Lisboa


Licenciatura em Informtica e Gesto de Empresas (IGE)
Licenciatura em Engenharia de Telecomunicaes e Informtica (ETI)
Licenciatura em Engenharia Informtica (EI)

(4) (5 valores)
public class FilaPriHeap implements FilaPri{
protected static final int lim=100;
protected int[] ve=new int[lim+1];
protected int n_elementos;
public void nova(){n_elementos=0;}
public void insere(int n){
if(n_elementos!=lim){
int posicao = ++n_elementos;
while(posicao>1 && n<ve[posicao/2]){
ve[posicao]=ve[posicao/2];
posicao = posicao/2;
}
ve[posicao]=n;
}
else throw new IllegalStateException("Erro: capacidade da fila prioritria excedida!");
}
public int menor(){
if(n_elementos!=0) return ve[1];
else throw new IllegalStateException("Erro: fila prioritria vazia!");
}
public void retira(){
if(n_elementos!=0){
int posicao=1, menordescendente;
int aux = ve[n_elementos--];
boolean auxmenordescendente = true ;
while(posicao *2<=n_elementos && auxmenordescendente){
menordescendente=posicao*2;
if( menordescendente != n_elementos &&
ve[menordescendente+1]<ve[menordescendente])
menordescendente++;
if(aux<ve[menordescendente]) auxmenordescendente = false ;
else {
ve[posicao]=ve[menordescendente];
posicao = menordescendente;
}
}
ve[posicao]=aux;
}else throw new IllegalStateException("Erro: fila prioritria vazia!");
}

Algoritmos e Estruturas de Dados


ISCTE - Instituto Universitrio de Lisboa
Licenciatura em Informtica e Gesto de Empresas (IGE)
Licenciatura em Engenharia de Telecomunicaes e Informtica (ETI)
Licenciatura em Engenharia Informtica (EI)

(5) (3 valores)
void ordena(int[] v, int n){
Contacto x;
for(int k = 0; k <= n-2; k++){
int pos = n-1;
for(int i=n-2; i >= k; i--)
if(v[i]>v[pos]) pos = i;
x = v[k]; v[k] = v[pos]; v[pos] = x;
}
}
C(n) = k=0..n-2(i=k..n-2 1) = (n2 n)/2
M(n) = k=0..n-2 3 = 3(n 1)

12 de Junho de 2015

Você também pode gostar