Escolar Documentos
Profissional Documentos
Cultura Documentos
(AED)
2º semestre 2022/2023
Semana 5
Sacos, Deques, Listas e Filas
Prioritárias – Implementação
▪ Parte 1:
▪ Bags – Implementação com Array e Linked-Lists
▪ Deques – Implementação com Array e Linked-Lists
▪ Parte 2:
▪ Lists – Implementação com Array e Linked-Lists
▪ Priority Queues – Implementação com Array e Linked-Lists
Referência
▪ Implementação:
Stack (sem a operação pop) ou Queue (sem a
operação dequeue).
(from KW slides, used with permission)
Lista duplamente terminada
(Deque)
Deque API
▪ Principal aplicação: Utilização simultânea de operações
existentes em Stack e Queue. Suporta facilmente rotações
de elementos no sentido horário e anti-horário.
▪ Representação:
▪ d[]: array redimensionável para armazenar os itens do deque
▪ first: índice do primeiro item do deque
▪ last: índice do último item do deque
▪ pushLeft(item): decrementa first; adiciona item em d[first]
▪ pushRight(item): incrementa last; adiciona item em d[last]
▪ popLeft(): remove item de d[first]; incrementa first
▪ popRight(): remove item de d[last]; decrementa last
▪ Ocupação circular do array para otimizar o espaço
0 1 2 3 4 5 6 7 8 9
first last
Deque – Implementação com Array
▪ Representação:
▪ Incremento circular: Resto da divisão pela capacidade do array
next(i) = (i + 1) % d.lenght
i – 1 , i > 0
previous(i) = ቊ
d.length – 1 , i == 0
first last
to be or
first
▪ Guarda a referência do primeiro nó null
null
Node oldfirst = first;
oldfirst
last
▪ Cria um novo nó para o primeiro to be or
first
null null
first = new Node();
null null
▪ Representação:
▪ l[]: array redimensionável para armazenar os itens da lista
0 1 2 3 4 5 6 7 8 9
first last
List – Implementação com Array
▪ Operações adicionais:
0 1 2 3 4 5 6 7 8 9
last first get(3)
▪ contains(item): verifica se encontra o item entre as posições
first e last
▪ get(index): devolve o item na posição index a contar a partir
de first
▪ remove(index): remove o item na posição index a partir de
first e reagrupa os restantes elementos no array (à esquerda
ou direita)
2 1
0 1 2 3 4 5 6 7 8 9
last first remove(3)
List – Implementação com Array
▪ Representação:
▪ Incremento circular: Resto da divisão pela capacidade do array
next(i) = (i + 1) % l.lenght
i – 1 , i > 0
previous(i) = ቊ
l.length – 1 , i == 0
if(first == last) {
first = -1;
last = -1;
}
else if(position<l.length/2) {
for(int i = position; i != first; i = previous(i))
l[i] = l[previous(i)];
l[first] = null;
first = next(first);
}
else {for(int i = position; i != last; i = next(i))
l[i] = l[next(i)];
l[last] = null;
last = previous(last);
}
return item;
}
List – Implementação
com Linked-List
List – Implementação com Linked-List
▪ Exemplo:
to be or not to
first last
null
to be or not to
first last
null
remove(3)
List – Implementação
if(ant == null)
first = first.next;
else
ant.next = pos.next;
if(first == null)
last = null;
return pos.item;
}
Priority Queue – Implementação
com Array
Priority Queue API
▪ Principal aplicação: Aceder a elementos mais prioritários,
independentemente da ordem de inserção
0 1 2 3 4 5 6 7 8 9
N
▪ insert(item): adiciona um novo item em q[N] eg insert(“free”) ~1
0 1 2 3 4 5 6 7 8 9
N
▪ delete(): procura mais prioritário remove item e desloca p/ esquerda todos ~N
os elementos à sua direita eg mais prioritário é maior na ordem
lexicográfica
1 2 3 4
0 1 2 3 4 5 6 7 8 9
N
Priority Queue – Implementação
0 1 2 3 4 5 6 7 8 9
N
▪ insert(item): desloca p/ direita todos os elementos maiores do que ~N
novo item eg insert(“free”)
4 3 2 1
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
N
Priority Queue – Implementação
▪ insert(item) ~ lg N
▪ delete() ~ lg N
…
Priority Queue – Implementação
com Linked-List
Priority Queue – Implementação com
Linked-List
▪ 1ª versão: sem ordenação de elementos por prioridade
brave is who he
first
null
brave is free he
first
null
Priority Queue – Implementação
is he free Brave
first
null
Priority Queue – Implementação
public void insert(Item x){
Node aux = new Node();
aux.item = x;
if(first == null || less(first.item,x)){
aux.next = first;
first = aux;
}
else{ Node i = first;
while(i.next != null && less(x,i.next.item))
i = i.next;
aux.next = i.next;
i.next = aux;
}
}