Algoritmos e Estrutura de Dados II

Propaganda
Universidade Federal do Vale do São Francisco
Algoritmos e Estrutura
de Dados II
Professor: Marcelo Santos Linder
E-mail: [email protected]
Ementa
Árvores B, grafos e tabelas de hash:
alocação estática e dinâmica e algoritmos
de inserção, remoção e consulta.
Armazenamento em disco com uso de
índices.
Métodos
de
classificação.
Introdução à complexidade de algoritmos,
com análise de complexidade no tempo e
no espaço.
2
Objetivos Gerais
Proporcionar aos alunos experiência
teórica e prática com estruturas de
dados
e
modelos
abstratos,
considerando aspectos da eficiência dos
algoritmos associados às estruturas de
dados, no tocante a complexidade
temporal e espacial dos algoritmos.
3
Objetivos Específicos
4
Apresentar os diversos tipos de modelos abstratos ou
estruturas de dados e seus algoritmos;
Entender as estruturas de dados como modelos
matemáticos cuja escolha é dependente do contexto no
qual ela será utilizada;
Apresentar o conceito da estrutura de dados árvore e
as operações de inserção, remoção e busca;
Apresentar o conceito da estrutura de dados grafo e as
operações de inserção, remoção e busca;
Apresentar a estrutura Tabela de hash e as operações
de alocação estática e dinâmica juntamente com as
operações de inserção, remoção e consulta.
Apresentar a forma de armazenamento em disco por
meio do uso de índices.
Apresentar os métodos de classificação na sua relação
com as operações de busca, ou seja, o rearranjo como
Objetivos Específicos
5
uma forma de tornar mais eficiente a operação de busca
dos dados.
Fazer perceber que rearranjar os elementos de uma
estrutura de dados pode proporcionar aos alunos uma
melhor compreensão das relações internas que possam
existir entre os dados.
Fazer perceber que reorganizar é especialmente útil
para que sejam alcançadas soluções para um dado
problema.
Fazer perceber que reorganizar os elementos de uma
estrutura de dados muitas vezes podem ajudar a
encontrar uma solução para um problema, o que lhes
permite ver novas informações destacando uma
informação que anteriormente não era visualizada.
Fazer perceber que o rearranjo pode ser utilizado para
demonstrar conceitos.
Metodologia
A disciplina será trabalhada com aulas
expositivo-dialogadas,
onde
serão
fornecidos os componentes teóricos e será
feita a prática de exercícios.
Recursos
Quadro branco, marcador, notebook e
projetor multimídia. Nas aulas práticas serão
utilizados os computadores do laboratório
onde as aulas ocorrerão.
6
Forma de Avaliação
A avaliação será realizada mediante 2
provas escritas e um trabalho prático
(passível de alterações).
7
Bibliografia
Bibliografia Básica:
AARON M.T.; LANGSAM, Y.; MOSHA, J.A. Estruturas de Dados
Usando C. Pearson Education, 2005.
CORMEN T.H.; LEISERSON C.E.; RIVEST, R.L. Algoritmos Teoria e Prática. Elsevier, 2002.
SEDGEWICK, R. Algorithms in C. 3ª ed. Pearson Education, 1998.
ZIVIANI, N. Projeto de Algoritmos - com implementação em Pascal
e C. Cengage Learning, 1992.
Bibliografia Complementar:
DOUGLAS D.; MOONEY, A; RANDALL J.S. Course in
mathematical modeling. Mathematical Association of America,
1999.
STUART, J. Cálculo. 4 ª ed. Cengage Learning, 2005. vol. 1.
SAYÃO, L.F. Modelos teóricos em ciência da informação:
abstração e método científico. Ciência e Informação, 2001.
Bibliografia Auxiliar:
8
DROZDEK A. Estrutura de Dados e Algoritmos em C++. Cengage
Learning, 2009.
Informações Gerais
Material de apoio
Os slides utilizados em aula, descrição de trabalhos, datas de
avaliações e demais informações referentes à disciplina encontramse na página www.univasf.edu.br/~marcelo.linder
9
Breve Revisão
10
Programa
Um programa pode ser visto como a
especificação formal da solução de um
problema. N.Wirth expressa em sua equação
programa = algoritmo + estruturas de dados
onde: o algoritmo contém a lógica do
programa e os dados são organizados em
estruturas de dados.
11
Estruturas de Dados
A qualidade da solução de um problema
depende, entre outros fatores, da forma como
estão organizados os dados relevantes.
Encontrar o número do telefone de um certo
assinante no conjunto de todos os assinantes.
Representação interna de uma string:
4
G
A
T
O
G
A
T
O
\0
;
.
Toda uma classe de modelos desenvolveuse, ao longo do tempo, com o objetivo de
viabilizar o processamento de dados.
12
Estruturas de Dados
Estruturas de dados são formas genéricas
de se estruturar informação de modo a serem
registradas e processadas pelo computador.
Ex.:
lista ordenada;
vetores;
árvores;
grafos, etc.
Contudo estas só adquirem significado
quando associadas a um conjunto de
operações, que visam, de um modo geral,
manipulá-las (algoritmos).
13
Tipos Abstratos de Dados
Embora os termos “tipo de dado”,
“estrutura de dados” e “tipo abstrato de
dados” em essência se refiram aos mesmos
objetos formais, eles são usados em
contextos próprios.
O termo “tipo de dado” é usado no
contexto
de
uma
linguagem
de
programação (tipos primitivos) e está
associado a um método de interpretar um
padrão de bits.
14
Tipos Abstratos de Dados
O termo “tipo abstrato de dado” (TAD)
denota um modelo junto com um conjunto
de operações definidas sobre o modelo.
(tipo + operações validas).
Por fim, “estrutura de dados” é uma forma
concreta de se implementar um TAD, ou
seja, uma representação computacional do
modelo matemático em questão.
15
Listas, Pilhas e Filas
Visando recordá-los dos pontos principais e
estabelecer um elo entre as disciplinas,
faremos agora um overview dos tópicos
vistos na disciplina Algoritmos e Estrutura de
Dados I através um conjunto de exercícios.
O que é uma lista?
Uma lista é uma seqüência de zero ou mais
elementos, cada um deles sendo um valor
primitivo (átomo ou nodo) ou composto. Em
outras palavras, a estrutura de lista
representa a ordem linear entre os
elementos. Listas podem ser homogêneas ou
16
heterogêneas, lineares ou não lineares.
Listas, Pilhas e Filas
Cite
algumas
operação
primitivas
necessárias a uma implementação de uma
lista:
-criar uma nova lista;
-verificar se a lista é vazia;
-acessar o k-ésimo elemento;
-inserir um elemento como k-ésimo da lista;
-remover o k-ésimo elemento;
-etc.
17
Listas, Pilhas e Filas
No que tange a gerência de memória como
uma lista pode ser implementada?
Com relação a gerência de memória uma lista
pode ser implementada de forma seqüencial ou
encadeada.
Utilizando a alocação encadeada uma lista
pode ser implementada de algumas formas,
cite-as:
-simplesmente encadeada;
- com nó de cabeçalho;
-circular;
-duplamente encadeada;
18
-etc.
Disciplinas de acesso
Muitas vezes é útil impor, para manipulação
de uma certa estrutura de dados, restrições
quanto à visibilidade de seus componentes ou
quanto à ordem que deve ser respeitada para
se efetuarem operações, como inserções ou
retiradas, por exemplo. Isto ajuda na
modelagem de certos processos que ocorrem
no mundo real.
Com o tempo e a prática, foram identificadas
algumas disciplinas de acesso aplicadas a
estruturas de dados, úteis em diversas
aplicações. Dois casos dos mais importantes
são casos particulares de listas com disciplinas
de acesso, denominados: filas e pilhas.
19
Listas, Pilhas e Filas
Defina uma fila.
Uma fila é uma lista com restrições de
acesso, em que as operações de inserção são
realizadas sobre uma das extremidades, o fim
da lista, enquanto operações de consulta e
retirada são feitas na outra extremidade, o
início da fila.
Isto leva ao critério FIFO (first in, first out) que
indica que o primeiro item que entra é o
primeiro a sair da estrutura. O modelo intuitivo
para isto é o de uma fila para atendimento em
um guichê, na qual são atendidas as pessoas
pela ordem de chegada.
20
Listas, Pilhas e Filas
O atendente só tem contato com (só pode
consultar) o primeiro (ou o mais antigo) da fila.
Novos pretendentes ao serviço entram no fim da
fila.
No modelo formal, não há opção de abandono
da fila: somente o primeiro pode ser retirado
(sair da fila).
21
Listas, Pilhas e Filas
Especifique uma forma simples e eficiente
de armazenar em memória uma fila.
Podemos utilizar uma lista simplesmente
encadeada com um nó de cabeçalho (descritor)
contendo um ponteiro para o primeiro elemento
e outro para o último elemento da fila.
F
INICIO
FIM
...
Nodo 1
22
Nodo 2
λ
Nodo n
Desta forma, utilizando a linguagem C,
defina o TAD FILA_ENC (de valores inteiros).
23
typedef struct nodo
{
int inf;
struct nodo * next;
}NODO;
typedef struct
{
NODO *INICIO;
NODO *FIM;
}DESCRITOR;
typedef DESCRITOR * FILA_ENC;
void cria_fila (FILA_ENC *);
int eh_vazia (FILA_ENC);
void ins (FILA_ENC, int);
int cons (FILA_ENC);
void ret (FILA_ENC);
int cons_ret (FILA_ENC);
Listas, Pilhas e Filas
Implemente a operação de inserção de um
novo elemento no TAD FILA_ENC.
Inicialmente é feita a identificação de quantas
situações se apresentam no processo de
inserção.
No caso são duas: lista com algum ou alguns
elementos e lista vazia.
Listas, Pilhas e Filas
Esquema do processo de inserção de
um elemento na fila encadeada.
F
(situação 1)
INICIO
FIM
X
•
Nodo 1
Nodo 2
Nodo 3
v
•
Novo
F
INICIO
FIM
•
25
Nodo 1
Nodo 2
Nodo 3
v
•
Nodo 4
Listas, Pilhas e Filas
Esquema do processo de inserção de
um elemento na fila encadeada.
(situação 2)
F
INICIO
•
•
v
Novo
FIM
•
F
INICIO
•
•
v
FIM
•
Nodo 1
26
void ins (FILA_ENC f, int v)
{
NODO *novo;
novo = (NODO *) malloc (sizeof(NODO));
if (!novo)
{
printf ("\nERRO! Memoria insuficiente!\n");
exit (1);
}
27
novo->inf = v;
novo->next = NULL;
if (eh_vazia(f))
f->INICIO=novo;
else
f->FIM->next=novo;
f->FIM=novo; }
Listas, Pilhas e Filas
Implemente a operação de retirada de um
elemento no TAD FILA_ENC.
Inicialmente é feita a identificação de quantas
situações se apresentam no processo de
retirada.
No caso são três: lista vazia, lista com mais de
um elemento e lista com apenas um elemento.
Listas, Pilhas e Filas
Esquema do processo de retirada de
um elemento na fila encadeada.
F
(situação 1)
INICIO
FIM
X
aux
Nodo 1
Nodo 2
•
•
Nodo 3
Nodo 4
•
•
Nodo 2
Nodo 3
F
INICIO
29
FIM
Nodo 1
Listas, Pilhas e Filas
Esquema do processo de retirada de
um elemento na fila encadeada.
(situação 2)
F
INICIO
•
•
X
X
FIM
•
aux
30
Nodo 1
F
INICIO
•
•
FIM
void ret (FILA_ENC f)
{
if (eh_vazia(f))
{
printf ("\nERRO! Retirada em fila vazia!\n");
exit (3);
}
31
else
{
NODO *aux=f->INICIO;
f->INICIO=f->INICIO->next;
if (!f->INICIO)
f->FIM=NULL;
free (aux); } }
Listas, Pilhas e Filas
Defina uma pilha.
Uma pilha é uma lista com restrições de
acesso, onde todas as operações só podem ser
aplicadas sobre uma das extremidades da lista,
denominada topo da pilha.
Com isso estabelece-se o critério LIFO (last in,
first out), que indica que o último item que entra é
o primeiro a sair.
O modelo intuitivo para isto é o de uma pilha de
pratos, ou livros, etc, na qual só se pode
visualizar (consultar) o último empilhado e este é
o único que pode ser retirado. E também
qualquer novo empilhamento (inserção) se fará
sobre o último da pilha.
32
Listas, Pilhas e Filas
33
Listas, Pilhas e Filas
Uma pilha pode ser armazenada em uma
lista simplesmente encadeada, sem perda de
eficiência. Por exemplo:
P
...
Nodo 1
Nodo 2
λ
Nodo n
A implementação das operações é trivial.
Para fazer uma inserção, basta alocar um
nodo para o novo valor, ligá-lo ao primeiro
nodo da lista e fazer o ponteiro apontar para
o novo nodo.
34
Listas, Pilhas e Filas
Uma retirada exige apenas que o ponteiro
passe a apontar para o segundo nodo da lista
(ou ser anulado, se houver apenas um nodo).
Uma consulta exige apenas a recuperação do
valor do primeiro nodo.
Desta forma, podemos definir o TAD
PILHA_ENC (de valores inteiros) da seguinte
forma.
35
36
typedef struct nodo
{
int inf;
struct nodo * next;
}NODO;
typedef NODO * PILHA_ENC;
void cria_pilha (PILHA_ENC *);
int eh_vazia (PILHA_ENC);
void push (PILHA_ENC *, int);
int top (PILHA_ENC);
void pop (PILHA_ENC *);
int top_pop (PILHA_ENC *);
Árvores
Qual a carência das pilhas e filas?
Estas são de difícil utilização para
representação hierárquica de elementos.
a
Devido a…
Serem limitadas a apenas uma dimensão.
Visando eliminar esta limitação foi criado o
conceito de árvore.
Uma definição recursiva para árvore é:
1. Uma estrutura vazia é uma árvore.
2. Se t1, …, tk são árvores disjuntas, então a
estrutura cuja raiz tem como suas filhas as
raízes de t1, …, tk também é uma árvore.
3. Somente estruturas geradas pelas regras 1 e 2
37são árvores.
Árvores
Exemplo de árvore
38
Download