Algoritmos e Estrutura de Dados
Algoritmos e Estrutura de Dados
Algoritmos e Estrutura de Dados
Algor
Algoritmos
itmos e
Algoritmos e
Estrutura de Dados
Estrutura de
Dados
Algoritmos
Dados e Estrutura de
Presidente
Rodrigo Galindo
Vice-Presidente Acadêmico de Graduação e de Educação Básica
Mário Ghio Júnior
Conselho Acadêmico
Ana Lucia Jankovic Barduchi
Camila Cardoso Rotella
Danielly Nunes Andrade Noé
Grasiele Aparecida Lourenço
Isabel Cristina Chagas Barbin
Lidiane Cristina Vivaldini Olo
Thatiane Cristina dos Santos de Carvalho Ribeiro
Revisão Técnica
Marcio Aparecido Artero
Ruy Flávio de Oliveira
Editorial
Camila Cardoso Rotella (Diretora)
Lidiane Cristina Vivaldini Olo (Gerente)
Elmir Carvalho da Silva (Coordenado
(Coordenador)
r)
Letícia Bento Pieroni (Coordenador
(Coordenadora)a)
Renata Jéssica Galdino (Coordenado
(Coordenadora)
ra)
ISBN 978-85-522-0660-6
CDD 600
2018
Editora e Distribuidora Educacional S.A.
Avenida Paris, 675 – Parque Residencial
Residencial João Piza
CEP: 86041-100 — Londrina — PR
e-mail: editora.educacional@kro
[email protected]
ton.com.br
Homepage: http://www.kroton.com.br/
Sumário
Unidade 1 | Listas Ligadas 7
Palavras do autor
Caro aluno,
Unidade 1
Listas Ligadas
Convite ao estudo
Seção 1.1
Definição e Elementos de Listas Ligadas
Diálogo aberto
Caro aluno,
Nesta seção, você estudará alguns conceitos importantes para a
compreensão e o aprendizado sobre as listas ligadas, assim como
sua estrutura e suas aplicações.
Você conhecerá e compreenderá as estruturas de dados
dinâmicas essenciais e suas aplicações na solução de problemas.
Poderá identificar como a estrutura de uma lista ligada funciona e,
assim, desenvolver novas soluções para os mais variados sistemas
que utilizam essa estrutura como base fundamental do seu
funcionamento, ou criar novos processos automatizados baseados
em listas ligadas.
Para iniciarmos a situação proposta, imagine que você foi
contratado como programador júnior por uma empresa de
tecnologia de sistemas que desenvolve sistemas para diversos
setores do comércio, como farmácias, lojas de roupas, padarias etc.
Como primeiro desafio, você precisará analisar a demanda de
um cliente, uma empresa de autopeças que possui a matriz e uma
filial. Ambas utilizam o sistema no qual você trabalha de forma
interligada.
Esse cliente precisa de sua ajuda e conhecimento para criar um
relatório com informações do estoque mínimo de cada empresa,
utilizando uma lista ligada. Você precisará trabalhar com duas
listagens de informações e implementar esse relatório.
É bom estar atento ao funcionamento de uma lista e no que esta
pode se enquadrar no sistema em que o seu cliente já possui.
Vamos começar?
Bons estudos!
U1 - Listas Ligadas 9
10 U1 - Listas Ligadas
Uma lista ligada é uma coleção L:[a1, a2, ..., an], em que n > 0.
Sua propriedade
elementos, estrutural
dispostos baseia-se apenas na posição relativa dos
linearmente.
De acordo com Silva (2007), é também conhecida como lista
encadeada. É composta de um conjunto de dados dispostos por
uma sequência de nós, em que a relação de sucessão desses
elementos é determinada por um ponteiro que indica a posição do
próximo elemento, podendo estar ordenado ou não.
Pesquise mais
U1 - Listas Ligadas 11
Assimile
Uma das vantagens das listas ligadas é que os elementos alocados
não precisam estar sequencialmente na memória, como é necessário
ocorrer com os vetores. Cada elemento pode estar alocado em
diferentes regiões dela.
Quando uma lista está sem nós, é definida como vazia ou nula,
assim o valor do ponteiro para o próximo nó da lista é considerado
ponteiro nulo, conforme mostra a Figura 1.3.
12 U1 - Listas Ligadas
Exemplificando
Exemplo de declaração para criar uma lista em C:
informação;
• Temos outra struct prox com
com ponteiro para a própria struct alunos,
alunos,
para receber o endereço de apontamento da próxima informação.
Precisamos inicializar a lista para ser utilizada após sua criação.
Para isso, basta criarmos uma função em que inicializamos a lista
como nula, pois esta é uma das possíveis formas de inicialização:
/* Função para inicialização: retorna uma lista vazia */
Lista* inicializa (void)
{
return NULL;
}
U1 - Listas Ligadas 13
A utilização
conhecer dos ponteiros
o endereço é indicada
que está nos casos
armazenando e m quePodemos
em
a variável. é preciso
declarar um ponteiro utilizando a mesma palavra da variável,
precedido do caractere * (asterisco). Vejamos o exemplo:
int *ptr; /* sendo um ponteiro do tipo inteiro*/
float *ptr; /* sendo um ponteiro do tipo ponto flutuante*/
char *ptr; /* sendo um ponteiro do tipo caracteres*/
Exemplificando
int
int x*p;
= 10; /*variável
/*ponteiro
p = &x; /*ponteiro p aponta
aponta para
para o endereço da variável
variável x
14 U1 - Listas Ligadas
char *pnt;
pnt = malloc (2); /* Aloca 2
2 bytes na memória */
U1 - Listas Ligadas 15
Pesquise mais
Assim,
nossa lista.podemos considerar
Para determinar queque start
a lista é ovazia,
está endereço inicial da
consideramos:
start ⇒ prox ==
== NULL.
Exemplificando
Exemplo de um trecho de uma função do tipo inteiro, para inserir
pacientes com prioridades na lista:
16 U1 - Listas Ligadas
listar todasquais
definimos as nossas
delastarefas do próximo
têm mais diacomo
prioridade, de trabalho e, depois,
na Figura 1.5, e
vamos numerando todas as demais por grau de prioridade.
Figura 1.5 | Lista de prioridade de tarefas
Fonte: <http://www.istock
<http://www.istockphoto.com/br/foto/perto-de-um-
photo.com/br/foto/perto-de-um-espa%C3%A7o-em-branco-lista
espa%C3%A7o-em-branco-lista-de-prioridades-
-de-prioridades-
e-caneta-gm532120946-94121105>. Acesso em: 23 out. 2017
2017..
U1 - Listas Ligadas 17
18 U1 - Listas Ligadas
Reflita
U1 - Listas Ligadas 19
Avançando na prática
Desenvolvendo uma lista de itinerários
Descrição da situação-problema
Uma empresa de transporte coletivo municipal, após estudos
realizados com passageiros, identificou que muitas das reclamações
eram sobre o ônibus não passar no ponto corretamente.
Com esses dados, a empresa de transporte decidiu desenvolver
um sistema para orientar os motoristas sobre a questão e contratou
sua empresa para esse desenvolvimento.
Sua empresa precisa, então, desenvolver um sistema em que a
empresa de ônibus insira os pontos de parada de cada rota, para
que os motoristas sigam esse roteiro e não percam nenhum ponto
de passageiros, evitando reclamações dos
do s usuários e desvio da rota.
Com o conhecimento adquirido em listas ligadas, você precisa
desenvolver esse sistema para cada rota existente na empresa.
Como é possível criar uma solução para o problema que essa
empresa vem enfrentando em seus itinerários? Apresente a solução
encontrada à empresa de transportes. Vamos começar?
Resolução da situação-problema
20 U1 - Listas Ligadas
struct rota {
char[15] parada;
struct rota* prox;
};
typedef struct rota Rota;
E inicializar a lista ligada com a função:
Rota* inicializa (void) {
return NULL;
}
U1 - Listas Ligadas 21
22 U1 - Listas Ligadas
U Listas Ligadas
Seção 1.2
Operações com Listas Ligadas
Diálogo aberto
Caro aluno, seja bem-vindo a mais um conteúdo sobre listas ligadas.
Você já se inscreveu em alguma prova de concurso público? Já
imaginou a quantidade de pessoas inscritas em um concurso de
âmbito nacional? E para gerar uma lista de pessoas inscritas por
região? Pois bem, com as listas ligadas, é possível criarmos uma
solução para um evento desse porte. Por meio de listas ligadas,
podemos ordenar os inscritos por ordem alfabética de nome ou
segmentar uma lista por cidades e até mesmo segmentá-la por
cidades e, depois, ordená-la por ordem alfabética.
Nesta seção, você estudará conceitos e as aplicabilidades de
operações com as listas ligadas, a fim de conhecer e compreender
as estruturas de dados dinâmicas essenciais, bem como suas
aplicações na solução de problemas.
Ao utilizar os conceitos sobre listas ligadas vistos na seção anterior,
você estudará e compreenderá, nesta seção, como aplicar as operações
para inserir um elemento no início, no meio e no fim da lista ligada,
assim como o remover e percorrer uma lista para buscá-lo.
Você conhecerá o funcionamento das operações em uma lista e
poderá criar novas funções para aplicá-la em novos sistemas.
Como programador júnior, você precisa aplicar os conhecimentos
que está adquirindo em estrutura de dados em listas ligadas, criando
os relatórios necessários, para solucionar uma nova demanda de
um cliente de autopeças.
Seu cliente solicitou que:
• o relatório seja
seja gerado em tempo real;
• o relatório seja exibido todas as vezes que um produto entrar
nessa listagem ou sair dela;
• o relatório seja gerado por meio de venda ou compra de produtos;
produtos;
• seja possível pesquisar
pesquisar se um produto consta na listagem ou não.
U1 Listas Ligadas 23
ponteiro
Tenenbaumpara o próximo
et al. elemento possui valor nulo, conforme
(2007, p. 225):
Exemplificando
Assimile
Sua implementação
definida como: de chamada da função principal pode ser
cont++;
}
novo -> info = v;
novo -> prox = p -> prox;
p -> prox = novo;
return l;
}
Assim,
para usamos
chamar a implementação do trecho na função principal
a função:
listaFinal = inserirFim(listaFinal, 74);
U1 - Listas Ligadas 27
Reflita
o valor
sem do elemento
o elemento e a lista. Assim, deve atualizar o valor da lista
removido.
Caso o primeiro elemento da lista seja o elemento a ser retirado,
devemos atualizar o valor da lista com o ponteiro para o segundo
elemento, liberando o espaço alocado do elemento retirado, como
podemos observar na Figura 1.11.
Figura 1.11 | Removendo o primeiro elemento da lista
imprimir(
imprimir: ) , passando como parâmetro a lista na qual desejamos
imprimir(listaFinal);
30 U1 - Listas Ligadas
} else {
printf(“\n Elemento encontrado”);
}
Figura 1.14 | Lista impressa em tela
Pesquise mais
struct listaProd {
int codigo;
char produto[30]
produto[30];;
struct listaProd* prox;
};
typedef struct listaProd Produtos;
Produtos* busca(Produtos*
busca(Produtos* l, int v){
Produtos* p;
for (p = l; p != NULL; p = p -> prox) {
if (p -> codigo == v)
return p;
}
return NULL;
}
34 U1 - Listas Ligadas
Produtos* listaProdutos;
listaProdutos = inicializar(); /* inicializa lista como vazia */
listaProdutoss = inserir(l
listaProduto inserir(listaProdutos,
istaProdutos, codprod, nprod);
}
printf(“Lista Produtos:\n”);
imprimir(listaProdutos);
Avançando na prática
Livros para leitura
Descrição da situação-problema
Resolução da situação-problema
3. A função pode ser criada para receber a informação de qual elemento
desejamos e, caso encontre o valor, retorna o ponteiro do nó da lista em
que representa o elemento ou sua posição na lista, ou, como no nosso
exemplo, informa se o elemento foi encontrado ou não.
Com base no texto dado, assinale a alternativa em que consta o trecho de
código correto referente ao texto:
a) Lista* busca(Lista* l, int v){
Lista* p;
for (p = l; p!=NULL; p = p->prox) {
if (p->info == v)
return p;
}
return NULL;
}
b) void libera (Lista* l) {
Lista* p = l;
while (p != NULL) {
Lista* t = p->prox;
free(p);
p = t;
}
}
c) Lista* inserir (Lista* l, int i) {
Lista* novo = (Lista*) malloc(sizeof(Lista));
novo -> info = i;
novo -> prox = l;
return novo;
}
38 U1 - Listas Ligadas
}
e) Lista* inicializar (void) {
return NULL;
}
U1 - Listas Ligadas 39
Seção 1.3
Listas Duplamente Ligadas
Diálogo aberto
Caro aluno, nesta última seção sobre listas ligadas, você
conhecerá as listas duplamente ligadas e suas funcionalidades.
Também compreenderá
compreende rá as estruturas de dados dinâmicas essenciais,
esse nciais,
bem como suas aplicações na solução de problemas.
Poderá identificar as diferenças entre uma lista ligada simples e
uma lista duplamente ligada, como funciona sua estrutura e quais
as vantagens em utilizar essa estrutura dinâmica, permitindo que a
utilização de listas seja mais simples de ser aplicada em sistemas mais
complexos, como a criação de sistemas para controle de processos
dentro do sistema operacional. Com as listas duplamente ligadas,
é possível identificar qual o processo anterior e qual o próximo
processo a ser executado.
Vamos retornar ao nosso desafio desta unidade. Você adquiriu
mais experiência na sua função como programa
programador
dor e passou ao nível
sênior.. Seu líder o deixou como o único responsável por atender um
sênior
cliente antigo da empresa de autopeças, que utiliza os sistemas no
qual você trabalha de forma interligada entre a matriz e a filial.
Após a criação da nova funcionalidade, que permite gerar o
relatório
facilidadepara exibirlançou-lhe
gerada, o estoquemais
mínimo, seu cliente,
um desafio, comaoa perceber
certeza dea
que você tem todas as condições de ajudá-lo. Ele deseja que a
listagem de produtos seja:
• criada de forma ordenada ao adicionar
adicionar ou excluir produtos;
produtos;
• seja exibida em tempo real, nas duas empresas, ao mesmo
tempo e, para isso, precisará utilizar os recursos da lista duplamente
ligada na resolução desse desafio.
Esse cliente precisa novamente de sua ajuda e conhecimento
para a criação desse novo
no vo recurso em suas empresas.
Uma lista duplamente ligada será o assunto principal para
solucionar o desafio do seu cliente.
40 U1 - Listas Ligadas
Exemplificando
{
return NULL;
}
42 U1 - Listas Ligadas
listaFinal = inicializar();
listaFinal = inserir(listaFinal, 20);
}
U1 - Listas Ligadas 43
Assimile
if (ant == NULL) {
l = p -> prox;
}
else
{
p -> ant -> prox = p -> prox;
}
Pesquise mais
As listas duplamente ligadas também permitem a remoção de
elementos do início, do meio e do final da lista, assim como a lista
simplesmente ligada. No vídeo indicado a seguir é possível visualizar a
implementação dessas três formas de remoção.
Lista* p;
Lista* aux;
int temp;
U1 - Listas Ligadas 47
Exemplificando
int main() {
Lista* listaFinal;
listaFinal = inicializar();
listaFinal = inserir(listaFinal, 68);
listaFinal = inserir(listaFinal, 89);
listaFinal = inserir(listaFinal, 41);
listaFinal = inserirFim(listaFinal, 14);
printf(“Lista:\n”);
imprimir(listaFinal);
imprimir(listaFinal);
printf(“\n”);
system(“PAUSE”);
return 0;
}
Reflita
Produtos* aux;
int temp;
}
Assim, todas as vezes que um novo produto é inserido ou
removido da listagem, a função para ordenação é chamada e
executada.
Avançando na prática
Pesquisa de mercado
Descrição da situação-problema
Resolução da situação-problema
struct produto {
char[25] produto;
char[30] mercado;
float valor;
struct produto* ant;
struct produto* prox;
};
typedef struct produto Pesquisa;
novo
novo ->
-> prox
ant ==l; l;
e) Lista* novo = (Lista*) malloc(sizeof(Lista));
malloc(sizeof(Lista));
novo -> info = i;
novo -> prox = novo;
novo -> ant = novo;
Referências
CELES, W.; CERQUEIRA, C.; RANGEL, J. L. Introdução a estrutura de dados: com
técnicas de programação em C. Rio de Janeiro: Campus Elsevier, 2004.
Unidade 2
Pilhas e filas
Convite ao estudo
Seção 2.1
Definição, elementos e regras de pilhas e filas
Diálogo aberto
Caro aluno, nesta seção enfocaremos o desenvolvimento de
habilidades em programação para o trabalho com pilhas e filas,
que serão muito importantes na construção das competências
esperadas para esta disciplina.
Vamos começar?
U2 - Pilhas e filas 59
Exemplificando
Fonte: <https://www.istoc
<https://www.istockphoto.com/br/en/vector/box
kphoto.com/br/en/vector/boxes-on-wooded-pallet-vector
es-on-wooded-pallet-vector-flat-warehouse-
-flat-warehouse-
cardboard-parcel-boxes-stack-front-view-gm6588
cardboard-parcel-boxes -stack-front-view-gm658846064-120259799
46064-120259799 >. Acesso em: 29 nov. 2017
2017..
• um vetor para
para armazenar os elementos da pilha;
• uma variável do tipo
tipo inteiro para armazenar
armazenar a posição atual
atual do
topo da pilha.
U2 - Pilhas e filas 61
Fonte: <http://www.istockphoto.com/br/foto/towers-of-hanoi-gm657122632-1197148
<http://www.istockphoto.com/br/foto/towers-of-hanoi-gm657122632-119714879>.
79>. Acesso em: 29
nov. 2017.
Reflita
Os elementos inseridos
inseri dos em uma pilha possuem uma sequência de
inserção. O primeiro elemento que entra na pilha só pode ser removido
por último, após todos os outros elementos serem removidos.
Segundo Celes, Cerqueira e Rangel (2004), os elementos da pilha
só podem ser retirados na ordem inversa da ordem em que nela
foram inseridos. Isso é conhecido como LIFO (last in , first out , ou seja,
o último que entra
entra é o primeiro a sair) ou FILO (first in , last out , ou seja,
62 U2 - Pilhas e filas
• criar uma
uma pilha vazia;
• inserir um elemento no topo;
• remover o elemento do topo;
• verificar se a pilha está vazia;
vazia;
• liberar a estrutura de pilha.
Definição e elementos de filas
Outra estrutura de dados muito importante é a do tipo fila, que é
muito utilizada para representar situações do mundo real.
Segundo Tenenbaum, Langsam e Augenstein (2007), uma fila é
a representação de um conjunto de elementos no qual podemos
U2 - Pilhas e filas 63
Exemplificando
Fonte: <https://www.ist
<https://www.istockphoto.com/br/en/vector/airport-pas
ockphoto.com/br/en/vector/airport-passengers-registration-waiting-in-line-
sengers-registration-waiting-in-line-
gm890786432-246763716>. Acesso em: 29 nov. 2017.
• um vetor dinâmico;
• uma variável
variável do tipo inteiro para o início;
• uma variável do
do tipo inteiro para o fim.
Regras para operação de filas
Podemos imaginar a fila em uma agência dos Correios.
Diferentemente da fila de um aeroporto para despacho de malas,
a fila dos Correios é realizada com base em senhas, em que um
cliente, na entrada, adquire uma senha e aguarda ser chamado por
ela no painel, dirigindo-se ao guichê para atendimento.
Assimile
Pesquise mais
Fonte: <http://www.gazetadop
<http://www.gazetadopovo.com.br/economia/positivo-informat
ovo.com.br/economia/positivo-informatica-registra-lucro-liquido-de-r-2
ica-registra-lucro-liquido-de-r-233-
33-
milhoes-em-2014-9g7igpwimvtew401m4kqf0t69>.
milhoes-em-2014-9g7igpwimvtew40 1m4kqf0t69>. Acesso em 29 nov. 2017.
U2 - Pilhas e filas 67
montage m,
Com as peças já sendo disponibilizadas na ordem de montagem,
você pode aplicar seu conhecimento adquirido em pilhas para realizar
o encaixe das peças, começando com as estruturas e ajustando
essas peças uma em cima da outra, até a última peça, concluindo
a montagem com a tampa final do notebook, como na Figura 2.12.
Figura 2.12 | Empilhamento de peças na montagem de um notebook
Avançando na prática
Organizando a biblioteca
Descrição da situação-problema
Imagine que a unidade da Kroton na qual você se formou está
reestruturando toda a biblioteca com troca de prateleiras e nova
disponibilização dos livros para os alunos. Sabendo do seu destaque
como aluno e do seu grande conhecimento em e m estrutura de dados,
a direção da faculdade solicitou seu auxílio na organização dos
livros da nova biblioteca, de forma que seja mais simples e prática a
disponibilização do acervo, para busca e consulta dos exemplares.
Assim, você irá precisar elaborar um relatório para facilitar a
organização utilizando as estruturas de pilha e fila.
Você precisará
precisará do seu conhecimento em estrutura de dados em
pilha e fila, para ajudá-lo nessa organização dos livros.
68 U2 - Pilhas e filas
Resolução da situação-problema
por
pelaordem
mesmaalfabética. Assim,
letra serão todos em
colocados os livros
uma cujos títulos iniciam-se
pilha específica, como
no modelo da Figura 2.13.
Figura 2.13 | Empilhamento de livros
Fonte: <http://www.istockp
<http://www.istockphoto.com/br/vetor/alfabeto-de-u
hoto.com/br/vetor/alfabeto-de-uma-pilha-de-livros-colorido-
ma-pilha-de-livros-colorido-
gm477556497-35864160>. Acesso em: 29 nov. 2017.
2017.
a) I, II e III apenas.
apenas. d) II, III e IV apenas.
b) II, IV e V apenas. e) I, IV e V apenas.
c) I, III e V apenas.
70 U2 - Pilhas e filas
Seção 2.2
Operações e problemas com pilhas
Diálogo aberto
Caro aluno, na seção anterior você estudou as definições de
pilhas e filas e suas estruturas. Para darmos continuidade aos nossos
estudos, nesta seção você vai conhecer as operações para inserir e
remover elementos de uma pilha e como verificar se ela está vazia
ou cheia.
• empilhar um novo
novo elemento;
• desempilhar um elemento.
Exemplificando
• criar a declaração
declaração da estrutura
estrutura da pilha;
pilha;
• criar a pilha
pilha com a alocação dinâmica;
dinâmica;
• criar as funções para
para inserir na pilha e remover dela.
U2 - Pilhas e filas 73
Assimile
p -> topo--;
return aux;
}
No trecho apresentado, a função pop_pilha ( ) recebe como para
a struct da
da pilha, e a variável aux declarada
declarada recebe o elemento que
está no topo. Na linha a seguir, o valor do topo é decrementado,
sendo retornado o elemento removido da pilha.
Pesquise mais
Reflita
O algoritmo de Backtracking pode
pode ser aplicado também como
operação de desfazer, existente em diversas aplicações de usuários,
como, por exemplo, a utilização deste algoritmo em sistema de GPS.
Quando o motorista utiliza uma rota não indicada pelo programa,
o algoritmo de Backtracking é
é aplicado para redefinir a nova rota.
int i, j, flag
flag = 0;
char aux;
elem_t_pilha origem;
78 U2 - Pilhas e filas
}
}
}
Assim, o algoritmo de Backtracking tem como meta resolver
o problema no menor intervalo de tempo possível, sem levar em
conta o esforço de operações para a solução do problema.
Agora é com você!
else
return 0; /* Caso contrário, o notebook está com pecas */
}
80 U2 - Pilhas e filas
int main(){
struct Pecas TestePec
estePecas;
as;
int qtd, op;
float num;
printf( “\nInforme a quantidade de pecas do notebook? “ );
scanf(“%d”, &qtd);
U2 - Pilhas e filas 81
criarteste
criarte ste (&T
(&TestePec
estePecas,
as, qtd);
switch (op){
case 1:
if(note_comple
if(note _completo(
to( &T
&TestePec
estePecas
as )
== 1)
printf(“\nNotebook
Completo! \n”);
else {
printf(“\nInformar o numero
da peca? \n”);
scanf(“%f”, &num);
num); insere_peca
insere_pe ca (&T
(&TestePec
estePecas,
as,
}
break;
case 2:
if (note_vazio(&TestePecas) == 1)
printf(“\nNotebook Vazio!
\n”);
else{
valor = remove_pe
remove_peca
ca (&T
(&TestePec
estePecas);
as);
82 U2 - Pilhas e filas
case 3:
if (note_vazio(&TestePecas) == 1)
printf(“\nNotebook Vazio!
\n”);
else {
valor = retorna_peca
(&TestePecas);
printf (“\nUltima peca
inserida: %f\n”, num);
}
break;
case 4:
exit(0);
default: printf(“\nOpcao Invalida! \n”);
}
}
}
Avançando na prática
Torre de Hanói
Descrição da situação-problema
Fonte: <https://www.
<https://www.istockphoto.com/br/foto/a-torre-
istockphoto.com/br/foto/a-torre-de-han%C3%B3i-isolada-no-branc
de-han%C3%B3i-isolada-no-branco-
o-
gm177370171-20377888>.
gm177370171-20377888 >. Acesso em: 28 dez. 2017.
Podemos começar?
Resolução da situação-problema
#include <stdio.h>
#include <stdlib.h>
int contador = 0;
int main(void)
{
int numDiscos;
printf(“Informe o numero de discos: “);
scanf(“%d”, &numDiscos);
hanoi(numDiscos,
hanoi(n umDiscos, ‘A
‘A’,’, ‘B’, ‘C’);
printf(“\n\nA quantidade de movimentos foi: %d”, contador);
return 0;
}
U2 - Pilhas e filas 85
Já a operação
topo de desempilhar
da pilha, sendo utilizada natem a função deem
programação remover um elemento do.
C++ como
Por exemplo, equivale a remover o livro que está no topo da pilha.
Assinale a alternativa que completa as sentenças com as respectivas
funções de pilha:
a) pop( ) e push( ). c) struct( ) e pop(
pop( ). e) pop( ) e struct( ).
b) push( ) e struct( ). d) push( ) e pop( ).
estrutura
a) I, II e IIIinicial
apenas.
apenas.para criação
c) II,deIVuma pilha:
e V apenas. e) I, IV e V apenas.
b) I, III e IV apenas. d) II, III e V apenas.
b)
c) criar
criar marcações para onde para
uma pilha secundária o algoritmo pode
inserir os retornarjána
elementos pilha.
removidos.
d) criar a estrutura para verificar se a pilha está vazia.
e) criar a estrutura para verificar se a pilha está cheia.
86 U2 - Pilhas e filas
Seção 2.3
Operações e problemas com filas
Diálogo aberto
Caro aluno, estamos chegando ao final desta unidade sobre
pilhas e filas. Na seção anterior, você aprendeu sobre as Operações e
problemas com pilhas e como implementar as funções necessárias
para criar um código dessa estrutura.
A estrutura de fila é amplamente usada no mundo real, sendo
muito importante na organização dos elementos que a compõem.
Várias empresas estão aderindo cada vez mais ao painel de senhas
para a organização de suas filas de atendimento. Por meio desse
sistema, as pessoas retiram uma senha e são chamadas pelo painel,
fazendo com que a fila seja organizada, mas sem que elas fiquem na
mesma posição da sua chegada.
Para darmos prosseguimento
prosseguimento a nossos estudos nesta seção, você
vai aprender sobre as operações de inserção, remoção e verificação
se uma fila está vazia ou não.
Para a solução de desafios referentes a filas, você vai conhecer
e compreender as estruturas de dados dinâmicas essenciais, bem
como suas aplicações na solução de problemas.
U2 - Pilhas e filas 87
Fonte: <https://www.is
<https://www.istockphoto.com/br/foto/grupo-de-p
tockphoto.com/br/foto/grupo-de-pessoas-em-fila-para-a-
essoas-em-fila-para-a-caixa-
caixa-
gm453156437-30865510>. Acesso em: 27 dez. 2017
2017..
Assimile
Pesquise mais
também chamadas
apresentada de filas estáticas.
a implementação No
de criação vídeo indicado
e eliminação a seguir,
de uma é
estrutura
de dados do tipo fila estática. BACKES,
B ACKES, André. Linguagem C Programação
Descomplicada. Aula 32 - Criando e destruindo uma fila estática.
Disponível em: <https://www.youtube.com/watch?v=y93DzmBskGQ>.
Acesso em: 22 jan. 2018. (Vídeo do YouTube)
U2 - Pilhas e filas 89
• remove o elemento
elemento do início da
da fila;
• verifica se a fila está vazia;
vazia;
• libera a fila.
Conforme Celes, Cerqueira e Rangel (2004), podemos
simplesmente utilizar um vetor para armazenar os elementos e
implementarmos uma fila nessa estrutura de dados ou podemos
utilizar uma alocação dinâmica de memória para armazenar esses
elementos.
#define N 100
struct fila {
int n;
int ini;
char vet[N];
};
typedef struct fila Fila;
Após a definição da estrutura, é preciso inicializar a fila, para que
possa receber os elementos e, utilizando a alocação dinâmica, ser
implementado o trecho de código a seguir para a inicialização da
fila como vazia:
90 U2 - Pilhas e filas
U2 - Pilhas e filas 91
92 U2 - Pilhas e filas
Reflita
Filas circulares
U2 - Pilhas e filas 93
• um valor inteiro
inteiro para o tamanho da fila;
• um valor inteiro
inteiro para o início da fila;
• um valor inteiro
inteiro para o fim da fila.
Exemplificando
94 U2 - Pilhas e filas
f -> ini = 1;
f -> fim = 0;
}
U2 - Pilhas e filas 95
Retomando
consultoria nosso desafio,
ao Vinícius, a fim devocê foi direcionado
ajudá-lodirecion ado do
na criação para realizarpara
sistema uma a
terceirização de serviços em montagem de notebooks, em que será
feita a montagem e, após a conclusão, os testes nos equipamentos.
96 U2 - Pilhas e filas
Avançando na prática
Fila de processos em um sistema operacional
Descrição da situação-problema
U2 - Pilhas e filas 97
Sua função
circular é analisar
de processos, a fime de
implementar
solucionar oum algoritmo
problema de de uma fila
requisições
nos processos em execução, com base no tempo limite para cada
processo a ser executado, e garantir o funcionamento do sistema
operacional da empresa.
Seu desafio será entregar um relatório com a análise realizada e o
algoritmo de como implementar essa solução junto ao seu cliente.
Resolução da situação-problema
Para aeresolução
declarar utilizar asdesse desafio,
funções você(vai
de horas precisar
Time pesquisar
) dentro como
da linguagem
C++.
É importante realizar um fluxograma a fim de entender como
pode funcionar a fila circular para resolver o problema de processos
e, com base nesse fluxograma, criar o algoritmo para a execução
da solução.
A implementação do algoritmo a seguir é uma das formas
possíveis de solucionar o desafio proposto, em que é verificado o
tempo limite de cada processo e, assim que o tempo se esgotar,
o sistema irá remover o processo da fila e passar para o próximo
processo. Com base neste algoritmo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> /* Declaração das funções de horas */
#define N 10
struct filacirc {
int tam, ini, fim;
int vet[N];
98 U2 - Pilhas e filas
};
typedef struct filacirc FilaCirc;
f -> ini = 1;
f -> fim = 0;
}
f -> tam--;
}
}
U2 - Pilhas e filas 99
int main ( ){
FilaCirc* f;
char processo[20]
processo[20];;
int tempo, tmpGasto;
clock_t tInicio, tFim; /* Declaração de variável do tipo hora
*/
}
while (f -> tam <= N - 1){
tFim = clock(); /* Finaliza o relógio */
tmpGasto = ((int) (tFim – tInicio)); /* Calcula o
tempo gasto */
remove_fila(f);
} else {
printf(“Processando...”);
}
system(“Pause”);
}
Referências
CELES,
CELES, W.; CERQUEIRA, Renato; RANGEL, José Lucas. Introdução à estrutura de
dados: com técnicas de programação em C. Rio de Janeiro: Campus-Elsevier, 2004.
Unidade 3
Tabelas de Espalhamento
Convite ao estudo
proposição: em razão
grupo de estudos estãodotendo
grande
emdestaque que você
programação, e seu
a unidade
universitária em que estudam lhes solicitou o desenvolvimento
de um novo sistema para a biblioteca da unidade.
A biblioteca está passando por uma reestruturação de
melhorias e o sistema atual já não suporta mais a quantidade
de livros existentes, tornando lento o retorno das informações.
Seção 3.1
Definição e Usos de Tabela de Espalhamento
Diálogo aberto
Prezado aluno, na seção anterior você conheceu e aprendeu
sobre as Pilhas e Filas, definições e operações como uma estrutura de
dados. Nesta seção, vamos concentrar nossos estudos nas Tabelas
Tabelas de
Espalhamento, com o intuito de desenvolvermos habilidades lógicas
e de programação nessa estrutura que será de muita importância no
aprendizado das competências esperadas para esta disciplina.
A estrutura da Tabela de Espalhamento é dividida em grupo de
informações e, ao realizar a busca de uma informação, a estrutura
elimina a maior quantidade possível de elementos que estão em
outros grupos, restringindo o espaço e facilitando a busca.
Em estrutura de dados, os métodos de pesquisas existentes
procuram informações armazenadas com base em comparações de
chaves, como a Lista Ligada, por exemplo. Para obter um algoritmo
mais eficiente, é ideal que as informações armazenadas estejam
organizadas e é nesse ponto que a Tabela
Tabela de Espalhamento entra.
Como vimos, você e seu grupo de amigos se destacaram em
programação na unidade em que estudam e foram convidados
pela faculdade a desenvolver um novo sistema para a biblioteca,
substituindo o atual sistema já defasado, visto que a biblioteca está
sendo reestruturada para atender à crescente demanda de alunos.
Como primeiro desafio, vocês precisaram criar um sistema
moderno e com grande desempenho, atendendo à demanda de
alunos e realizando buscas rápidas dos exemplares.
Será necessário utilizar a estrutura de dados com Tabelas de
Espalhamento para facilitar a exposição e categorização dos
exemplares.
Para isso, vocês precisarão pesquisar e realizar um levantamento
de qual a melhor forma para estruturar o sistema e tornar as buscas
mais rápidas para os usuários, a fim de entender e compreender a
as atividades propostas.
conhecimentos Procure
importantes se aprofundar
para sua formação e nos conteúdos e
profissão.
Preparados para começar?
Segundo
mesmo Silva
em um (2007),
banco dehá situações,
código postalcomo
(CEP)em
dosuma faculdade
Correios, ou
em que
a recuperação de informações em um grande volume de dados em
uma tabela exige formas eficientes de acesso à informação, com
buscas de melhor desempenho.
Definição de Tabelas de Espalhamento
Exemplificando
Para Celes
estrutura et al.
ocuparia (2004),
4 bytes poraponteiro,
utilização desta
assim formatotal
o gasto de seria
uso da
de
aproximadamente
aproximad amente 40 mbytes, sendo considerado um consumo de
memória ainda alta, apesar de ser muito menor que a forma anterior.
Assimile
• identificar
uma chave; em qual subconjunto podemos inserir ou procurar
• gerenciar os subconjuntos
subconjuntos menores com
com métodos simples.
simples.
Segundo Silva (2007), a Função de Espalhamento permite
identificar quantos subconjuntos serão necessários para criar uma
regra de cálculo, nos quais, dada uma chave, será possível identificar
em qual subconjunto será armazenada ou em qual devemos
procurar as informações.
Para Celes et al. (2004), a Função de Espalhamento transforma
uma chave em um endereço e associa-a ao endereço relativo do
registro, apresentando as seguintes características:
• os endereços aparentam ser aleatórios, não existindo um
paralelo entre a chave e o endereço, apesar de a chave ser utilizada
no Espalhamento;
• é possível duas chaves direcionarem ao mesmo endereço,
gerando uma colisão a ser tratada.
A ideia principal do Espalhamento é utilizar uma função com
aplicação em parte da informação, chamada de chave, para retornar
ao índice onde a informação deve ou deveria estar armazenada,
mantendo, de forma ideal, uma informação por índice, sem
repetição, como no exemplo da Figura 3.4.
Figura 3.4 | Exemplo de Espalhamento ideal
Fonte: elaborada pelo autor.
Reflita
Pesquise mais
Comparativo: Tabelas
Tabelas de Espalhamento × Listas Ligadas
Acesso aos
Acesso direto Acesso sequencial
dados
Insere com base na Função Pode-se inserir dados
Inserção de
de Espalhamento por no início, meio ou
dados
subconjuntos final da Lista
Remove com base na A remoção pode ser
Remoção de
Função de Espalhamento por realizada no início,
dados
subconjuntos meio ou final da Lista
Utiliza métodos para controle
Não há controle
Duplicidade de de colisão, podendo usar
de duplicidade de
informações uma Lista Ligada como
informação
auxiliar para armazenamento
Pesquisa sequencial,
Acesso direto aos dados
Pesquisa de sendo a pesquisa
pesquisado devido à Função
dados realizada chave a
de Espalhamento
chave
Fonte: elaborada pelo autor.
Com o
o nosso conhecimento
desafio. adquirido
Você e seu nesta
grupo de seção,
amigos vamos
que relembrar
se destacaram
em programação na unidade em que estudam foram convidados
pela faculdade a desenvolver um novo sistema para a biblioteca,
substituindo o atual sistema, já defasado, visto que a biblioteca está
sendo reestruturada para atender à crescente demanda de alunos.
Avançando na prática
Pronto-socorro
Descrição da situação-problema
você, solicitando
organização sua consultoria
de dados. Após vários em soluções
estudos de problemas
e grande em
conhecimento
na área, você se tornou um exímio consultor de software com
com base
em Tabelas de Espalhamento.
2. Para
resolvermos o problema de , podemos em muitos
casos utilizar outras estruturas de dados combinados com a Tabela de
, como uma . Assim, para cada elemento da
Tabela de Espalhamento, teremos uma Lista ou outra estrutura de dados
para armazenar mais informações na mesma , em vez de
apenas uma informação.
Assinale a alternativa que contém as palavras que completam a sentença
corretamente:
a) chave, Dispersão, Fila e posição.
b) colisão, Escrutínio, Fila e tabela.
c) chave, Espalhamento, Lista Ligada e tabela.
d) colisão, Dispersão, Pilha e posição.
e) colisão, Espalhamento, Lista Ligada e posição.
posição.
Seção 3.2
Operações em Tabelas de Espalhamento
Diálogo aberto
Prezado aluno, na seção anterior você aprendeu sobre as definições
e a utilização das Tabelas
Tabelas de Espalhamento.
Espalhamento. Para continuarmos
continu armos nosso
conteúdo nesta seção você aprenderá e conhecerá, as Funções de
Espalhamento, operações para inserir e remover elementos de uma
tabela, identificar se um elemento está presente ou ausente nela e
identificar o tamanho do conjunto na Tabela de Espalhamento.
Para conhecer e compreender as estruturas de dados dinâmicas
essenciais, bem como suas aplicações na solução de problemas
com Tabelas
Funções de Espalhamento,
de Espalhamento vocêarmazenar
e como aprenderáas
asinformações
operações com
em
sua estrutura.
Com o uso dessa técnica de espalhamento, será possível
criar sistemas que permitam a fácil organização de informações,
possibilitando, assim, a busca rápida dessa informação quando
solicitada. É possível imaginarmos como seriam os sites de buscas
da internet sem uma Tabela de Espalhamento para acesso direto às
informações em sites de dados?
No mundo existem 13 servidores de direcionamento de sites
e todos eles possuem uma tabela para armazenar todos os sites
existentes e seus endereços de IP (
(Internet Protocol ou
ou Protocolo de
Internet), onde identificam em qual servidor do mundo encontra-se
um site que você deseja acessar. Vamos supor que você irá acessar um
site. Os servidores realizam a busca deste endereço do site informado
em uma tabela onde constam todos os endereços de IP atribuídos
a cada endereço de site no mundo, e assim ele associa o endereço
que você deseja com o local onde está hospedado este site ou
milhares de pessoas ao redor do mundo acessam simultaneamente
esses servidores. Como seria a procura de um único endereço dentre
milhares de sites nestes servidores sendo comparado linha a linha até
encontrar o site desejado? Para essa solução, temos as Tabelas de
Espalhamento, que permitem acessar diretamente o servidor do site
que você procura, ganhando desempenho nas buscas.
Para o desafio desta seção, sabemos que seu grupo foi destaque da
faculdade em programação e vocês foram convidados a desenvolver
o novo sistema da biblioteca, que está sendo reestruturada em
melhorias para atender à grande demanda de alunos.
O sistema atual já não suporta mais a quantidade de buscas em
razão
lento, da quantidade
além de ser umdesistema
exemplares cadastrados, o que o deixa mais
antigo.
Ao definir a forma de buscas a ser realizada pelo sistema, será
necessário, agora, analisar a adição e remoção de novos exemplares
no sistema, além de verificar se existe ou não um exemplar no
sistema da biblioteca, quando solicitado pelo aluno, com base nas
Funções de Espalhamento, apresentando, após, um relatório da
possível implementação da solução encontrada para esse desafio.
Pronto para solucionar esse desafio?
F (valor) =
1 Se valor < 30
2 Se 30 ≤ valor < 50
3 Se valor ≥ 50
Fonte: adaptada de Silva (2007).
para que a lista fique ordenada. Para criar uma única lista ordenada,
basta unir as listas geradas, como na Figura 3.9.
Figura 3.9 | Lista ligada ordenada com a Função de Espalhamento
- Divisão
Conforme Drozedek (2016), a forma de divisão é a mais simples
e utilizada para a Função de Espalhamento, em que a função deve
retornar um valor de índice válido para uma das células da tabela,
garantindo o acesso direto aos elementos.
Para definir o endereço de um elemento na Tabela de
Espalhamento, basta utilizar o resto da divisão de sua chave pela
quantidade de elementos no vetor de alocação.
A divisão é dada por:
h (k ) = mod (k ,n ).
).
Ou seja, a Função de Espalhamento (h ) é igual ao resto da divisão
(mod ) entre o valor a ser buscado ou inserido ( k ) e a quantidade de
células do vetor (n ).).
Podemos verificar o seguinte exemplo de aplicação dessa função:
funç ão:
Vamos supor que temos uma tabela de 10 posições e a seguinte
sequência de chaves: 16, 65, 248, 189, 74 para ser inserida nela.
Como resultado, teremos na Tabela 3.3 a seguinte distribuição na
Tabela de Espalhamento, após o uso da função por divisão:
Tabela 3.3| Distribuição na Tabela de Espalhamento
Representan
Representando
do essa tabela em forma de Tabela
Tabela de Espalhamento,
Espalhamen to,
teremos o resultado exibido na Figura 3.10.
Figura 3.10 | Representação da Tabela de Espalhamento
Exemplificando
Para criarmos um exemplo desta seção, vamos utilizar a estrutura
declarada na seção anterior:
#define tam 113
struct matricula{
int RA;
char nome[81];
char email[41];
char turma;
};
typedef struct matricula MatAluno;
typedef MatAluno* Hash[tam];
Reflita
if (tab[h] == NULL) {
tab[h] = (MatAluno)* malloc(sizeof(MatA
malloc(sizeof(MatAluno));
luno));
tab[h] -> RA = RA;
}
Pesquise mais
h = (h + 1) % tam;
}
return NULL;
}
Verificação do tamanho do conjunto em Tabelas de
Espalhamento
A função de verificação do tamanho do conjunto pode ser
realizada de duas formas:
• Percorrer todas as Listas da tabela, contando os elementos
}
Acervo* insere_Esp (Hash tab, int codigo, char* titulo, char*
autor, char* area) {
int h = funcao_Esp(codig
funcao_Esp(codigo);
o);
}
void remove_Esp(Hash tab, int codigo){
int h = funcao_Esp(codig
funcao_Esp(codigo);
o);
h = (h + 1) % tam;
}
return NULL;
}
Avançando na prática
Urnas eletrônicas
Descrição da situação-problema
Resolução da situação-problema
A implementação desse sistema de senha pode ser criada com
base na troca de caracteres, usando a ideia do Criptograma de César
César,,
com base no vocabulário. É passada uma chave (um número) e a
letra digitada é alterada pela letra que se situa na posição indicada
pela chave:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define tam 250
typedef struct{
char mensagem[tam];
}urna;
2. Em cálculo de endereços e , de
Espalhamento, ao inserirmos um elemento na tabela e esse elemento
com outro elemento no endereço de , o elemento
a ser inserido será armazenado no próximo disponível na
própria tabela.
Assinale a alternativa que contém as palavras que completam a sentença
corretamente:
a) multiplicação – Tabelas
Tabelas – colidir – tabela – índice.
b) Hash – Funções – troca – índice – grupo.
c) divisão – Tabelas
Tabelas – troca – índice – grupo.
d) divisão – Funções – colidir – índice – índice.
e) Hash – Tabelas
Tabelas – colidir – tabela – índice.
Seção 3.3
Otimização de Tabelas de Espalhamento
Diálogo aberto
Saudações, caro aluno!
Nesta seção, você poderá identificar por que ocorre a deterioração
de desempenho em Tabelas de Espalhamento, podendo
comprometer o desempenho na busca e no armazenamento de
informações. Conhecerá como utilizar técnicas na otimização de
desempenho em uma tabela, aprenderá como realizar a redução de
colisões nos casos em que a colisão ocorrer em armazenamento de
informações e melhorará o Espalhamento em tabelas, bem como
suas aplicações na solução de problemas.
Técnicas de otimização permitem que o uso de Tabelas de
Espalhamento melhore consideravelmente o desempenho de busca
e armazenamento por meio do acesso direto à informação.
Para retornarmos ao nosso desafio desta unidade, a biblioteca da
unidade universitária em que você estuda está passando por uma
reestruturação de melhoria em diversos pontos. Como você e seu
grupo se destacaram em programação, a direção da faculdade os
• qual o índice
índice a ser definido
definido para busca;
• o armazenamento de um elemento ou informação em sua
estrutura.
Já estudamos que uma Função de Espalhamento Perfeita
apresenta todos os elementos de um conjunto de chaves em apenas
uma entrada na Tabela de Espalhamento. Em geral, chamamos a
Função de Espalhamento de “perfeita” se é uma função bijetora,
como mostra a Figura 3.12.
Figura 3.12 | Exemplo de Função de Espalhamento Perfeita
Assimile
A principal
é o fato devantagem de ter
ser possível uma pesquisas
realizar Tabela decom
Espalhamento perfeita
tempo constante.
Assim, sendo de conhecimento todas as chaves de início, uma
Tabela de Espalhamento perfeita pode ser criada por uma Função de
Espalhamento Perfeita, sem ocasionar nenhuma colisão.
Assimile
Já no caso
devem do Endereçamento
ser inseridos de maneira Aberto, os cada
direta em elementos emposições
uma das questão
calculadas pela Função de Espalhamento. Caso ocorram colisões,
o registro ao qual se refere a colisão deverá ser inserido na próxima
posição livre da Tabela de Espalhamento.
Exemplificando
if (a[ i ] == chave)
return –1; /* Elemento já existente na tabela */
if (++cont == n)
return –2; /* Retorna que a tabela está cheia */
}
/* Insere na próxima posição livre encontrada e retorna a
posição onde inseriu */
a[ i ] = chave;
return i;
}
int busca_espalha(int a[], int chave, int n) {
int i, cont = 0 ;
i = espalha(chave);
/* Procura a chave a partir da posição i */
while (a[ i ] != chave) {
if (a[ i ] == -1)
return –1; /* Retorna que não achou a chave, pois existe
uma posição vazia */
if (++cont == n)
return –2; /* Retorna que a tabela está cheia */
}
/* Retorna a posição que encontrou */
return i;
}
Função de Espalhamento Duplo
}
/* Retorna a posição que encontrou */
return i;
}
Reflita
Melhorando o Espalhamento
free(p);
p = q;
}
}
/* Insere na posição livre encontrada */
p[ i ] = chave;
M++;
return i;
}
Pesquise mais
}
Avançando na prática
Atendimento ao cliente
Descrição da situação-problema
Vamos começar?
Resolução da situação-problema
ainda,
sistemaque a utilização
aproveitar de função
melhor dupla,
o uso da com tabela dinâmica, fará o
memória.
Referências
CELES,
C ELES, W.; CERQUEIRA, R.; RANGEL, J. S. Introdução à estrutura de dados : com
técnicas de programação em C. Rio de Janeiro: Campus Elsevier, 2004.
Unidade 4
Armazenamento associativo
Convite ao estudo
Armazenamento Associativo,
essa estrutura, como funcionam quais
os as motivações
Mapas para utilizar
Associativos e usos
gerais para Armazenamento Associativo.
Na seção seguinte, você aprenderá sobre definição e
exemplos de Mapas com Listas, verificará a existência de
uma Chave específica em um mapeamento com listas,
como adicionar e remover associações dadas suas chaves
em mapeamento com listas e recuperar valores associados a
chaves em mapeamento com listas.
Prontos?
Seção 4.1
Definição e usos de Mapas de Armazenamento
Diálogo aberto
Caro aluno, na unidade anterior, você conheceu e aprendeu a
respeito das Tabelas
Tabelas de espalhamento,
espalhament o, definições, operações,
opera ções, como
resolver problemas e otimizar as pesquisas de informações nessa
estrutura de dados. Nesta seção, vamos direcionar nossos estudos
em Armazenamentos Associativos com o objetivo de conhecer
e compreender os Mapas de Armazenamento Associativo, sua
construção e uso adequados, e sua aplicação em programas de
computador.
Vamos começar?
Exemplificando
Fonte: <https://www.
<https://www.istockphoto.com/br/foto/mul
istockphoto.com/br/foto/mulher-de-varredura-de-c%C3
her-de-varredura-de-c%C3%B3digo-de-barras-de-um-
%B3digo-de-barras-de-um-
r%C3%B3tulo-no-armaz%C3%A9m-moderno-gm697462150
r%C3%B3tulo-no-arma z%C3%A9m-moderno-gm697462150-129182251>.
-129182251>. Acesso em: 17 jan. 2018.
nosVocê consegue
dias de hoje são imaginar quantas
possíveis no mundoutilizações
real? Pois de associação
bem, inúmeras
foram as formas de utilização da associação no mundo real, como
o controle de veículos existentes, como carros, motos, caminhões e
ônibus nas ruas das cidades ou estradas; algum órgão governamental
associa uma placa a cada veículo existente, assim é informada a
placa do veículo apenas, sendo possível consultar suas informações
cadastrais.
160 U4 - Armazenament
Armazenamento
o associativo
Mapas Associativos
162 U4 - Armazenament
Armazenamento
o associativo
Pesquise mais
A utilização de Mapas Associativos tem grande aplicação dentro do
sistema operacional em gerenciamento de memórias cache.
Reflita
É possível,
chave está ou por
nãomeio do Mapa
associada Associativo,
a algum verificar
valor, como
valor, se determinada
na implementação
do trecho de código a seguir:
#include <iostream>
#include <map>
mapa[1] = “KLS”;
mapa[2] = “KROTON”;
mapa[3] = “ESTRUTURA DE DADOS”;
scanf(“%d”,&chave);
if(mapa.find(chave)
if(mapa.find(chave) == mapa.end()) /* Verifica se a chave
existe na estrutura */
164 U4 - Armazenament
Armazenamento
o associativo
mapa[1] = “KLS”;
mapa[2] = “KROTON”;
return 0;
}
Assimile
Uma questão
as chaves fundamental
devem ser únicas,para
nãoopodendo
uso de Mapa
existir Associativo
dois alunosé com
que
o mesmo número de chamada, duas Notas Fiscais com o mesmo
número ou duas pessoas com o mesmo número de documento CPF.
de
do identificação de todas
leitor de código as informações
de barras, dos produtosno
temos as informações, e, por meio
caixa, da
descrição do produto, valor de venda e valor de imposto.
Número Prato
101 Parmegiana de frango
102 Parmegiana de carne
103 Almôndegas
104 Bisteca suína
105 Bife acebolado
106 Frango grelhado
printf (“Pratos:\n\n”);
return 0;
}
Avançando na prática
Jukebox - Aparelho eletrônico de som
Descrição da situação-problema
Mãos à obra!
Resolução da situação-problema
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <map>
genero1[1] = “ Skank”;
genero1[2] = “ Barao Vermelho”;
genero1[3] = “ Capital Inicial”;
genero1[4] = “ Titas”;
do {
banda = 0;
system(“cls”);
printf(“Escolha o Genero:\n”);
printf(“1 - Rock Nacional\n”);
printf(“2 - Sertanejo\n”);
printf(“3 - Sair\n”);
scanf(“%d”, &opcao);
switch (opcao){
case 1:
system(“cls”);
printf(“Escolha a Banda de Rock Nacional:\n”);
printf(“1 - Skank\n”);
printf(“2 - Barao Vermelho\n”)
Vermelho\n”);;
printf(“3 - Capital Inicial\n”);
printf(“4 - Titas\n”);
printf(“5 - Nenhum de Nos\n”);
scanf(“%d”, &banda);
170 U4 - Armazenament
Armazenamento
o associativo
if(genero1.find(band
if(genero1.find(banda)
a) == genero1.end())
cout << “\nOpcao Invalida!\n\n”;
else
cout << “\nTocando: “ + genero1[banda] + “\n\n”;
system(“pause”);
opcao = 0;
break;
case 2:
system(“cls”);
printf(“Escolha a Dupla Sertaneja:\n”);
printf(“1 - Leandro e Leonardo\n”);
printf(“2 - Gian e Geovanni\n”);
printf(“3 - Chitaozinho e Xororo\n”);
printf(“4 - Jorge e Mateus\n”);
printf(“5 - Bruno e Marrone\n”);
scanf(“%d”, &banda);
if(genero2.find(banda) == genero2.end())
if(genero2.find(banda)
cout << “\nOpcao Invalida!\n\n”;
else
Seção 4.2
Mapas com Lista
Diálogo aberto
Caro aluno, você aprendeu na seção anterior a respeito das
definições sobre Armazenamento Associativo, as motivações para
sua utilização, os Mapas Associativos e casos de usos gerais.
• as definições e os exemplos
exemplos de Mapas com Listas;
• a verificar a existência de uma chave em mapeamento com
Listas;
• a recuperar valores
valores associados a chaves
chaves em mapeamento com
Listas.
Na Figura 4.4,
4.4, podemos observar a coluna
colu na de índice que se refere
refe re
aos índices da Lista. A coluna de Elementos da Lista é formada por
uma estrutura de mapa, em que é associada uma chave a uma
informação. Desta forma, teremos um índice associado a uma
chave contendo uma informação.
Exemplificando
176 U4 - Armazenament
Armazenamento
o associativo
Assimile
#include <iostream>
/* Responsável pela associação de objetos do tipo chave e
elemento */
#include <map>
Pesquise mais
178 U4 - Armazenament
Armazenamento
o associativo
int main(){
int chave;
mat.codigo = “203”;
mat.disciplina = “ESTRUTURA DE DADOS II”;
MapaLista[2] = mat;
mat.codigo = “303”;
mat.disciplina = “ESTRUTURA DE DADOS III”;
MapaLista[3] = mat;
int main(){
int chave;
char disciplina[20]
disciplina[20],, codigo[5];
Materias mat;
mat.codigo = “103”;
mat.disciplina
mat.discip lina = “ESTRUTURA DE DADOS I”;
MapaLista[1] = mat;
mat.codigo = “203”;
mat.disciplina = “ESTRUTURA DE DADOS II”;
MapaLista[2] = mat;
mat.codigo = “303”;
mat.disciplina = “ESTRUTURA DE DADOS III”;
180 U4 - Armazenament
Armazenamento
o associativo
MapaLista[3] = mat;
printf(“Adicionar
printf(“Adicionar nova disciplina\n”);
printf(“Informe a chave para armazenar: “);
scanf(“%d”, &chave);
/* Insere no mapa */
mat.codigo = codigo;
mat.disciplina = disciplina;
MapaLista[chave]
MapaLista[chave] = mat;
/* Imprime na tela os
o s dados da disciplina inserido */
cout << “\nDisciplina Inserida com sucesso” << endl;
cout << “\nCodigo: “ + MapaLista[chav
MapaLista[chave].codigo
e].codigo + “\
nDisciplina: “ + MapaLista[chave].d
MapaLista[chave].disciplina
isciplina + “\n” << endl;
} else {
Reflita
182 U4 - Armazenament
Armazenamento
o associativo
} else {
/* Caso exista, a disciplina retorna as informações na lista
associada à chave */
cout << “Disciplina Encontrada!\nCodigo: “ + MapaLista[chav
MapaLista[chave].
e].
codigo + “\nDisciplina:
“\nDisciplina: “ + MapaLista[chave].disciplina
MapaLista[chave].disciplina + “\n” << endl;
}
Outra forma de utilizarmos essa pesquisa de elementos em um
mapeamento é realizar a pesquisa por meio do código da disciplina,
no caso do nosso exemplo, ou seja, por um dos elementos da Lista,
que nos apresentaria como resultado final o mesmo do trecho de
código anterior:
printf(“Informe o codigo da disciplina: “);
scanf(“%s”, &coddisc);
struct Restaurante{
string descprato;
string ingredprato;
};
int main(){
int i = 0, chave, opcao;
char descricao[15], ingr[50];
Restaurante pratos;
do {
system(“cls”);
printf(“Selecione uma opcao:\n”);
printf(“1 - Adicionar um Prato\n”);
printf(“2 - Remover um Prato\n”);
printf(“3 - Listar todos os Pratos\n”);
printf(“4 - Sair\n”);
scanf(“%d”, &opcao);
switch (opcao){
case 1:
system(“cls”);
printf(“Adicionar
printf(“Adicionar nova disciplina\n”);
printf( Informe o nome do prato: );
scanf(“%s”, &descricao);
pratos.descprato
pratos.descprato = descricao;
pratos.ingredprato
pratos.ingredprato = ingr;
MapaPratos[(MapaPratos.siz
MapaPratos[(MapaPratos.size()+1)]
e()+1)] = pratos;
case 2:
system(“cls”);
printf(“Informe o numero do prato para remover: “);
scanf(“%d”, &chave);
186 U4 - Armazenament
Armazenamento
o associativo
case 3:
system(“cls”);
printf(“*** Listagem dos pratos! ***\n”);
system(“pause”);
opcao = 0;
break;
default:
break;
}
}while (opcao != 4);
return 0;
}
Avançando na prática
Resultado de votação
Descrição da situação-problema
Resolução da situação-problema
int main(){
int i = 0, chave, opcao;
char nome[15];
/* Cria o Mapa com Lista */
map<int, Candidato
Candidatos>
s> MapaVotos;
188 U4 - Armazenament
Armazenamento
o associativo
Candidatos votos;
do {
system(“cls”);
printf(“Selecione uma opcao:\n”);
printf(“1 - Adicionar um Candidato\n”);
printf(“2 - Votar\
Votar\n”);
n”);
printf(“3 - Resultado parcial\n”);
printf(“4 - Sair\n”);
scanf(“%d”, &opcao);
switch (opcao){
case 1:
system(“cls”);
printf(“Adicionar
printf(“Adicionar novo candidato\n”);
printf(“Informe o nome do candidato: “);
scanf(“%s”, &nome);
votos.nomecand = nome;
votos.totalvotos = 0;
MapaVotos[(MapaVotos.si
MapaVotos[(MapaVotos.size()+1)]
ze()+1)] = votos;
case 2:
system(“cls”);
printf(“Vote pelo numero:\n”);
scanf(“%d”, &chave);
system(“pause”);
opcao = 0;
break;
case 3:
system(“cls”);
printf(“*** Resultado Parcial! ***\n”);
for (i = 1; i <= MapaVotos.size(); i++) {
printf(“Candidato numero %d: “, i);
190 U4 - Armazenament
Armazenamento
o associativo
system(“pause”);
opcao = 0;
break;
default:
break;
}
}while (opcao != 4);
return 0;
}
2. Para
remover uma associação, comparamos a chave informada com
as demais chaves das associações da Lista. Se acaso a chave existir, será
removida do mapeamento, deixando essa posição disponível para uma
eventual adição com essa chave.
Assinale a alternativa que apresenta a linha de comando que permite a
exclusão da associação de um Mapa com Lista:
a) MapaLista.delete(MapaLista.find(chave)).
b) MapaLista.erase(MapaLista.find(chave)
MapaLista.erase(MapaLista.find(chave)).).
c) MapaLista.remove(MapaLista.find(chave)).
d) MapaLista.out(MapaLista.find(chave)).
e) MapaLista.exit(MapaLista.find(chave)).
Seção 4.3
Mapas com Espalhamento
Diálogo aberto
Caro aluno, na seção anterior você conheceu e aprendeu Mapas
com Listas, sua definição e exemplos, a existência de uma chave em
mapeamentos com listas, as operações para adicionar ou remover
uma associação com base na chave de mapeamento e a recuperação
de valores associados a chaves de mapeamento em lista.
Assimile
Exemplificando
196 U4 - Armazenament
Armazenamento
o associativo
int i;
HashMapa *hashmapa = (HashMapa*)m
(HashMapa*)malloc(sizeof(HashMa
alloc(sizeof(HashMapa));
pa));
hashmapa -> node_list = malloc(size * sizeof(HashmapN
sizeof(HashmapNo*));
o*));
hashmapa -> cont_elemento = 0;
hashmapa -> map_size = size;
Pesquise mais
198 U4 - Armazenament
Armazenamento
o associativo
hashmap_node = hashmapa_new_nod
hashmapa_new_node(hash,
e(hash, valor);
hashmapa -> cont_elemento++;
}
}
Já a remoção de uma associação é um procedimento simples:
apenas calculamos
correspondente o índice
e, ao e procuramos
encontrarmos a chave
a chave, na tabelaa
removemos
associação. Como exemplo de implementação da remoção de
uma associação, temos o seguinte trecho de código:
/* Função para remover uma associação */
void hashmapa_remove(HashMapa
hashmapa_remove(HashMapa *hashmapa, int key) {
int hash = hashmapa_hash_fu
hashmapa_hash_func(hashmapa,
nc(hashmapa, key);
HashmapNo *hashmap_node = hashmapa -> node_list[hash];
hashmap_node -> values = NULL;
hashmap_node -> hash_index = 0;
hashmap_node -> values_size = 0;
}
if (hashmap_node == NULL)
return “Chave não encontrada!”;
else
return hashmapa -> node_list[hash];
}
Reflita
Utilizando a técnica de Espalhamento, podemos obter um consumo
de tempo médio constante para todas as operações. De que forma a
técnica de Espalhamento associada ao mapeamento pode ser mais
eficiente do que a associação do mapeamento com Listas?
200 U4 - Armazenament
Armazenamento
o associativo
if(hashmap_node != NULL) {
hash_index = hashmapa_hash_fu
hashmapa_hash_func(hashmapa,
nc(hashmapa,
hashmap_node -> hash_index);
hashmap_node -> hash_index = hash_index;
new_node_list[hash_index] = hashmap_node;
}
/* Libera a alocação anterior */
free(hashmapa_node);
}
/* Mapeamento recebe a nova alocação dinâmica */
hashmapa -> node_list = new_node_list;
}
return num_prato;
}
204 U4 - Armazenament
Armazenamento
o associativo
NumPratos* pesquisa_prato(Pratos
pesquisa_prato(Pratos *pratos, unsigned int key) {
unsigned int hash = prato_hash_func(pratos,
prato_hash_func(pratos, key);
NumPratos *num_pratos = pratos -> num_list[hash];
num_list[hash];
if(num_pratos == NULL) {
return NULL;
} else {
return pratos -> num_pratos[hash]
num_pratos[hash];;
}
}
Avançando na prática
Cadastro de veículos
Descrição da situação-problema
assim
desafiocomo os dados
é realizar do cliente e os
um levantamento dodo proprietário
que doimplementar
é necessário veículo. Seu
no sistema para suprir a necessidade do sr. Raul, mantendo um
sistema com ótimo desempenho. Ao concluir, você deve entregar
um relatório com as informações levantadas do sistema.
Resolução da situação-problema
Referências
CODENuclear.
CODENuclear. Difference between HashMap and Hashtable. Disponível em: <http://
www.codenuclear.com/difference-between-hashmap-hashtable/>. Acesso em: 6
mar. 2018.
GOODRICH, M. T.; TAMASSIA, R. Estruturas de dados & algoritmos em Java. 5. ed.
São Paulo: Bookman, 2013.