Escolar Documentos
Profissional Documentos
Cultura Documentos
Estruturas de
dados
2022
STITUTO SUPER
LICENCIATURA EM ENGENHARIA
INFORMÁTICA
1º Ano
Fax: 23323501
E-mail: unisced@unisced.edu.mz
Website: www.unisced.edu.mz
i
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Agradecimentos
Direcção Académica
Coordenação
Universidade Aberta ISCED (UnISCED)
Design
Instituto Africano de Promoção da Educação a Distância
Financiamento e Logística
(IAPED)
Revisão Científica e
Linguística
2022
Ano de Publicação
UnISCED – BEIRA
Local de Publicação
ii
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Índice
VISÃO GERAL 1
Benvindo à Disciplina/Módulo de Algoritmos e Estruturas de Dados ............................. 1
Objectivos do Módulo....................................................................................................... 1
Quem deveria estudar este módulo ................................................................................. 1
Como está estruturado este módulo ................................................................................ 1
Ícones de actividade ......................................................................................................... 3
Habilidades de estudo ...................................................................................................... 3
Precisa de apoio? .............................................................................................................. 5
Tarefas (avaliação e auto-avaliação) ................................................................................ 5
Avaliação ........................................................................................................................... 6
iii
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
iv
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
v
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
BIBLIOGRAFIA 140
vi
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
VISÃO GERAL
Objectivos do Módulo
Páginas introdutórias
▪ Um índice completo.
▪ Uma visão geral detalhada dos conteúdos do módulo,
resumindo os aspectos-chave que você precisa conhecer para
melhor estudar. Recomendamos vivamente que leia esta secção
com atenção antes de começar o seu estudo, como componente
de habilidades de estudos.
1
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Outros recursos
A equipa dos académicos e pedagogos da UnISCED, pensando em
si, num cantinho, recôndito deste nosso vasto Moçambique e cheio
de dúvidas e limitações no seu processo de aprendizagem,
apresenta uma lista de recursos didácticos adicionais ao seu
módulo para você explorar. Para tal a UnISCED disponibiliza na
biblioteca do seu centro de recursos mais material de estudos
relacionado com o seu curso como: Livros e/ou módulos, CD, CD-
ROOM, DVD. Para além deste material físico ou electrónico
disponível na biblioteca, pode ter acesso a Plataforma digital
moodle para alargar mais ainda as possibilidades dos seus estudos.
2
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Comentários e sugestões
Use este espaço para dar sugestões valiosas, sobre determinados
aspectos, quer de natureza científica, quer de natureza didáctico-
Pedagógica, etc., sobre como deveriam ser ou estar apresentadas.
Pode ser que graças as suas observações que, em gozo de
confiança, classificamo-las de úteis, o próximo módulo venha a ser
melhorado.
Ícones de actividade
Habilidades de estudo
3
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
4
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Precisa de apoio?
Caro estudante temos a certeza que por uma ou por outra razão, o
material de estudos impresso, lhe pode suscitar algumas dúvidas
como falta de clareza, alguns erros de concordância, prováveis erros
ortográficos, falta de clareza, fraca visibilidade, página trocada ou
invertidas, etc.). Nestes casos, contacte os serviços de atendimento
e apoio ao estudante do seu Centro de Recursos (CR), via telefone,
SMS, E-mail, se tiver tempo, escreva mesmo uma carta participando
a preocupação.
Uma das atribuições dos Gestores dos CR e seus assistentes
(Pedagógico e Administrativo), é a de monitorar e garantir a sua
aprendizagem com qualidade e sucesso. Dai a relevância da
comunicação no Ensino a Distância (EAD), onde o recurso as TICs se
torna incontornável: entre estudantes, estudante – Tutor, estudante
– CR, etc.
As sessões presenciais são um momento em que você caro
estudante, tem a oportunidade de interagir fisicamente com staff do
seu CR, com tutores ou com parte da equipa central da UnISCED
indigitada para acompanhar as suas sessões presenciais. Neste
período pode apresentar dúvidas, tratar assuntos de natureza
pedagógica e/ou administrativa.
O estudo em grupo, que está estimado para ocupar cerca de 30%
do tempo de estudos a distância, é muita importância, na medida
em que lhe permite situar, em termos do grau de aprendizagem
com relação aos outros colegas. Desta maneira ficará a saber se
precisa de apoio ou precisa de apoiar aos colegas. Desenvolver
hábito de debater assuntos relacionados com os conteúdos
programáticos, constantes nos diferentes temas e unidade
temática, no módulo.
5
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Avaliação
1
Plágio - copiar ou assinar parcial ou totalmente uma obra literária, propriedade
intelectual de outras pessoas, sem prévia autorização.
6
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
7
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
1.1. Introdução
1.2. Algoritmo
9
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
• Tamanho de um array
• Grau polinomial
• Número de elementos numa matriz
• Número de bits na representação binária da entrada
• Vértices e pontas nos gráficos.
Para melhor análise de um algoritmo sugere-se que se expresse o
tempo de execução de um dado algoritmo como uma função do
tamanho de entrada n, f(n), e se compare o tempo de execução dessas
diferentes funções. Pois este tipo de comparação é independente do
tempo de máquina, do estilo de programação, entre outros factores.
A taxa de crescimento dos algoritmos é medida em aproximação da
função do tamanho de entrada mais alto.
Tipos de analises
Os algoritmos geralmente analisam-se consoante o tempo de execução
e memória utilizada. Para analisar um dado algoritmo, precisamos saber
para quais dados de entrada o algoritmo é executado em menos tempo
e para quais leva mais tempo a ser executado. São eles:
• O pior caso
o Define os dados de entrada que o algoritmo leva maior
tempo para ser executado.
o Os dados de entrada para os quais o algoritmo executa
mais lentamente.
𝑓(𝑛) = 𝑛2 + 500
• O melhor caso
10
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Definição:
Considere f e g duas funções de domínio inteiro não negativo e
contradomínio real. Diz-se que g domina assimptoticamente f,
escrevendo-se f é O(g) ou f é da ordem de O(g), se e só se,
∃𝑘>0 ∃𝐶>0 ∀𝑛>0 ∶ 𝑛 > 𝑘 ⇒ |𝑓(𝑛)| ≤ 𝐶 ∗ |𝑔(𝑛)|
Existem constantes k natural e C real tais que, para todo o argumento
n>k, a função g multiplicada pela constante C é maior do que f. Isto
determina um limite superior ao crescimento da função f. Note que O(g)
representa um conjunto de todas as funções limitadas superiormente
por g. Diz-se que O(g) é uma classe de complexidade. Sendo O(g) um
conjunto de funções, pode-se escrever f é O(g) como f∈O(g) ou ainda
O(f)⊆O(g).
A figura 1.1 apresenta um exemplo com a função g(n)=3*n/8 e a função
f(n)=3*log10(n+1). Com n=1, a função f é maior do que g. Porém, há que
n aumenta, a função g cresce mais depressa e, inevitavelmente, chega
a um valor a partir do qual é sempre maior. Assim, é possível definir um
valor para k (um qualquer valor maior que 27) de modo a que a
expressão lógica da definição anterior seja satisfeita (o valor de C, neste
caso, pode ser igual a 1). Logo f é O(g), por exemplo, f(n)=3*log10(n+1)
é O(3*n/8).
11
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
g(n) = 3*n/8
n
k (com C=1)
Figura 1.1. Ilustração da complexidade assimptótica através do uso da
notação O.
• 2n é de complexidade O(n!)
• n! é de complexidade O(nn)
12
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
13
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Estruturas de Vector
Comprimento fixo
dados Bidimensional
(variáveis indexadas)
Matriz ...
Multi-indexado
Pilhas
Não Primitivas Lineares Filas
(Complexas) Comprimento variável Listas
(Listas - adjacência física)
Árvores
Não lineares
Grafos
Ficheiros Sequenciais
(memória secundária) Sequenciais indexados
Directos
Figura 1.2. Estruturas de dados.
14
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
1.6. Sumário
Perguntas
1. Algoritmo é a medida de espaço que representa instruções para a
resolução de um problema.
A. Verdadeiro
B. Falso
2. A análise dos algoritmos serve para comparar o tempo de execução,
a memória utilizada, o esforço do desenvolvedor, entre outros
factores.
A. Verdadeiro
B. Falso
3. Na análise de algoritmos o pior caso define os dados de entrada para
os quais o algoritmo executa mais lentamente.
A. Verdadeiro
B. Falso
4. Na análise de algoritmos o melhor caso define os dados de entrada
que o algoritmo leva mais tempo para ser executado.
A. Verdadeiro
B. Falso
15
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Respostas
1. B; 2. A; 3. A; 4. B; 5. B
16
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
2.1. Introdução
Lista Linear
A lista linear é uma estrutura de dados que permite representar os
elementos ou dados de um mesmo tipo de dados de forma a preservar
a relação de ordem entre si. Por exemplo, pessoas na fila de um banco;
dias da semana; itens em estoque em uma loja; etc. Cada elemento da
lista é denominado nó.
Definição: Conjunto de N nós, onde N≥0, x1, x2, …, xn, organizados de
forma a reflectir a posição relativa dos mesmos. Se N≥0,
então x1 é o primeiro nó. Para 1<k<n, o nó xk é precedido
pelo nó xk-1 e seguido pelo nó xk+1 e xn é o último nó.
Quando N=0, diz-se que a lista está vazia.
17
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
2.2.1. Introdução
Ao completar esta unidade, você deverá ser capaz de:
▪ Definir e identificar as pilhas;
▪ Entender o funcionamento das pilhas, como inserir e
remover elementos, entre outros métodos.
Objectivos ▪ Saber como implementar uma pilha.
específicos
n+1
n
...
3
2
1
Figura 2.1. Pilha.
18
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
1 1 17 topo 1 17
topo
0 8 0 8 0 8
a) b) c)
Figura 2.2. Empilhamento.
Desempilhar () Desempilhar ()
4 4 4
3 3 3
2 21 topo 2 2
1 17 1 17 topo 1
0 8 0 8 0 8 topo
a) b) c)
Figura 2.3. Desempilhamento.
19
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
top(push(S, I)) = I
pop(push(S, I)) = S
equals(S1, S2) =
if isEmpty (S1)
then isEmpty(S2)
else not isEmpty(S2) and
(equals(top(S1), top(S2)) and
equals(pop(S1), pop(S2)))
pré-condições
top(S) requer not isEmpty(S)
pop(S) requer not isEmpty(S)
fim-especificação
20
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
package dataStructures;
/** Uma implementação vectorial da pilha */
public class VStack implements Stacks, Cloneable {
private final int DELTA = 128;
private Object[] stack;
private int top;
public VStack(int cap) {
stack = new Object[DELTA];
top = -1;
}
public Stack empty() {
return new VStack();
}
public boolean isEmpty() {
return top = -1;
}
public void push(Object item) {
if (top+1 == stack.length)
grow();
21
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
top++;
stack[top] = item;
}
public void grow() {
Object[] newStack = new Object[stack.length + DELTA];
for (int i=0; i<stack.length; i++)
newStack[i] = stack[i];
stack = newStack;
}
public Object top() {
return stack[top];
}
public void pop() {
stack[top--] = null;
}
public boolean equals(Object s) {
if (!(s instanceOf Stack))
return false;
int i=top;
Stack cp=(Stack) (((Stack) s).clone());
while (!cp.isEmpty()) {
if (i<0 || !stack[i].equals(cp.top()))
return false;
cp.pop();
i--;
}
return i<0;
}
public Object clone() {
VStack cp = new VStack;
cp.stack = new Object[stack.length];
for (int i=0; i<=top; i++)
cp.stack[i] = stack[i];
cp.top = top;
return cp;
}
public String toString() {
if (this.isEmpty())
return “[ ]>”;
StringBuffer result = new StringBuffer(“[“ + stack[0]);
for (int i=0; i<=top; i++)
result.append(“, ” + stack[i]);
return result.toString() + “]>”;
}
} // endClass VStack
Classe 2.1. Implementação estática da Pilha.
22
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
23
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
v2.push(new Integer(4));
v1.pop();
System.out.println(v1 + “ ” + v2.clone());
System.out.print(v1.equals(v2) ? “==” : “!=”);
}
Programa 2.1. Uso da classe VStack.
2.2.6. Sumário
Nesta unidade temática definimos a pilha, detalhamos o seu
funcionamento, assim como os métodos defindos pelo tipo de dados
abstracto. Abordamos ainda a implementação estática da pilha e o uso
da classe VStack.
Perguntas
1. Tanto as pilhas como as listas são listas lineares.
A. Verdadeiro
B. Falso
2. Enquanto na pilha o último elemento a entrar é o primeiro a sair, na
fila o último a sair é o primeiro que entrou.
A. Verdadeiro
B. Falso
3. Numa pilha os elementos são inseridos e retirados apenas pela
camada de topo.
A. Verdadeiro
B. Falso
4. A pilha é definida recursivamente a partir dos construtores empty()
e equals().
A. Verdadeiro
B. Falso
5. Na implementação estática da pilha, o método insert() incrementa
o atributo top e insere a referência do objecto na posição do vector.
A. Verdadeiro
B. Falso
Respostas
1. A; 2. A; 3. A; 4. B; 5. A
24
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
2.3.1. Introdução
Ao completar esta unidade, você deverá ser capaz de:
▪ Identificar os diferentes tipos de filas
▪ Entender o funcionamento das filas, como inserir e
remover elementos, entre outros métodos.
Objectivos ▪ Saber como implementar as filas.
Específicos
As filas são estruturas de dados do tipo FIFO (First-In First-Out), onde o
primeiro elemento a ser inserido, será o primeiro a ser retirado, isto é,
adicionam-se os itens duma extremidade (fim) e são removidos doutra
extremidade (início).
Remove Insere
1 2 3 ... n n+1
Figura 2.4. Fila.
25
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
isEmpty(empty) = TRUE
isEmpty(enqueue(Q, I)) = FALSE
front(enqueue(Q, I)) =
if isEmpty(Q)
then I
else front(Q)
dequeue(enqueue(Q, I)) =
if isEmpty(Q)
then empty
else enqueue(dequeue(Q), I)
equals(Q1, Q2) =
if isEmpty (Q1)
then isEmpty(Q2)
else not isEmpty(Q2) and
(equals(front(Q1), front(Q2)) and
equals(dequeue(Q1), dequeue(Q2)))
pré-condições
front(S) requer not isEmpty(Q)
dequeue(S) requer not isEmpty(Q)
fim-especificação
26
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
27
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6 3
5 4
28
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
package dataStructures;
/** Uma implementação vectorial da fila. Descricao: A implementação usa
um vector circular. */
public class VQueue implements Queue, Cloneable {
private final int DELTA = 128;
private Object[] queue;
private int begin, end;
public VQueue() {
queue = new Object[DELTA];
begin = 0;
end = queue.length - 1;
}
public Queue empty() {
return new VQueue();
}
public boolean isEmpty() {
return (end + 1) % queue.lenght == begin;
}
public void grow() {
Object[] newQueue = new Object[queue.length + DELTA];
for (int i = begin; i != (end + 1) % queue.length;
i = (I + 1)queue.length, j++)
newQueue[j] = queue[i];
begin = 0;
end = queue.length - 2;
queue = newQueue;
}
public void enqueue(Object item) {
stack[top--] = null;
if ((end + 2) % queue.length == begin)
grow();
end = (end + 1) % queue.length;
queue[end] = item;
}
public Object front() {
return queue[begin];
}
public void dequeue() {
queue[begin] = null;
begin = (begin + 1) % queue.length;
}
29
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
30
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
31
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
2.3.6. Sumário
Nesta unidade temática vimos como identificar os diferentes tipos de
filas. Detalhamos o funcionamento da fila, assim como os métodos
defindos pelo seu tipo de dados abstracto. Abordamos a
implementação estática da fila e o uso da classe VQueue. Fizemos ainda
algumas considerações sobre as filas com prioridade.
Perguntas
1. A figura que se segue representa uma fila.
push pop
n+1
n
...
3
2
1
A. Verdadeiro
B. Falso
2. Enquanto na pilha o último elemento a entrar é o primeiro a sair, na
fila o último a sair é o primeiro que entrou.
A. Verdadeiro
B. Falso
3. Na implementação estática de uma fila (vector), diz-se que esta está
vazia quando end = begin - 1.
A. Verdadeiro
B. Falso
4. Na implementação estática da fila, caso não haja espaço suficiente
para inserir um novo elemento, utiliza-se o método privado grow()
para reservar mais espaço criando um vector maior para onde se
copia o conteúdo da fila.
A. Verdadeiro
B. Falso
5. dequeue() é um construtor da fila que devolve a fila sem o elemento
inicial.
A. Verdadeiro
B. Falso
Respostas
1. B; 2. A; 3. A; 4. B; 5. B
32
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
3.1. Introdução
Cabeça
da lista
Elemento Elemento Elemento
33
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
head). Pode também existir uma referência para o fim ou cauda da lista
(list tail).
3.2.1. Introdução
Ao completar esta unidade, você deverá ser capaz de:
▪ Definir e identificar uma lista ligada ou simples;
▪ Conhecer os algoritmos básicos das listas ligadas ou
simples;
Objectivos ▪ Ententer a implementação genérica das listas ligadas ou
Específicos simples.
A figura 3.4 ilustra uma lista ligada ordenada por ordem crescente. O
último nó aponta para null, indicação do fim da lista.
Cabeça 20 30 40
Figura 3.4. Lista ligada.
A figura 3.5 ilustra os dois tipos que os nós da lista ligada podem ser. A
esquerda representa um nó compacto que armazena um elemento de
um tipo de dados primitivo, sendo cada nó constituído pela referência
para o nó seguinte da lista (atributo next) e pelo elemento que se
pretende armazenar na lista (atributo elem). Na direita temos um nó
decomposto que armazena um elemento de um tipo de dados
referência, sendo cada nó constituído por uma referência para o nó
seguinte e outra para o elemento que se pretende armazenar na lista.
34
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
ins 10 prev 2
a)
36
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Cabeça 20 30 x
50
3
4
prev 40
ins
b)
x
Cabeça 20 30 50
3
4
prev 60
ins
c)
Figura 3.6. Inserção de elementos na lista ordenada por ordem crescente.
37
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
}
}
Algoritmo 3.3. Inserção na lista ordenada por ordem crescente.
del prev 2
a)
3
Cabeça 10 x 20 X
4
x 30
prev del
b)
3
Cabeça 10 20 x 30 X
4
x
prev del
c)
Figura 3.7. Remoção de elementos na lista ordenada por ordem crescente.
38
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
39
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
40
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
41
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
3.2.4. Sumário
As listas, mesmo quando ordenadas para optimizar a pesquisa de
elementos, são estruturas lineares que só podem ser percorridas
sequencialmente. Por isso, são pouco eficientes para inserir e remover
elementos, devido ao tempo gasto na pesquisa da posição de inserção
e de remoção, a não ser quando os elementos são inseridos e
removidos na cabeça e na cauda da lista. Por esta razão, as listas são
geralmente utilizadas com acesso limitado às suas extremidades,
nomeadamente para implementar memórias de tipo fila e do tipo pilha.
Nesta unidade temática detalhamos sobre as listas ligadas ou simples e
apresentamos os seus algoritmos básicos. Abordamos ainda a
implementação genérica das listas ligadas ou simples.
Perguntas
1. O tamanho da lista ligada em execução depende da disponibilidade
da memória do sistema.
A. Verdadeiro
B. Falso
2. O último elemento da lista simples aponta para o primeiro.
A. Verdadeiro
B. Falso
3. A figura a seguir representa a implementação estática da lista de
uma lista ligada.
Cabeça 20 30 40
A. Verdadeiro
*B. Falso
42
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Respostas
1. A; 2. B; 3. B; 4. B; 5. B
3.3.1. Introdução
Ao completar esta unidade, você deverá ser capaz de:
▪ Identificar uma lista biligada ou duplamente ligada;
▪ Conhecer os algoritmos básicos das listas biligadas ou
duplamente ligadas;
Objectivos ▪ Ententer a implementação genérica das listas biligadas
específicos ou duplamente ligadas.
Cabeça 20 30 40
43
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
44
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
3
ins 10
a)
x
Cabeça 20 30 x 50
3 4
5 6
prev ins 40
b)
Figura 3.10. Inserção na lista biligada ordenada por ordem crescente.
45
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
ins.next = prev.next;
prev.next = ins;
if (ins.next != null)
ins.next.prev = ins;
}
}
}
Algoritmo 3.5. Inserção na lista biligada ordenada por ordem crescente.
46
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Cabeça
x x
20
x
x
2
30 50
del
a)
Cabeça 20
x
x x
30
x
x 50
del
b)
Figura 3.11. Remoção na lista biligada ordenada por ordem crescente.
47
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
48
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
49
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
head = del.next;
} else { // remoção de outro elemento da lista
del.prev.next = del.next;
if (del.next != null)
del.next.prev = del.prev;
}
return del.elem; // devolver o elemento
}
public String toString() { // método de impressão
if (isEmpty()) // teste de lista vazia
return “Lista vazia\n”;
String str = “Lista Biligada : ”;
for (BiNode<T> binode = head; binode != null; binode = binode.next)
str += “\t” + binode.elem.toString();
return str + “\n”;
}
// método interno de pesquisa para inserção
private BiNode<T> posInsert(BiNode<T> pHead, T pElem) {
BiNode<T> actual = pHead, prev = null;
while (actual != null && pElem.compareTo(actual.elem) > 0) {
prev = actual;
actual = actual.next;
}
return prev;
}
// método interno de pesquisa para remoção
private BiNode<T> posDelete(BiNode<T> pHead, T pElem) {
BiNode<T> actual = pHead;
while (actual != null && pElem.compareTo(actual.elem) != 0)
actual = actual.next;
return prev;
}
}
Classe 3.4. Tipo de Dados Abstrato GenericDoubleList.
3.3.4. Sumário
Geralmente as listas biligadas são utilizadas para armazenar colecções
de dados, que exigem que os dados estejam sempre ordenados e que
sejam pesquisados por chave de identificação. Por exemplo, para
implementar versões dinâmicas de memórias de tipo associativo e de
tipo fila com prioridade.
Nesta unidade temática estudamos as listas biligadas e detalhamos os
seus algoritmos. Abordamos ainda a implementação genérica da lista
biligada.
50
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Perguntas
1. Tal como na lista ligada, a lista biligada têm referências para o
elemento anterior e para o elemento seguinte.
A. Verdadeiro
B. Falso
2. O primeiro e o último nó da lista duplamente ligada apontam para
null.
A. Verdadeiro
B. Falso
3. A figura que se segue representa um nó decomposto da lista
Respostas:
1. B; 2. B; 3. B; 4. B; 5. B
3.4.1. Introdução
Ao completar esta unidade, você deverá ser capaz de:
▪ Definir e identificar uma lista skip;
▪ Conhecer os algoritmos básicos das listas skip;
▪ Ententer a implementação genérica das listas skip.
Objectivos
específicos
Uma lista skip ou com atalhos é uma lista ligada simples em que cada
nó tem um número variável de ligações, sendo que cada nível de ligação
implementa uma lista ligada simples constituída por um numero
diferente de nós. Em outras palavras, é um conjunto de listas paralelas,
todas elas devidamente terminadas com a referência nula, que permite
51
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
0 10 20 40 50 60 70 80
52
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
53
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
54
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Cabeça
0 10 20 40 50 60 70 80
a)
Cabeça
0 10 20 40 50 60 70 80
b)
Cabeça
0 10 20 40 50 60 70 80
c)
Figura 3.14. Pesquisa de elementos numa lista skip ordenada por ordem
crescente.
Na figura 3.14.a) pesquisamos o elemento 80. A travessia começa na
cabeça da lista no nível três e chega ao elemento 60. Por este ser menor
que o valor procurado, ela continua no nível um, pois as listas dos níveis
acima já terminaram. A lista atinge o elemento 80com sucesso após
duas comparações.
Na figura 3.14.b) pesquisamos o elemento 50. A travessia começa na
cabeça da lista no nível três e chega ao elemento 60. Por este ser maior
que o valor procurado, a travessia regressa a cabeça, desce um nível e
chega ao elemento 40. Como este é menor do que o valor procurado, a
travessia continua no mesmo nível e chega outra vez ao elemento 60.
Como este é maior que o valor procurado, mais uma vez regressa ao
elemento 40, desce um nível e atinge o elemento 50 com sucesso ao
fim de cinco comparações.
Na figura 3.14.c) pesquisamos o elemento 30. A travessia começa na
cabeça da lista no nível três e chega ao elemento 60. Por ser maior que
o procurado, a pesquisa regressa à cabeça, desce um nível e chega ao
elemento 40. Por este ainda ser maior, a pesquisa regressa outra vez à
cabeça da lista, desce um nível e chega ao elemento 20. Como este é
menor que o valor procurado, a pesquisa continua no mesmo nível e
chega outra vez ao elemento 40. De novo, a pesquisa regressa ao
elemento 20, desce um nível e chega mais uma vez ao elemento 40.
Finalmente, a pesquisa regressa outra vez ao elemento 20, desce a um
nível negativo, concluindo a pesquisa sem sucesso ao fim de cinco
comparações.
55
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
56
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
40
0 10 20 50 70 80
a)
ins
Cabeça
60
0 10 20 40 50 70 80
b)
Cabeça
0 10 20 40 50 60 70 80
c)
Figura 3.15. Inserção de elementos numa lista skip ordenada por ordem
crescente.
57
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
58
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
0 10 20 40 50 60 70 80
a)
del
20
Cabeça
0 10 40 50 60 70 80
b)
59
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
del
80
Cabeça
0 10 40 50 60 70
c)
Figura 3.16. Remoção de elementos de uma lista skip ordenada por ordem
crescente.
60
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
61
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
62
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
63
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
3.4.4. Sumário
As listas com atalhos permitem a existência de elementos repetidos, o
que pode influenciar na sua operação. A pesquisa não garante que
encontre a primeira ocorrência de um elemento repetido. Como a
inserção usa a comparação “menor do que”, insere o novo elemento à
frente de eventuais elementos com o mesmo valor. A remoção elimina
um dos elementos repetidos mas pode, eventualmente, desfazer
algumas ligações dos outros elementos com o mesmo valor,
degradando o desempenho futuro da lista.
As listas com atalhos geradas aleatoriamente têm algoritmos com
eficiência logarítmica, sendo assim, mais eficientes do que as listas
simples e biligadas, e equivalentes às árvores balanceadas. Esta
eficiência é obtida à custa de mais memória para manter um maior
número e diversidade de ligações possíveis entre os nós da lista. Os seus
algoritmos são recursivos e de fácil implementação, se comparados
com os algoritmos das árvores. São uma estrutura de dados alternativas
às árvores, geralmente usadas para armazenar colecções de dados que
exigem que os dados estejam sempre ordenados e que sejam
pesquisados por chave de identificação.
Nesta unidade temática estudamos as listas skip e detalhamos os seus
algoritmos. Abordamos ainda a implementação genérica da lista skip.
Perguntas
1. O nó composto da lista skip é igual ao nó composto da lista simples.
A. Verdadeiro
B. Falso
2. O nó decomposto da lista skip é igual ao nó decomposto da lista
ligada.
A. Verdadeiro
B. Falso
3. A lista skip tal como a lista ligada está vazia quando não existem
elementos nela armazenados.
A. Verdadeiro
B. Falso
4. As listas skip são menos eficientes que as listas duplamente ligadas.
A. Verdadeiro
B. Falso
64
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Respostas
1. A; 2. A; 3. B; 4. B; 5. A
65
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
4.1. Introdução
66
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
67
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
package dataStructures;
/** Título: A interface do TDA Tabela. Descrição: O desenho com
contractos. */
public interface Table {
/** Criar uma tabela vazia
* @return Uma tabela vazia. */
//@ ensures \result.isEmpty();
/*@ pure @*/ Table empty();
/**
* Inserir na tabela o item com chave key
* @param key A chave do elemento
* @param item A referência para o elemento a inserir.
* As três pós-condições do método insert() referem-se
* respectivamente aos axiomas das operações isEmpty, contains,
* e retrieve.
*/
//@ requires item != null && key != null;
//@ requires !contains(key);
//@ ensures !isEmpty();
//@ ensures contains(key);
//@ ensures retrieve(key).equals(item);
void insert(Object item, Object key);
/**
* A tabela está vazia?
* @return TRUE se a estrutura está vazia, FALSE caso contrário
*/
/*@ pure @*/ boolean !isEmpty();
/**
* Esta chave pertence à tabela?
* @param key A chave a procurar
* @return TRUE se pertence, FALSE caso contrário
*/
//@ requires key != null;
//@ ensures \old(isEmpty()) ==> !\result;
/*@ pure @*/ boolean contains(Object key);
/**
* Devolver o elemento com chave key
* @param key A chave a procurar
* @return A referência do objecto com a chave
*/
//@ requires key != null;
//@ requires contains(key);
/*@ pure @*/ Object retrieve(Object key);
/**
* Remover o elemento com chave key
* @param key A chave a procurar
*/
//@ requires key != null;
//@ ensures \old(isEmpty()) ==> isEmpty();
//@ ensures !contains(key);
68
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
69
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
1 /
g f d b
2
/
c
3
/
70
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
71
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
posição vaga, dai que este tipo de problema ocorre apenas quando a
tabela está praticamente cheia.
Dado o factor de saturação (do inglês, load factor) α (igual ao número
de posições ocupadas a dividir pelo número total de posições) é possível
através da análise estatística do caso médio, determinar que o número
esperado de colisões é igual a
α
1−2
C=
1−α
Por exemplo, mesmo para a pesquisa linear, se α=0.5, C=1.5. Se α=0.95,
C=10.5: mesmo com 95% da tabela ocupada o método de pesquisa mais
fraco, procura em média 10 ou 11 posições.
Pesquisa com dispersão dupla
O método necessita uma segunda função de dispersão (do inglês,
rehashing), h1, para ser usada na sequência de pesquisa
ℎ𝑖 (k, i) = (ℎ(k) + i. ℎ1 (k)) 𝑚𝑜𝑑 N
Este método é considerado melhor para criar uma sequencia de
pesquisa, porque mesmo que as chaves de dois elementos produzam o
mesmo valor quando aplicada a função h, os valores já serão diferentes
na função h1 diminuindo assim a criação de aglomerados.
Pesquisa aleatória
Neste método é usado um gerador de números pseudoaleatórios para
evitar a criação de aglomerados
ℎ𝑖 (k, i) = (ℎ(k) + i. 𝑟𝑎𝑛𝑑()) 𝑚𝑜𝑑 N
• O gerador deve ser uniforme no intervalo [0, N-1] para permitir
que todas as posições tenham a mesma probabilidade de serem
escolhidas
• O gerador deve ser previsível, isto é, tem de possuir um
mecanismo de semente inicializado com a chave do elemento a
inserir. Doutra forma, não seria possível pesquisar
eficientemente um elemento, não haveria forma de saber onde
tinha sido inserido.
Apesar da distribuição dos elementos para evitar colisões ser muito
eficiente, o gerador pode demorar muito tempo a encontrar um espaço
vago se a tabela for relativamente grande e estiver cheia.
Remoção de um elemento
A figura 4.2 ilustra a remoção de um elemento da tabela de dispersão
com endereçamento aberto. Do aglomerado (a, b, c, d), o elemento d
está na posição em que a função de dispersão lhe atribuiu inicialmente,
enquanto a, b e c possuem chaves com o mesmo índice, logo b e c estão
em posições resultantes de um e três colisões, h(a) = h(b) = h(c) = h(d)-
2.
72
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
a b d c f g h
a)
a d c f g h
b)
a d c f g h
c)
Figura 4.2. Remoção de um elemento da tabela de dispersão com
endereçamento aberto.
Se removemos o elemento b devemos marcar o espaço com vago com
uma seta, no caso da figura 4.2.c. Isto permite que quando procurarmos
pelo elemento c após a remoção do b, a pesquisa continue, caso não se
marque a posição vaga a pesquisa consideraria vazia e daria por
terminada, informando a não existência do elemento c.
package dataStrucures;
/** Título: A interface do TDA Hashable. Descrição: Para uso de tabelas de
dispersão. */
public interface HashFunction {
/** Calcular o valor de dispersão de uma dada chave.
@param key A chave a ser calculada.
@return O valor dessa chave.
*/
//@ requires isHashable(key);
int hashValue(Object key)
/** Este objecto tem valor de dispersão?.
@param key A chave a verificar.
@return TRUE se tem valor de dispersão, FALSE c.c.
*/
/*@ pure @*/ boolean isHashable(Object key);
73
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
74
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
75
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
}
}
private void grow() {
HashRegister[] oldTable = table;
int newLength = getNextPrime(table.length + DELTA);
table = new HashRegister[newLength];
nElems = 0;
for (int i = 0; i < oldTable.length; i++)
if (oldTable[i] != availableCell && oldTable[i] != null)
insert(oldTable[i].item, oldTable[i].key);
}
/** Calcular os próximos números primos */
private boolean isPrime(int n) {
if (n % 2 == 0)
return n == 2;
int limit = (int)Math.round(Math.sqrt(n));
for (int i = 3; i <= limit; i += 2)
if (n % i == 0)
return FALSE;
return TRUE
}
private int getNextPrime(int n) {
while (!isPrime)
n++;
return n;
}
/** Método de inserção */
public void insert(Object item, Object key) {
if ((double)nElems / table.length > LOAD_FACTOR)
grow();
// encontrar a posição inicial
while (!isCellFree(pos) && isCellAvailable(pos))
pos = h.nextValue() % table.length;
table[pos] = new HashRegister(item, key);
nElems++;
}
/** Traduzir a tabela, e.g: [|(key1: item1), (key2: item2)|]. @return
Descrição da tabela numa string. */
public String toString() {
StringBuffer result = new StringBuffer(“[|”);
for (int i = 0; i < table.length; i++)
if (!isCellFree(i) && !isCellAvailable(i))
result.append(table[i] + “, ”);
return result.substring(0, result.length() - 1) + “|]”
}
public Object clone() {
HashTable cp = new HashTable(h);
cp.table = new HashRegister[table.length];
cp.nElems = nElems;
cp.h = h;
76
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
77
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
78
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
ht.insert(“tigre2”, “13t”);
System.out.println(ht);
System.out.println(cp);
}
Programa 4.1. Uso da classe HashTable.
4.5. Sumário
Perguntas
1. Nas tabelas de dispersão ocorre uma colisão quando um mesmo
endereço está associado à diversas chaves.
A. Verdadeiro
B. Falso
2. Implementar o TDA tabela numa tabela de dispersão com
endereçamento fechado.
3. Criar para exemplo da secção anterior, as implementações
seguintes do tipo HashFunction:
a. Com uma função de pesquisa quadrática,
b. Com uma função de pesquisa aleatória,
c. Com uma função de pesquisa com dispersão dupla.
4. Um vector flexível (do inglês, flexible array) possui o acesso e
actualização a qualquer elemento através do seu índice e, além
disso, permite a inserção e remoção de elementos na sua
primeira e última posição. Apresente a especificação do vector
flexível (defina o TODA flexArray) que inclui as seguintes
funções:
79
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Respostas
1. B
80
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
5.1. Introdução
7 2
3 12 9
81
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Uma árvore binária (binary tree) é uma árvore de grau dois, pois
contem exactamente duas subárvores, subárvore de esquerda e
subárvore da direita.
/
+ *
- 10 3 -
4 5 2
82
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
83
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
84
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
4 10 8 20
2 7 4 14
a) b)
Figura 5.6. Aplicação de um visitor sobre a árvore binária.
package dataStructures;
public interface Visitor {
/** Executar a operação. @param info A referência da informação a ser
tratada. */
void visit(Object info);
85
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
@ item.getClass() == right.root().getClass();
@ requires left != null && !left.isEmpty() ==>
@ item.getClass() == left.root().getClass();
@ ensures item != null ==> !isEmpty();
@ ensures item != null ==> root().equals(item);
@ ensures item != null ==> left().equals(left);
@ ensures item != null ==> right().equals(right);
@*/
void constr(Object item, BinTree left, BinTree right); 2
/** Devolver a informação da raiz árvore
* @return A referência do objecto situado na raiz. */
//@ requires !isEmpty();
/*@ pure @*/ Object root();
/**
* Devolver a árvore da esquerda
* @return A referência da subárvore à esquerda
*/
//@ requires !isEmpty();
/*@ pure @*/ BinTree left();
/**
* Devolver a árvore da direita
* @return A referência da subárvore à direita
*/
//@ requires !isEmpty();
/*@ pure @*/ BinTree right();
/**
* Devolver o número de elementos da árvore
* @return O número de elementos da árvore
*/
/*@ ensures isEmpty() ==> \result == 0;
@ ensures !isEmpty() ==>
@ \result == 1 + left().length() + right().length();
@*/
/*@ pure @*/ int length();
/**
* Devolver a altura da árvore
* @return A altura da árvore
*/
/*@ ensures isEmpty() ==> \result == 0;
@ ensures !isEmpty() ==> \result == 1 +
@ (left().height() > right().height() ?
@ left().height() : right().height());
@*/
/*@ pure @*/ int height();
/**
2
As précondições do método constr() garantem que a árvore armazena elementos do
mesmo tipo. As quatro póscondições são referentes aos axiomas das interrogações cons,
root, left e right no TDA. Porque o método pode ser invocado com referências nulas é
colocado uma guarda.
86
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
* É uma folha?
* @return TRUE se é uma folha, FALSE caso contrário
*/
/*@ ensures \result == (!isEmpty() && left().isEmpty()
@ && right().isEmpty());
@*/
/*@ pure @*/ Boolean isLeaf();
/**
* Verificar se as árvores são iguais
* @param t A árvore a ser comparada
* @return TRUE se forem iguais, FALSE caso contrário
*/
/*@ also
@ requires t != null;
@ ensures isEmpty() <==> ((BinTree)t).isEmpty();
@ ensures !isEmpty() && !((BinTree)t).isEmpty() ==>
@ \result == (root().equals(((BinTree)t).root()) &&
@ left().equals(((BinTree)t).left()) &&
@ right().equals(((BinTree)t).right()));
@*/
/*@ pure @*/ boolean equals(Object t);
/**
* Percorrer a árvore de forma prefixa
* @param op O operador a ser executado em cada nó
*/
//@ requires op != null;
void prefix(Visitor op);
/**
* Percorrer a árvore de forma infixa
* @param op O operador a ser executado em cada nó
*/
//@ requires op != null;
void infix(Visitor op);
3
A forma de implementar o iterador dependerá da implementação.
87
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
A
B C
B C
/ / / /
a)
/ / / / / / / /
b)
Figura 5.9. Representação da estrutura da árvore binária em memória e o
respectivo diagrama.
package dataStructures;
import java.util.*;
/** Título: Uma implementação dinâmica da Árvore Binária */
public class DBinTree implements BinTree, Cloneable {
private DBinTree leftTree, rightTree;
private Object infoTree;
public DBinTree() {
infoTree = null;
leftTree = rightTree = null;
}
public DBinTree(Object o, BinTree left, BinTree right) {
88
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
4
Este construtor permite construir árvores a partir de árvores já existentes.
5
O teste da existência de subárvores a esquerda e a direita torna-se desnecessário, pois
estes nós podem ser vazios. A complexidade temporal deste algoritmo é Θ(n) porque
cada nó é percorrido apenas uma vez.
89
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6
Duas árvores são iguais se ambas são vazias ou ambas possuem o mesmo conteúdo e
duas subárvores iguais.
90
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
private BinTreeIterator(DBinTree t) {
actualObject = null;
qNodes = new VQueue();
qNodes.enqueue(t);
}
public Boolean hasNext() {
return !qNodes.isEmpty();
};
public Object next() {
if (qNodes.isEmpty()) {
actualObject = null;
return null;
}
DBinTree t = (DBinTree) (qNodes.front());
if (!t.leftTree.isEmpty())
qNodes.enqueue(t.leftTree);
if (!t.rightTree.isEmpty())
qNodes.enqueue(t.rightTree);
qNodes.dequeue();
actualObject = t.infoTree;
return actualObject;
}; // 7
public void remove() {
throw new UnsupportedOperationException();
}
} // endInnerClass BinTreeOperator
public String toString() {
// Descrição textual da estrutura da árvore
return isEmpty() ? “[]” : makeTree(0, this);
}
private String makeTree() {
if (t.isEmpty()) // base da recursão
return mark(level) + “[]\n”;
if (t.isLeaf()) // base da recursão
return mark(level) + t.root() + “\n” +
makeTree(level + 1, (DBenTree) t.left()) +
makeTree(level + 1, (DBinTree) t.right);
}
private String mark(int level) {
String s = “”;
for (int i = 0; i < level - 1; i++)
s += “ ”;
return s += ((level > 0) ? “|” : “”)
}
// Devolver cópia exacta da árvore (apenas a estrutura).
public object clone() {
7
O método next vai buscar à da lista o próximo nó, actualiza o objecto actual para o
conteúdo do nó recolhido e coloca no fim da lista os eventuais filhos desse nó. Se a fila
estiver vazia, o método devolve a referência nula.
91
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
if (isEmpty())
return new DBinTree();
return new DBinTree(root(), (DBinTree) (left().clone()),
(DBinTree) (right().clone()));
}
} // endInterface Visitor
A
A |B
|D
B C
|E
D E F |C
|[]
a) |F
b)
Figura 5.7. Representação da árvore binária a) e sua respectiva descrição
b).
92
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
System.out.println(t6);
t6.prefix(cc);
System.out.print(cc.result() + “ ”);
cc.reset();
t6.infix(cc);
System.out.print(cc.result() + “ ”);
cc.reset();
t6.sufix(cc);
System.out.print(cc.result() + “ ”);
Iterator it = t6.iterator();
while (it.hasNext())
System.out.print(it.next() + “ / ”);
}
⎕A⏌
|B
|D
|E
|C
|[]
|F
ABDECF DBEACF DEBFCA ABCDEF
Classe 5.2. Classe Concat.
A 0 A 1 2
1 B 3 4
B C 2 C -1 5
3 D -1 -1
D E F 4 E -1 -1
5 F -1 -1
Figura 5.8. Árvore binária e sua respectiva representação por vector.
93
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
4
7 4
/ /
7 2
3 5 9
3 5 9
/ / / /
Figura 5.9. Árvore genérica e sua respectiva estrutura.
Algoritmo de pesquisa
A procura nas árvores (a,b) percorre o nó actual até encontrar o
elemento; se o elemento não se encontra nesse nó, percorre o nó
referenciado entre os dois elementos do nó actual no qual o elemento
a procurar eventualmente se situa. Na figura 5.10, ao procurar o
número 5. O algoritmo iria requisitar o nó referenciado entre os
números 4 e 7 para continual a pesquisa. Assim, o número de nós
percorridos (e carregados da memória secundária) pode ser
substancialmente reduzido.
94
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
4 7
/ 1 / 3 / / 5 / / 9 /
Figura 5.10. Representação da procura numa árvore (a,b).
Algoritmo de inserção
• Pesquisar por x. a pesquisa terminará numa determinada folha
(com insucesso se não for permitido repetições) numa
determinada posição.
• Adicionar x nessa mesma folha respeitando a ordem do nó.
• Se a folha, depois da inserção, tiver menos de b elementos,
parar. Senão:
o Escolher um elemento do meio (ou no caso de o número
de elementos ser par, escolher o primeiro elemento da
segunda partição) designado w. dividir essa folha em
duas novas folhas, F1 com os elementos (e filhos) até w
e F2 com os elementos (e filhos) depois de w. É devido a
este processo de divisão que se restringe os valores a
2≤a≤(b+1)/2.
• Passar w para o nó pai (se a folha a dividir era uma raiz, criar
uma nova raiz) e inseri-lo na posição correcta. O nó F1 será o
filho antes de w e F2 o filho depois de w.
• Caso o nó pai, após a inserção de w, ficar com b elementos,
repetir os dois últimos passos.
4 7 2 4 7
/ 1 / 3 / / 5 / / 9 / / 1 / / 3 / / 5 / / 9 /
a) c)
4 7 4
/ 1 / 2 / 3 / / 5 / / 9 / 2 7
b)
/ 1 / / 3 / / 5 / / 9 /
d)
95
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Algoritmo de remoção
• Encontrar o elemento x.
• Trocar x pelo próximo elemento, i.e., o elemento que está mais
à esquerda da árvore da direita, ou se esta estiver vazia pelo
próximo elemento. Repetir até x chegar a uma folha.
• Apagar x. Se a folha tiver a-1 elementos ou mais parar. Senão:
o Verificar se a soma dos elementos da folha anterior com
os da folha actual é menor que b-1. Se for, fundir essas
folhas juntamente com o elemento pai e formar uma
nova folha (pode significar uma nova iteração de todo
este processo, porque agora o nó pai ficou com menos
um elemento). Se não for, transferir elementos de uma
das folhas para a outra (incluindo o valor do nó pai) de
modo a restabelecer o número mínimo de elementos
por nó.
4 7 5 / 7
/ 1 / 3 / / 5 / / 9 / / 1 / 3 / / 9 /
a) c)
5 7 3 7
/ 1 / 3 / / 4 / / 9 / / 1 / / 5 / / 9 /
b) d)
Figura 5.12. Remoção do elemento 4 da árvore (2,3).
3 / 7 7
/ 1 / / 9 / / 1 / 3 / / 9 /
a) b)
Figura 5.13. Remoção do elemento 5.
Na figura 5.13 a folha (que ficou vazia), a folha anterior mais o elemento
pai (o número 3) têm elementos suficientes para criar uma nova folha.
O nó pai ficou com menos um elemento (7). Se o nó pai ficar com menos
elementos que o admitido, provaca-se um novo processo de fusão que
pode ser propagado até a raiz. É somente nestes casos que as árvores
(a,b) podem perder a altura.
96
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
5.4. Sumário
Perguntas
1. As árvores binárias são também conhecidas como árvores n-árias.
A. Verdadeiro
B. Falso
2. As árvores binárias são um caso especial das árvores genéricas.
A. Verdadeiro
B. Falso
3. Tal como as árvores binárias as árvores genéricas contêm apenas
um elemento em cada nó.
A. Verdadeiro
B. Falso
4. A árvore genérica é um caso particular das árvores binárias.
A. Verdadeiro
B. Falso
5. A figura que se segue representa uma árvore (a-b).
97
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
7 2
3 5 9
A. Verdadeiro
B. Falso
Respostas
1. B; 2. A; 3. B; 4. B; 5. B
98
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6.1. Introdução
Objectivos
específicos
Os tipos de dados abstractos que armazenam colecções de dados são
deginados memórias. Estes definem a política de acesso aos dados da
colecção. Para o escopo deste módulo abordaremos apenas as
memórias fila, pilha e fila com prioridade.
Existem essencialmente três tipos de implementação da memória do
computador
• Implementação estática
• Implementação dinâmica
• Implementação semi-estática
99
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
100
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Queue[0] Queue[1]
dequeue
cabeça da fila
Queue[N-1]
Queue[2]
...
...
Queue[I]
cauda da fila
...
enqueue
Queue[0]
Queue[1]
dequeue
Queue[2]
Queue[N-1]
Elemento
cabeça
da fila
cauda ...
da fila
...
Elemento
Queue[I]
...
Elemento
enqueue
101
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
cabeça
enqueue
Elemento Stack[I]
topo da
push Elemento ...
pilha
Elemento Stack[1]
Elemento Stack[0]
Figura 6.4. Implementação estática da memória pilha.
103
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Stack[N-1]
...
Stack[I]
Stack[1] Elemento
Stack[0] Elemento
Figura 6.5. Implementação semi-estática da memória pilha.
Elemento
Elemento
Filas com prioridade são estruturas em que os elementos são com uma
chave indicando as suas prioridades e que para o acesso aos elementos
consideram-se os de maior ou menor prioridade.
A fila com prioridade é uma memória simplificada, pois somente se
acede a um elemento com uma chave específica. Ela pode ou não
manter os elementos ordenados. Se a fila tem os elementos ordenados
é facilitada a remoção dos elementos e dificultada a sua inserção, caso
104
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
105
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
106
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
107
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6.5. Sumário
Perguntas
1. Na memória pilha a operação push() retira o elemento do topo da
pilha e devolve-o.
A. Verdadeiro
B. Falso
2. A memória fila retira o elemento que se na cauda da fila através da
operação dequeue().
A. Verdadeiro
B. Falso
3. A memória fila com prioridade utiliza a pesquisa binária na inserção
de um novo elemento.
A. Verdadeiro
B. Falso
4. A implementação dinâmica da memória fila com prioridade utiliza a
pesquisa sequencial na inserção de um novo elemento.
108
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
A. Verdadeiro
B. Falso
5. Na memória fila com prioridade é imperioso que os elementos
estejam ordenados para os poder aceder.
A. Verdadeiro
B. Falso
Respostas
1. B; 2. B; 3. A; 4. A; 5. B
109
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
7.1. Introdução
110
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
111
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
112
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
}
/** Pesquisa binária que determina se o elemento pretendido existe na
sequência. Caso exista, devolve a sua posição. Caso contrário,
devolve a posição onde o elemento devia estar. */
private static int binSearch(char[] pPQ, int pN, char pElem) {
int min = 0, med = 0, max = pN-1;
if (pN == 0)
return 0;
while (min <= max) {
med = (min + max) / 2;
if (pPQ[med] < pElem)
max = med - 1;
else if (pPQ[med] < pElem)
min = med + 1;
else
break;
}
if (pPQ[med] >= pElem)
return med;
else
return med + 1;
}
/** Desloca todos os elementos, a partir da posição pPos inclusive, uma
posição para a frente. */
private static void shiftDown (char[] pPQ, int pN, int pPos) {
for (int i = pN; i > pPos; i--)
pPQ[i] = pPQ[i-1];
}
}
Classe 7.1. Memória fila com prioridade estática ordenada concreta.
113
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
114
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
116
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
117
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
cabeça cabeça
118
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
cabeça cabeça
119
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
120
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
121
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
122
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
7 4 8 7 4 1 3 2
Índice: 0 1 2 3 4 5
1 3 2 b)
a)
Figura 7.7. Amontoado binário e sua respectiva representação vectorial.
123
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
package dataStructures;
/** Uma implementação vectorial do amontoado. */
public class VHeap implements Heap, Cloneable {
private final int DELTA = 128;
private int nElem; //número de elementos armazenados na fila
private Object[] heap;
/** Construtor da fila. Cria o amontoado com a dimensão indicada e
inicializa o indicador do número de elementos. */
public VHeap() {
heap = new Object[DELTA];
nElem = 0;
}
//@ requires isHeap(t);
/** Segundo construtor da fila. Traduz uma árvore binária num
amontoado, quando satisfeita a condição. */
public VHeap(BinTree t) {
this ();
constr(t.root(), t.left(), t.right());
}
public BinTree empty() {
return new VHeap();
}
public void constr(Object item, BinTree left, BinTree right) {
heap = new Object[DELTA + left.length() + right.length()];
heap[0] = item;
nElem = 1;
VQueue qTree = new VQueue(); // fila de árvores
VQueue qIndex = new VQueue(); // fila de inteiros
qTree.enqueue(left);
qIndex.enqueue(new Integer(1));
qTree.enqueue(right);
qIndex.enqueue(new Integer(2));
while (!qTree.isEmpty()) {
BinTree t = ((BinTree) (qTree.front()));
int I = ((Integer) (qIndex.front())).intValue();
heap[i] = t.root;
nElem = i+1;
if (!t.left().isEmpty()) {
qTree.enqueue(t.left());
qIndex.enqueue(new Integer(left(i)));
}
if (!t.right().isEmpty()) {
qTree.enqueue(t.right());
qIndex.enqueue(new Integer(right(i)));
}
}
}
124
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
125
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
126
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
127
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
}
/** Método de impressão. */
public String toString() {
if (isEmpty())
return “[ ]”;
StringBuffer result = new StringBuffer(“[ ” + heap[0]);
for (int i = 0; i < nElem; i++)
result.append(“, ” + heap[i] == null? “ [ ] ” : heap[i]);
return result.toString() + “] ”;
}
public Object clone() {
VHeap newHeap = new VHeap();
newHeap.heap = (Object[]) (heap.clone());
newHeap.nElem = nElem;
return newHeap;
}
}
Classe 7.6. Implementação do amontoado binário com prioridade.
7.4. Sumário
128
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
Perguntas
1. Na fila com prioridade é imperioso que os elementos estejam
ordenados para os poder aceder.
A. Verdadeiro
B. Falso
2. A tabela unidimensional ordenada é um exemplo da representação
estática das filas prioritárias.
A. Verdadeiro
B. Falso
3. A árvore binária é uma representação dinâmica das filas prioritárias.
A. Verdadeiro
B. Falso
4. A lista ligada ordenada é uma representação dinâmica das filas
prioritárias.
A. Verdadeiro
B. Falso
5. Nas tabelas de dispersão ocorre uma colisão quando um mesmo
endereço está associado à diversas chaves.
A. Verdadeiro
B. Falso
Respostas
1.B; 2.A, 3.A; 4.A; 5. B
129
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
8.1. Introdução
130
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6 5 3 9 7 6 5 3 9 7 5 6 3 9 7
j i j i j i
5 6 3 9 7 5 6 3 9 7 5 6 3 9 7
j i j i j i
3 5 6 9 7 3 5 6 9 7 3 5 6 9 7
j i j i j i
3 5 6 9 7 3 5 6 7 9 3 5 6 7 9
j i j i
Figura 8.1. Ilustração do Algorítmo insertionsort.
6 5 3 9 7 3 5 6 9 7 3 5 6 9 7
i i j i
3 5 6 9 7 3 5 6 9 7 3 6 3 7 9
i i i j
Figura 8.2. Ilustração do Algorítmo Selectionsort
131
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6 5 7 9 3 5 6 7 9 3 5 6 7 9 3
i j i j i
5 6 7 9 3 5 6 7 3 9 5 6 7 3 9
j i j i i
5 6 7 3 9 5 6 7 3 9 5 6 3 7 9
j i j i j i
5 6 3 7 9 5 6 3 7 9 5 3 6 7 9
i j i j i
5 3 6 7 9 3 5 6 7 9 3 5 6 7 9
i j i
Figura 8.3. Ilustração do Algorítmo Bubblesort
132
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
3 9 6 7 5 1 4 2 8 0
begin end
133
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
3 0 6 7 5 1 4 2 8 9
begin end
3 0 6 7 5 1 4 2 8 9
begin end
3 0 2 7 5 1 4 6 8 9
begin end
3 0 2 7 5 1 4 6 8 9
begin end
3 0 2 4 5 1 7 6 8 9
begin end
3 0 2 4 5 1 7 6 8 9
begin end
3 0 2 4 1 5 7 6 8 9
begin end
3 0 2 4 1 5 7 6 8 9
end begin
Quando o valor do end é menor que o do begin terminou o processo de
separação e iniciou-se a resolução dos subproblemas.
3 0 2 4 1 5 7 6 8 9
135
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
6 5 3 9 7
6 5 3 9 7 6
i
6 5 3 9 7 6 5
i
6 5 3 9 7 6 5 3
6 5 3 9 7 9 6 3 5
6 5 3 9 7 9 7 3 5 6
i
6 5 3 7 9 6 5 3
i
6 5 6 7 9 5 3
6 5 6 7 9 3
3 5 6 7 9
136
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
package dataStructures;
/** A classe utilitária para ordenação. Possui vários algoritmos de
ordenação sobre vectores de objectos comparáveis. Não se pode
construir objectos nesta classe. */
public class Sort {
/** O construtor privado impede a criação de objectos. */
private Sort() {}
/** O método swap é utilizado pelos algoritmos de ordenação e
corresponde à troca dos dois objectos do vector situados
nos índices i e j. */
private static void swap(Object[] v, int i, int j) {
Object tmp = v[i];
v[i] = v[j];
v[j] = tmp;
}
/** Algoritmo insertionsort, complexidade O(|v|^2)
* @param v O vector de elementos a ordenar
*/
private static void insert(Comparable[] v) {
int i, j;
Comparable tmp;
for (i=1; i<v.length; i++) {
tmp = v[i];
for (j=i; j>0 && v[j-1].compareTo(tmp)>0; j--)
v[j] = v[j-1];
v[j] = tmp;
}
}
/** Algoritmo selectionsort, complexidade O(|v|^2)
* @param v O vector de elementos a ordenar
*/
private static void selection(Comparable[] v) {
int least;
for (int i=1; i<v.length-1; i++) {
least = i;
for (int j=i+1; j<v.length; j++)
if (v[j].comparableTo(v[least])<0)
least = j;
swap(v, i, least);
}
}
/** Algoritmo bubblesort, complexidade O(|v|^2)
* @param v O vector de elementos a ordenar
*/
private static void bubble(Comparable[] v) {
for (int i=v.length; i>0; i--)
for (int j= 1; j<i; j++)
if (v[j].comparableTo(v[j-1])<0)
swap(v, j, j-1);
}
137
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
138
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
8.8. Sumário
Perguntas
1. O algoritmo insertionsort é um algoritmo de ordenação interna que
utiliza a comparação entre os adjacentes para efectuar a ordenação.
A. Verdadeiro
B. Falso
2. O algoritmo de ordenação interna quicksort é mais eficiente quando
utilizado em amostragens relactivamente maiores.
A. Verdadeiro
B. Falso
3. O algoritmo de ordenação externa bubblesort é um algoritmo
recursivo que os elementos adjacentes, colocando os maiores na
direita.
A. Verdadeiro
B. Falso
4. O algoritmo de ordenação bubblesort é mais eficiente quando
utilizado em amostragens relactivamente maiores.
A. Verdadeiro
B. Falso
5. O algoritmo de ordenação selectionsort começa por procurar o
menor valor não ordenado para o mover para a primeira posição.
A. Verdadeiro
B. Falso
Respostas
1. B; 2. A; 3. B; 4. B; 5. A
139
UnISCED CURSO: LICENCIATURA EM ENGENHARIA INFORMÁTICA; 10 Ano
Disciplina/Módulo: Algoritmos e Estruturas de Dados
BIBLIOGRAFIA
140