• Nenhum resultado encontrado

Universidade Federal de Juiz de Fora Departamento de Ciˆencia da Computac¸˜ao

N/A
N/A
Protected

Academic year: 2019

Share "Universidade Federal de Juiz de Fora Departamento de Ciˆencia da Computac¸˜ao"

Copied!
36
0
0

Texto

(1)

Estrutura de Dados

(2)

◮ Definic¸˜ao

◮ Operac¸ ˜oes

◮ Representac¸ ˜oes

◮ Cont´ıgua

◮ Encadeada

◮ Aplicac¸˜ao

◮ Exerc´ıcios

(3)

Defini¸c˜ao

◮ Foi definida umalistacomo uma estrutura linear, composta de um conjunto denelementosx1,x2,. . .,xn chamados n ´os, organizados de forma a manter uma relac¸˜ao entre eles.

◮ Al´em das relac¸ ˜oes j´a apresentadas anteriormente, a posic¸˜ao

dos itens em umalista ordenadan˜ao ´e arbitraria.

◮ Os itens devem respeitar umaordem total:

◮ Seja um conjunto de elementosZ

Para todo par de elementos (i,j)ZxZ, tal quei6

=j, vale

(4)

◮ Operac¸ ˜oes comuns:

◮ consultar o n ´ox

k;

◮ inserir um novo n ´ox

kem uma lista ordenada;

◮ remover o n ´ox

k;

◮ Obs: Lembrando que uma lista ´e uma estrutura de dados dinˆamica, isto ´e, o seu comprimento (= n ´umero de n ´os) pode ser alterado em tempo de execu¸c˜ao.

(5)

◮ Uma lista ordenada pode ser representada por:

(6)
(7)

◮ Usando a alocac¸˜ao cont´ıgua (ou sequencial), os n ´os da lista s˜ao alocados fisicamente em posic¸ ˜oes consecutivas da mem ´oria.

◮ Assim, ´e comum usar um vetor como meio de alocac¸˜ao de posic¸ ˜oes consecutivas.

◮ Esquematicamente, uma lista cont´ıgua comnn ´os pode ser armazenada em um vetorxcomnelementos.

(8)

◮ Esta lista ´e ent˜ao composta por:

◮ o n ´umero m´aximo de elementos (max);

◮ um vetorvetcom capacidade paramaxelementos;

◮ quantidade de elementos na lista (n).

◮ Em uma lista comnelementos, tem-seultimo = n - 1, ondeultimo´e o ´ındice do ´ultimo elemento.

(9)

◮ Exemplo de uma lista ordenada de valores inteiros usando a representac¸˜ao por contiguidade dos n ´os.

◮ Capacidade m´axima: 12.

◮ Itens armazenados: 6.

(10)

◮ TADListaOrdContpara listas ordenadas de valores inteiros.

◮ Construtor

◮ Destrutor

◮ Consulta (get) o valor do elemento na posic¸˜aok

◮ Insereum valorvalna ordem

◮ Removeo n ´o com um valorval

(11)

class ListaOrdCont {

public:

ListaOrdCont(int tam);

∼ListaOrdCont();

int get(int k);

void insere(int val); // insere na ordem

void remove(int val); // remove no

void imprime();

bool busca(int val);

private:

int max; // capacidade maxima de elementos int n; // quantidade de nos na lista

int *vet; // vetor que armazena a lista

int buscaBinaria(int val);

(12)

◮ Construtor

◮ Inicializa os dados.

◮ Aloca mem ´oria de forma dinˆamica para o vetor que

representa a lista.

◮ Destrutor: desaloca a mem ´oria alocada de forma dinˆamica.

ListaOrdCont::ListaOrdCont(int tam)

{

max = tam; n = 0;

vet = new int[max];

}

ListaOrdCont::∼ListaOrdCont()

{

delete [] vet;

}

(13)

◮ Como a lista est´a ordenada podemos usar um algoritmo de busca bin´aria.

int ListaOrdCont::get(int k)

{

if (k >= 0 && k < n)

return vet[k];

else {

cout << "Indice invalido!" << endl;

exit(1); }

(14)

◮ Busca Bin´aria:

int ListaOrdCont::buscaBinaria(int val)

{

int esq = 0;

int dir = n-1;

while(esq <= dir) {

int meio = (esq + dir) / 2;

if(val > vet[meio])

// se existir, val esta na segunda metade esq = meio + 1;

else if (val < vet[meio])

// se existir, val esta na primeira metade dir = meio - 1;

else

return meio; // val na posicao meio

}

return -1; // val nao encontrado

}

(15)

◮ Busca por um valor e retorna

truese encontr´a-lo

falsese n˜ao encontr´a-lo

int ListaOrdCont::busca(int val)

{

int k = buscaBinaria(val);

// retorna true, se k eh um indice valido // returna false, caso contrario

(16)

◮ Para inserir um novo n ´o na posic¸˜ao corretak´e preciso “abrir espac¸o” e deslocar os itens `a frente do n ´ovetkpara direita.

◮ A lista deve estar ordenada antes e deve permanecer ordenada ap ´os a inserc¸˜ao.

(17)

void ListaOrdCont::insere(int val) {

int i;

if(n == max) {

cout << "Vetor Cheio!" << endl;

exit(3); }

for(i = n-1; i >= 0 && vet[i] >= val; i--) {

vet[i+1] = vet[i]; }

(18)

◮ Para remover um novo n ´o na posic¸˜aok ´e preciso “fechar o seu espac¸o” e deslocar os itens `a frente do n ´ovetkpara esquerda.

(19)

void ListaOrdCont::remove(int val) {

// busca indice

int k = buscaBinaria(val);

if (k >= 0 && k < n)

{

// copia da dir. para esq.

for(int i = k; i < n-1; i++)

vet[i] = vet[i+1]; n = n - 1;

(20)

Complexidade

◮ Considere as operac¸ ˜oes:

(i) inserir na lista ordenada; ou

(ii) encontrar itens na lista; ou

(iii) remover item da lista.

◮ Qual a complexidade das operac¸ ˜oes (i), (ii) e (iii)?

(21)

Exerc´ıcio 1: desenvolva um programa que cria uma lista ordenada e a inicializa com valores inteiros aleat ´orios (use o TADListaOrdCont) com capacidade m´axima 100.

◮ Escreva uma func¸˜ao que inverta o conte ´udo da lista

ordenada e determine o tempo de processamento do seu algoritmo.

◮ Escreva uma func¸˜ao que intercale o conte ´udo de duas listas

(22)
(23)

◮ Lembrando que nessa estrutura de dados, um n ´o deve conter al´em de seu valor, um ponteiro para o n ´o seguinte, representando uma sequˆencia dos n ´os da lista.

◮ Esquematicamente:

◮ Al´em disso, em uma lista simplesmente encadeada ´e necess´ario dispor de um ponteiro para o primeiro n ´o da lista.

(24)

◮ Uma lista simplesmente encadeada consiste de dois objetos distintos:

◮ o n ´o;

◮ e a pr ´opria lista.

◮ Assim, ´e necess´ario definir dois TADs: Noe

ListaOrdEncad.

◮ A seguir s˜ao apresentados os TADs de umalista ordenada simplesmente encadeada de valores inteiros.

(25)

class No {

public: No();

∼No();

int getInfo();

No* getProx();

void setInfo(int val);

void setProx(No *p);

private:

int info; // informacao

No *prox; // ponteiro para o proximo

(26)

No::No() { }

No::∼No() { }

int No::getInfo() {

return info;

}

No* No::getProx() {

return prox;

}

void No::setInfo(int val) {

info = val; }

void No::setProx(No *p) {

prox = p; }

(27)

class ListaOrdEncad {

public:

ListaOrdEncad();

∼ListaOrdEncad();

void insere(int val);

bool busca(int val);

void imprime();

private:

No *primeiro; // ponteiro para o primeiro

(28)

◮ Construtor

ListaOrdEncad::ListaOrdEncad() {

primeiro = NULL; }

◮ Destrutor

ListaOrdEncad::∼ListaOrdEncad()

{

No *p = primeiro; while(p != NULL) {

No *t = p->getProx();

delete p;

p = t; }

}

(29)

Insere na lista ordenada

void ListaOrdEncad::insere(int val)

{

No *p = new No();

No *ant = NULL, *atual = primeiro; p->setInfo(val);

while(atual != NULL && val >= atual->getInfo()) { ant = atual;

atual = atual->getProx(); }

if(ant == NULL) {

p->setProx(primeiro); primeiro = p;

} else {

ant->setProx(p); p->setProx(atual); }

(30)

Programa

int main()

{

ListaOrdEncad *lista = new ListaOrdEncad();

int n;

cin >> n;

for(int i = 0; i < n; i++) {

int valor;

cin >> valor;

lista->insere(valor); }

cout << "Lista Ordenada: " << endl;

lista->imprime();

delete lista;

return 0;

};

(31)

Exerc´ıcio 2:Desenvolva um programa que cria uma lista ordenada e a inicializa com valores inteiros aleat ´orios (use o TADListaOrdEncad).

Exerc´ıcio 3:Implemente uma func¸˜ao de busca para identificar se um elemento pertence `a lista. Use o prot ´otipo:

bool ListaOrdEncad::busca(int val)

(32)

Cont´ıgua x Encadeada

M´etodo Cont´ıgua Encadeada

inserir O(n) O(n)

encontrar O(logn) O(n)

remover O(n) O(n)

(33)

Exemplo

◮ Um polin ˆomio de ordemn:

n X

i=0

aixi =a0+a1x+a2x2+. . .+anx n

,

◮ ondea

n6=0, pode ser representado por uma sequˆencia de pares ordenados como:

(a0,0),(a1,1),(a2,2), . . . ,(an,n).

(34)

Exemplo

◮ Existem operac¸ ˜oes em polin ˆomios cujo tempo de processamento depende da ordem dos termos.

◮ Por exemplo, vamos considerar adic¸˜ao de dois polin ˆomios:

(a0+a1x+a2x2) + (b3x3+b2x2+b1x) =

(a0) + (a1+b1)x+ (a2+b2)x2+ (b3)x3.

◮ para realizar a adic¸˜ao, todos os termos que envolvemx elevados a uma mesma potˆencia devem ser agrupados. ◮ Podemos representar cada um dos polin ˆomios como uma

lista ordenada.

(35)

1. Implemente um programa para realizar a soma de dois polin ˆomios representando-os atrav´es delistas ordenadas encadeadas

a) Crie um novo TAD para representar um polin ˆomio.

Obs: Pense em como vai representar os termos.

b) Implemente uma func¸˜ao que receba como parˆametros dois

(36)

2. Implemente um m´etodo que compute o valor de um polin ˆomio para um dado valor dex. Dica:percorra todos os termos do polin ˆomio e acumule o resultado.

3. Escreva um algoritmo para computar a k-´esima potˆencia de um polin ˆomio, onde k ´e um inteiro positivo. Qual o tempo de processamento do seu algoritmo?

Referências

Documentos relacionados

O caso de gestão a ser estudado irá discutir sobre as possibilidades de atuação da Pró-Reitoria de Assistência Estudantil e Educação Inclusiva (PROAE) da

Depois de exibido o modelo de distribuição orçamentária utilizado pelo MEC para financiamento das IFES, são discutidas algumas considerações acerca do REUNI para que se

Em 2008 foram iniciadas na Faculdade de Educação Física e Desportos (FAEFID) as obras para a reestruturação de seu espaço físico. Foram investidos 16 milhões

Não obstante a reconhecida necessidade desses serviços, tem-se observado graves falhas na gestão dos contratos de fornecimento de mão de obra terceirizada, bem

intitulado “O Plano de Desenvolvimento da Educação: razões, princípios e programas” (BRASIL, 2007d), o PDE tem a intenção de “ser mais do que a tradução..

No Brasil, a falta de uma fiscalização mais rigorosa é uma das razões que possibilitam que certas empresas utilizem os estágios como forma de dispor de uma mão-de-obra

A presente dissertação é desenvolvida no âmbito do Mestrado Profissional em Gestão e Avaliação da Educação (PPGP) do Centro de Políticas Públicas e Avaliação

Dessa forma, diante das questões apontadas no segundo capítulo, com os entraves enfrentados pela Gerência de Pós-compra da UFJF, como a falta de aplicação de