estrutura de dados -...
TRANSCRIPT
Estrutura de DadosEstrutura de DadosEstrutura de DadosEstrutura de DadosCarlos Eduardo Batista
Centro de Informática - [email protected]
� Aritmética de ponteiros em C (continuação)◦ O que acontece na memória?
◦ Ponteiro para ponteiro etc.
� Métodos de pesquisa e classificação de dados (resumo)
Estruturas de DadosEstruturas de Dados2
� Operador &◦ Endereço de◦ Operador unário que devolve o endereço na memória do seu operando
� Operador *◦ Valor no endereço de◦ Operador unário que devolve o valor da variável localizada no endereço do seu
Aritmética de ponteiros em CAritmética de ponteiros em C
variável localizada no endereço do seu operando
3
m = &count;q = *m;
int *piValor; /* ponteiro para inteiro */int iVariavel = 1234234;piValor = &iVariavel; /* endereço de memória */printf ("Endereco: %d\n", piValor);printf ("Valor : %d\n", *piValor);*piValor = 180118 ;printf ("Valor alterado: %d\n", iVariavel);printf ("Endereco : %d\n", piValor);
Aritmética de ponteiros em CAritmética de ponteiros em C4
int* e;*e = (int*)malloc(sizeof(int));if (e == NULL) {
printf(“Memória cheia”);exit(1);}
*e = 10;printf (“e = %p e contém %d”,e,*e);
PonteirosPonteiros emem CC5
printf (“e = %p e contém %d”,e,*e);free(e);
� Ponteiro para ponteiro◦ Ponteiro que guarda o endereço de memória de outro ponteiro� tipo **nome
◦ *nome = conteúdo do ponteiro intermediário (um endereço)
◦ **nome = conteúdo da região final apontada (um valor)
� Ponteiro para ponteiro para ponteiro…
PonteirosPonteiros emem CC
� Ponteiro para ponteiro para ponteiro…
6
int *piVariavel;*piVariavel = (int *) malloc(sizeof(int)); //ADDR 4*piVariavel = 20;printf(“%d\n”,&piVariavel); //1printf(“%d\n”,piVariavel); //4printf(“%d\n”,*piVariavel); //20
Ponteiros em CPonteiros em C7
#include <stdio.h>#include <stdlib.h>
int funcao(int **piParametro){
printf("%d\n",&piParametro);printf("%d\n",piParametro);printf("%d\n",*piParametro);printf("%d\n",**piParametro);return 0;
}
int main( void ){
Ponteiros em CPonteiros em C8
int *piVariavel;*piVariavel = (int *) malloc(sizeof(int);*piVariavel = 20;printf("%d\n",&piVariavel);printf("%d\n",piVariavel);printf("%d\n",*piVariavel);funcao( &piVariavel );return 0;
}
Ponteiros em CPonteiros em C9
Ponteiros em CPonteiros em C10
main(){
float pi = 3.1415, *pf, **ppf;pf = πppf= &pf;printf("%f\n", **ppf);printf("%f\n", *pf);
}
PonteirosPonteiros emem CC11
}
� Busca: Tarefa recorrente
� Diferentes métodos e estruturas (TADs) aplicáveis◦ Quais e quando?
◦ Métodos específicos para situações específicas
� O problema:◦ Dado um conjunto de elementos identificados
Pesquisa e classificação de dadosPesquisa e classificação de dados
◦ Dado um conjunto de elementos identificados (por uma chave, por exemplo), localizar o elemento que possui uma chave específica
12
� Algoritmo de busca◦ Recebe como argumento o índice para a busca e o conjunto no qual a busca será realizada
� Operações◦ Inserção
◦ Inserção com busca � Se elemento não existe, insira
Pesquisa e classificação de dadosPesquisa e classificação de dados
� Se elemento não existe, insira
◦ Recuperação
◦ Remoção
13
� Conjunto de dados◦ Um vetor de registros
◦ Uma lista encadeada
◦ Uma árvore
� Busca◦ Sequencial
◦ Binária
Pesquisa e classificação de dadosPesquisa e classificação de dados
◦ Binária
◦ Busca por interpolação, em árvores e hashing
� Busca deve ser realizada com menor custo◦ Utilizar menor quantidade de recursos possíveis
14
� Busca sequencial◦ Forma mais simples
◦ Aplica-se a vetores, listas encadeadas e estruturas que possuem sequência de ordenação
◦ São consultados todos os registros até que se encontre o que se busca
Pesquisa e classificação de dadosPesquisa e classificação de dados15
234 567 353 276 958 598 988 544
Encontrar 988 em um vetor com 8 elementos inteiros
Iteração 1... 7ª. Iteração!
int A[] = { 234, 567, 353, 276, 958, 598, 988, 544 } ;int x = 988;for (i=0; i<8; i++) {
if (A[i] == x)return(i); /*chave encontrada*/
}return(-1); /* chave não encontrada */
int A[] = { 234, 567, 353, 276, 958, 598, 988, 544 };
A
Pesquisa e classificação de dadosPesquisa e classificação de dados16
int A[] = { 234, 567, 353, 276, 958, 598, 988, 544 };int x = 988;int i;int n = 8;A[n] = 988;for (i=0; x!=A[i]; i++)
if (i < n) return(i); /*chave encontrada*/else return(-1); /*chave não encontrada*/
B
� Busca sequencial◦ Tamanho fixo do vetor � Desperdício de memória pode ocorrer
◦ Alternativa: usar lista encadeada
� Complexidade◦ Pesquisa com sucesso � melhor caso: C(n) = 1 � pior caso: C(n) = n
Pesquisa e classificação de dadosPesquisa e classificação de dados
� pior caso: C(n) = n � caso médio: C(n) = (n+1) / 2
◦ Pesquisa sem sucesso � C(n) = n + 1
17
� Busca sequencial◦ Em arranjo não ordenado� Inserção no final do arranjo
� Remoção: realocação dos registros acima do removido
◦ Eficiência: reordenar continuamente� Mover para frente – pesquisa com êxito move item para frente (no início da lista)
Pesquisa e classificação de dadosPesquisa e classificação de dados
item para frente (no início da lista)
� Transposição – registro recuperado é trocado com o registro imediatamente anterior
� Recuperação recorrente de registros (frequência)
18
� Busca sequencial◦ Em estrutura ordenada (pelos valores das chaves a serem buscadas)
◦ Melhor eficiência� Pior caso (não encontrada a chave): O(n)
� Caso médio: O(n/2)
◦ Tabela de índices
Pesquisa e classificação de dadosPesquisa e classificação de dados19
234
697
987
1000
100
110
234
345
697
987
Chave Registro
Pesquisa e classificação de dadosPesquisa e classificação de dados20
1000 987
999
1000
� Busca binária◦ Se os dados estiverem ordenados em um arranjo...
◦ Arr[i] <= Arr[i+1] (ordem crescente)
◦ Arr[i] >= Arr[i+1] (ordem decrescente)
◦ Parte-se do elemento ‘do meio’ do arranjo para realizar a busca
Pesquisa e classificação de dadosPesquisa e classificação de dados
� Se igual, busca bem sucedida
� Se maior ou menor, realizar busca na metade correspondente (dependendo se ordenado crescente ou decrescentemente)
21
123 133 222 245 321 334 411 544
133 < 245
Buscando 133...
Pesquisa e classificação de dadosPesquisa e classificação de dados22
123 133 222 245 321 334 411 544
133 = 133Elemento encontrado!
� Busca binária◦ Complexidade
� O(log n) – cada comparação reduz o número de possíveis candidatos por um fator de 2
◦ Eficiente e simples
◦ Porém...� Nem todo arranjo está ordenado
� Faz uso do fato que os índices são inteiros consecutivos
Pesquisa e classificação de dadosPesquisa e classificação de dados
� Faz uso do fato que os índices são inteiros consecutivos ◦ Não se aplica a todos os tipos de estruturas
� Pode-se combinar com busca sequencial (organização da tabela secundária)
23
struct registry { int id; /* chave do registro */ ... /* outros campos do registro */
}
Pesquisa e classificação de dadosPesquisa e classificação de dados24
typedef struct registry Registry;
/* tamanho do vetor = n *//* função retorna posição do registro no vetor v,
ou -1 se não encontrou */int binsearch(Registry *v, int id) {
if (n <= 0)return -1;
int esq = 0;int dir = n - 1;int i;do {
i = (esq + dir) / 2;if (id > v[i].id)
Pesquisa e classificação de dadosPesquisa e classificação de dados25
if (id > v[i].id)esq = i + 1;
elsedir = i - 1;
} while ((id != v[i].id) && (esq <= dir));if (id == v[i].id)
return i;return -1;
}
� Primeiro trabalho: Agenda
� Definir estrutura para armazenar registro◦ Pessoa: nome, endereço, telefone...
� Definir um vetor que armazene os registros◦ Com no máximo 100 elementos
� Operações:
Pesquisa e classificação de dadosPesquisa e classificação de dados
� Operações:◦ Inserção, busca/recuperação e remoção
26
� Métodos de pesquisa e classificação de dados (continuação)
� Pilhas e Filas
Próximas aulasPróximas aulas27
� Notas de Aula do Prof. Bruno B. Boniati
� Notas de Aula do Prof. João Luís Garcia Rosa
ReferênciasReferências28
Estrutura de DadosEstrutura de DadosEstrutura de DadosEstrutura de DadosCarlos Eduardo Batista
Centro de Informática - [email protected]