Escolar Documentos
Profissional Documentos
Cultura Documentos
Slides da Disciplina
Prof. Rmulo Alencar
romulo.alencar@live.estacio.br
Contedo
Funes
Busca binria
Passagem de Parmetros Pilhas
Escopo
Filas
Recursividade
Ponteiros
Classificao
Listas
Listas Sequenciais
Mtodos de Ordenao
Prof. Rmulo Alencar
Listas Simplesmente
Encadeadas
Listas Duplamente
Encadeadas
Listas Circulares
Estruturas de Dados
Funes
possvel dividir seu programa em blocos de cdigo
Estruturas de Dados
Funes
Assim como as funes na matemtica, as funes em
Processamento
Estruturas de Dados
Sada
Funes
Sintaxe de funes na linguagem de programao C++
Tipo de dados da sada
Entrada
tipo_de_dados nome_da_funo(lista_de_parmetros)
{
//Lista de comandos
Processamento
return valor_de_retorno;
Sada
Estruturas de Dados
Funes
Exemplo
Funo para calcular a soma de dois nmeros inteiros
Entrada: dois nmeros inteiros
Processamento: realizar a soma dos dois numeros
Sada: o resultado da soma
Estruturas de Dados
Funes
Uma vez que a funo est criada, ela pode ser
Estruturas de Dados
Funes
Na linguagem de programao C++, todo programa
Sada retornada ao SO
}
Prof. Rmulo Alencar
Estruturas de Dados
Passagem de Parmetros
Funes podem receber parmetros como entrada de
dados
Parmetros podem ser passados
Por valor
Apenas os valores das variveis so passados para a
funo
Por referncia
Os endereos das variveis so passados para a
funo
Estruturas de Dados
Passagem de Parmetros
Passagem de parmetros por valor
Funcionamento
Valores dos parmetros so copiados para as variveis da
funo que sero manipuladas
Exemplo
Admita a funo
int f(int x, int y)
Estruturas de Dados
10
Passagem de Parmetros
Passagem de parmetros por referncia
Funcionamento
Endereos dos parmetros so copiados para as variveis
da funo que sero manipuladas
Exemplo
Precisamos escrever uma funo que inverta os valores de
duas variveis
Primeira ideia
void inverte(int x, int y)
{
int aux = x;
x = y;
y = aux;
}
Admitindo a chamada
inverte(a, b);
Prof. Rmulo Alencar
Estruturas de Dados
11
Passagem de Parmetros
Passagem de parmetros por referncia
Exemplo
Caso executemos a funo do jeito que est, o efeito
esperado no acontecer!
A passagem de parmetros est sendo realizada por valor
As variveis originais estaro isoladas do processamento da
funo
Ocorrer a inverso dos valores de x e y, mas a e b continuam
como estavam antes da execuo
Estruturas de Dados
12
Passagem de Parmetros
Passagem de parmetros por referncia
Exemplo
Segunda implementao
void inverte(int &x, int &y)
{
int aux = x;
x = y;
y = aux;
}
Admitindo a chamada
inverte(a, b);
Estruturas de Dados
13
Passagem de Parmetros
Passagem de parmetros por referncia
Exemplo
Agora a execuo ser exatamente o esperado!
Os endereos de a e b sero passados como endereos de x e
y
No final, a e b, referenciados por x e y, tero seus valores
realmente invertidos!
Estruturas de Dados
14
Passagem de Parmetros
Passagem de parmetros por referncia
Sempre que for necessrio alterar os valores dos
parmetros dentro de uma funo
Dever ser utilizada a passagem de parmetros por
referncia!
Estruturas de Dados
15
Passagem de Parmetros
Passagem de parmetros por referncia
Curiosidade
Na linguagem C, no existe formalmente passagem de
parmetros por referncia
Tal recurso deve ser simulado com o uso de ponteiros
Parmetros devem ser ponteiros
Chamadas de funo devem passar endereos
No confundir com C++, que usa o smbolo & para passagem
de parmetros por referncia!
Chamadas de funo so idnticas, independente do tipo
de passagem de parmetros
Estruturas de Dados
16
Passagem de Parmetros
Passagem de parmetros por referncia
Importante
Tanto C quanto C++ so linguagens com alta
ortogonalidade, ou seja, usam poucos smbolos em sua
representao
*
Declarar um ponteiro
Acessar o valor apontado por um ponteiro
Alm do uso clssico de multiplicao
&
Acessar o endereo de uma varivel
Passagem de parmetros por referncia
Alm do uso clssico do e bit a bit
Prof. Rmulo Alencar
Estruturas de Dados
17
Escopo
O escopo de uma varivel o local dentro do programa
onde a varivel
considerada vlida
Existe
Pode ser acessada
Fora de seu escopo, uma varivel inacessvel
Ainda que continue alocada na memria
Estruturas de Dados
18
Escopo
Na linguagem C++, temos variveis com escopo
Global
So vlidas no programa inteiro
Devem ser declaradas fora de qualquer funo
Local
So vlidas em locais especficos do programa
Esto declaradas dentro de uma funo ou bloco de
cdigo
So vlidas a partir de sua declarao at o final da funo ou
bloco de cdigo
Estruturas de Dados
19
Escopo
Exemplo
int x;
int main()
{
int y;
cin >> y;
if (y > 0)
{
int z;
x = 2 * y;
z = x + y;
}
return 0;
}
Prof. Rmulo Alencar
Estruturas de Dados
20
Escopo
No exemplo anterior
x uma varivel global
Seu escopo o programa inteiro
y uma varivel local
Seu escopo a funo main
A partir do ponto em que foi declarada at o final da funo
Estruturas de Dados
21
Escopo
No podemos ter duas variveis com mesmo nome dentro de
um escopo
Mas podemos declarar variveis com nomes iguais em
escopos diferentes
Exemplo
int x;
x = 10;
if (x > 0)
{
int x;
x = 20;
cout << x << endl;
}
cout << x << endl;
Prof. Rmulo Alencar
Estruturas de Dados
22
Escopo
O primeiro comando cout imprimir 20, enquanto o
segundo imprimir 10
As duas variveis de nome x so diferentes
Pois possuem escopos diferentes!
A segunda atribuio no impacta no valor da primeira
varivel
Cuidado com a definio do escopo de suas variveis!
Erros de lgica de difcil deteco podem acontecer
Estruturas de Dados
23
Recursividade
Uma funo dita recursiva quando faz referncia a ela
Estruturas de Dados
24
Recursividade
Exemplo base: Clculo do Fatorial
Regra
n! =
1
n * (n 1)!
, se n = 0
, nos demais casos
Estruturas de Dados
25
Recursividade
Exemplo em C++ utilizando iterao
int fatorial(int n)
{
int f = 1;
for (int i = 1; i <= n; i++)
f = f * i;
return f;
}
Prof. Rmulo Alencar
Estruturas de Dados
26
Recursividade
Exemplo em C++ utilizando recurso
int fatorial(int n)
{
if (n == 0) return 1;
return n * fatorial(n 1);
}
Estruturas de Dados
27
Recursividade
Vantagens
Geralmente fcil de ler
Geralmente fcil de implementar
Solues elegantes
Fazer mais com menos
Desvantagens
Pode sobrecarregar a pilha de execuo
Muitas chamadas internas a si mesmo
Geralmente mais lento
Estruturas de Dados
28
Recursividade
Cuidado!
Casos bsicos devem sempre ser alcanados pela
execuo da recurso
Caso contrrio, um loop infinito ocorrer!
Provavelmente haver um overflow da pilha de execuo e seu
programa ser encerrado com erro
int fatorial(int n)
{
return n * fatorial(n 1);
}
Estruturas de Dados
29
Complexidade Algortmica
Motivao
Necessidade de medio do tempo de execuo de
algoritmos
Predio de seus comportamentos
Preparao de ambiente de execuo
Medio deve ser independente de hardware
Simples medio de tempo inadequada
Necessrio o uso de mtodos analticos
Estruturas de Dados
30
Complexidade Algortmica
Motivao
Anlise de algoritmos
Baseada no tamanho da entrada
Instrues passam a ter o mesmo peso
Passos
Estruturas de Dados
31
Complexidade Algortmica
Funo matemtica que representa o comportamento do
algoritmo
Quantos passos realizar em funo de sua entrada
Pode ser definida para o melhor caso, caso mdio ou
pior caso
Pior caso a situao adotada como padro
Melhor caso e caso mdio requerem conhecimento prvio
da distribuio da entrada
Algoritmos podem ser analisados em situaes extremas
Estruturas de Dados
32
Complexidade Algortmica
Trs notaes
Estruturas de Dados
33
Complexidade Algortmica
Notao O
Limite superior assinttico
So computados apenas os passos diretamente
dependentes da entrada
Constantes aditivas ou multiplicativas so descartadas
Estruturas de Dados
34
Complexidade Algortmica
Padres de complexidade tpicos
O(1)
Complexidade constante
O(n)
Complexidade linear
O(n2)
Complexidade quadrtica
O(2n)
Complexidade exponencial
O(log2n)
Complexidade logartimica
Prof. Rmulo Alencar
Estruturas de Dados
35
Complexidade Algortmica
Padres de complexidade tpicos
Estruturas de Dados
36
Complexidade Algortmica
Exemplo
Clculo do fatorial de um nmero
funo fatorial(n)
f := 1
para i := 1,,n faa
f := f * i
fatorial := f
Complexidade
O(n) Complexidade linear!
Estruturas de Dados
37
Complexidade Algortmica
Exemplo
Clculo da soma de duas matrizes
para i := 1,,n faa
para j := 1,,n faa
cij := aij + bij
Complexidade
O(n2) Complexidade quadrtica!
Estruturas de Dados
38
Complexidade Algortmica
Os problemas com complexidade exponencial no
Estruturas de Dados
39
Complexidade Algortmica
Exemplo de problema NP-Completo
Problema do Caixeiro Viajante
Como, a partir de qualquer cidade, encontrar o menor
caminho para percorrer todas as outras cidades apenas
uma vez e regressar cidade original?
Estruturas de Dados
40
Registro
Recurso das linguagens de programao que permitem
Estruturas de Dados
41
Registro
Por exemplo, um aluno possui vrios dados diferentes
Estruturas de Dados
42
Registro
Na linguagem C++, um registro definido com a palavra
reservada struct
Nome do registro
struct aluno
{
string nome;
int matricula;
string endereco;
};
Os componentes internos do
registro so conhecidos
como membros
Estruturas de Dados
43
Registro
Uma vez declarado o registro, ele assume o papel de um
tipo de dados
aluno a;
Estruturas de Dados
44
Registro
Registros podem ser utilizados como parmetros de
funes
void imprimir_aluno(aluno a)
{
cout << a.matricula;
cout << a.nome;
}
Estruturas de Dados
45
Registro
Registros tambm podem ser utilizados como tipos de
retorno de funes
aluno criar_novo_aluno()
{
aluno a;
a.matricula = 0;
a.nome = "";
a.endereco = "";
return a;
}
Estruturas de Dados
46
Registro
Registros podem ser compostos por arrays
struct aluno
{
string nome;
int matricula;
float notas[10];
};
47
Registro
Registros podem ser compostos por outros registros
struct curso
{
int codigo;
string nome;
};
struct aluno
{
string nome;
int matricula;
curso curso_matriculado;
};
Prof. Rmulo Alencar
Estruturas de Dados
48
Estruturas de Dados
49
Estruturas de Dados
50
Coleo de Dados
Operadores
- Idade da pessoa
- Entrar no cadastro
- Sair do cadastro
- Alterar o cargo
- Alterar o salrio
Pessoa
Fila de Espera
Cadastro de Funcionrios
Estruturas de Dados
51
Estruturas de Dados
52
Funcionalidade
Fila.Inserir(Pessoa p)
Fila.Retirar(Pessoa p)
Representao abstrata
Implementao
void inserir(struct pessoa p)
{
Estruturas de Dados
53
Estruturas de Dados
Algoritmo
Processo sistemtico para a resoluo de um problema
Um algoritmo computa uma sada
A partir de uma entrada
Durante a computao da sada (processamento)
O algoritmo manipula dados
Quando os dados so manipulados de forma homognea
Constituem um Tipo Abstrato de Dados
Estruturas de Dados
54
Estruturas de Dados
Tipo Abstrato de Dados
composto por
Representao matemtica dos dados
Conjunto de operaes que manipulam os dados
Implementao de um TAD
necessrio represent-lo na linguagem de
programao escolhida
Utilizando tipos de dados e operaes suportados
Estruturas de Dados
55
Estruturas de Dados
Estrutura de Dados
Modo particular de armazenamento e organizao de
dados em um computador de modo que possam ser
usados eficientemente
fundamental propor
Um conjunto eficiente de algoritmos para manipul-las
Estruturas de Dados
56
Estruturas de Dados
Classificao
Estruturas Lineares
Listas
Ns (dados) relacionados linearmente
Casos especiais
Filas
Pilhas
Quanto ordenao
Listas desordenadas
Listas ordenadas
Estruturas de Dados
57
Estruturas de Dados
Classificao
Estruturas Lineares
Listas
Quanto alocao de memria
Listas sequenciais
Listas encadeadas
Quanto navegabilidade
Listas simplesmente encadeadas
Listas duplamente encadeadas
Listas circulares
Listas com clula cabea
Listas com clula cauda
Estruturas de Dados
58
Estruturas de Dados
Classificao
Estruturas Lineares
Listas
Exemplo
Estruturas de Dados
59
Estruturas de Dados
Classificao
Estruturas Lineares
Listas
Operaes tpicas
Criar a lista
Inserir um elemento na lista
Remover um elemento da lista
Buscar um elemento na lista
Busca sequencial
Busca binria
Ordenar a lista
Algoritmos de ordenao
Imprimir os elementos da lista
Estruturas de Dados
60
Estruturas de Dados
Classificao
Estruturas No-Lineares
rvores
Hierarquia de ns
Quanto ordem
rvores binrias
rvores ternrias
rvores n-rias
Quanto ao balanceamento
rvores desbalanceadas
rvores balanceadas
Estruturas de Dados
61
Estruturas de Dados
Classificao
Estruturas No-Lineares
rvores
Implementaes importantes
rvores AVL
rvores rubro-negras
rvores-B
rvores-B+
rvores-quadrante
rvores-kd
rvores-R
Estruturas de Dados
62
Estruturas de Dados
Classificao
Estruturas No-Lineares
rvores
Exemplo
Estruturas de Dados
63
Estruturas de Dados
Classificao
Estruturas No-Lineares
rvores
Operaes tpicas
Criar a rvore
Inserir um elemento na rvore
Remover um elemento da rvore
Buscar um elemento na rvore
Iterao
Recursividade
Balancear a rvore
Imprimir os elementos da rvore
Estruturas de Dados
64
Estruturas de Dados
Classificao
Estruturas No-Lineares
Grafos
Composto por
Vrtices
Arestas
Quanto ao direcionamento
Grafos direcionados
Grafos no direcionados
Certas operaes em grafos possuem complexidade
exponencial!
Achar o melhor caminho entre dois vrtices
Estruturas de Dados
65
Estruturas de Dados
Classificao
Estruturas No-Lineares
Grafos
Exemplo
Estruturas de Dados
66
Estruturas de Dados
Classificao
Estruturas No-Lineares
Grafos
Operaes tpicas
Criar o grafo
Inserir um elemento no grafo
Remover um elemento do grafo
Buscar um elemento no grafo
Imprimir os elementos do grafo
Direcionar o grafo
Fuso de dois elementos do grafo
Inverter o grafo (direcionado)
Estruturas de Dados
67
Estruturas de Dados
Qual estrutura de dados escolher para implementar meu
algoritmo?
Anlise de adequao da estrutura abstrao do
algoritmo
Anlise da complexidade algortmica das operaes
utilizadas com mais frequncia
Anlise dos requerimentos de custo/benefcio
Tempo/custo financeiro de desenvolvimento
Vantagem computacional da implementao
Estruturas de Dados
68
Estruturas de Dados
Exemplo
Complexidade algortmica
Lista desordenada
Insero: O(1)
Busca: O(n)
Qual a melhor?
Depende do que mais importante em cada caso!
Estruturas de Dados
69
Listas
Estrutura de dados linear
Agrupa informaes referentes a um conjunto de
Estruturas de Dados
70
Listas
Formalmente
Lista de n 0 ns L[1], L[2], , L[n]
Tais que suas propriedades decorrem exclusivamente
de sua posio na lista
Se n > 0
L[1] o primeiro n da lista
Para 1 < k n
Ao menos 2 elementos!
O n L[k] precedido por L[k 1]
Estruturas de Dados
71
Listas
Operaes bsicas
Busca
Insero
Remoo
importante que tenhamos algoritmos eficientes
Estruturas de Dados
72
Listas
Armazenamento na memria
Alocao esttica Lista sequencial
Realizada com o uso de vetores
Vantagens
Facilidade de implementao
Desempenho
Alocao contgua
Desvantagens
Conhecimento a priori do tamanho mximo da lista
Lista com tamanho limitado
Pode levar a overflows!
Alocao inicial de uma grande rea de memria
Nem sempre totalmente utilizada!
Prof. Rmulo Alencar
Estruturas de Dados
73
Listas
Armazenamento na memria
Alocao dinmica Lista encadeada
Realizada com o uso de ponteiros
Vantagens
Lista pode crescer sob-demanda
Uso da memria mais racional
Desvantagens
Implementao mais complexa
Desempenho menor
Alocao no-contgua
Estruturas de Dados
74
Listas Sequenciais
Definio da lista
Ns
Registros formados por campos
Armazenam os dados da lista
Listas
Registros que possuem
Uma quantidade n de ns
Um vetor de ns
Sem buracos!
Prof. Rmulo Alencar
Estruturas de Dados
75
Listas Sequenciais
Inicializao da Lista
Antes de poder ser manipulada, a lista precisa ser
inicializada
De acordo com nosso modelo
A quantidade de elementos n deve ser inicializada
Receber zero (0)
Estruturas de Dados
76
Listas Sequenciais
Operao de Busca
Busca Sequencial
Ideia
Percorrer a lista sequencialmente, elemento a elemento, at
encontrar o valor de chave de busca desejado
Ou no encontrar!
Estruturas de Dados
77
Listas Sequenciais
Operao de Busca
Algoritmo (pseudocdigo)
funo busca(x)
i := 1
busca := 0
enquanto i n faa
se L[i].chave = x ento
busca := i
i := n + 1
seno
i := i + 1
Estruturas de Dados
78
Listas Sequenciais
Operao de Insero
Admitindo uma lista desordenada!
Ideia
Procurar pela chave de busca do elemento a ser
inserido
Se j existir um elemento com mesma chave de busca
Informar mensagem de erro, pois cada chave nica!
Caso contrrio
Inserir o novo elemento no final da lista
Primeira posio vaga!
Ajustar o tamanho da lista
Estruturas de Dados
79
Listas Sequenciais
Operao de Insero
Algoritmo (pseudocdigo)
se n < TAMANHO_MXIMO ento
se busca(x) = 0 ento
L[n + 1] := novo_valor
n := n + 1
seno elemento j existe na lista!
seno overflow
Complexidade:
Se no houvesse a busca: O(1) Constante!
Com a busca: O(1) + complexidade da busca
Se a busca for sequencial: O(1) + O(n) = O(n)
Estruturas de Dados
80
Listas Sequenciais
Operao de Remoo
Ideia
Procurar pela chave de busca do elemento a ser
removido
Caso o elemento no seja encontrado
Informar mensagem de erro, o elemento no existe na lista!
Caso contrrio
Retornar os dados do elemento ao usurio
Remover o elemento da lista
Ajustar os elementos subsequentes para no termos um
buraco na lista
Mover cada elemento posterior para a posio
imediatamente anterior
Ajustar o tamanho da lista
Estruturas de Dados
81
Listas Sequenciais
Operao de Remoo
Algoritmo (pseudocdigo)
se n > 0 ento
indice := busca(x)
se indice > 0 ento
valor_recuperado := L[i]
para i := indice at n 1 faa
L[i] := L[i + 1]
n := n 1
seno elemento no existe na lista!
seno underflow
Estruturas de Dados
82
Listas Sequenciais
Operao de Impresso
Ideia
Imprimir todos os elementos da lista, de forma
sequencial
Se a lista estiver vazia
Imprimir mensagem de erro
Estruturas de Dados
83
Listas Sequenciais
Operao de Impresso
Algoritmo (pseudocdigo)
se n > 0 ento
para i := 1 at n faa
imprima L[i]
seno lista sem elementos!
Estruturas de Dados
84
Mtodos de Ordenao
s vezes precisamos ordenar os elementos de uma lista
Como fazer isso eficientemente?
Uma vez que a lista est ordenada, podemos aplicar
Estruturas de Dados
85
Mtodos de Ordenao
Bubble Sort
Ordenao por bolha
O mais bsico de todos os algoritmos de ordenao
Abstrao: bolhas em um lquido qualquer sobem at
romper a superfcie do lquido.
Na ordenao por bolha, cada elemento de menor (ou
maior) valor deve subir na lista at que encontre seu
local adequado de acordo com a ordenao pretendida
Ao final, a lista estar ordenada
Estruturas de Dados
86
Mtodos de Ordenao
Bubble Sort
Ideia do algoritmo
Percorrer todos os itens da lista
A cada item, compar-lo a seus itens anteriores
Se ele for maior (ou menor), desloc-lo sucessivamente em
direo ao incio da lista, at que se encontre um elemento
menor (ou maior)
Neste momento, a lista at o elemento em questo estar
ordenada
Ao final do lao, a lista inteira estar ordenada
Complexidade: O(n2)
Estruturas de Dados
87
Mtodos de Ordenao
Bubble Sort
Algoritmo (pseudocdigo)
Admitindo que a lista ser ordenada de forma
ascendente
funo bubble_sort()
para i := 2 at n faa
k := i
para j := i 1 at 1 faa
se L[j].chave > L[k].chave ento
inverte(L[j], L[k])
k := j
Prof. Rmulo Alencar
Estruturas de Dados
88
Mtodos de Ordenao
Insertion Sort
Ordenao por insero
Mtodo eficiente quando o nmero de elementos
pequeno
Fcil implementao
Extremamente similar ao processo de ordenao de uma
mo de cartas de baralho
Estruturas de Dados
89
Mtodos de Ordenao
Insertion Sort
Ideia do algoritmo
Percorrer a lista da esquerda para a direita
A cada iterao
Admite-se que os elementos esquerda esto ordenados
Retira-se momentaneamente o elemento atual da lista
Os elementos esquerda so percorridos, at que se ache o
buraco onde o elemento retirado deve ser inserido
Complexidade: O(n2)
Estruturas de Dados
90
Mtodos de Ordenao
Insertion Sort
Algoritmo (pseudocdigo)
Admitindo que a lista ser ordenada de forma
ascendente
funo insertion_sort()
para i := 2 at n faa
item := L[i]
buraco := i
enquanto buraco > 1 e L[buraco-1] > item faa
L[buraco] := L[buraco-1]
buraco := buraco-1
L[buraco] := item
Prof. Rmulo Alencar
Estruturas de Dados
91
Mtodos de Ordenao
Selection Sort
Ordenao por seleo
Fcil implementao
Geralmente mais lento que o Insertion Sort
Grande vantagem: usa pouca memria
Em cenrios com escassez de memria, consegue ser
mais rpido que algoritmos mais sofisticados
Estruturas de Dados
92
Mtodos de Ordenao
Selection Sort
Ideia do algoritmo
Encontrar o menor (ou maior) elemento da lista
Substitu-lo pelo primeiro elemento da lista
Repetir o processo para o restante da lista
Complexidade: O(n2)
Estruturas de Dados
93
Mtodos de Ordenao
Selection Sort
Algoritmo (pseudocdigo)
Admitindo que a lista ser ordenada de forma
ascendente
funo selection_sort()
para i := 1 at n-1 faa
minimo := i
para j := i+1 at n faa
se L[j] < L[minimo] ento
minimo := j
inverte(L[i], L[minimo])
Estruturas de Dados
94
Mtodos de Ordenao
Merge Sort
Algoritmo criado por Von Neumann em 1945
Ideia
Dividir uma lista desordenada em n sub-listas, cada
uma com apenas 1 elemento
Se possui apenas 1 elemento, a lista est ordenada!
Complexidade: O(n*log2n)
Estruturas de Dados
95
Mtodos de Ordenao
Merge Sort
Diviso e Conquista
Diviso
Dividir o vetor original de n elementos em dois sub-vetores
com n/2 elementos cada
Conquista
Ordenar os dois sub-vetores recursivamente utilizando o
prprio Merge Sort
Combinao
Combinar os dois vetores para produzir a soluo unificada
(operao merge)
Estruturas de Dados
96
Mtodos de Ordenao
Merge Sort
Algoritmo (pseudocdigo)
funo merge_sort(p, r)
se p < r
ento
q := (p + r)/2
merge_sort(p, q)
merge_sort(q + 1, r)
merge(p, q, r)
Estruturas de Dados
97
Mtodos de Ordenao
Merge Sort
Algoritmo (pseudocdigo)
funo merge(p, q, r)
n1 := q p + 1
n2 := r q
criar vetores E[1...n1] e D[1...n2]
para i := 1 at n1 faa
E[i] := L [p + i 1]
para j := 1 at n2 faa
D[j] := L [q + j]
Estruturas de Dados
98
Mtodos de Ordenao
Merge Sort
Algoritmo (pseudocdigo)
i := j := 1
para k := p at r faa
se E[i] D[j] ento
L [k] := E[i]
i := i + 1
seno
L [k] := D[j]
j := j + 1
Estruturas de Dados
99
Mtodos de Ordenao
Merge Sort
Exemplo
Estruturas de Dados
100
Mtodos de Ordenao
Merge Sort
Exemplo
Estruturas de Dados
101
Busca Binria
Ideia
Admitindo que a lista est ordenada, podemos comear a
busca pelo elemento que est exatamente no meio da lista
Caso ele seja o elemento que estamos procurando, a
busca termina
Caso contrrio, avaliamos se o elemento que estamos
procurando est esquerda ou direita do elemento
do meio
Facilmente decidvel, j que a lista est ordenada!
Uma vez que decidimos onde ele deve estar, repetimos o
processo de busca at encontrar o elemento procurado ou at
que no haja mais elementos onde buscar
Estruturas de Dados
102
Busca Binria
Caracterstica principal
A cada passo da busca, metade do conjunto de dados
descartada
Complexidade da busca binria: O(log2n)
Comportamento logartmico, crescimento suave
busca sequencial
Mas s pode ser utilizada quando a lista est ordenada
Estruturas de Dados
103
Busca Binria
Algoritmo (pseudocdigo)
Admitindo que a lista est ordenada de forma ascendente
funo busca_binaria(x)
inicio := 1
fim := n
busca_binaria := 0
enquanto inicio fim faa
meio := (inicio + fim) / 2
se x = L[meio].chave ento
busca_binaria := meio
seno se x < L[meio].chave ento
fim := meio - 1
seno
inicio := meio + 1
Prof. Rmulo Alencar
Estruturas de Dados
104
Pilha
Tipo especial de lista
Implementa o conceito LIFO
Last In First Out
O ltimo a entrar o primeiro a sair
Utilizada sempre que a funcionalidade de
Empilhar (push)
Insere um novo elemento no topo da pilha
Desempilhar (pop)
Remove o elemento que se encontra no topo da pilha
Prof. Rmulo Alencar
Estruturas de Dados
105
Fila
Tipo especial de lista
Implementa o conceito FIFO
First In First Out
O primeiro a entrar o primeiro a sair
Utilizada sempre que a funcionalidade
Entrar na fila
Insere um novo elemento no final da fila
Sair da fila
Remove o elemento que se encontra no incio da fila
Prof. Rmulo Alencar
Estruturas de Dados
106
Ponteiros
Um ponteiro uma varivel que armazena um endereo
de memria
Funciona exatamente como qualquer outra varivel
Mas seu valor um endereo de memria!
Permite a manipulao de
Endereos de outras variveis
Endereos de memria livres
Estruturas de Dados
107
Ponteiros
Exemplo:
Sendo o seguinte vetor uma representao de memria:
0
10
1000
-2
12,50
Estruturas de Dados
108
Ponteiros
Ponteiros so especialmente importantes para a
Estruturas de Dados
109
Ponteiros
Representao na Linguagem de Programao C++
Definio de uma varivel ponteiro x
int *px;
px um ponteiro para um nmero inteiro
Atribuio de um endereo a px
px = &y;
px recebe o endereo de y
Estruturas de Dados
110
Ponteiros
Representao na Linguagem de Programao C++
Declarando que o ponteiro px no aponta para nada
No padro C++11:
px = nullptr;
Estruturas de Dados
111
Ponteiros
Ponteiros para registros (struct)
Similar a um ponteiro para um tipo escalar
aluno *pa;
pa um ponteiro para um registro de aluno!
Estruturas de Dados
112
Ponteiros
Ponteiros para registros (struct)
Os componentes do registro so acessados normalmente
com o uso do operador ponto
Considerando que o registro apontado pelo ponteiro!
int m = (*pa).matricula;
Primeiro acessamos o registro apontado por pa para, em
seguida, acessarmos sua matricula
A matricula acessada a mesma do registro a (slide
anterior)
Estruturas de Dados
113
Alocao Dinmica
Com o uso de ponteiros, podemos reservar reas de
Estruturas de Dados
114
Alocao Dinmica
Em C++
Alocao realizada com o comando new
Retorna um ponteiro para a rea de memria alocada
Por isso precisamos de ponteiros para realizar
alocao dinmica!
Liberao realizada com o comando delete
No confundir com C, que utiliza malloc e free,
respectivamente
Aloca na memria espao
Exemplo
suficiente para armazenar
int *px = new int;
um int
delete px;
Libera o espao alocado anteriormente
Prof. Rmulo Alencar
Estruturas de Dados
115
Alocao Dinmica
Cuidado!
O comando delete libera a memria apontada pelo
ponteiro, mas no desfaz o apontamento
Ou seja, se o ponteiro for utilizado posteriormente,
estar apontando para um endereo de memria que
no possui mais dados
Neste caso comum que, aps o comando delete, seja feita
uma atribuio de nullptr ao ponteiro
Exemplo
delete px;
px = nullptr;
Estruturas de Dados
116
Alocao Dinmica
Observao
O comando delete executado sobre um ponteiro que
aponta para nullptr no possui efeito
O que significa que no h necessidade de se testar se
o ponteiro realmente aponta para algo antes de liberar
a memria
Caso no aponte, nada acontece
Exemplo
if (px != nullptr)
delete px;
Prof. Rmulo Alencar
Teste desnecessrio
Estruturas de Dados
117
Alocao Dinmica
Comandos new e delete podem ser utilizados para
Estruturas de Dados
118
Alocao Dinmica
Comandos new e delete podem ser utilizados
Estruturas de Dados
119
Listas Encadeadas
Lista implementada com o uso de alocao dinmica
Ns no ficam mais alocados estaticamente na memria
So alocados dinamicamente de acordo com a demanda
Vantagem
Economia de memria
Desvantagem
Menor desempenho
Na prtica, quando no se sabe a priori a quantidade de
Estruturas de Dados
120
Listas Encadeadas
Classificao
Lista Simplesmente Encadeada
Cada n aponta para seu prximo
Lista Circular
O ltimo n aponta para o primeiro
Estruturas de Dados
121
Listas Encadeadas
Lista Simplesmente Encadeada
N
Registro formado por
Chave
Ponteiro para o prximo n
N
Registro formado por
Chave
Ponteiro para o n anterior
Ponteiro para o prximo n
Prof. Rmulo Alencar
Estruturas de Dados
122
Listas Encadeadas
Toda Lista Encadeada, independente de seu tipo, possui
Simplesmente Encadeada
Algoritmo (pseudocdigo)
no := L;
enquanto no NULO faa
imprima no.chave
no := no.proximo
Prof. Rmulo Alencar
Estruturas de Dados
123
Listas Encadeadas
Operao de Busca na Lista Simplesmente Encadeada
Algoritmo (pseudocdigo)
funo busca(x)
busca := NULO
no := L
enquanto no NULO faa
se no.chave = x ento
busca := no
no := NULO
seno
no := no.proximo
Estruturas de Dados
124
Listas Encadeadas
Operao de Insero na Lista Simplesmente Encadeada
Algoritmo (pseudocdigo)
se h memria suficiente para alocar novo n ento
se busca(x) = NULO ento
alocar(novo_no)
novo_no.chave := x
novo_no.proximo := NULO
ultimo_no := L
enquanto ultimo_no NULO faa
ultimo_no := ultimo_no.proximo
ultimo_no.proximo = novo_no
seno elemento j existe na lista!
seno overflow
Prof. Rmulo Alencar
Estruturas de Dados
125
Listas Encadeadas
Operao de Remoo na Lista Simplesmente Encadeada
Algoritmo (pseudocdigo)
se L NULO ento
se L.chave = x ento
desalocar(L)
seno
no := L
enquanto no.proximo NULO faa
se no.proximo.chave = x ento
removido := no.proximo
no.proximo := removido.proximo
desalocar(removido)
no := NULO
seno
no := no.proximo
seno underflow
Estruturas de Dados
126
Listas Encadeadas
Como ficariam os algoritmos para os casos das Listas
Estruturas de Dados
127