Busca Sequencial Int pseqint x int n int
Busca Sequencial Int pseq(int x, int n, int v[]){ for(i=0; i<n; i++){ if(x==v[i]) return true; } return false; }
Busca Seqüencial Recursiva int busca 2 (int x, int n, int v[]) { if (n == 0) return false; if ( v[n-1]==x) return ; return busca 2 (x, n-1, v); }
Busca Binária • Quanto tempo o algoritmo leva parar? Na início da primeira iteração, d-e vale aproximadamente n. Na início da segunda, vale aproximadamente n/2. Na início da terceira, n/4. Na início da (k-1)-ésima, n/2 k. Quando k passar de log 2 n, o valor da expressão n/2 k fica menor que 1 e o algoritmo pára. Logo, o número de iterações é aproximadamente
Busca Binária busca. Binaria (int x, int n, int v[]) { int e, m, d; e = 0; d = n-1; while (e <= d) { m = (e + d)/2; if (v[m] == x) return m; if (v[m] < x) e = m + 1; else d = m - 1; } return -1; }
Busca Binária int bb (int x, int e, int d, int v[]) { if (e > d) return -1; else { int m = (e + d)/2; if (v[m] == x) return m; if (v[m] < x) return bb (x, m+1, d, v); else return bb (x, e, m-1, v); } } Int busca. Binaria 2 (int x, int n, int v[ ]) { return bb (x, 0, n-1, v); }
Exercício • Suponha que cada elemento do vetor v[0. . n-1] é uma struct com dois campos: o nome de um aluno e o número do aluno. Suponha que o vetor está em ordem crescente de números. Escreva uma função de busca binária que receba o número de um aluno e devolva o seu nome. Se o número não está no vetor, a função deve devolver a string vazia.
Remoção e inserção em vetor • Suponha que um vetor (= array) v foi declarado como • int v[MAX]; • sendo MAX uma constante definida por um #define. Digamos que v abriga uma seqüência • v[0] , . . . , v[n-1]. • É óbvio que devemos ter 0 ≤ n ≤ MAX. Se n é igual a 0 então a seqüência está vazia. Se n é igual a MAX, a seqüência está cheia. • Suponha que a seqüência v[0], . . . , v[n-1] sofre inserção de novos elementos e remoção de elementos antigos. Como administrar essas operações?
REMOÇÃO int remover (int k, int n, int v[]) { int j; for (j = k+1; j < n; j++) v[j-1] = v[j]; return n - 1; }
Remoção int remover 2 (int k, int n, int v[]) { if (k == n-1) return n - 1; else { v[k] = v[k+1]; return remover 2 (k+1, n, v); } }
Exercício Refaça todo o problema da remoção sob condições mais gerais: Suponha que a parte relevante do vetor v é v[ini. . fim-1]; para remover v[k], puxe v[k+1. . fim-1] para a esquerda ou empurre v[ini. . k-1] para a direita, dependendo de qual das alternativas seja mais "barata".
Inserção Suponha quero inserir um novo elemento x entre v[k-1] e v[k]. É óbvio que isso faz sentido quando 1 ≤ k ≤ n-1. Também faz sentido quando k é igual a 0 (insere no início) e quando k é igual a n (insere no fim). Em suma, faz sentido quando e somente quando 0 ≤ k ≤ n.
Inserção int inserir (int k, int x, int n, int v[]) { int j; for (j = n; j > k; --j) v[j] = v[j-1]; v[k] = x; return n + 1; } n = inserir (51, 999, n, v);
Inserção int inserir 2 (int k, int x, int n, int v[]) { if (k == n) { v[n] = x; return n + 1; } else { int y; y = v[k]; v[k] = x; return inserir 2 (k+1, y, n, v); } }
Exercício • Escreva uma função que insira x entre v[k] e v[k+1]
Pequena Aplicação. Escreva um programa para administrar uma coleção de números digitados pelo usuário. A coleção pode conter mais de uma cópia de um mesmo número. O usuário pode inserir novos números na coleção e remover números que já estão lá. A coleção é armazenada em ordem crescente. Se o usuário digitar i 222 (seguido de ENTER) o número 222 é inserido na coleção. Se digitar r 333 o número 333 é removido da coleção (se esse número não estiver na coleção, o comando é ignorado). Depois de cada inserção ou remoção, o programa deve exibir a coleção. Se o usuário digitar qualquer outro caracter que não 'i' ou 'r', a execução do programa termina.
- Slides: 15