estrutura de dados -...

29
Estrutura de Dados Estrutura de Dados Estrutura de Dados Estrutura de Dados Carlos Eduardo Batista Centro de Informática - UFPB [email protected]

Upload: buithien

Post on 04-Dec-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

Estrutura de DadosEstrutura de DadosEstrutura de DadosEstrutura de DadosCarlos Eduardo Batista

Centro de Informática - [email protected]

Page 2: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 3: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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;

Page 4: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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

Page 5: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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);

Page 6: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 7: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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

Page 8: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

#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;

}

Page 9: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

Ponteiros em CPonteiros em C9

Page 10: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

Ponteiros em CPonteiros em C10

Page 11: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

main(){

float pi = 3.1415, *pf, **ppf;pf = &pi;ppf= &pf;printf("%f\n", **ppf);printf("%f\n", *pf);

}

PonteirosPonteiros emem CC11

}

Page 12: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 13: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 14: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 15: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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!

Page 16: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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

Page 17: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 18: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 19: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 20: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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

Page 21: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 22: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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!

Page 23: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 24: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

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;

Page 25: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

/* 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;

}

Page 26: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� 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

Page 27: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� Métodos de pesquisa e classificação de dados (continuação)

� Pilhas e Filas

Próximas aulasPróximas aulas27

Page 28: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

� Notas de Aula do Prof. Bruno B. Boniati

� Notas de Aula do Prof. João Luís Garcia Rosa

ReferênciasReferências28

Page 29: Estrutura de Dados - wiki.cbatista.netwiki.cbatista.net/lib/exe/fetch.php/ed-aula04-ponteiros_ordenacao.pdf · Estrutura de Dados Carlos Eduardo Batista Centro de Informática -UFPB

Estrutura de DadosEstrutura de DadosEstrutura de DadosEstrutura de DadosCarlos Eduardo Batista

Centro de Informática - [email protected]