Você está na página 1de 86

Estruturas de dados: Pilhas,

Filas, Listas, Dicionrios, Filas de


prioridade.

Agenda

Dicas;
Pilhas;
Filas;
Listas;
Dicionrios;
Filas de prioridade.

Dicas

Leia o problema atentamente


No assuma nada: leia a especificao
Eficincia nem sempre algo to importante
a no ser que voc esteja lidando com
algoritmos exponenciais para problemas
polinomiais

Dicas

Qual a melhor forma de representar uma


mo de cartas?

Voc vai embaralhar as cartas?


Comparar os seus valores?
Procurar por padres na sua mo?

Dicas

Qual a melhor forma de representar cada


carta?

Operaes com cartas?


O naipe importa?

Dicas

Debugar pode ser muito frustante com o rob


de avaliao (robot judge)

Muito importante testar antes da submisso.

Teste a entrada
Teste entradas incorretas
Teste situaes limites (entrada vazia, um
nico item, dois items e valores igual a zero)
7

Dicas

Teste instncias em que voc sabe a


resposta correta
Teste instncias grandes (muito grandes)
Conhea bem seu debugador
Exiba sua estruturas de dados
Faa testes invariantes
Verifique seu cdigo
Faa seus prints significarem alguma coisa

Dicas

Crie seus arranjos um pouco maiores do que


o necessrio

Tenha certeza de que seus bugs so bugs


de verdade

Pilhas

10

Pilhas
Tipo Abstrato de dados com a seguinte
caracterstica:
O ltimo elemento a ser inserido o primeiro
a ser retirado/ removido
(LIFO Lastin FirstOut)

Analogia: pilha de pratos, livros, etc.


Usos: Chamada de subprogramas, avaliao
de expresses aritmticas, etc.
11

Pilhas
Operaes primrias:
PilhaPush(s, x) Insere item xno topoda pilha s.
PilhaPop(s) Retorna (e remove) o topoda pilha s.
PilhaInicializa(s) Cria uma pilha vazia em s.
PilhaCheia(s), PilhaVazia(s) Testa se a pilha s
est cheia ou vazia, respectivamente.
Existem opes de estruturas de dados que podem ser
usadas para representar pilhas.
As duas representaes mais utilizadas so as
implementaes por meio de arranjos e de ponteiros
12

Fila (Queue)

13

Fila
Tipo Abstrato de dados com a seguinte
caracterstica:
O primeiro elemento a ser inserido o
primeiro a ser retirado/ removido
(FIFO Firstin FirstOut)
Analogia: fila em de pessoas, fila de espera,
etc.
Usos: Sistemas operacionais, filas de
impresso, processamento, etc.
14

Fila
Operaes primrias:
FilaPush(q, x) Insere o item x no final da fila q.
FilaPop(q) Retorna (e remove) o item na frente da
fila q.
FilaInicializa(q) Cria uma fila vazia em q.
FilaCheia(q), FilaVazia(q) Testa se a fila q est
cheia ou vazia, respectivamente.
Existem opes de estruturas de dados que podem ser
usadas para representar listas.
As duas representaes mais utilizadas so as
implementaes por meio de arranjos e de ponteiros
15

Dicas

Problemas de utilizar arranjos:

Possibilidade de overflow.
Em caso de fila: dificuldade de manuteno.

Assim, se utilizar array:

Use dois ndices para implementar filas:


inicio(head) e fim (tail), de forma a evitar
movimentaes em toda a fila.
Use um contador para implementar as funes
FilaCheia e FilaVazia.
16

Dicas

Problemas de utilizar arranjos:

Possibilidade de overflow.
Em caso de fila: dificuldade de manuteno.

Assim, se utilizar array:

Use dois ndices para implementar filas:


inicio(head) e fim (tail), de forma a evitar
movimentaes em toda a fila.
Use um contador para implementar as funes
FilaCheia e FilaVazia.
17

Dicionrios

18

Dicionrios
Permite retornar um item a partir de sua chave, ao invs de
utilizar a posio do elemento
Operaes primrias:

DicInsere(d, x) Insere item x no dicionrio d.


DicRemove(d, x) Remove item x(ou o item para o qual x aponta) do
dicionrio d.
DicBusca(d, k) Retorna o item com chave k do dictionrio d (se o item
existir).
DicInicializa(d) Inicializa o dicionrio d.
DicCheio(d), DicVazio(d) Testa se o dicionrio dest cheio ou vazio,
respectivamente.

19

Dicionrios

Arrays ordenados e no-ordenados


Listas ordenadas e no-ordenadas
rvores AVL
Tabelas Hash

Qual deles utilizar? O que analisar?


Performance?
Dados sero modificados?
20

Dicionrios
Dicionrios estticos

Dados no mudam
Utilizar arrays (ordenados ou no-ordenados)
Fazer busca binria apenas se n >> 1000

Dicionrios semi-estticos

Apenas inseres e buscas (pouqussimas remoes)


Tabelas Hash (com endereamento aberto)

Dicionrios totalmente dinmicos

Dados so modificados o tempo todo


Tabelas Hash (caprichar na funo de Hash)

21

Filas de Prioridade

22

Filas de Prioridade
Estruturas de dados que suportam as operaes:
FPInsere(q, x) Insere item x na fila de prioridade q.
FPRemove(q) Remove e retorna o maior item da fila de
prioridade q.
Maximo(q) Retorna o maior item da fila de prioridade q (se
o item existir).
FPInicializa(q) Inicializa a fila de prioridade d.
FPCheio(q), FPVazio(q) Testa se a fila de prioridade q est
cheia ou vazia, respectivamente.

23

Filas de Prioridade

Como implementar?
Quando usar?

Um heap binrio uma forma eficiente.


Se houver poucas inseres, que tal um
array ordenado?
Utilizar para manter cronogramas e
calendrios, determinando prximas tarefas.

24

Conjuntos

25

Conjuntos

Coleo de elementos.
Deve implementar as seguintes operaes bsicas:
Membro(S, x) Retorna true se o item x for membro do
conjunto S.
Uniao(A, B) Retorna um novo conjunto AB.
Intersecao(A, B) Retorna um novo conjunto AB.
SetInsere(S, x), SetRemove(S, x) Insere e remove,
respectivamente, o item x do conjunto S.
SetInicializa(S) Inicializa um conjunto S vazio.

26

Conjuntos

Dicionrio uma boa opo para conjuntos


maiores.
Dicionrios ordenados facilitam a operao de
interseo.
Para conjuntos menores, que tal um array de bits,
com uma posio para cada um dos possveis
elementos?
Uso de array para representar um conjunto U

Eficiente at para valores maiores de |U|


Exemplo: array de 1.000 inteiros suficiente para
representar um conjunto de at 32.000 elementos!!!
27

Que tal implementar um heap binrio ou uma


tabela hash durante uma competio?
Desvantagem de utilizar a linguagem C
No existe uma biblioteca de estruturas
de dados de uso geral
Impossvel criar uma pilha genrica.
Seriam necessrias mltiplas definies:

push_char()
push_int()
push_estudante()
push_outro_tipo_dados()

28

29

Programao Genrica

30

Programao Genrica
Por exemplo, podemos criar uma funo genrica que ordene
um vetor

A linguagem se encarrega de criar especializaes que trataro vetores


do tipo int, float, string e etc.

Podemos tambm criar uma classe genrica para a estrutura de


dados Pilha

A linguagem se encarrega de criar as especializaes pilha de int, float,


string, etc.

O genrico um estncil (define o formato), a Especializao


contedo.
31

Funes Genricas ou Templates

32

Funes Genricas ou Templates

33

Funes Genricas ou Templates

34

Funes Genricas ou Templates

35

Funes Genricas ou Templates

36

Funes Genricas ou Templates

37

Funes Genricas ou Templates

38

Conhecer a STL
(Standard Templates Library)

39

STL

A Standard Template Library (STL) foi


adicionada biblioteca padro C++;
A STL define componentes genricos
reutilizveis que implementam vrias
estruturas de dados e algoritmos que
processam estas estruturas;
Basicamente, a STL composta de
contineres, iteradores e algoritmos.
40

STL

Contineres so templates de estruturas de dados

Possuem mtodos associados a eles.

Iteradores so ponteiros, utilizados para percorrer e


manipular os elementos de um continer;
Algoritmos so as funes que realizam operaes
tais como buscar, ordenar e comparar elementos ou
contineres inteiros

Existem aproximadamente 70 algoritmos implementados


na STL;
A maioria utiliza iteradores para acessar os elementos de
contineres.
41

Contineres

42

Contineres

43

Contineres

44

Contineres

45

Contineres

46

Contineres, Funes Comuns

47

Contineres, Funes Comuns

48

Contineres, Funes Comuns

49

Funes de Contineres

50

Bibliotecas de Contineres

51

Contineres
necessrio garantir que os elementos
armazenados em um continer suportam um
conjunto mnimo de operaes

Quando um elemento inserido em um continer,


ele copiado: o operador de atribuio deve ser
sobrecarregado se necessrio;
Dica: pode ser necessrio que os operadores ==e
< devem ser sobrecarregados.

52

Iteradores

53

Iteradores

54

Categorias de Iteradores

55

Categorias de Iteradores

56

Tipos Predefinidos de Iteradores

57

Operaes em Iteradores

58

Operaes em Iteradores

Bidirecionais

59

Operaes em Iteradores

60

Algoritmos

61

Algoritmos, Ordenao

62

Algoritmos, Busca Binria

63

Algoritmos, Intercalao

64

Algoritmos, Heap

65

Algoritmos, Min e Max

66

Exemplos

67

Exemplos, Vector

68

Exemplos, Vector

69

Exemplos, Vector

A classe vector genrica, logo, deve ser


definido o tipo na declarao de um objeto;
Este continer dinmico

A cada insero o continer se redimensiona


automaticamente.

O mtodo push_back adiciona um elemento


ao final do vector.

70

Exemplos, Vector

Outros possveis mtodos incluem:

front: determina o primeiro elemento;


back: determina o ltimo elemento;
at: determina o elemento em uma determinada
posio, mas antes verifica se uma posio
vlida.
insert: insere um elemento em uma posio
especificada por um iterador.

71

Exemplos, Deque

72

Exemplos, Deque

73

Exemplos, Deque

O mtodo push_front est disponvel apenas


para liste deque;
O operador [] permite acesso direto aos
elementos do deque

Tambm pode ser utilizado em um vector.

Em geral, um deque possui um desempenho


levemente inferior em relao a um vector

No entanto, mais eficiente para fazer inseres


e remoes no incio.
74

Exemplos, Set

75

Exemplos, Map

76

Exemplos, Map

77

Exemplos, Map

O continer map possui os mesmos mtodos


find(), count(), swap() e clear().

78

Exemplos, Multimap

79

Exemplos, Multimap

O continer multimap possui os mesmos


mtodos find(), count(), swap() e clear().

80

Exemplos, Contineres Adaptativos

Os contineres adaptativos (pilha, fila e fila


de prioridades) contm praticamente os
mesmos mtodos:

empty: testa se o continer est vazio;


size: retonar a quantidade de elementos do continer;
top (exceto fila): acessa o elemento do topo;
push: insere um elemento;
pop: remove um elemento;
front (somente fila): acessa o prximo elemento;
back (somente fila): acessa o ltimo elemento.
81

Exemplos, Stack

82

Exemplos, Stack

83

Exemplos, Queue

84

Exemplos, Priority_Queue

85

Estruturas de dados: Pilhas,


Filas, Listas, Dicionrios, Filas de
prioridade.