Escolar Documentos
Profissional Documentos
Cultura Documentos
○ Banco de dados
○ Sistemas operacionais
○ Computação gráfica
○ Compiladores
○ Funcionar corretamente
○ Operações: E, NÃO, OU
Tipos de Dados - Primitivos
● Caracter: “A”, “X”, “1”, “+”
Esse tipo de dado não tem tamanho predefinido, só ficando limitado à memoria do
computador em que se está trabalhando.
Desde o ponto de vista logico, um tipo dinâmico de dados não tem limitações,
porém, como os algoritmos de manipulação dessas estruturas são implementadas
em computadores nesta disciplina trataremos suas limitações físicas.
Recursividade
● Um algoritmo que resolve um problema grande em problemas menores, cujas
soluções requerem a aplicação dele mesmo, é chamado recursivo.
1 si n = 0 ó 1
n!=
n(n − 1) si n 1
Analogamente, sua expressão funcional será a seguinte:
1 si n = 0 ó 1
fac(n) =
n * fac(n − 1) si n 1
Recursividade
Exemplo:A função fatorial pode ser desenvolvida recursivamente.
Matematicamente é definido como:
1 si n = 0 ó 1 1 si n = 0 ó 1
n!= fac(n) =
n(n − 1) si n 1 n * fac(n − 1) si n 1
Option Explicit
Dim num As Integer
Private Function sumaPares(ByVal n As Integer) As Integer
If n = 1 Then
sumaPares = 2
List1.AddItem 2
Else
sumaPares = sumaPares(n - 1) + 2 * n
List1.AddItem (2 * n)
End If
End Function
Operações
Independentemente do tipo de dado, existem operações clássicas que podemos
efetuar.
● Criação, alguns linguagens de programação exigem que o tipo de dados seja
declarado antes de ser referenciado, de qualquer forma em algum momento a
estrutura de dados será criada com uma definição de criação.
● Percurso é a operação em que referenciamos todos os elementos de uma
estrutura de dados.
● Busca usada para selecionar um determinado elemento cuja complexidade
depende da estrutura utilizada e do tempo estimado para selacao de um
determinado elemento. (Verificar, utilizar ou atualizar o conteúdo de um
elemento ou ainda retirar e inserir novos elementos).
● Alteração modifica o conteúdo
Operações
● Retirada
○ No caso de estruturas estáticas não podemos que retirar um elemento, no máximo podemos
retirar os valores que ele contem, substituindo-os por outros.
○ Em uma estrutura dinâmica podemos retirar quantos elementos desejarmos, onde cada retirada
diminuímos a sua quantidade de elementos.
Uma lista linear é uma estrutura dinâmica caraterizada por uma sequencia
ordenada de elementos, no sentido da sua posição relativa:
𝐸1 , 𝐸2 , . . . , 𝐸𝑛
Tal que:
1. Existem 𝑛 elementos na sequência;
2. 𝐸1 é o primeiro elemento da sequência;
3. 𝐸𝑛 é o ultimo elemento da sequência;
4. Para todo i, j entre 1 e n, se i<j, então o elemento 𝐸𝑖 , antecede o elemento 𝐸𝑗 ;
5. Caso i=j-1, 𝐸𝑖 é o antecessor de 𝐸𝑗 e 𝐸𝑗 é o sucessor de 𝐸𝑖 .
Operação que permite utilizar cada um dos elementos de uma lista linear, de tal forma que:
Operação que procura um elemento especifico da lista linear. A busca pode ser efetuada de duas
formas:
Operação que incorpora um elemento X a uma lista linear de tal forma que:
○ A inserção é realizada de tal forma que ao inserir o elemento X na posição i, onde i está no
intervalo de 1 a (n+1), esse elemento passa a ser o i-ésimo elemento da lista linear;
Operação que retira um elemento X de uma lista linear de tal forma que:
○ Se 𝐸𝑖 é o elemento retirado, o seu sucessor passa a ser o sucessor de seu antecessor, ou seja,
𝐸𝑖 + 1 passa a ser o sucessor de 𝐸𝑖 +1. Se 𝐸𝑖 é o primeiro elemento, o seu sucessor passa a
ser o primeiro; se 𝐸𝑖 é o ultimo elemento, o seu antecessor passa a ser o ultimo;
● Phila: Uma Pilha, “Stack” é uma lista linear onde as operações de inserção e
retirada são efetuadas apenas no final da lista linear, ou seja:
● Pilha: Uma Pilha, “Stack” é uma lista linear onde as operações de inserção e
retirada são efetuadas apenas no final da lista linear, ou seja:
Exemplo:
Em uma rua sem saída, tão estreita que apenas um carro passa por vez, o
primeiro carro a sair será o ultimo a ter entrado. Observe ainda que podemos
retirar qualquer carro e não podemos inserir um carro de tal forma que ele não
seja o ultimo.
Filas
Uma fila “queue”, é uma lista linear onde as operações de inserção são efetuadas
apenas no final e as de retirada, apenas no inicio da lista linear, ou seja:
● A inserção de um elemento X torna-o o último da lista linear;
● A retirada é sempre efetuada sobre o elemento 𝐸1 .
Exemplo: Uma fila de banco, onde os clientes que chegam ficam ao final da fila os
que saem, o fazem do inicio da fila
Deque
Um deque, “double-ended queue” é uma lista linear onde as operações de
inserção e retirada podem ser efetuadas tanto no inicio quanto no final da lista
linear, ou seja :
● A inserção de um elemento X pode torná-lo ou o primeiro ou o ultimo da lista
linear;
● A retirada é sempre efetuada sobre o elemento 𝐸1 ou 𝐸𝑛
Exemplos:
● Para montar a composição de um trem, vagões são inseridos e retirados
sempre nas extremidades.
● Em uma barca para transporte de automóveis, estes podem entrar e sair por
qualquer uma das extremidades.
Representação Física
Existem duas formas de implementação:
● Alocação sequencial, onde usamos estruturas estáticas;
● Alocação encadeada, onde usamos ponteiros para identificar as sequencias de
elementos da lista linear.
Tamanho do nó
(TamNo)
● A posição que indica o primeiro nó do vetor que pode ser utilizado pela lista
(IndIniLst);
● A posição que indica o ultimo nó do vetor que pode ser utilizado pela lista
(IndFimLst)
Representação Física
Ptrini PtrFim
X X X
IndIni IndFim
IndIniLst IndFimLst
● Endereço (𝑎𝑖 ) = 𝜀 k
Esquema de alocação sequencial
● Endereço (𝑎𝑖−1 ) = 𝜀 − 𝑘
● Endereço (𝑎𝑖+1 ) = 𝜀 + 𝑘
PtrNovo Formato de um nó
X Y
Y #
X Y
Z
Z
Y
Inserção em uma lista encadeada
Alocação Encadeada
X Y
Z
Z
Y
X Y
Y
ooo
ooo
# ooo
#
A lista alocada dessa forma nos permite a pesquisa nos seus dois sentidos como
também a inserção e retirada conhecendo-se o endereço de apenas um nó.
Lista Duplamente Encadeadas
No algoritmo de inserção em uma lista duplamente encadeada, apresentado a
seguir, consideramos que o novo nó será inserido à do nó apontado por PtrTrb.
PtrNovo
PtrTrb
X Y
Z Z
Z
X Y
Todos os tipos abstratos de dados (pilhas, filas, deques, etc.) podem ser
implementados usando um vetor (array) ou um tipo de estrutura encadeada (lista
encadeada)
0 0 0 0 0
Vetores
● Exemplo: int a[5];
● a[0] = 1 1 0 0 0 0
● a[1] = 2 1 2 0 0 0
● a[2] = 3 1 2 3 0 0
● a[3] = 4 1 2 3 4 0
● a[4] = 5 1 2 3 4 5
Vetores Multidimensionais
● Um vetor multidimencional de dimensão n é uma coleção de ítens que são
acessados através de n expressões de subscritos
● Exemplo: (i,j)-ésimo elemento de um vetor x bidimencional é acessado pela
expressão x[i,j]
■ int x[3][5];
■ Etc.
Matrizes
● Vetores bidimencionais
● Conjunto de dados do mesmo tipo (estrutura homogênea)
● Cada elemento pode ser acessado pela sua posição (índices)
● Alocação estática e sequencial
𝐴11 𝐴12 𝐴13 𝐴14 𝐴21 𝐴22 𝐴23 𝐴24 𝐴31 𝐴32 𝐴33 𝐴34 𝐴41 𝐴42 𝐴43 𝐴44
Considerando ouso de listas simplesmente encadeadas temos o seguinte formato para cada
nó: Valor
Linha Coluna
LinkLinha LinkColuna
Onde Linha e Coluna definem a posicao do elemento na matriz e linkLinha e LinkColuna sao
links que indicam a proxima linha e coluna, respectivamente.
Como existem m*n listas lineares, precisaremos de m*n variaveis ponteiros externas, uma
apontando para o inicio de cada lista.
Matriz Encadeada
C1 C2 C3 Cn
1 1 1 2 1 3 1 4
L1 ooo #
2 1 2 2 2 3 2 4
L2 ooo #
O
O O O
O
O O O
O
O O O
m 1 m 2 m 3 m n
Lm ooo # #
# # #
Matriz Encadeada
.
Matriz Encadeada
C
C1 C2 C3 ... Cn
L
L1
1 1 1 2 1 3 1 4
ooo #
L2
2 1 2 2 2 3 2 4
.
. ooo #
.
O
O O O
O
O O O
O
O O O
Lm
m 1 m 2 m 3 m n
# # # ooo # #
Tópicos
● Introdução.
● Estruturas de dados fundamentais: vetores, vetores multidimensionais, listas
encadeadas.
● Pilhas, filas e deques.
● Análise de algoritmos e algoritmos recursivos.
● Notação assintótica.
● Árvores.
● Heaps.
● Algoritmos de ordenação.
● Tabelas de dispersão e tabelas de espalhamento.
● Grafos.
Análise de algoritmos
● Automação: Processo em que uma tarefa deixa de ser desempenhada pelo
homem e passa a ser realizada por máquinas.
● Uma determinada tarefa, para que seja automatizada, deve ter todas as etapas
conhecidas, e a maquina ou dispositivo que desempenhará este processo
deverá estar apta a garantir sua repetibilidade.
● As etapas para resolução de um processo, podemos chamar de especificação
de sequencia ordenada de passos.
● Sequência finita de passos, logicamente organizados, para resolução de um
problema conhecido.
Análise de algoritmos
● Alguns autores restringem a definição de algoritmo para procedimentos que
(eventualmente) terminam
○ Funcionar corretamente
○ A robustez do programa
■ Ainda, diferente hardware (processador, memória, disco, etc.), diferente SO, etc.
○ Além disso, uma análise detalhada, considerando todos estes fatores, seria difícil,
demorada e pouco significativa
○ Exemplo: i = i + 1
○ Como não faz sentido analisar um algoritmo para apenas um determinado conjunto
de entradas e é impossível fazer esta análise para todas as entradas possíveis,
consideraremos apenas dois cenários: o pior caso e o melhor caso
Análise de algoritmos
Pior Caso
2
3*(n+1) //sendo n o tamanho do vetor, já calculado
3*(n) //considerando o acesso a vetor[i] como uma única operação
0
4*(n)
1
Total = 10n + 6
Análise de algoritmos
Melhor Caso
2
3*(1)
3*(1) //considerando o acesso a vetor[i] como uma única operação
1
0
0
Total = 9
Análise de algoritmos
● Vamos partir do seguinte algoritmo
<1> para i ← 1 até n, faça
<2> para j ← 1 até i, faça
<3> imprima i × j × n
<4> fim-para
<5> fim-para
Para medir o custo do algoritmo, nossa análise consistirá em ver quantas vezes cada passo
é executado.
● Linha <1> Será executada n + 1 vezes.
● Linha <2> Será executada 𝑛 ∗ σ𝑛𝑖=1 𝑖 + 𝑛
● Linha <3> Será executada 𝑛 ∗ σ𝑛𝑖=1 𝑖
● Linha <4> Sem custo
● Linha <5> Sem Custo
Análise de algoritmos
○ Então agora, vamos escrever o tempo de execução do algoritmo, que é a soma
dos tempos de execução para cada instrução executada.
○ 𝑇 𝑛 = 𝑛 + 1 + (𝑛 ∗ σ𝑛𝑖=1 𝑖 + 𝑛) + (σ𝑛𝑖=1 𝑖)
Classificação de Algoritmos
● Iterativo: estruturas de repetições (laços, pilhas, etc.)
● Recursivo: invoca a si mesmo até que certa condição seja satisfeita
■ 3 variáveis (soma, i, n)
Representação Física – Alocação Sequencial
O algoritmo de busca de um nó em uma lista linear sequencial existente, cujo
endereço do primeiro nó é PtrIni, e o valor procurado em um determinado campo
do nó é igual a “00345”.
<14> SE NAO
<15> INICIO
Informacao <- Lista(PtrRetirar )
<16> PtrTrb <- PtrRetirar
<17> ENQUANTO PtrTrb < PtrFim FAÇA
<18> INICIO
<19> Lista (PtrTrb) <- Lista (PtrTrb+1)
<20> PtrTrb <- PtrTrb +1
<21> FIM
<22> PtrFim <- PtrFim -1
<23> Fim
<25> Fim
Exercícios Aula– Alocação Sequencial
1. Observe que, nos algoritmos InserLsOverflow e RetiraLstTestaUnderflow, PtrIni
tem valor constante. Em alguns casos o número de movimentações
necessárias para manter a lista contigua pode ser reduzido, se não fixaramos
PtrIni. Por exemplo em uma lista com 10 nós, para retirar o segundo nó o
algoritmo RetiraLstTestaUnderflow realiza oito movimentações (Os nós
posteriores ao nó retirado). Poderíamos realizar apenas uma movimentação,
se movêssemos o primeiro nó em direção a PtrFim, o que é possível apenas se
PtrIni puder ser modificado. Criar um algoritmo de inserção e retirada que faça
esta alteração.
2. Baseando-se nos algoritmos apresentados, codifique uma unidade de rotinas
para verificação de resultados.