ALGORITMOS em linguagem C
|
|
|
- Sebastiana Batista Barroso
- 9 Há anos
- Visualizações:
Transcrição
1 ALGORITMOS em linguagem C Paulo Feofiloff Instituto de Matemática e Estatística Universidade de São Paulo Campus/Elsevier. Algoritmos em linguagem C Paulo Feofiloff editora Campus/Elsevier, pf/algoritmos-livro/ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 2 / 162
2 Ciência da computação não é a ciência dos computadores, assim como a astronomia não é a ciência dos telescópios. E. W. Dijkstra P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 3 / 162 Leiaute P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 4 / 162
3 Leiaute Bom Bom leiaute int Funcao (int n, int v[]) { int i, j; i = 0; while (i < n) { if (v[i]!= 0) i = i + 1; else { for (j = i + 1; j < n; j++) v[j-1] = v[j]; n = n - 1; return n; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 5 / 162 Leiaute Mau Mau leiaute int Funcao (int n, int v[]) { int i, j; i = 0; while (i < n) { if (v[i]!= 0) i = i + 1; else { for (j = i + 1; j < n; j++) v[j-1] = v[j]; n = n - 1; return n; Use fonte de espaçamento fixo! P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 6 / 162
4 Leiaute Mau Péssimo leiaute int Funcao ( int n,int v[] ){ int i,j; i=0; while(i<n){ if(v[i]!=0) i= i +1; else { for (j=i+1;j<n;j++) v[j-1]=v[j]; n =n- 1; return n; Seja consistente! P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 7 / 162 Leiaute Compacto Um bom leiaute compacto int Funcao (int n, int v[]) { int i, j; i = 0; while (i < n) { if (v[i]!= 0) i = i + 1; else { for (j = i + 1; j < n; j++) v[j-1] = v[j]; n = n - 1; return n; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 8 / 162
5 Leiaute Regras Regras Use as regras adotadas por todos os jornais, revistas e livros: bla bla bla bla = bla bla <= bla bla; bla bla) bla; bla { while (bla if (bla P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 9 / 162 Leiaute Enfeitado Leiaute enfeitado int Função (int n, int v[]) { int i, j; i = 0; while (i < n) { if (v[i]!= 0) i = i + 1; else { for (j = i + 1; j < n; j++) v[j-1] = v[j]; n = n - 1; return n; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 10 / 162
6 Leiaute O que eles dizem Devemos mudar nossa atitude tradicional em relação à construção de programas. Em vez de imaginar que nossa principal tarefa é instruir o computador sobre o que ele deve fazer, vamos imaginar que nossa principal tarefa é explicar a seres humanos o que queremos que o computador faça. D. E. Knuth P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 11 / 162 Documentação P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 12 / 162
7 Documentação O que versus como documentação: código: Exemplo o que um algoritmo faz como o algoritmo faz o que faz /* A função abaixo recebe um número n >= 1 e um vetor v * e devolve o valor de um elemento máximo de v[0..n-1]. ******************************************************/ int Max (int v[], int n) { int j, x = v[0]; for (j = 1; j < n; j++) if (x < v[j]) x = v[j]; return x; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 13 / 162 Invariantes P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 14 / 162
8 Invariantes Explicam processo iterativo Exemplo 1 int Max (int v[], int n) { int j, x; x = v[0]; for (j = 1; j < n; j++) /* x é um elemento máximo de v[0..j-1] */ if (x < v[j]) x = v[j]; return x; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 15 / 162 Invariantes Explicam processo iterativo Exemplo 2 int Max (int v[], int n) { int j, x; x = v[0]; for (j = 1; /* A */ j < n; j++) if (x < v[j]) x = v[j]; return x; /* a cada passagem pelo ponto A, x é um elemento máximo de v[0..j-1] */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 16 / 162
9 Invariantes O que eles dizem A atividade de programação deve ser encarada como um processo de criação de obras de literatura, escritas para serem lidas. D. E. Knuth P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 17 / 162 Recursão P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 18 / 162
10 Recursão Para entender recursão, é preciso primeiro entender recursão. folclore Ao tentar resolver o problema, encontrei obstáculos dentro de obstáculos. Por isso, adotei uma solução recursiva. um aluno P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 19 / 162 Recursão Instâncias de problemas Problemas e suas instâncias instância de um problema = exemplo concreto do problema cada conjunto de dados de um problema define uma instância cada instância tem um tamanho Exemplo Problema: Calcular a média de dois números, digamos a e b. Instância: Calcular a média de 123 e P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 20 / 162
11 Recursão Algoritmos recursivos Problemas que têm estrutura recursiva Cada instância do problema contém uma instância menor do mesmo problema. Algoritmo recursivo se a instância em questão é pequena resolva-a diretamente senão reduza-a a uma instância menor do mesmo problema aplique o método à instância menor volte à instância original P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 21 / 162 Recursão Exemplo Exemplo: Problema do máximo Determinar o valor de um elemento máximo de um vetor v[0.. n 1]. o tamanho de uma instância deste problema é n o problema só faz sentido quando n 1 P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 22 / 162
12 Recursão Exemplo Solução recursiva /* Ao receber v e n >= 1, esta função devolve o valor de um elemento máximo de v[0..n-1]. */ int MáximoR (int v[], int n) { if (n == 1) return v[0]; else { int x; x = MáximoR (v, n - 1); if (x > v[n-1]) return x; else return v[n-1]; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 23 / 162 Recursão Exemplo Outra solução recursiva int Máximo (int v[], int n) { return MaxR (v, 0, n); int MaxR (int v[], int i, int n) { if (i == n-1) return v[i]; else { int x; x = MaxR (v, i + 1, n); if (x > v[i]) return x; else return v[i]; /* A função MaxR recebe v, i e n tais que i < n e devolve o valor de um elemento máximo de v[i..n-1]. */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 24 / 162
13 Vetores P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 25 / 162 Vetores Busca Problema da busca Dado x e vetor v[0.. n 1], encontrar um índice k tal que v[k] = x. x n 1 v o problema faz sentido com qualquer n 0 se n = 0, o vetor é vazio e essa instância não tem solução como indicar que não há solução? P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 26 / 162
14 Vetores Busca Algoritmo de busca Recebe um número x e um vetor v[0.. n 1] com n 0 e devolve k no intervalo 0.. n 1 tal que v[k] = x. Se tal k não existe, devolve 1. int Busca (int x, int v[], int n) { int k; k = n - 1; while (k >= 0 && v[k]!= x) k -= 1; return k; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 27 / 162 Vetores Busca Deselegante e/ou ineficiente! int k = n - 1, achou = 0; while (k >= 0 && achou == 0) { if (v[k] == x) achou = 1; else k -= 1; return k; int k; if (n == 0) return -1; k = n - 1; while (k >= 0 && v[k]!= x) k -= 1; return k; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 28 / 162
15 Vetores Busca Deselegante, ineficiente e/ou errado! int k = 0; int sol = -1; for (k = n-1; k >= 0; k--) if (v[k] == x) sol = k; return sol; int k = n - 1; while (v[k]!= x && k >= 0) k -= 1; return k; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 29 / 162 Vetores Busca Algoritmo recursivo de busca Recebe x, v e n 0 e devolve k tal que 0 k < n e v[k] = x. Se tal k não existe, devolve 1. int BuscaR (int x, int v[], int n) { if (n == 0) return -1; if (x == v[n-1]) return n - 1; return BuscaR (x, v, n - 1); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 30 / 162
16 Vetores Busca Deselegante! int feio (int x, int v[], int n) { if (n == 1) { if (x == v[0]) return 0; else return -1; if (x == v[n-1]) return n - 1; return feio (x, v, n - 1); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 31 / 162 Vetores Remoção Problema de remoção Remover o elemento de índice k de um vetor v[0.. n 1]. Decisões de projeto: suporemos 0 k n 1 novo vetor fica em v[0.. n 2] algoritmo devolve algo? P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 32 / 162
17 Vetores Remoção Algoritmo de remoção Remove o elemento de índice k do vetor v[0.. n 1] e devolve o novo valor de n. Supõe 0 k < n. int Remove (int k, int v[], int n) { int j; for (j = k; j < n-1; j++) v[j] = v[j+1]; return n - 1; funciona bem mesmo quando k = n 1 ou k = 0 exemplo de uso: n = Remove (51, v, n); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 33 / 162 Vetores Remoção Versão recursiva int RemoveR (int k, int v[], int n) { if (k == n-1) return n - 1; else { v[k] = v[k+1]; return RemoveR (k + 1, v, n); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 34 / 162
18 Vetores Inserção Problema de inserção Inserir um novo elemento y entre as posições k 1 e k de um vetor v[0.. n 1]. Decisões de projeto: se k = 0 então insere no início se k = n então insere no fim novo vetor fica em v[0.. n+1] P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 35 / 162 Vetores Inserção Algoritmo de inserção Insere y entre as posições k 1 e k do vetor v[0.. n 1] e devolve o novo valor de n. Supõe que 0 k n. int Insere (int k, int y, int v[], int n) { int j; for (j = n; j > k; j--) v[j] = v[j-1]; v[k] = y; return n + 1; estamos supondo n < N exemplo de uso: n = Insere (51, 999, v, n); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 36 / 162
19 Vetores Inserção Versão recursiva int InsereR (int k, int y, int v[], int n) { if (k == n) v[n] = y; else { v[n] = v[n-1]; InsereR (k, y, v, n - 1); return n + 1; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 37 / 162 Vetores Busca seguida de remoção Problema de busca-e-remoção Remover todos os elementos nulos de um vetor v[0.. n 1]. Algoritmo Remove todos os elementos nulos de v[0.. n 1], deixa o resultado em v[0.. i 1], e devolve o valor de i. int RemoveZeros (int v[], int n) { int i = 0, j; for (j = 0; j < n; j++) if (v[j]!= 0) { v[i] = v[j]; i += 1; return i; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 38 / 162
20 Vetores Busca seguida de remoção Funciona bem mesmo em casos extremos: quando n vale 0 quando v[0.. n 1] não tem zeros quando v[0.. n 1] só tem zeros Invariantes No início de cada iteração i j v[0.. i 1] é o resultado da remoção dos zeros do vetor v[0.. j 1] original P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 39 / 162 Vetores Busca seguida de remoção Mau exemplo: deselegante e ineficiente int i = 0, j = 0; /* "j = 0" é supérfluo */ while (i < n) { if (v[i]!= 0) i += 1; else { for (j = i; j+1 < n; j++) /* ineficiente */ v[j] = v[j+1]; /* ineficiente */ --n; return n; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 40 / 162
21 Vetores Busca seguida de remoção Versão recursiva int RemoveZerosR (int v[], int n) { int m; if (n == 0) return 0; m = RemoveZerosR (v, n - 1); if (v[n-1] == 0) return m; v[m] = v[n-1]; return m + 1; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 41 / 162 Endereços e ponteiros P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 42 / 162
22 Endereços e ponteiros Endereços Endereços os bytes da memória são numerados seqüencialmente o número de um byte é o seu endereço cada char ocupa 1 byte cada int ocupa 4 bytes consecutivos etc. cada objeto char, int, struct etc. tem um endereço o endereço de um objeto x é &x P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 43 / 162 Endereços e ponteiros Endereços Exemplo fictício endereços char c; int i; struct {int x, y; ponto; int v[4]; c i ponto v[0] v[1] v[2] &i vale &v[3] vale P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 44 / 162
23 Endereços e ponteiros Ponteiros Ponteiros ponteiro é um tipo de variável capaz de armazenar endereços se p = &x então dizemos p aponta para x se p é um ponteiro então *p é o valor do objeto apontado por p p 9999 representação esquemática P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 45 / 162 Endereços e ponteiros Ponteiros Exemplo: Um jeito bobo de fazer j = i int j, i = 888; int *p; p = &i; j = *p + 999; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 46 / 162
24 Listas encadeadas P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 47 / 162 Listas encadeadas Estrutura da lista Estrutura de uma célula struct cel { int conteúdo; struct cel *seg; /* seguinte */ ; conteúdo 999 seg P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 48 / 162
25 Listas encadeadas Estrutura da lista Células são um novo tipo de dados typedef struct cel célula; Definição de uma célula e de um ponteiro para célula célula c; célula *p; conteúdo da célula: c.conteúdo p->conteúdo endereço da célula seguinte: c.seg p->seg P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 49 / 162 Listas encadeadas Estrutura da lista última célula da lista: p->seg vale NULL P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 50 / 162
26 Listas encadeadas Estrutura da lista Exemplos: imprime lista com e sem cabeça O algoritmo imprime o conteúdo de uma lista lst sem cabeça. void Imprima (célula *lst) { célula *p; for (p = lst; p!= NULL; p = p->seg) printf ("%d\n", p->conteúdo); Imprime o conteúdo de uma lista lst com cabeça. void Imprima (célula *lst) { célula *p; for (p = lst->seg; p!= NULL; p = p->seg) printf ("%d\n", p->conteúdo); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 51 / 162 Listas encadeadas Busca Algoritmo de busca Recebe um inteiro x e uma lista lst com cabeça. Devolve o endereço de uma célula que contém x ou devolve NULL se tal célula não existe. célula *Busca (int x, célula *lst) { célula *p; p = lst->seg; while (p!= NULL && p->conteúdo!= x) p = p->seg; return p; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 52 / 162
27 Listas encadeadas Busca Versão recursiva célula *BuscaR (int x, célula *lst) { if (lst->seg == NULL) return NULL; if (lst->seg->conteúdo == x) return lst->seg; return BuscaR (x, lst->seg); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 53 / 162 Listas encadeadas Remoção Algoritmo de remoção de uma célula Recebe o endereço p de uma célula em uma lista e remove da lista a célula p->seg. Supõe que p NULL e p->seg NULL. void Remove (célula *p) { célula *lixo; lixo = p->seg; p->seg = lixo->seg; free (lixo); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 54 / 162
28 Listas encadeadas Inserção Algoritmo de inserção de nova célula Insere uma nova célula em uma lista entre a célula p e a seguinte (supõe p NULL). A nova célula terá conteúdo y. void Insere (int y, célula *p) { célula *nova; nova = malloc (sizeof (célula)); nova->conteúdo = y; nova->seg = p->seg; p->seg = nova; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 55 / 162 Listas encadeadas Busca e remoção Algoritmo de busca seguida de remoção Recebe uma lista lst com cabeça e remove da lista a primeira célula que contiver x, se tal célula existir. void BuscaERemove (int x, célula *lst) { célula *p, *q; p = lst; q = lst->seg; while (q!= NULL && q->conteúdo!= x) { p = q; q = q->seg; if (q!= NULL) { p->seg = q->seg; free (q); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 56 / 162
29 Listas encadeadas Busca e inserção Algoritmo de busca seguida de inserção Recebe lista lst com cabeça e insere nova célula conteúdo y imediatamente antes da primeira que contiver x. Se nenhuma célula contiver x, a nova célula será inserida no fim da lista. void BuscaEInsere (int y, int x, célula *lst) { célula *p, *q, *nova; nova = malloc (sizeof (célula)); nova->conteúdo = y; p = lst; q = lst->seg; while (q!= NULL && q->conteúdo!= x) { p = q; q = q->seg; nova->seg = q; p->seg = nova; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 57 / 162 Filas P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 58 / 162
30 Filas Implementação em vetor Fila implementada em vetor 0 s t N uma fila f[s..t-1] Remove elemento da fila x = f[s++]; /* x = f[s]; s += 1; */ Insere y na fila f[t++] = y; /* f[t] = y; t += 1; */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 59 / 162 Filas Distâncias em uma rede Aplicação: distâncias em uma rede d O vetor d dá as distâncias da cidade 3 a cada uma das demais. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 60 / 162
31 Filas Distâncias em uma rede Algoritmo das distâncias Recebe matriz A que representa as interligações entre cidades 0, 1,..., n 1: há uma estrada de x a y se e somente se A[x][y] = 1. Devolve um vetor d tal que d[x] é a distância da cidade o à cidade x. int *Distâncias (int **A, int n, int o) { int *d, x, y; int *f, s, t; d = malloc (n * sizeof (int)); for (x = 0; x < n; x++) d[x] = -1; d[o] = 0; f = malloc (n * sizeof (int)); processo iterativo free (f); return d; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 61 / 162 Filas Distâncias em uma rede processo iterativo s = 0; t = 1; f[s] = o; /* o entra na fila */ while (s < t) { x = f[s++]; /* x sai da fila */ for (y = 0; y < n; y++) if (A[x][y] == 1 && d[y] == -1) { d[y] = d[x] + 1; f[t++] = y; /* y entra na fila */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 62 / 162
32 Filas Distâncias em uma rede Invariantes (antes de cada comparação s < t ) 1. para cada cidade v em f[0.. t 1] existe um caminho de comprimento d[v] de o a v cujas cidades estão todas em f[0.. t 1] 2. para cada cidade v de f[0.. t 1] todo caminho de o a v tem comprimento d[v] 3. toda estrada que começa em f[0.. s 1] termina em f[0.. t 1] Conseqüência Para cada v em f[0.. t 1], o número d[v] é a distância de o a v. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 63 / 162 Filas Distâncias em uma rede Para provar invariantes 1 a 3, precisamos de mais dois invariantes: 4. d[f[s]] d[f[s+1]] d[f[t 1]] 5. d[f[t 1]] d[f[s]] + 1 P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 64 / 162
33 Filas Implementação circular Implementação circular da fila 0 t s N uma fila f[s..t-1] Remove elemento da fila x = f[s++]; if (s == N) s = 0; Insere y na fila f[t++] = y; if (t == N) t = 0; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 65 / 162 Filas Implementação em lista encadeada Fila implementada em lista encadeada typedef struct cel { int valor; struct cel *seg; célula; Decisões de projeto lista sem cabeça primeira célula: início da fila última célula: fim da fila Fila vazia célula *s, *t; /* s aponta primeiro elemento da fila */ s = t = NULL; /* t aponta último elemento da fila */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 66 / 162
34 Filas Implementação em lista encadeada Remove elemento da fila Recebe endereços es e et das variáveis s e t respectivamente. Supõe que fila não está vazia e remove um elemento da fila. Devolve o elemento removido. int Remove (célula **es, célula **et) { célula *p; int x; p = *es; /* p aponta o primeiro elemento da fila */ x = p->valor; *es = p->seg; free (p); if (*es == NULL) *et = NULL; return x; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 67 / 162 Filas Implementação em lista encadeada Insere elemento na fila Recebe endereços es e et das variáveis s e t respectivamente. Insere um novo elemento com valor y na fila. Atualiza os valores de s e t. void Insere (int y, célula **es, célula **et) { célula *nova; nova = malloc (sizeof (célula)); nova->valor = y; nova->seg = NULL; if (*et == NULL) *et = *es = nova; else { (*et)->seg = nova; *et = nova; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 68 / 162
35 Pilhas P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 69 / 162 Pilhas Implementação em vetor Pilha implementada em vetor 0 t N uma pilha p[0..t-1] Remove elemento da pilha x = p[--t]; /* t -= 1; x = p[t]; */ Insere y na pilha p[t++] = y; /* p[t] = y; t += 1; */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 70 / 162
36 Pilhas Parênteses e chaves Aplicação: parênteses e chaves expressao bem-formada: ((){()) expressao malformada: ({) Algoritmo Devolve 1 se a string s contém uma seqüência bem-formada e devolve 0 em caso contrário. int BemFormada (char s[]) { char *p; int t; int n, i; n = strlen (s); p = malloc (n * sizeof (char)); processo iterativo free (p); return t == 0; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 71 / 162 Pilhas Parênteses e chaves processo iterativo t = 0; for (i = 0; s[i]!= \0 ; i++) { /* p[0..t-1] é uma pilha */ switch (s[i]) { case ) : if (t!= 0 && p[t-1] == ( ) --t; else return 0; break; case : if (t!= 0 && p[t-1] == { ) --t; else return 0; break; default: p[t++] = s[i]; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 72 / 162
37 Pilhas Notação posfixa Aplicação: notação posfixa Notação infixa versus posfixa infixa posfixa ( A + B * C ) A B C * + ( A * ( B + C ) / D - E ) A B C + * D / E - ( A + B * ( C - D * ( E - F ) - G * H ) - I * 3 ) A B C D E F - * - G H * - * + I 3 * - ( A + B * C / D * E - F ) A B C * D / E * + F - ( A * ( B + ( C * ( D + ( E * ( F + G ) ) ) ) ) ) A B C D E F G + * + * + * P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 73 / 162 Pilhas Notação posfixa Algoritmo Recebe uma expressão infixa representada por uma string infix que começa com ( e termina com ) seguido de \0. Devolve a correspondente expressão posfixa. char *InfixaParaPosfixa (char infix[]) { char *posfix, x; char *p; int t; int n, i, j; n = strlen (infix); posfix = malloc (n * sizeof (char)); p = malloc (n * sizeof (char)); processo iterativo free (p); posfix[j] = \0 ; return posfix; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 74 / 162
38 Pilhas Notação posfixa processo iterativo t = 0; p[t++] = infix[0]; /* empilha ( */ for (j = 0, i = 1; /*X*/ infix[i]!= \0 ; i++) { /* p[0..t-1] é uma pilha de caracteres */ switch (infix[i]) { case ( : p[t++] = infix[i]; /* empilha */ break; case ) : while (1) { /* desempilha */ x = p[--t]; if (x == ( ) break; posfix[j++] = x; break; demais casos P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 75 / 162 Pilhas Notação posfixa demais casos case + : case - : while (1) { x = p[t-1]; if (x == ( ) break; --t; /* desempilha */ posfix[j++] = x; p[t++] = infix[i]; /* empilha */ break; case * : case / : while (1) { x = p[t-1]; if (x == ( x == + x == - ) break; --t; posfix[j++] = x; p[t++] = infix[i]; break; default: posfix[j++] = infix[i]; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 76 / 162
39 Pilhas Notação posfixa Aplicação de InfixaParaPosfixa à expressão (A*(B*C+D)) Valores das variáveis a cada passagem pelo ponto X: infix[0..i-1] p[0..t-1] posfix[0..j-1] ( ( ( A ( A ( A * ( * A ( A * ( ( * ( A ( A * ( B ( * ( A B ( A * ( B * ( * ( * A B ( A * ( B * C ( * ( * A B C ( A * ( B * C + ( * ( + A B C * ( A * ( B * C + D ( * ( + A B C * D ( A * ( B * C + D ) ( * A B C * D + ( A * ( B * C + D ) ) A B C * D + * P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 77 / 162 Pilhas Implementação em lista encadeada Pilha implementada em lista encadeada typedef struct cel { int valor; struct cel *seg; célula; Decisões de projeto lista com cabeça segunda célula: topo da pilha P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 78 / 162
40 Pilhas Implementação em lista encadeada Pilha vazia célula cabeça; célula *p; p = &cabeça; /* p->seg é o topo da pilha */ p->seg = NULL; Insere void Empilha (int y, célula *p) { célula *nova; nova = malloc (sizeof (célula)); nova->valor = y; nova->seg = p->seg; p->seg = nova; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 79 / 162 Pilhas Implementação em lista encadeada Remove int Desempilha (célula *p) { int x; célula *q; q = p->seg; x = q->valor; p->seg = q->seg; free (q); return x; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 80 / 162
41 Busca em vetor ordenado Problema: Encontrar um dado número x num vetor crescente v[0.. n 1]. Vetor é crescente se v[0] v[1] v[n 1]. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 81 / 162 Busca em vetor ordenado O problema Problema mais geral Dado x e um vetor crescente v[0.. n 1], encontrar j tal que v[j 1] < x v[j]. 0 j n se j = 0 então x v[0] se j = n então v[n 1] < x imagine v[ 1] = e v[n] = Se x = 555 então j = 4. Se x = 1000 então j = 13. Se x = 110 então j = 0. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 82 / 162
42 Busca em vetor ordenado Busca seqüencial Algoritmo de busca seqüencial Recebe um vetor crescente v[0.. n 1] com n 1 e um inteiro x. Devolve um índice j em 0.. n tal que v[j 1] < x v[j]. int BuscaSeqüencial (int x, int n, int v[]) { int j = 0; while (j < n && v[j] < x) ++j; return j; invariante: no começo de cada iteração tem-se v[j 1] < x consumo de tempo: proporcional a n P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 83 / 162 Busca em vetor ordenado Busca binária Algoritmo de busca binária Recebe um vetor crescente v[0.. n 1] com n 1 e um inteiro x. Devolve um índice j em 0.. n tal que v[j 1] < x v[j]. int BuscaBinária (int x, int n, int v[]) { int e, m, d; e = -1; d = n; while (/*X*/ e < d - 1) { m = (e + d)/2; if (v[m] < x) e = m; else d = m; return d; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 84 / 162
43 Busca em vetor ordenado Busca binária Invariante: a cada passagem pelo ponto X temos v[e] < x v[d]. 0 e d n Consumo de tempo em cada iteração, o tamanho do vetor em jogo é d e 1 tamanho do vetor na primeira, segunda, terceira, etc. iterações: n, n/2, n/4,..., n/2 k,... número total de iterações: = log2 n consumo de tempo: proporcional a log 2 n P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 85 / 162 Busca em vetor ordenado Busca binária Versão recursiva int BuscaBinária2 (int x, int n, int v[]) { return BuscaBinR (x, -1, n, v); BuscaBinR recebe um vetor crescente v[e.. d] e um x tal que v[e] < x v[d]. Devolve um índice j no intervalo e+1.. d tal que v[j 1] < x v[j]. int BuscaBinR (int x, int e, int d, int v[]) { if (e == d-1) return d; else { int m = (e + d)/2; if (v[m] < x) return BuscaBinR (x, m, d, v); else return BuscaBinR (x, e, m, v); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 86 / 162
44 ALGORITMOS DE ORDENAÇÃO P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 87 / 162 Ordenação O problema Problema Rearranjar os elementos de um vetor v[0.. n 1] de tal modo que ele fique crescente. Vetor é crescente se v[0] v[1] v[n 1]. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 88 / 162
45 Ordenação Ordenação por inserção por seleção P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 89 / 162 Ordenação Inserção Algoritmo de ordenação por inserção Rearranja o vetor v[0.. n 1] em ordem crescente. void Inserção (int n, int v[]) { int i, j, x; for (j = 1; /*A*/ j < n; j++) { x = v[j]; for (i = j-1; i >= 0 && v[i] > x; i--) v[i+1] = v[i]; v[i+1] = x; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 90 / 162
46 Ordenação Inserção Invariantes: a cada passagem pelo ponto A 1. v[0.. n 1] é uma permutação do vetor original 2. o vetor v[0.. j 1] é crescente 0 crescente j 1 j n Consumo de tempo proporcional ao número de execuções de v[i] > x no pior caso, esse número é n 1 j=1 j = n (n 1)/2 consumo de tempo total: no máximo n 2 unidades de tempo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 91 / 162 Ordenação Seleção Algoritmo de seleção Rearranja o vetor v[0.. n 1] em ordem crescente. void Seleção (int n, int v[]) { int i, j, min, x; for (i = 0; /*A*/ i < n-1; i++) { min = i; for (j = i+1; j < n; j++) if (v[j] < v[min]) min = j; x = v[i]; v[i] = v[min]; v[min] = x; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 92 / 162
47 Ordenação Seleção Invariantes: a cada passagem pelo ponto A 1. v[0.. n 1] é uma permutação do vetor original 2. v[0.. i 1] está em ordem crescente 3. v[i 1] v[j] para j = i, i+1,..., n 1 0 i 1 i n pequenos, crescente grandes Consumo de tempo no máximo n 2 unidades de tempo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 93 / 162 Algoritmo Mergesort P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 94 / 162
48 Mergesort Problema auxiliar Problema principal Rearranjar os elementos de um vetor v[0.. n 1] de tal modo que ele fique crescente, ou seja, de modo que v[0] v[1] v[n 1]. Problema auxiliar: intercalação Rearranjar v[p.. r 1] em ordem crescente sabendo que v[p.. q 1] e v[q.. r 1] são crescentes. p q 1 q r P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 95 / 162 Mergesort Intercalação de vetores ordenados Algoritmo de intercalação Recebe vetores crescentes v[p.. q 1] e v[q.. r 1] e rearranja v[p.. r 1] em ordem crescente. void Intercala (int p, int q, int r, int v[]) { int i, j, k, *w; w = malloc ((r-p) * sizeof (int)); i = p; j = q; k = 0; while (i < q && j < r) { if (v[i] <= v[j]) w[k++] = v[i++]; else w[k++] = v[j++]; while (i < q) w[k++] = v[i++]; while (j < r) w[k++] = v[j++]; for (i = p; i < r; i++) v[i] = w[i-p]; free (w); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 96 / 162
49 Mergesort Intercalação de vetores ordenados Consumo de tempo do algoritmo Intercala proporcional ao número de elementos do vetor P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 97 / 162 Mergesort Algoritmo principal Algoritmo Mergesort (ordena por intercalação) Rearranja o vetor v[p.. r 1] em ordem crescente. void Mergesort (int p, int r, int v[]) { if (p < r - 1) { int q = (p + r)/2; Mergesort (p, q, v); Mergesort (q, r, v); Intercala (p, q, r, v); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 98 / 162
50 Mergesort Algoritmo principal P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 99 / 162 Mergesort Algoritmo principal v[0.. n 1] v[0.. n 2 1] v[ n 2.. n 1] v[0.. n 4 1] v[ n 4.. n 2 1] v[ n 2.. 3n 4 1] v[ 3n 4.. n 1] Consumo de tempo do Mergesort aproximadamente log 2 n rodadas cada rodada consome n unidades de tempo total: n log 2 n unidades de tempo. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 100 / 162
51 Mergesort Algoritmo principal Versão iterativa void MergesortI (int n, int v[]) { int p, r, b = 1; while (b < n) { p = 0; while (p + b < n) { r = p + 2*b; if (r > n) r = n; Intercala (p, p + b, r, v); p = p + 2*b; b = 2*b; 0 p p+b p+2b n P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 101 / 162 Algoritmo Heapsort P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 102 / 162
52 Heapsort Heap Problema Rearranjar os elementos de um vetor v[0.. n 1] em ordem crescente. Definição Um max-heap é um vetor v[1.. m] tal que v[ 1 2 f ] v[f] para f = 2, 3,..., m P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 103 / 162 Heapsort Heap P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 104 / 162
53 Heapsort Algoritmo auxiliar 1 Algoritmo auxiliar 1: inserção em um heap Transforma v[1.. m+1] em max-heap supondo que v[1.. m] é max-heap. void InsereEmHeap (int m, int v[]) { int f = m+1; while /*X*/ (f > 1 && v[f/2] < v[f]) { int t = v[f/2]; v[f/2] = v[f]; v[f] = t; f = f/2; invariante no pto X: v[ 1 2 i ] v[i] para i = 2,..., m+1, i f consumo: log 2 (m + 1) unidades de tempo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 105 / 162 Heapsort Algoritmo auxiliar Transforma v[1.. 14] em max-heap supondo que v[1.. 13] é max-heap. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 106 / 162
54 Heapsort Algoritmo auxiliar 2 Algoritmo auxiliar 2 Transforma quase-max-heap v[1.. m] em max-heap. void SacodeHeap (int m, int v[]) { int t, f = 2; while /*X*/ (f <= m) { if (f < m && v[f] < v[f +1]) ++f; if (v[f/2] >= v[f]) break; t = v[f/2]; v[f/2] = v[f]; v[f] = t; f *= 2; v[1.. m] é quase-max-heap se v[ 1 2 f ] v[f] para f = 4, 5,..., m invariante no ponto X: v[ 1 2 i ] v[i] quando i f e i f+1 consumo: log 2 m unidades de tempo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 107 / 162 Heapsort Algoritmo principal Algoritmo Heapsort Rearranja vetor v[1.. n] de modo que ele fique crescente. void Heapsort (int n, int v[]) { int m; for (m = 1; m < n; m++) InsereEmHeap (m, v); for (m = n; /*X*/ m > 1; m--) { int t = v[1]; v[1] = v[m]; v[m] = t; SacodeHeap (m-1, v); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 108 / 162
55 Heapsort Algoritmo principal Invariantes no ponto X v[1.. m] é um max-heap v[1.. m] v[m+1.. n] v[m+1.. n] está em ordem crescente 1 max-heap m crescente n elementos pequenos elementos grandes P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 109 / 162 Heapsort Algoritmo principal Consumo de tempo do Heapsort no pior caso: n log 2 n unidades de tempo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 110 / 162
56 Algoritmo Quicksort Problema: Rearranjar um vetor v[0.. n 1] em ordem crescente. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 111 / 162 Quicksort Subproblema da separação Subproblema da separação: formulação vaga Rearranjar um vetor v[p.. r] de modo que os elementos pequenos fiquem todos do lado esquerdo e os grandes do lado direito. Formulação concreta Rearranjar v[p.. r] de modo que v[p.. j 1] v[j] < v[j+1.. r] para algum j em p.. r. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 112 / 162
57 Quicksort Subproblema da separação Algoritmo da separação Recebe um vetor v[p.. r] com p r. Rearranja os elementos do vetor e devolve j em p.. r tal que v[p.. j 1] v[j] < v[j+1.. r]. int Separa (int p, int r, int v[]) { int c, j, k, t; c = v[r]; j = p; for (k = p; /*A*/ k < r; k++) if (v[k] <= c) { t = v[j], v[j] = v[k], v[k] = t; j++; v[r] = v[j], v[j] = c; return j; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 113 / 162 Quicksort Subproblema da separação Invariantes no ponto A v[p.. r] é uma permutação do vetor original v[p.. j 1] c < v[j.. k 1] e v[r] = c p j k r p j k r c c c > c > c > c??? = c j k c c c c > c > c > c > c > c = c j c c c c = c > c > c > c > c > c P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 114 / 162
58 Quicksort Subproblema da separação j k c c c c > c > c > c > c > c = c última passagem pelo ponto A j c c c c = c > c > c > c > c > c resultado final Consumo de tempo do algoritmo Separa proporcional ao número de elementos do vetor P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 115 / 162 Quicksort Algoritmo principal Algoritmo Quicksort Rearranja o vetor v[p.. r], com p r + 1, de modo que ele fique em ordem crescente. void Quicksort (int p, int r, int v[]) { int j; if (p < r) { j = Separa (p, r, v); Quicksort (p, j - 1, v); Quicksort (j + 1, r, v); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 116 / 162
59 Quicksort Algoritmo principal Consumo de tempo do Quicksort no pior caso: n 2 unidades de tempo em média: n log 2 n unidades de tempo n := r p + 1 P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 117 / 162 Quicksort Altura da pilha de execução Quicksort com controle da altura da pilha de execução Cuida primeiro do menor dos subvetores v[p.. j 1] e v[j+1.. r]. void QuickSortP (int p, int r, int v[]) { int j; while (p < r) { j = Separa (p, r, v); if (j - p < r - j) { QuickSortP (p, j - 1, v); p = j + 1; else { QuickSortP (j + 1, r, v); r = j - 1; Altura da pilha de execução: log 2 n P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 118 / 162
60 Algoritmos de enumeração Enumerar = fazer uma lista de todos os objetos de um determinado tipo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 119 / 162 Algoritmos de enumeração Enumeração de subseqüências Problema Fazer uma lista, sem repetições, de todas as subseqüências de 1, 2,..., n P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 120 / 162
61 Algoritmos de enumeração Ordem lexicográfica Ordem lexicográfica de seqüências r 1, r 2,..., r j precede s 1, s 2,..., s k se 1. j < k e r 1,..., r j = s 1,..., s j ou 2. existe i tal que r 1,..., r i 1 = s 1,..., s i 1 e r i < s i Algoritmo de enumeração em ordem lexicográfica Recebe n 1 e imprime todas as subseqüências não-vazias de 1, 2,..., n em ordem lexicográfica. void SubseqLex (int n) { int *s, k; s = malloc ((n+1) * sizeof (int)); processo iterativo free (s); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 121 / 162 Algoritmos de enumeração Ordem lexicográfica processo iterativo s[0] = 0; k = 0; while (1) { if (s[k] < n) { s[k+1] = s[k] + 1; k += 1; else { s[k-1] += 1; k -= 1; if (k == 0) break; imprima (s, k); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 122 / 162
62 Algoritmos de enumeração Ordem lexicográfica Invariante Cada iteração começa com subseqüência s 1, s 2,..., s k de 1, 2,..., n. k ?? Vetor s no início de uma iteração de SubseqLex com n = 7. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 123 / 162 Algoritmos de enumeração Ordem lexicográfica Versão recursiva void SubseqLex2 (int n) { int *s; s = malloc ((n+1) * sizeof (int)); SseqR (s, 0, 1, n); free (s); void SseqR (int s[], int k, int m, int n) { if (m <= n) { s[k+1] = m; imprima (s, k+1); SseqR (s, k+1, m+1, n); /* inclui m */ SseqR (s, k, m+1, n); /* não inclui m */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 124 / 162
63 Algoritmos de enumeração Ordem lexicográfica especial Ordem lexicográfica especial r 1, r 2,..., r j precede s 1, s 2,..., s k se 1. j > k e r 1,..., r k = s 1,..., s k ou 2. existe i tal que r 1,..., r i 1 = s 1,..., s i 1 e r i < s i P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 125 / 162 Algoritmos de enumeração Ordem lexicográfica especial Algoritmo de enumeração em ordem lexicográfica especial Recebe n 1 e imprime, em ordem lexicográfica especial, todas as subseqüências não-vazias de 1, 2,..., n. void SubseqLexEsp (int n) { int *s, k; s = malloc ((n+1) * sizeof (int)); processo iterativo free (s); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 126 / 162
64 Algoritmos de enumeração Ordem lexicográfica especial processo iterativo s[1] = 0; k = 1; while (1) { if (s[k] == n) { k -= 1; if (k == 0) break; else { s[k] += 1; while (s[k] < n) { s[k+1] = s[k] + 1; k += 1; imprima (s, k); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 127 / 162 Algoritmos de enumeração Ordem lexicográfica especial Versão recursiva Recebe n 1 e imprime todas as subseqüências de 1, 2,..., n em ordem lexicográfica especial. void SubseqLexEsp2 (int n) { int *s; s = malloc ((n+1) * sizeof (int)); SseqEspR (s, 0, 1, n); free (s); continua... P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 128 / 162
65 Algoritmos de enumeração Ordem lexicográfica especial continuação Recebe um vetor s[1.. k] e imprime, em ordem lexicográfica especial, todas as seqüências da forma s[1],..., s[k], t[k+1],... tais que t[k+1],... é uma subseqüência de m, m+1,..., n. Em seguida, imprime a seqüência s[1],..., s[k]. void SseqEspR (int s[], int k, int m, int n) { if (m > n) imprima (s, k); else { s[k+1] = m; SseqEspR (s, k+1, m+1, n); /* inclui m */ SseqEspR (s, k, m+1, n); /* não inclui m */ P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 129 / 162 Algoritmos de enumeração Ordem lexicográfica especial Resultado de SseqEspR (s,2,7,9) supondo s[1] = 2 e s[2] = 4. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 130 / 162
66 Busca de palavras em um texto Problema: Encontrar as ocorrências de a[1.. m] em b[1.. n]. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 131 / 162 Busca de palavras Exemplos a l g o r í t i m o O s a l g o r í t i m o s d e o r d e n a ç ã o T A C T A G T A G T A T A T A T A T A T A C T A C T A G T A G P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 132 / 162
67 Busca de palavras O problema Definições a[1.. m] é sufixo de b[1.. k] se m k e a[1.. m] = b[k m+1.. k] a[1.. m] ocorre em b[1.. n] se existe k no intervalo m.. n tal que a[1.. m] é sufixo de b[1.. k] Problema Encontrar o número de ocorrências de a[1.. m] em b[1.. n]. P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 133 / 162 Busca de palavras O problema typedef unsigned char *palavra; typedef unsigned char *texto; Algoritmo trivial Recebe palavra a[1.. m] e texto b[1.. n], com m 1 e n 0, e devolve o número de ocorrências de a em b. int trivial (palavra a, int m, texto b, int n) { int k, r, ocorrs; ocorrs = 0; for (k = m; k <= n; k++) { r = 0; while (r < m && a[m-r] == b[k-r]) r += 1; if (r >= m) ocorrs += 1; return ocorrs; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 134 / 162
68 Busca de palavras Primeiro algoritmo de Boyer Moore Algoritmo de Boyer Moore B C B A X C B A B X C B A A X B C B A B X ˆ ˆ ˆ ˆ ˆ ˆ posições k em que a[1.. 4] é comparada com b[k 3.. k] B C B A A B C D E F G T1[c] Tabela de deslocamentos T1 T1[c] é o menor t em 0.. m 1 tal que a[m t] = c P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 135 / 162 Busca de palavras Primeiro algoritmo de Boyer Moore Primeiro algoritmo de Boyer Moore Recebe uma palavra a[1.. m] e um texto b[1.. n], com m 1 e n 0, e devolve o número de ocorrências de a em b. Supõe que cada elemento de a e b pertence ao conjunto de caracteres int BoyerMoore1 (palavra a, int m, texto b, int n) { int T1[256], i, k, r, ocorrs; /* pré-processamento da palavra a */ for (i = 0; i < 256; i++) T1[i] = m; for (i = 1; i <= m; i++) T1[a[i]] = m - i; busca da palavra a no texto b return ocorrs; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 136 / 162
69 Busca de palavras Primeiro algoritmo de Boyer Moore busca da palavra a no texto b ocorrs = 0; k = m; while (k <= n) { r = 0; while (m - r >= 1 && a[m-r] == b[k-r]) r += 1; if (m - r < 1) ocorrs += 1; if (k == n) k += 1; else k += T1[b[k+1]] + 1; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 137 / 162 Busca de palavras Segundo algoritmo de Boyer Moore Segundo algoritmo de Boyer Moore Tabela de deslocamentos T2 T2[i] é o menor t em 1.. m 1 tal que m t é bom para i j é bom para i se a[i.. m] é sufixo de a[1.. j] ou a[1.. j] é sufixo de a[i.. m] C A A B A A B A - B A. B A B A - B A * B A * B A i T2[i] i T2[i] i T2[i] P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 138 / 162
70 Busca de palavras Segundo algoritmo de Boyer Moore Segundo algoritmo de Boyer Moore Recebe uma palavra a[1.. m] com 1 m MAX e um texto b[1.. n] e devolve o número de ocorrências de a em b. int BoyerMoore2 (palavra a, int m, texto b, int n) { int T2[MAX], i, j, k, r, ocorrs; /* pré-processamento da palavra a */ for (i = m; i >= 1; i--) { j = m-1; r = 0; while (m - r >= i && j - r >= 1) if (a[m-r] == a[j-r]) r += 1; else j -= 1, r = 0; T2[i] = m - j; busca da palavra a no texto b return ocorrs; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 139 / 162 Busca de palavras Segundo algoritmo de Boyer Moore busca da palavra a no texto b ocorrs = 0; k = m; while (k <= n) { r = 0; while (m - r >= 1 && a[m-r] == b[k-r]) r += 1; if (m - r < 1) ocorrs += 1; if (r == 0) k += 1; else k += T2[m-r+1]; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 140 / 162
71 Busca de palavras Segundo algoritmo de Boyer Moore Consumo de tempo dos algoritmos de Boyer Moore pré-processamento: m 2 unidades de tempo busca, pior caso: mn unidades de tempo busca, em média: n unidades de tempo P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 141 / 162 Árvores binárias P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 142 / 162
72 Árvores binárias Definição Estrutura de um nó struct cel { int conteúdo; struct cel *esq; struct cel *dir; ; typedef struct cel nó; typedef nó *árvore; conteúdo 999 esq dir P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 143 / 162 Árvores binárias Varredura esquerda-raiz-direita Varredura esquerda-raiz-direita Visite a subárvore esquerda (em ordem e-r-d) depois a raiz depois a subárvore direita (em ordem e-r-d) P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 144 / 162
73 Árvores binárias Varredura esquerda-raiz-direita Algoritmo de varredura e-r-d Recebe uma árvore binária r e imprime o conteúdo de seus nós em ordem e-r-d. void Erd (árvore r) { if (r!= NULL) { Erd (r->esq); printf ("%d\n", r->conteúdo); Erd (r->dir); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 145 / 162 Árvores binárias Varredura esquerda-raiz-direita Versão iterativa void ErdI (árvore r) { nó *p[100], *x; int t = 0; x = r; while (x!= NULL t > 0) { /* o topo da pilha p[0..t-1] está em t-1 */ if (x!= NULL) { p[t++] = x; x = x->esq; else { x = p[--t]; printf ("%d\n", x->conteúdo); x = x->dir; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 146 / 162
74 Árvores binárias Altura Altura de nó = distância entre nó e seu descendente mais afastado de árvore = altura da raiz Se árvore tem n nós e altura h então log 2 n h < n. h = log 2 12 = 3 P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 147 / 162 Árvores binárias Altura Algoritmo da altura Devolve a altura da árvore binária r. int Altura (árvore r) { if (r == NULL) return -1; /* a altura de uma árvore vazia é -1 */ else { int he = Altura (r->esq); int hd = Altura (r->dir); if (he < hd) return hd + 1; else return he + 1; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 148 / 162
75 Árvores binárias Nó seguinte Estrutura de nó com campo pai struct cel { int conteúdo; struct cel *pai; struct cel *esq; struct cel *dir; ; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 149 / 162 Árvores binárias Nó seguinte Algoritmo do nó seguinte Recebe um nó x de uma árvore binária cujos nós têm campo pai e devolve o (endereço do) nó seguinte na ordem e-r-d. A função supõe que x NULL. nó *Seguinte (nó *x) { if (x->dir!= NULL) { nó *y = x->dir; while (y->esq!= NULL) y = y->esq; return y; while (x->pai!= NULL && x->pai->dir == x) x = x->pai; return x->pai; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 150 / 162
76 Árvores binárias de busca P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 151 / 162 Árvores de busca Definição Estrutura de um nó struct cel { int chave; int conteúdo; struct cel *esq; struct cel *dir; ; typedef struct cel nó; Árvore de busca: definição E.chave X.chave D.chave para todo nó X, todo nó E na subárvore esquerda de X e todo nó D na subárvore direita de X P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 152 / 162
77 Árvores de busca Busca Algoritmo de busca Recebe k e uma árvore de busca r. Devolve um nó cuja chave é k ou devolve NULL se tal nó não existe. nó *Busca (árvore r, int k) { if (r == NULL r->chave == k) return r; if (r->chave > k) return Busca (r->esq, k); else return Busca (r->dir, k); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 153 / 162 Árvores de busca Busca Versão iterativa while (r!= NULL && r->chave!= k) { if (r->chave > k) r = r->esq; else r = r->dir; return r; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 154 / 162
78 Árvores de busca Inserção nó *novo; novo = malloc (sizeof (nó)); novo->chave = k; novo->esq = novo->dir = NULL; Algoritmo de inserção Recebe uma árvore de busca r e uma folha avulsa novo. Insere novo na árvore de modo que a árvore continue sendo de busca e devolve o endereço da nova árvore. árvore Insere (árvore r, nó *novo) { nó *f, *p; if (r == NULL) return novo; processo iterativo return r; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 155 / 162 Árvores de busca Inserção processo iterativo f = r; while (f!= NULL) { p = f; if (f->chave > novo->chave) f = f->esq; else f = f->dir; if (p->chave > novo->chave) p->esq = novo; else p->dir = novo; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 156 / 162
79 Árvores de busca Remoção Algoritmo de remoção da raiz Recebe uma árvore não-vazia r, remove a raiz da árvore e rearranja a árvore de modo que ela continue sendo de busca. Devolve o endereço da nova raiz. árvore RemoveRaiz (árvore r) { nó *p, *q; if (r->esq == NULL) q = r->dir; else { processo iterativo free (r); return q; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 157 / 162 Árvores de busca Remoção processo iterativo p = r; q = r->esq; while (q->dir!= NULL) { p = q; q = q->dir; /* q é o nó anterior a r na ordem e-r-d */ /* p é o pai de q */ if (p!= r) { p->dir = q->esq; q->esq = r->esq; q->dir = r->dir; P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 158 / 162
80 Árvores de busca Remoção Exemplo: antes e depois de RemoveRaiz r p 5 10 q f q p 5 f nó f passa a ser o filho direito de p nó q fica no lugar de r P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 159 / 162 Árvores de busca Remoção Remoção do filho esquerdo de x x->esq = RemoveRaiz (x->esq); Remoção do filho direito de x x->dir = RemoveRaiz (x->dir); P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 160 / 162
81 Árvores de busca Desempenho dos algoritmos Consumo de tempo da busca, inserção e remoção pior caso: proporcional à altura da árvore árvore balanceada : proporcional a log 2 n n = número de nós da árvore P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 161 / 162 Fim P. Feofiloff (IME-USP) Algoritmos em C Campus/Elsevier 162 / 162
1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.
Disciplina: Estrutura de Dados II Turma: 4EC/5CC Data: 13/11/15 Nota: Professor: Renato E. N. de Moraes Semestre: 2015-2 Valor: 0,0 pts Aluno: Lista de exercícios 04 1. O que é a eficiência assintótica
UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO
Disciplina: Estrutura de Dados II Turma: 4EC/5CC Data: 13/11/15 Nota: Professor: Renato E. N. de Moraes Semestre: 2015-2 Valor: 0,0 pts Aluno: Lista de exercícios 04 1. O que é a eficiência assintótica
AULA 19 AULA 20. Ordenação: algoritmo Quicksort. Resumo. Melhores momentos
Melhores momentos Resumo AULA 19 função consumo de observação tempo bubble O(n 2 ) todos os casos insercao O(n 2 ) pior caso O(n) melhor caso insercaobinaria O(n 2 ) pior caso O(n lg n) melhor caso selecao
Lista Encadeada (Linked List)
Lista Encadeada (Linked List) As listas ou listas encadeadas são a estrutura de dados mais simples concebível excetuando-se naturalmente os arrays. Listas encadeadas nada mais são que uma seqüência de
BCC202 - Estrutura de Dados I
BCC202 - Estrutura de Dados I Aula 13: Ordenação: MergeSort Reinaldo Fortes Universidade Federal de Ouro Preto, UFOP Departamento de Computação, DECOM Website: www.decom.ufop.br/reifortes Email: [email protected]
Ordenação: Heapsort. Algoritmos e Estruturas de Dados II
Ordenação: Heapsort Algoritmos e Estruturas de Dados II Introdução Possui o mesmo princípio de funcionamento da ordenação por seleção Selecione o menor item do vetor Troque-o pelo item da primeira posição
ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos
ÁRVORES BINÁRIAS DE BUSCA Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REFERÊNCIA Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC. Cap. 4 INSTITUTO DE COMPUTAÇÃO
ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres
ESTRUTURA DE DADOS E ALGORITMOS Árvores Binárias de Busca Cristina Boeres Árvore Binária de Busca 30! construída de tal forma que, para cada nó: nós com chaves menores estão na sub-árvore esquerda nós
Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:
ORDENAÇÃO A atividade de ordenação é o processo de rearranjo de um certo conjunto de objetos de acordo com um critério (ordem) específico. O objetivo da ordenação é facilitar a localização dos membros
AED2 - Aula 11 Problema da separação e quicksort
AED2 - Aula 11 Problema da separação e quicksort Projeto de algoritmos por divisão e conquista Dividir: o problema é dividido em subproblemas menores do mesmo tipo. Conquistar: os subproblemas são resolvidos
INF 1010 Estruturas de Dados Avançadas. Árvores binárias
INF 1010 Estruturas de Dados Avançadas Árvores binárias 1 Árvore estrutura hierárquica: A B E F C D G A B C E F D G A B C D E F G (A (B (E, F)), C, (D (G))) 05/09/16 2 Árvore - definições árvore: nó raiz
DAINF - Departamento de Informática
DAINF - Departamento de Informática Algoritmos 2 - Árvore binária de busca Prof. Alex Kutzke ( http://alex.kutzke.com.br/courses ) 30 de Novembro de 2015 Slides adaptados do material produzido pelo Prof.
Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira
Árvores SCC-202 Algoritmos e Estruturas de Dados I Lucas Antiqueira Listas e árvores Listas lineares Um nó após o outro, adjacentes Nó sucessor e antecessor Diversas aplicações necessitam de estruturas
Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões
Edital de Seleção 032/2016 PROPESP/UFAM Prova de Conhecimento Caderno de Questões CANDIDATO: INSCRIÇÃO: Assinatura conforme identidade INSTRUÇÕES PARA O CANDIDATO: Verifique o seu nome e o número da sua
Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:
Fontes Bibliográficas Estruturas de Dados Aula 15: Árvores Livros: Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo 13; Projeto de Algoritmos (Nivio Ziviani): Capítulo 5; Estruturas
INF 1620 P2-23/10/04 Questão 1 Nome:
INF 1620 P2-23/10/04 Questão 1 Considere um tipo abstrato de dados para representar uma disciplina da PUC-Rio, com as seguintes informações: Nome da disciplina: com até 50 caracteres Código da disciplina:
ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES
ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES Listas de Prioridades! Em muitas aplicações, dados de uma coleção são acessados por ordem de prioridade! A prioridade associada a um dado pode
Capacitação em Linguagem C Parte 2
Capacitação em Linguagem C Parte 2 Andrey Souto Maior Giuseppe Portolese Universidade Estadual de Maringá - Centro de Tecnologia Departamento de Informática 22 de outubro de 2015 Sumário I Tipos abstratos
Carlos Eduardo Batista. Centro de Informática - UFPB
Estrutura de Dados Carlos Eduardo Batista Centro de Informática - UFPB [email protected] Aritmética de ponteiros em C (continuação) O que acontece na memória? Ponteiro para ponteiro etc. Métodos de pesquisa
Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.
Algoritmos e Estrutura de Dados II Árvore Prof a Karina Oliveira [email protected] Introdução Estruturas de dados lineares (pilha, fila) são estruturas que guardam coleções de elementos que são acessados
Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões
Edital de Seleção 024/2017 PROPESP/UFAM Prova de Conhecimento Caderno de Questões CANDIDATO: «Nome» INSCRIÇÃO: «Inscrição» Assinatura conforme identidade INSTRUÇÕES PARA O CANDIDATO: Verifique o seu nome
ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA
ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro [email protected] Sala 110 Prédio da Computação www.comp.ita.br/~pauloac IECE - ITA MÉTODOS MAIS EFICIENTES QUE O(N 2 ) Método Quicksort Método
Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação
1 Árvores Estrutura de Dados Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 2 Árvore Binária de Busca Definição: uma árvore binária de busca (ABB) é uma árvore binária na qual
Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35
Heaps Estrutura de Dados Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35 Conteúdo Introdução Definição de Heap Heap Binária Implementação com vetor Fila de Prioridades
ORDENAÇÃO POR INTERCALAÇÃO
AULA 6 ORDENAÇÃO POR INTERCALAÇÃO Na aula 5 revimos os métodos de ordenação mais básicos, que são todos iterativos, simples e têm tempo de execução de pior caso proporcional a n 2, onde n é o tamanho da
Árvore Binária de Busca. Prof. César Melo
Árvore Binária de Busca Prof. César Melo Introdução O algoritmo de busca binária em vetores tem bom desempenho e deve ser usado quando temos os dados já ordenados. No entanto, se precisarmos inserir e
Árvores Binárias de Busca (ABB) 18/11
Árvores Binárias de Busca (ABB) 18/11 Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguintes propriedade: Para todo nó da árvore, se seu valor é X, então:
ANÁLISE DE ALGORITMOS
ANÁLISE DE ALGORITMOS Paulo Feofiloff Instituto de Matemática e Estatística Universidade de São Paulo agosto 2009 Introdução P. Feofiloff (IME-USP) Análise de Algoritmos agosto 2009 2 / 102 Introdução
Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1
Estruturas de Dados Módulo 17 - Busca 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)
Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM
Árvores Binária de Busca Prof. César Melo DCC/ICE/UFAM Introdução O algoritmo de busca binária em vetores tem bom desempenho e deve ser usado quando temos os dados já ordenados. No entanto, se precisarmos
Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP
Aula 13: Ordenação - Heapsort Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP Filas de Prioridades É uma estrutura de dados onde a chave de cada item reflete sua habilidade relativa de abandonar
Aula 08. Estruturas de dados Árvore e Grafo
Logo Aula 08 Estruturas de dados Árvore e Grafo 2 Árvore Estruturas estudadas até agora não são \ adequadas para representar dados que devem ser dispostos de maneira hierárquica Ex., hierarquia de pastas
Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura
Árvores B Prof. Márcio Bueno [email protected] / [email protected] Fonte: Material da Prof a Ana Eliza Lopes Moura Situação Problema Memória Principal Volátil e limitada Aplicações Grandes
Edital de Seleção 053/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões
Edital de Seleção 053/2016 PROPESP/UFAM Prova de Conhecimento Caderno de Questões CANDIDATO: INSCRIÇÃO: Assinatura conforme identidade INSTRUÇÕES PARA O CANDIDATO: Verifique o seu nome e o número da sua
Linguagem C: Listas Encadeadas
Prof. Paulo R. S. L. Coelho [email protected] Faculdade de Computação Universidade Federal de Uberlândia GEQ007 Organização 1 Introdução 2 3 Organização Introdução 1 Introdução 2 3 Introdução Introdução
Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio
Programação II Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio Árvores Dados organizados de maneira hierárquica Exemplos: arquivos em diretórios, subdivisão de espaço 2D em um
Ordenação: HeapSort. Prof. Túlio Toffolo BCC202 Aula 17 Algoritmos e Estruturas de Dados I
2014-01 Aula 16 Fila de Prioridade / HeapSort Adaptado por Reinaldo Fortes para o curso de 2014-01 Arquivo original: Aula 17: HeapSort Ordenação: HeapSort Prof. Túlio Toffolo http://www.toffolo.com.br
Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo
PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo Árvore: estrutura composta por nós e arestas entre nós. As arestas são direcionadas ( setas ) e: um nó (e apenas um) é a raiz; todo nó
Árvores & Árvores Binárias
Árvores & Árvores Binárias Problema Implementações do TAD Lista Linear Lista encadeada eficiente para inserção e remoção dinâmica de elementos, mas ineficiente para busca Lista seqüencial (ordenada) Eficiente
SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)
SCC 202 Algoritmos e Estruturas de Dados I Pilhas (Stacks) (implementação dinâmica) Operações alocação encadeada dinâmica typedef struct elem{ tipo_info info; struct elem *lig; tipo_elem; typedef struct{
Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo
PMR2300 Escola Politécnica da Universidade de São Paulo Árvore: estrutura composta por nós e arestas entre nós. As arestas são direcionadas ( setas ) e: um nó (e apenas um) é a raiz; todo nó (exceto a
Algoritmos e Estruturas de dados
Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21 Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores
Aula 13: Listas encadeadas (estruturas lineares)
Algoritmos e Estruturas de Dados I Aula 13: Listas encadeadas (estruturas lineares) Prof. Jesús P. Mena-Chalco [email protected] 1Q-2017 1 Estruturas (alguns autores usam o termo registro) 2 Linguagem
Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.
Listas Estáticas SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista http://www.icmc.usp.br/~paulovic [email protected] Instituto de
Aula 07: Algoritmos de busca e Listas encadeadas
BC1424 Algoritmos e Estruturas de Dados I Aula 07: Algoritmos de busca e Listas encadeadas Prof. Jesús P. Mena-Chalco [email protected] 1Q-2016 1 Busca de um elemento 2 Exemplo: Busca de um elemento
Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista
Matrizes Esparsas SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista http://www.icmc.usp.br/~paulovic [email protected] Instituto
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Árvores Binárias Árvores Árvores representam estruturas de dados caracterizadas por uma relação hierárquica da informação:
INF 1620 P2-01/11/03 Questão 1 Nome:
INF 1620 P2-01/11/03 Questão 1 Considere a implementação de uma lista encadeada para armazenar as notas dos alunos de uma turma dada pelo tipo abaixo: struct lista { char nome[81]; int mat; float p1, p2,
Árvores binárias de busca
Árvores binárias de busca Introdução à Ciência de Computação II Diego R. Amancio Baseado no material do Prof. Thiago A. S. Pardo Árvore binárias n Árvores de grau 2, isto é, cada nó tem dois filhos, no
UNIVERSIDADE FEDERAL DO PIAUÍ COLÉGIO TÉCNICO DE TERESINA-TÉCNICO EM INFORMÁTICA DISCIPLINA: ESTRUTURA DE DADOS PROFESSOR: Valdemir Junior
UNIVERSIDADE FEDERAL DO PIAUÍ COLÉGIO TÉCNICO DE TERESINA-TÉCNICO EM INFORMÁTICA DISCIPLINA: ESTRUTURA DE DADOS PROFESSOR: Valdemir Junior ALGORITMO DE ORDENAÇÃO HEAPSORT Alyson Pereira Barbosa Erisvaldo
HeapSort Filas de Prioridade Heap. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR
HeapSort Filas de Prioridade Heap David Menotti Algoritmos e Estruturas de Dados II DInf UFPR Filas de Prioridades É uma estrutura de dados onde a chave de cada item reflete sua habilidade relativa de
ÁRVORE BINÁRIA DE BUSCA
ÁRVORE BINÁRIA DE BUSCA Introdução O algoritmo de busca binária em vetores tem bom desempenho e deve ser usado quando temos os dados já ordenados. No entanto, se precisarmos inserir e remover elementos
ALGORITMOS DE ORDENAÇÃO
ALGORITMOS DE ORDENAÇÃO Prof. André Backes Conceitos básicos 2 Ordenação Ato de colocar um conjunto de dados em uma determinada ordem predefinida Fora de ordem 5, 2, 1, 3, 4 Ordenado 1, 2, 3, 4, 5 OU 5,
Algoritmos e Estruturas de Dados I
Algoritmos e Estruturas de Dados I Aula 09 Revisão + Simulado Prof. Jesús P. Mena-Chalco [email protected] 1Q-2019 1 Vetores 2 Vetores 3 Vetores vetor 4 Vetores... vetor... 5 Ponteiros 6 Processo
Introdução a AVL: teoria e prática. 22/11, 25/11 e 30/11
Introdução a AVL: teoria e prática 22/11, 25/11 e 30/11 Árvores binárias de busca (ABB) Árvores de grau 2, isto é, cada nó tem dois filhos, no máximo Raiz B A C Terminologia: filho esquerdo filho direito
Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich
Árvores Binárias SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista. Figuras editadas por Isadora Maria Mendes http://www.icmc.usp.br/~paulovic
Árvores Binárias de Busca (ABB) 18/11
Árvores Binárias de Busca (ABB) 18/11 Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguintes propriedade: Para todo nó da árvore, se seu valor é X, então:
ÁRVORE BINÁRIA DE BUSCA TDA-ABB
ÁRVORE BINÁRIA DE BUSCA TDA-ABB Conceitos Gerais sobre Árvores Uma árvore é uma estrutura hierárquica dividida em níveis, que ou está vazia, ou contém elementos chamados nós; Diferentemente da árvore natural,
Estruturas de Dados 2
Estruturas de Dados 2 Técnicas de Projeto de Algoritmos Dividir e Conquistar IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 1/83 Projeto de Algoritmos por Divisão
Módulo 9. Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II C++ (Rone Ilídio)
Módulo 9 Pesquisa em Memória Primária Algoritmos e Estruturas de Dados II C++ (Rone Ilídio) Árvore Binária Estrutura baseada em ponteiros Os elementos são chamados nós Cada nó é ligado a, 1 ou 2 elementos
Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.
Árvores de Pesquisa A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação. Particularmente adequada quando existe necessidade de considerar todos ou alguma combinação
Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula
Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula Tópicos Introdução Ordenação por bolha (bubble sort)
Lista 02: Pilhas & Filas
MAC122 Princípios de Desenvolvimento de Algoritmos DCC IME USP 2º Semestre de 2018 Prof.: Dr. Paulo Miranda [email protected] Lista 02: Pilhas & Filas Para as questões envolvendo pilhas, assuma
HeapSort. Estrutura de Dados II Jairo Francisco de Souza
HeapSort Estrutura de Dados II Jairo Francisco de Souza HeapSort Algoritmo criado por John Williams (1964) Complexidade O(NlogN) no pior e médio caso Mesmo tendo a mesma complexidade no caso médio que
Árvores binárias de busca
Árvores binárias de busca SCC-214 Projeto de Algoritmos Thiago A. S. Pardo Árvore binárias Árvores de grau 2, isto é, cada nó tem dois filhos, no máximo Raiz D B A E C F Terminologia: filho esquerdo filho
Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo
Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária Túlio Toffolo www.decom.ufop.br/toffolo Pesquisa em Memória Primária n Introdução - Conceitos Básicos n Pesquisa Sequencial n Pesquisa Binária n Árvores
Árvores AVL e Árvores B. Jeane Melo
Árvores AVL e Árvores B Jeane Melo Roteiro Árvores Binárias Árvores AVL Definição Motivação Balanceamento Operações de rebalanceamento Árvores B Introdução Árvores Binárias Árvores binárias Cada nó tem
Árvores Binárias de Busca
Árvores AVL Árvores Binárias de Busca Altura de uma árvore binária (AB): igual à profundidade, ou nível máximo, de suas folhas A eficiência da busca em árvore depende do seu balanceamento Algoritmos de
QUESTÕES DE PROVAS ANTIGAS
CT-24 QUESTÕES DE PROVAS ANTIGAS ) Preencha a tabela abaixo com Î ou Ï: ω(log n) Θ(n) O(n log n) Ω(n 2 ) o(n ) 6n + 2n 2 + 2.log n + 4n + n.log n + log n 2) Dada a árvore binária abaixo, escreva os seus
Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista
Pilha SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista http://www.icmc.usp.br/~paulovic [email protected] Instituto de Ciências
