Você está na página 1de 54

CT 234 CT-234

Estruturas de Dados, Dados Anlise de Algoritmos e Complexidade Estrutural


Carlos Alberto Alonso Sanches

CT 234 CT-234

3) ) Estruturas de dados elementares

Filas, pilhas e rvores

Alocao esttica versus dinmica

Alocao esttica versus dinmica

Variveis estticas: tm endereo determinado em

tempo de compilao

So previstas antes da compilao do programa Ocupam uma rea de dados do programa, determinada na compilao Existem durante toda a execuo do programa

Variveis dinmicas: tm endereo determinado em

tempo de d execuo

So alocadas de uma rea extra da memria, chamada heap, atravs t s de d funes f s especficas s fi s (malloc ll , new, etc.) t ) Sua eventual existncia depende do programa, e seu endereo precisa ser armazenado em outra varivel Exigem uma poltica de administrao da memria

Variveis indexadas

Exemplo: um vetor de inteiros int A[1 A[1:10] 10] (Obs (Obs: ndice low costuma ser 0) @A[i] = @A + ( i low ) . sizeof(A[1])
Quase sempre uma potncia de 2, 2 conhecida em tempo de compilao (nesse caso, usamse shifts para acelerar o clculo)

Endereo base

Quando low 0, acesso torna-se m mais rpido p (economiza-se uma subtrao)

Clculo em tempo p (1) ( )

Apontadores p

Apontadores p (ou p ponteiros) so variveis que armazenam


endereos, ou seja, apontam para um endereo da memria. So especialmente teis em estruturas com dados alocados dinamicamente. Exemplos:

Apontadores p

Estruturas E u u de dados

Em diversas aplicaes, p , comum o uso de algumas g operaes que manipulam dados:


Insero Remoo Mnimo ou mximo Sucessor ou predecessor Busca

A eficincia dessas operaes depende da estrutura de dados escolhida:


Pilhas (stacks) Filas (queues) rvores (trees)

Estruturas versus implementaes p

Listas lineares Pilhas Filas rvores Grafos etc. Variveis V indexadas Apontadores

Pilhas (stacks)

Pilhas P lhas so estruturas de dados que

permitem acessos em somente uma das suas extremidades. Por essa razo, uma pilha chamada de estrutura strutura L LIFO FO (last ast in n/f first rst out). Operaes:

push(x): h( ) empilha ilh x pop(): desempilha o topo top(): retorna o topo sem desempilh-lo size(): retorna o tamanho atual da pilha isEmpty(): verifica se a pilha est vazia

Exemplos E mp de operaes p com m pilhas p

push 10

push 5

pop

push 15

push 7

7 5 10 10 10 15 10 15 10

Implementao mp m com m vetor

size() { return t+1; }

isEmpty() { return (t<0); }

push(x) { if (size() == N) return Error; S[++t]=x; [ ] ; }

top() { if (isEmpty()) return t E Error; return S[t]; }

pop() { if (isEmpty()) return Error; S[t ] null; } S[t--]=null;

Eficincia f das operaes p

Na implementao com vetor, todas as operaes p anteriores podem p ser executadas em tempo (1). Caso fosse necessrio implementar uma operao de busca na pilha, a soluo gastaria tempo O(N), O(N) ou seja seja, seria ineficiente...

Uma apl aplicao cao t tpica p ca

Pilhas has so utilizadas ut za as para verificar r f car o emparelhamento mpar ham nto de delimitadores.
Leia o pr prximo imo caractere ch ch; while no fim de arquivo { if ch (,[ ou { push(ch); else if ch ),] ou } { x = top(); pop(); if ch e x no se casam erro; } Leia o prximo caractere ch; } p y() if isEmpty() sucesso; else erro;

Implementao mp m com m lista ligada g

Os elementos da pilha podem estar conectados atravs de uma cadeia de apontadores:

O topo da pilha seria o n apontado por head. tail tambm poderia ser utilizado como topo da pilha?

Filas (queues q )

crescem atravs do acrscimo de novos elementos no final e diminuem com a sada dos elementos da frente. Os elementos so acrescentados em uma extremidade m e removidos m da outra. Em relao pilha, a principal diferena que a fila uma estrutura FIFO (first in/first

Filas so simples sequncias de espera:

out).

Operacionalidades p das filas f


size(): () retorna o tamanho h atual l da d fila fl isEmpty(): verifica se a fila est vazia first(): retorna o p primeiro elemento da fila sem remov-lo dequeue(): retira o primeiro elemento da fila enqueue(x): coloca x no final enqueue(x) f nal da f fila la

Exemplos mp de operaes p com m filas f

enqueue 10 enqueue 5 dequeue d enqueue 15 enqueue 7

7 15 5 10 10 5 5 15 5

Implementao mp m com m vetor

O vetor utilizado ili d d de maneira i circular: i l

Nesse caso, o que significaria f = r ? Como diferenciar fila vazia de fila cheia?

Implementao mp m com m vetor

size() { return t (N (N-f+r) f+ ) % N N; }

isEmpty() { return (f==r); }

dequeue() q () { if (isEmpty()) return Error; Q[f] = null; f = (f+1) % N; } enqueue(x) { if (size() == N-1) return Error; ; Q[r] = x; r = (r+1) % N; }

first() { if (isEmpty()) return Error; return Q[f]; }

Eficincia f das operaes p


Na implementao com vetor, todas as as operaes anteriores t i t tambm b podem d ser executadas em tempo (1). Caso fosse necessrio uma operao de busca a soluo bvia gastaria tempo O(N), busca, O(N) ou seja, seria ineficiente. Seria possvel realiz-la realiz la em tempo O(log N)?

Implementao mp m com m lista ligada g

Dequeue:

Implementao mp m com m lista ligada g

Enqueue: crie um novo n

Adi t o apontador Adiante t d tail t il :

Implementao mp m com m lista ligada g

Exerccios:

Numa fila de N elementos, implementada com lista ligada, g , seria possvel p realizar remoes no seu final em tempo constante? Nessa mesma estrutura, estrutura seria possvel realizar uma operao de busca em tempo O(log N)?

Filas com duplo duplop -fim (deques q )

Filas com duplo-fim (doubled-ended queue) permitem i insero e remoo, em tempo constante, tanto no incio i i como no fim. Op r s: Operaes:

insertFirst(x): insere x no incio insertLast(x): insere x no final removeFirst(): remove o primeiro elemento removeLast(): remove o ltimo elemento first(): retorna o primeiro elemento last(): () retorna o ltimo m elemento m size(): retorna o tamanho atual isEmpty(): verifica se est vazia

A deque pode simular tanto as operaes de uma pilha como as de uma fila.

Listas duplamente p m ligadas g

Podemos implementar uma deque atravs de uma lista duplamente ligada:


final incio Ana Pedro Clara Joo

Cada n tem dois apontadores: para o prximo e para o anterior. p Para cada deque, preciso guardar apontadores para o seu incio e o seu final p

Remoo m do ltimo m elemento m


final incio Ana Pedro Clara Joo

final incio Ana Pedro Clara Joo

final incio Ana Pedro Clara

Filas com m duploduplo p -f fim m

Seria possvel implementar uma deque atravs de um vetor? Q Quais as vantagens g e as desvantagens g em relao implementao com listas duplamente p ligadas? g

Exerccios

Escreva um programa que leia uma expresso matemtica com ( ), [ ] e { }, e informe se est balanceada (no preciso calcul-la, nem preocupar-se com a presena de outros caracteres). caracteres) Escreva um p programa g para p resolver qualquer q q instncia do Problema de Josephus. Faa uma verso que q utilize vetor e outra com listas ligadas.

Tabelas de disperso p (hashing g)

Dicionrio o nome atribudo a uma


Insero Remoo Busca atravs de uma chave

importante estrutura de dados, que fornece as seguintes g operaes: p


Os dicionrios dici n i s podem p d m ser s implementados impl m nt d s eficientemente com tabelas de disperso, baseadas em listas li ligadas adas (open hashing hashin ). ) Em condies adequadas, essas trs operaes podem ser realizadas l em tempo constante.

Ideia
Universo de todas as possveis chaves Funo h de disperso Tabela de disperso 0m-1 0n-1

Naturalmente, m << n. h: {0,,n-1} {0 n 1} {0,...,m-1} {0 m 1} calculada em tempo (1). (1) Coliso: h(a) = h(b) quando a b. Na tcnica N t i open hashing h hi , as colises li so tratadas t t d com listas ligadas.

Implementao mp m da tabela
0 1 2 3 4 5

Colises

:
m-1

Evidentemente, E id t t nas posies i em que ocorrem colises, li a busca e a remoo passam a gastar mais tempo Nesses casos, casos a correspondente lista ligada precisa ser percorrida, n a n

Comentrios m finais f

p Fatores q que alteram o desempenho das operaes:

grau de d ocupao da d tabela; t b l escolha da funo de disperso. p

Dada uma chave x, uma conhecida funo de disperso h(x) = x mod m m. Geralmente Geralmente, escolhe-se um valor de m primo. Knuth oferece um bom estudo sobre diversas funes de d disperso. sperso.

rvores (trees)

Tantos as pilhas como as filas so estruturas lineares, isto , de uma nica dimenso. Na sua implementao, as listas ligadas possibilitam maior flexibilidade que os vetores, mas mesmo assim no permitem a representao hierrquica de dados.

rvores so estruturas hierrquicas,

formadas por vrtices e arestas. arestas Ao contrrio das rvores naturais, so representadas de cima para baixo: a raiz est no topo e as folhas na base.

rvores

uma estrutura recursiva: cada filho tambm uma rvore.

A raiz o nico n que no possui ancestrais. p As folhas so os ns sem filhos.

Exemplos mp de rvores

Algumas g m definies f

Cada n pode ser alcanado a partir da raiz atravs de uma sequncia nica de arestas, chamada de caminho. caminho O comprimento p de um caminho a q quantidade de arestas que ele possui. O nvel ld de um m n o comprimento mp im t do d caminho mi h da raiz at ele. A altura de uma rvore no vazia o nvel mximo dos ns dessa rvore.

Algumas g m definies f

O grau de d um m n o nmero m d de s seus s filh filhos. s As folhas tm grau nulo e so chamadas de ns terminais. Um n que no f folha lh (isto ( , que possui grau no nulo) chamado de n interno ou n no-terminal. O grau de uma rvore o mximo entre os graus dos seus ns. ns Um conjunto j de rvores chamado de floresta.

Algumas lgumas caracter caractersticas st cas

O nmero de filhos por n e as informaes armazenadas diferenciam os tipos ti de d rvores.

A rvore ao lado representa a expresso (3+6)*(4-1)+5: (3+6)*(4 1)+5: as folhas possuem valores e os ns intermedirios, intermedirios operadores matemticos.

rvores binrias

Nas rvores binrias, os ns tm no mximo dois filhos, designados como filho da esquerda e filho da direita.

Raiz

Seria possvel implementar uma rvore binria atravs de um vetor?


Percursos em m rvores

Percurso em rvores uma sequncia em que cada um dos ns da rvore aparece p exatamente uma vez (no precisam estar necessariamente unidos p por arestas). Uma rvore com N ns possui N! percursos diferentes. diferentes Ma importantes: Mais mp r an percursos p r ur em m largura argura ( (ou u extenso) e percursos em profundidade.

Percurso em m largura g

O percurso em largura l comea na raiz i e passa ordenadamente por todos os nveis subsequentes, visitando se primeiro os ns da esquerda e depois os da visitando-se direita. possvel li implement-lo l t l com o uso d de uma fil fila:

Depois que um n visitado, seus filhos so colocados no final d dessa fil fila (primeiro, ( i i o da d esquerda; d d depois, i od da di direita). it ) O prximo n a ser visitado o que est no incio da fila. Desse modo, os ns de nvel i+1 sero visitados somente depois que todos os ns do nvel i j o foram.

Exemplo mp

13 10 2 12 20 29 25 31

Fila: 13 Fila: 10, 25 Fila: 25, 2, 12 Fila: 2, 2 12, 12 20, 20 31 Fila: 12, 20, 31 Fila: 20, 31 Fila: 31 Fila: 29

Percurso em largura: 13 13, 10 10, 25 25, 2 2, 12 12, 20 20, 31 31, 29

Percurso em m largura g
void BreadthFirst() { Queue q; Node *p p = root; if (p != 0) { q.enqueue(p); while (!q.isEmpty()){ ( q p y()){ p = q.dequeue(); visit(p); if (p->left != 0) q.enqueue(p->left); if (p->right != 0) q.enqueue(p->right); } } }

Percurso u em m profundidade p fu
O percurso em profundidade prossegue tanto quanto possvel esquerda (ou direita). Em seguida, volta ao ltimo n visitado e recomea. Este processo repetido at que todos os ns sejam visitados. visitados Pode ser implementado p recursivamente ou com uma pilha explcita.

Exemplo p

Percurso em profundidade esquerda: Qual seria o percurso em profundidade direita d dessa rvore?

13 10 2 12 20 29 25 31

Percurso: 13, 10, 2, 12, 25, 20, 31, 29

Percursos esquerda q
Pr-ordem: raiz, filhos da esquerda, filhos da direita In-ordem: In ordem: filhos da esquerda esquerda, raiz, raiz filhos da direita Ps-ordem: filhos da esquerda, filhos da direita, , raiz

Percursos esquerda q
void inorder(Node *p) { if (p != 0) { inorder(p >left); inorder(p->left); visit(p); inorder(p->right); } } void preorder(Node *p) { if (p != 0) { visit(p); preorder(p->left); preorder(p->right); } }

void postorder(Node *p) { if (p != 0) { postorder(p->left); p (p ) postorder(p->right); visit(p); } }

Um m caso particular p u

Nas rvores binrias no-vazias no vazias cujos ns internos tenham exatamente dois filhos, sabese que f = i + 1 1, onde f e i so respectivamente o nmero de folhas e o nmero de ns internos. Demonstrao por induo:

Se a rvore apenas a raiz, essa observao trivialmente vlida. vlida Se a hiptese for vlida para uma certa rvore, aps anexar duas folhas a uma folha j existente existente, a antiga folha se tornar n interno. Logo, tanto o nmero de folhas como o nmero de ns internos acrescido de um, mantendo-se vlida a relao f = i + 1.

Ideia da demonstrao m

i ns internos

i+1 ns internos

f folhas

f+1 folhas

rvores binrias completas mp

Uma rvore binria completa quando os ns internos tm exatamente dois filhos e as folhas tm a mesma distncia da raiz. raiz Uma rvore binria completa p de altura h tem exatamente 2h-1 ns internos e 2h folhas. Numa N m rvore binria bi i completa mpl t com m n folhas, f lh s a distncia da raiz at qualquer folha lg n. Prove!!

rvores binrias de busca u

Em cada n de uma rvore binria de busca, os valores armazenados na sub-rvore esquerda so menores que o valor do prprio n n, e os valores armazenados na sub-rvore direita so maiores que o valor do prprio n. n
13 10 2 12 20 29 25 31 A N K P R

rvores binrias de busca u


Algoritmo Algor tmo de busca s simples mples e direto. d reto. Repetio que comea na raiz:

Compare com o valor armazenado no n. Se for igual igual, a busca chegou ao fim fim. Se for menor, v para a sub-rvore esquerda. Se for maior, v para a sub-rvore direita. Se no houver como m continuar, , o valor no est na rvore.

No pior caso, caso gastar tempo proporcional altura da rvore.

rvores binrias de busca

Como pode ser feita a insero e a remoo de valores? Objetivos:


Garantir a ordenao Manter um balanceamento: desejvel que a altura dessa rvore binria de busca seja proporcional ao logaritmo da quantidade de valores armazenados

H diversos di algoritmos... l it

Você também pode gostar