Escolar Documentos
Profissional Documentos
Cultura Documentos
Dados
ICEx/UFF
Volta Redonda-RJ
© 2002-2021
Estrutura de Dados
Sumário
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 2
Estrutura de Dados
Complexidade de Algoritmos
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 3
Estrutura de Dados
7) Obtenção de endereço;
8) Alteração/Obtenção de conteúdo através de ponteiros;
9) Chamada de função;
10) Retorno de valores.
Ex. 1: Fatorial
int i, fat;
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 4
Estrutura de Dados
int fibo(int n)
{ int i, x, y z;
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 5
Estrutura de Dados
Ex. 4: MDC
else
Complexidade de Tempo
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 6
Estrutura de Dados
{ int i=0; 1
for( ;i<n; ) 1
{ if(v[i]==x) 1
return(i); 1
i++;
return(-1);
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 7
Estrutura de Dados
{ int i=0; 1
{ if(v[i]==x) 1*n
return(i); 1*n
i++; 1*n
return(-1); 1
int fatorial(int n) {
int i, fat;
i=1; 1
fat=1; 1
fat=fat*i; 1*n
i++; 1*n
return (fat); 1
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 8
Estrutura de Dados
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 9
Estrutura de Dados
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 10
Estrutura de Dados
return(0);
}
Exercício:
b) soma=0;
for(i=1; i<n; i++)
soma++;
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 11
Estrutura de Dados
c) soma=0;
for(i=1; i<=n; i++)
soma++;
d) soma=0;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
soma++;
e) soma=0;
for(i=0; i<=n; i++)
for(j=1; j<n; j++)
soma++;
f) soma=0;
for(i=0; i<=n; i++)
for(j=1; j<n; j++)
for(k=2; k<n; k++)
soma++;
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 12
Estrutura de Dados
Alg1 Alg2
n 4n+3 4n²+4n+3
0 3 3
1 7 11
2 11 27
4 19 83
8 35 291
16 67 1.091
128 515 66.051
1024 4.099 4.198.403
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 13
Estrutura de Dados
Notação-O
Formalmente:
O(c) = O(1)
Ex. 1:
void funcao()
{
int i=0; 1
while(i<30) 30+1
{ printf("%d\t",i); 30
i++; 30
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 14
Estrutura de Dados
}
}
T(n) = 1+31+30+30 = 92 → O(1)
Formalmente:
Ex. 1:
T(n)= 3n+5 → O(3n) = 3*O(n) = O(n)
Ex. 2:
T(n) = 6n2 + 7n + 2 → O(6n 2 ) = 6*O(n2) = O(n2)
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 15
Estrutura de Dados
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 16
Estrutura de Dados
Logo, g(n) domina assintóticamente f(n), ou seja, f(n) é O(g(n)). Dessa forma,
10n≤ n2 para c=1 e n0=10. Isto é, para valores de n<10, f(n) gasta mais
tempo do que g(n), quando n=10, f(n) e g(n) gastam o mesmo tempo e para
n>10, g(n) será sempre maior do que f(n).
Função
(Complexidade) Nome Exemplo
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 17
Estrutura de Dados
Exercícios:
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 18
Estrutura de Dados
Ordenação Simples
#define N 5
int aux;
aux= *a;
*a=*b;
*b=aux;
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 19
Estrutura de Dados
int i, trocou=1;
while(trocou) {
trocou=0;
if(v[i]>v[i+1]) {
troca(&v[i], &v[i+1]);
trocou=1;
max--;
8 5 4 2 6
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 20
Estrutura de Dados
int i, j, menor;
menor = j;
if(v[i]<v[menor])
menor=i;
troca(&v[j], &v[menor]);
8 5 4 2 6
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 21
Estrutura de Dados
int i, j;
troca(&v[i-1], &v[i]);
8 5 4 2 6
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 22
Estrutura de Dados
1) Busca Sequencial:
int i;
return 1; // achou
Ex: Dado o vetor abaixo, faça a busca de cada elemento indicado fazendo o
acompanhamento no algoritmo passo a passo:
2 6 9 10 23 25 37
Buscar: 9
Buscar: 24
2) Busca Binária
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 23
Estrutura de Dados
Ex: Dado o vetor abaixo, faça a busca binária de cada elemento indicado
fazendo o acompanhamento no algoritmo passo a passo:
2 6 9 10 23 25 37
Buscar: 10
Buscar: 9
Buscar: 37
Buscar: 26
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 24
Estrutura de Dados
Exercícios:
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 25
Estrutura de Dados
Listas Lineares
1) Pilha Sequencial
Considere:
struct tpilha {
int topo;
int pilha[TAM];
};
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 26
Estrutura de Dados
Operações:
1) Inicializar a pilha:
4) Empilhamento
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 27
Estrutura de Dados
5) Desempilhamento
Exercícios:
Resposta questão 1:
#include <stdio.h>
#define TAM 10
struct tpilha{
int topo;
int pilha[TAM];
};
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 28
Estrutura de Dados
int main()
{
struct tpilha p1,p2;
int i, aux, soma=0;
inicializaPilha(&p1);
inicializaPilha(&p2);
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 29
Estrutura de Dados
Fila Sequencial
Considere:
struct tfila {
int F, R; // F é a frente da fila e R é a retaguarda da fila.
int fila[TAM];
};
fila(f)
F=0 0 1 2 3 4 5 6 7
R=-1
inserefila(f, A)
F=0
A
R=0
inserefila(f, B)
F=0 R=1
A B
inserefila(f, C)
F=0 R=2
A B C
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 30
Estrutura de Dados
inserefila(f, H)
F=0 R=7
A B C D E F G H
removefila(f)
F=1 R=7
B C D E F G H
removefila(f)
F=2 R=7
C D E F G H
removefila(f)
R=7
H
F=7
Operações:
1) Inicialização
return 1;
return 0;
}
4) Inserção
5) Remoção
Exercícios:
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 32
Estrutura de Dados
1) Inserir elemento
2) Remover elemento
3) Mostrar Fila
4) Sair
- Para cada opção, chame uma função para executar, exceto a opção 4.
Resposta questão 1:
#include <stdio.h>
#define TAM 10
struct tfila{
int F, R;
int fila[TAM];
};
void inicializafila(struct tfila *pf) {
pf->F=0;
pf->R=-1;
}
int fila_vazia(struct tfila *pf) {
if(pf->F > pf->R)
return 1;
return 0;
}
int fila_cheia(struct tfila *pf){
if(pf -> R == TAM-1)
return 1;
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 33
Estrutura de Dados
return 0;
}
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 34
Estrutura de Dados
return 1;
return 0;
}
int empilha(struct tpilha *p, int valor){
if(pilha_cheia(p))
return 0;
p->pilha[++p->topo]=valor;
return 1;
}
int desempilha(struct tpilha *p){
int x;
if(pilha_vazia(p))
return 0;
x = p->pilha[p->topo--];
return x;
}
int main() {
struct tpilha p1;
struct tfila f1;
int i, aux;
inicializapilha(&p1);
inicializafila(&f1);
for(i=0; i<TAM;i ++) {
printf("\nDigite o %d valor: ", i+1);
scanf("%d", &aux);
inserefila(&f1, aux);
}
for(i=0; i<TAM; i++)
printf("%d\t", f1.fila[i]);
printf("\n");
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 35
Estrutura de Dados
Fila Circular
A implementação da fila circular surgiu da necessidade de inserir
elementos em em uma fila com espaço, mas R pode está na posição TAM-1
da fila.
Considere:
fila(f)
F=0
R=0
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 36
Estrutura de Dados
Operações:
1) Inicialização da fila
4) Inserção
5) Remoção
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 37
Estrutura de Dados
Considere:
struct tfila_circ{
int ini;
int fim;
int cont;
int fila[TAM];
};
fila(f)
ini = 0
fim= -1
cont = 0
Operações:
1) Inicialização
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 38
Estrutura de Dados
4) Inserção
5) Remoção
Exercícios:
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 39
Estrutura de Dados
Listas Sequenciais
Considere:
struct tno {
int chave;
};
struct tlista {
int qtnos;
struct tno lista[TAM];
};
lista(l)
qtnos=0
tno
Operações:
1) Inicialização da lista
4) Percurso
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 41
Estrutura de Dados
8) Remoção
Exercícios:
Resposta:
#include <stdio.h>
#include <string.h>
#define TAM 10
struct tno{
int matricula;
float n1, n2, media;
char nome[60];
};
struct tlista{
int qtnos;
struct tno lista[TAM];
};
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 42
Estrutura de Dados
int insere_lista(struct tlista *pl, float n1, float n2, int mat, float media,
char nome[])
{
int i;
if(lista_cheia(pl))
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 43
Estrutura de Dados
return 0;
i= buscamat(pl, mat);
if(i>=0)
return -1;
pl->lista[pl->qtnos].matricula=mat;
pl->lista[pl->qtnos].n1=n1;
pl->lista[pl->qtnos].n2=n2;
pl->lista[pl->qtnos].media=media;
strcpy(pl->lista[pl->qtnos].nome, nome);
pl-> qtnos++;
return 1;
}
int main()
{
int op, mat, i;
float p1, p2, med;
char nome[60];
struct tlista l1;
inicializa_lista(&l1);
for(i=0; i<TAM; i++)
{
printf("\nDigite o nome: ");
gets(nome);
printf("\nDigite a matricula: ");
scanf("%d", &mat);
printf("\nDigite a primeira e segunda nota: ");
scanf("%f, %f", &p1, &p2);
med = (p1+p2)/2;
insere_lista(&l1, p1, p2, mat, med, nome);
fgetc(stdin);
}
do{
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 44
Estrutura de Dados
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 45
Estrutura de Dados
Operações:
2) Busca Binária
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 46
Estrutura de Dados
3) Inserção
4) Remoção
Exercício:
© 2002– 2021 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 47