EDB 12 - TAD Sequencia - Implementacao
EDB 12 - TAD Sequencia - Implementacao
EDB 12 - TAD Sequencia - Implementacao
Formas de implementação
Formas de implementação de sequencias num computador
Inserção => 3
2 2
1 1
0 0
Tipos Abstratos de dados para as operações
• Implementação da Pilha: Só é preciso se preocupar com as operações
de inserção e remoção no fim (ou início, dependendo do ponto de
vista) da pilha, não precisando se preocupar com a forma arbitrária,
que não é possível.
Tipos Abstrato de dados para as operações
• TAD Fila: Remoção no início e inserção no fim, ou remoção no fim e
inserção no início. Usa o buffer de memória.
• Ex.: Vídeos, por exemplo com o download dos frames no início e a
remoção da fila ao fim, a medida que os frames são exibidos. Outros
exemplos de buffer são áudios ou wi-fi.
TAD Filha - Buffer
3 2 1 7 6
5 2
Char * V N pos
Implementação de sequências usando a
estrutura de dados vetor
Criando o código (cont.), inserção:
void inserir(char *V, int N; int Nmax, int pos, int el);
Vetor Parâmetros inserção
if N == Nmax return;
for (int ii = N-1; ii ≥ pos; ii-- )
V[ii+1] = V[ii];
V[pos] = el;
0 1 2 3 4 5
Ex: 0 1 2 3 4 5
2 3 9 1 5
2 3 1 5
5 2 6 9
4 2 6 9
Char Char N pos Nmax el
*V N pos Nmax el *V
Implementação de sequências usando a
estrutura de dados vetor
Ex inserção: sequencia 7 3 2 1 5, pos = 1 N = 5 Nmax= 6, el = 9.
Sequencias: 7 3 2 1 5 5 -> 7 3 2 1 1 5 -> 7 3 2 2 1 5 -> 7 3 3 2 1 5 -> 7 9 3 2 1 5
Complexidade do algoritmo no pior caso: O(N), para o caso de uma inserção no primeiro
elemento, pois o for percorre todo o vetor. Isso também ocorre para o caso de um
elemento aleatório intermediário. Contudo, para o melhor caso, uma inserção na posição
N, o algoritmo não vai entrar no loop, vai direto para a atribuição V[pos] = el, com isso a
complexidade no melhor caso é O(1), constante.
Implementação de sequências usando a
estrutura de dados vetor
Ajustando o código da inserção, pois o N deve ser alterado:
int inserir(char *V, int N; int Nmax, int pos, int el);
Vetor Parâmetros inserção
if N == Nmax return;
for (int ii = N-1; ii ≥ pos; ii-- )
V[ii+1] = V[ii];
V[pos] = el;
return N + 1;
Implementação de sequências usando a
estrutura de dados vetor
Criando o código (cont.), remoção:
int remover(char *V, int N; int pos);
Vetor Parâmetros remoção
if N == 0 return N;
for (int ii = pos; ii ≤ N-2; ii++ )
V[ii] = V[ii + 1];
return N - 1
0 1 2 3 4 5 0 1 2 3 4 5
Ex:
2 3 8 1 5 2 3 1 5
5 2 4
Char Char
*V N pos *V N
Implementação de sequências usando a
estrutura de dados vetor
Ex remoção: sequencia 7 3 2 1 5, pos = 1, N = 5.
Sequencias: 7 3 2 1 5 -> 7 2 2 1 5 -> 7 2 1 1 5 -> 7 2 1 5 5 -> 7 2 1 5
Complexidade do algoritmo no pior caso: O(N), para o caso de uma remoção do primeiro
elemento, pois o for percorre todo o vetor, analogamente ao algoritmo de inserção. Isso
também ocorre para o caso da remoção de um elemento aleatório intermediário.
Contudo, para o melhor caso, uma remoção na posição N, o algoritmo não vai entrar no
loop, com isso a complexidade no melhor caso é O(1), constante.
Implementação de sequências usando a
estrutura de dados vetor
• Complexidade, resumo:
Inicio Fim Aleatório
Inserção Linear Constante Linear
Remoção Linear Constante Linear
Acesso Constante Constante Constante
Legenda:
• Pilha:
• Fila:
Implementação de fila com vetor
circular
Implementação de fila com vetor circular
O vetor circular dá a ideia de posições infinitas em ambos os lados.
0 1 2 3 4 5
A C D E F
...-2 -1 0 1 2 3 4 5 6...
A C D E F
Implementação de fila com vetor circular
O vetor circular dá a ideia de posições infinitas em ambos os lados.
...-2 -1 0 1 2 3 4 5 6...
A C D E F
5 ∞ 0
...-2 -1 0 1 2 3 4 5 6...
Char * V N Nmax B
X R A C D E F
5 ∞ -2
Char * V N Nmax B
Implementação com vetor circular
Como implementar? Considerando que Nmax = ∞ não é possível. A ideia é um espelhamento do
vetor, para isso é necessário usar o mod (%).
...-3 -2 -1 0 1 2 3 4 5 6 7 8 9
X Z F R X T X Z F R
6 10 5
Char * V N Nmax B
Implementação com vetor circular
• Uso do operador %(mod). Ex: Para Nmax = 4
Pos % 3 0 1 2 3 0 1 2 3 0 1
Nmax
pos -1 0 1 2 3 4 5 6 7 8 9
Implementação com vetor circular
Void inserir_inicio(char * V, int *N, int *B, int Nmax, char el)
if (*N == Nmax) return
*B--; //incompleto
V[*B] = el;
*N++;
Obs: O B representa a posição do primeiro elemento, o inicio da
sequência
Implementação com vetor circular
Void inserir_inicio(char * V, int *N, int *B, int Nmax, char el)
if (*N == Nmax) return 0 1 2 3 4 5
T G X 3 Z
5→4 6 4→5
N Nmax B
Implementação com vetor circular
Void remover_fim(char * V, int *N, int *B, int Nmax)
if (*N == 0) return
*N--;
// Complexidade O(1).
Implementação com vetor circular
• Complexidade, resumo:
Inicio Fim Aleatório
Inserção Constante Constante Linear
Remoção Constante Constante Linear
Acesso Constante Constante Constante
Legenda:
• Pilha:
• Fila: