Você está na página 1de 127

Estruturas de Dados

Slides da Disciplina
Prof. Rmulo Alencar
romulo.alencar@live.estacio.br

Contedo
Funes
Busca binria
Passagem de Parmetros Pilhas
Escopo
Filas
Recursividade
Ponteiros

Complexidade Algortmica Alocao Dinmica


Tipo Abstrato de Dados
Listas Encadeadas
Estruturas de Dados

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

menores chamados funes


Funcionam como sub-programas
Permitem o conceito de encapsulamento
Escondem detalhes de implementao do usurio
Tornam seu cdigo-fonte mais organizado
Evitam retrabalho
Facilitam manuteno
Reduzem pontos de falha

Prof. Rmulo Alencar

Estruturas de Dados

Funes
Assim como as funes na matemtica, as funes em

linguagens de programao possuem


Argumentos/Parmetros
Entrada
Valor de retorno
Sada
Uma funo recebe dados de entrada dos argumentos

(parmetros), realiza um processamento e retorna um


resultado como sada
Sub-programa!
Entrada

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

int soma(int x, int y)


{
int s;
s = x + y;
return s;
}
Prof. Rmulo Alencar

Estruturas de Dados

Funes
Uma vez que a funo est criada, ela pode ser

chamada dentro do programa, inclusive dentro de outras


funes

int subtrai(int x, int y)


{
int s;
s = soma(x, -y);
Chamada de funo
return s;
}
Prof. Rmulo Alencar

Estruturas de Dados

Funes
Na linguagem de programao C++, todo programa

visto como uma funo


Funo main
SO chama o programa, passando parmetros como
entrada. Ao final da execuo do programa, um valor
retornado ao SO.
Entrada vinda do SO

int main(int argc, const char * argv[])


{
...
return 0;

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

Prof. Rmulo Alencar

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)

Uma chamada a ela da forma


a = f(b, c);

Acarretaria na cpia dos valores e b e c para as variveis x


e y.
A partir da, a execuo ocorre normalmente com x e y isoladas
de b e c.

Efeito prtico: caso os valores de x e y sejam alterados pela


funo, nada acontece com b e c, pois elas esto
completamente isoladas!
Prof. Rmulo Alencar

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

Precisamos reescrever a funo utilizando passagem


de parmetros por referncia!

Prof. Rmulo Alencar

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);

Prof. Rmulo Alencar

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!

Prof. Rmulo Alencar

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!

Operador da passagem de parmetros por referncia


&
Na declarao do parmetro da funo

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

z uma varivel local


Seu escopo o bloco de cdigo if
A partir do ponto em que foi declarada at o final do bloco de
cdigo

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

23

Recursividade
Uma funo dita recursiva quando faz referncia a ela

prpria em sua definio


Casos bsicos: razes da soluo
Passo recursivo: permite que outros casos sejam
deduzidos a partir dos casos bsicos
Uma soluo recursiva sempre poder ser reescrita

como uma soluo iterativa

Prof. Rmulo Alencar

Estruturas de Dados

24

Recursividade
Exemplo base: Clculo do Fatorial
Regra
n! =

1
n * (n 1)!

, se n = 0
, nos demais casos

Problema: encontrar o valor do fatorial de um nmero


Soluo: criar uma funo que receba o nmero desejado
e retorne seu fatorial devidamente calculado
Implementaes podem ser construdas de vrias formas
diferentes!

Prof. Rmulo Alencar

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);
}

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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);
}

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

30

Complexidade Algortmica
Motivao
Anlise de algoritmos
Baseada no tamanho da entrada
Instrues passam a ter o mesmo peso
Passos

computada a quantidade de passos para se executar


o algoritmo em relao ao tamanho de sua entrada

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

32

Complexidade Algortmica
Trs notaes

Limite superior justo


O
Limite superior assinttico

Limite inferior assinttico


Notao adotada

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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!

Prof. Rmulo Alencar

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!

Prof. Rmulo Alencar

Estruturas de Dados

38

Complexidade Algortmica
Os problemas com complexidade exponencial no

podem ser representados como polinmios


So problemas No-Polinomiais (NP)
Entre eles esto os problemas NP-Completos
Os problemas mais difceis da Cincia da Computao!
Um problema dito NP-Completo se todo problema NP
puder ser reduzido a ele
A soluo de um problema NP-Completo pode ser
extendida a todos os problemas NP!

Prof. Rmulo Alencar

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?

Prof. Rmulo Alencar

Estruturas de Dados

40

Registro
Recurso das linguagens de programao que permitem

agrupar dados heterogneos (de diferentes tipos de


dados) como uma nica unidade lgica
Tambm conhecido como tipo agregado de dados
Dados que compem o registro so chamados de
membros
A grande vantagem do uso de registros, quando

adequados, tornar o programa mais fcil de ler,


entender e manter
Ou seja, o programa torna-se mais gerencivel
Registros so fundamentais para Estruturas de Dados

So utilizados para representar modelos de dados


Prof. Rmulo Alencar

Estruturas de Dados

41

Registro
Por exemplo, um aluno possui vrios dados diferentes

sobre si, como nome, matrcula, CPF, endereo, etc


Cada um destes dados poderia ser controlado
separadamente, tornando o programa mais complexo e
difcil de gerenciar
Especialmente se vrios alunos tiverem que ser
controlados pelo programa!
Com o uso de um registro de aluno, todas as informaes
de um aluno poderiam ser agrupadas como uma nica
entidade, facilitando o gerenciamento de dados
Vrios alunos poderiam ser controlados como um vetor
de registros de aluno!
Prof. Rmulo Alencar

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

Este ponto e vrgula obrigatrio!


Prof. Rmulo Alencar

Estruturas de Dados

43

Registro
Uma vez declarado o registro, ele assume o papel de um

tipo de dados
aluno a;

Varivel do tipo registro de aluno

Cada membro do registro pode ser acessado com o uso

do operador ponto (.)


a.matricula = 12345;
a.nome = "Joo da Silva";
cout << a.endereco;
Prof. Rmulo Alencar

Estruturas de Dados

44

Registro
Registros podem ser utilizados como parmetros de

funes
void imprimir_aluno(aluno a)
{
cout << a.matricula;
cout << a.nome;
}

Inclusive podem ser passados por referncia


void atribuir_endereco_aluno(aluno &a, string e)
{
a.endereco = e;
}

Prof. Rmulo Alencar

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;
}

Prof. Rmulo Alencar

Estruturas de Dados

46

Registro
Registros podem ser compostos por arrays
struct aluno
{
string nome;
int matricula;

float notas[10];
};

E, como acontece com qualquer tipo de dados, podem

ser usados como tipos de dados de arrays


aluno turma[50];
Prof. Rmulo Alencar

Vetor de 50 registros de aluno


Estruturas de Dados

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

Tipo Abstrato de Dados TAD


Conceito
uma coleo bem definida de dados a serem
armazenados, e um grupo de operadores que podem ser
aplicados para a manipulao desses dados
Caractersticas Fundamentais
Os operadores do TAD implementam regras bem
definidas para manipulao dos valores armazenados
Os valores armazenados devem ser manipulados
exclusivamente pelos operadores do TAD

Prof. Rmulo Alencar

Estruturas de Dados

49

Tipo Abstrato de Dados TAD


Um TAD descreve:
Quais dados podem ser armazenados
O que possvel fazer com esses dados atravs dos
operadores
Um TAD no descreve:
Como as operaes sero efetivamente implementadas
TAD um modelo abstrato!

Prof. Rmulo Alencar

Estruturas de Dados

50

Tipo Abstrato de Dados TAD


Exemplos
Mundo Real

Coleo de Dados

Operadores

- Idade da pessoa

- Nascer (idade recebe valor


zero)
- Fazer aniversrio (idade
incrementada em 1)

- Nome de cada pessoa na


fila
- Posio de cada pessoa
na fila

- Sair da fila (o primeiro)


- Entrar na fila (na ltima
posio)

- Nome de cada funcionrio


- Cargo de cada funcionrio
- Salrio de cada funcionrio

- Entrar no cadastro
- Sair do cadastro
- Alterar o cargo
- Alterar o salrio

Pessoa

Fila de Espera

Cadastro de Funcionrios

Prof. Rmulo Alencar

Estruturas de Dados

51

Tipo Abstrato de Dados TAD


Para que um TAD possa ser implementado
Sua coleo de dados deve ser representada utilizando os
recursos da linguagem de programao
Geralmente utilizando o conceito de registro
Seus operadores devem implementar algoritmos que
resolvam os problemas propostos
Diversos algoritmos podem existir para a resoluo de
cada problema
Aquele com menor complexidade deve ser utilizado sempre
que possvel!

Prof. Rmulo Alencar

Estruturas de Dados

52

Tipo Abstrato de Dados TAD


Devemos sempre considerar as diferenas entre:
Existncia no mundo real

Funcionalidade
Fila.Inserir(Pessoa p)
Fila.Retirar(Pessoa p)

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

A representao do modelo matemtico realizada


utilizando uma estrutura de dados

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

58

Estruturas de Dados
Classificao
Estruturas Lineares
Listas
Exemplo

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

62

Estruturas de Dados
Classificao
Estruturas No-Lineares
rvores
Exemplo

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

65

Estruturas de Dados
Classificao
Estruturas No-Lineares
Grafos
Exemplo

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

68

Estruturas de Dados
Exemplo
Complexidade algortmica
Lista desordenada
Insero: O(1)
Busca: O(n)

rvore binria balanceada


Insero: O(n * log2n)
Busca: O(log2n)

Qual a melhor?
Depende do que mais importante em cada caso!

Prof. Rmulo Alencar

Estruturas de Dados

69

Listas
Estrutura de dados linear
Agrupa informaes referentes a um conjunto de

elementos que se relacionam entre si


Funcionrios de uma empresa
Notas de alunos
Produtos em estoque
Etc

Prof. Rmulo Alencar

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]

Prof. Rmulo Alencar

Estruturas de Dados

71

Listas
Operaes bsicas
Busca
Insero
Remoo
importante que tenhamos algoritmos eficientes

para a implementao das operaes bsicas


Algoritmos eficientes Baixa complexidade
algortmica

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

74

Listas Sequenciais
Definio da lista
Ns
Registros formados por campos
Armazenam os dados da lista

Um dos campos ser a chave


Identificador do n
Chaves no podem se repetir

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)

Em outros modelos, outras aes de inicializao sero


necessrias

Prof. Rmulo Alencar

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!

A busca ser sempre feita pelas chaves de busca


Se a chave de busca existir
Retornar sua posio na lista
Caso contrrio
Retornar o valor zero (0)

Prof. Rmulo Alencar

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

Complexidade: O(n) Linear!

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

Complexidade: O(n) Linear!


Mesmo sem a busca!
Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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!

Complexidade: O(n) Linear!

Prof. Rmulo Alencar

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

mtodos otimizados para executar outras operaes


Por exemplo, podemos realizar buscas utilizando busca
binria

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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])

Prof. Rmulo Alencar

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!

Repetidamente combinar as sub-listas ordenadas para


produzir novas sub-listas, at que 1 nica lista seja
produzida
Totalmente ordenada!

Complexidade: O(n*log2n)

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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)

Prof. Rmulo Alencar

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]

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

99

Mtodos de Ordenao
Merge Sort
Exemplo

Prof. Rmulo Alencar

Estruturas de Dados

100

Mtodos de Ordenao
Merge Sort
Exemplo

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

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

A busca binria geralmente bem mais rpida que a

busca sequencial
Mas s pode ser utilizada quando a lista est ordenada

Prof. Rmulo Alencar

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

pilha do mundo real necessria


Toda pilha possui um topo
Operaes bsicas

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

de fila do mundo real necessria


Toda fila possui um incio e um final
Operaes bsicas

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

Prof. Rmulo Alencar

Estruturas de Dados

107

Ponteiros
Exemplo:
Sendo o seguinte vetor uma representao de memria:
0

10

1000

-2

12,50

Cada regio especfica da memria possui um valor e um


endereo.
Se uma varivel X for alocada no endereo 2
Valor de X 5
Endereo de X 2

Prof. Rmulo Alencar

Estruturas de Dados

108

Ponteiros
Ponteiros so especialmente importantes para a

implementao de Estruturas de Dados!


Pois nos permitem manipular diretamente a memria
Possibilitam alocao dinmica!

Prof. Rmulo Alencar

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

Acesso ao valor apontado por px


z = *px;
z recebe o valor apontado por px, que por sua vez o valor de
y

Prof. Rmulo Alencar

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;

Em padres mais antigos:


px = NULL;
px no aponta qualquer endereo!

comum declarar ponteiros j fazendo sua inicializao


como nullptr
int *px = nullptr;
Por que esta uma boa prtica?
Prof. Rmulo Alencar

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!

Um ponteiro para registro armazena o endereo de um


registro
aluno a;
a.matricula = 12345;
a.nome = "Joo da Silva";
pa = &a;
pa armazena o endereo de a, ou seja, pa aponta para a!

Prof. Rmulo Alencar

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)

Existe uma sintaxe simplificada para acessar


componentes de um ponteiro para registro
int m = pa->matricula;
Operador seta!
Prof. Rmulo Alencar

Estruturas de Dados

113

Alocao Dinmica
Com o uso de ponteiros, podemos reservar reas de

memria sempre que necessrio


o que chamamos de alocao dinmica
Extremamente til para estruturas de dados, pois
poderemos precisar de mais memria do que o reservado
no incio do programa (alocao esttica)
Sempre que seu programa alocar uma rea de memria,

ele responsvel por liber-la quando no precisar mais


dela
Caso a memria alocada no seja liberada, ela ficar
indisponvel para outros programas, mesmo quando seu
programa terminar sua execuo
Prof. Rmulo Alencar

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;

Prof. Rmulo Alencar

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

manipular dinamicamente memria para armazenar


arrays
Neste caso, devem ser utilizados colchetes
Exemplo

int *pv = new int[10];


Aloca na memria espao
delete [] pv;
suficiente para armazenar
um vetor de 10 inteiros

Libera o espao alocado para


todas as posies do vetor
Prof. Rmulo Alencar

Estruturas de Dados

118

Alocao Dinmica
Comandos new e delete podem ser utilizados

normalmente para alocar/desalocar registros


Exemplo

aluno *pa = new aluno;


Aloca na memria espao
delete pa;
suficiente para armazenar
um registro de aluno

Libera o espao alocado para


o registro de aluno

Prof. Rmulo Alencar

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

ns, deve-se utilizar listas encadeadas

Prof. Rmulo Alencar

Estruturas de Dados

120

Listas Encadeadas
Classificao
Lista Simplesmente Encadeada
Cada n aponta para seu prximo

Lista Duplamente Encadeada


Cada n aponta para seu prximo e para seu anterior

Lista Circular
O ltimo n aponta para o primeiro

Prof. Rmulo Alencar

Estruturas de Dados

121

Listas Encadeadas
Lista Simplesmente Encadeada
N
Registro formado por
Chave
Ponteiro para o prximo n

Lista Duplamente Encadeada

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

um ponteiro que aponta para o primeiro elemento da


lista
Os outros elementos so acessados pelo encadeamento
de ponteiros a partir do primeiro
Por exemplo, a operao de impresso em uma Lista

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

Prof. Rmulo Alencar

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

Prof. Rmulo Alencar

Estruturas de Dados

126

Listas Encadeadas
Como ficariam os algoritmos para os casos das Listas

Duplamente Encadeadas e Listas Circulares?


Implemente-os para todos os casos!

Prof. Rmulo Alencar

Estruturas de Dados

127

Você também pode gostar