Beruflich Dokumente
Kultur Dokumente
Estrutura de Dados
2010
Copyright 2010. Todos os direitos reservados desta edio SECRETARIA DE EDUCAO A DISTNCIA
(SEAD/UECE). Nenhuma parte deste material poder ser reproduzida, transmitida e gravada, por qualquer
meio eletrnico, por fotocpia e outros, sem a prvia autorizao, por escrito, dos autores.
EXPEDIENTE
Design instrucional
Antonio Germano Magalhes Junior
Igor Lima Rodrigues
Pedro Luiz Furquim Jeangros
Projeto grfico
Rafael Straus Timb Vasconcelos
Marcos Paulo Rodrigues Nobre
Coordenador Editorial
Rafael Straus Timb Vasconcelos
Diagramao
Marcus Lafaiete da Silva Melo
Francisco Jos da Silva Saraiva
Ilustrao
Marcos Paulo Rodrigues Nobre
Capa
Emilson Pamplona Rodrigues de Castro
PRESIDENTE DA REPBLICA
Luiz Incio Lula da Silva
MINISTRO DA EDUCAO
Fernando Haddad
SECRETRIO DE EDUCAO A DISTNCIA
Carlos Eduardo Bielschowsky
DIRETOR DO DEPARTAMENTO DE POLTICAS EM EDUCAO A DISTNCIA DPEAD
Hlio Chaves Filho
SISTEMA UNIVERSIDADE ABERTA DO BRASIL
Celso Costa
GOVERNADOR DO ESTADO DO CEAR
Cid Ferreira Gomes
REITOR DA UNIVERSIDADE ESTADUAL DO CEAR
Francisco de Assis Moura Araripe
VICE-REITOR
Antnio de Oliveira Gomes Neto
PR-REITORA DE GRADUAO
Josefa Lineuda da Costa Murta
COORDENADOR DA SECRETARIA DE EDUCAO A DISTNCIA
Antonio Germano Magalhes Junior
COORDENADOR GERAL UAB/UECE
Francisco Fbio Castelo Branco
COORDENADORA ADJUNTA UAB/UECE
Josete de Oliveira Castelo Branco Sales
COORDENADOR DA LICENCIATURA EM INFORMTICA
Joaquim Celestino Junior
COORDENADOR DE TUTORIA E DOCNCIA DA LICENCIATURA EM INFORMTICA
Jorge Lus de Castro e Silva
Sumrio
Apresentao ....................................................................................................................... 7
Unidade 1
Introduo Complexidade de Algoritmos ........................................................................... 9
Captulo 1 - Introduo ...................................................................................................... 11
O que anlise de algoritmos? ............................................................................................. 12
Captulo 2 - Medidas de Complexidade ............................................................................. 14
Comparao entre algoritmos ..............................................................................................15
Unidade 2
Representao dos Dados..................................................................................................... 23
Captulo 1 - Modelagem Conceitual................................................................................... 25
Tipo de dados .......................................................................................................................25
Tipo abstratos de dados ........................................................................................................28
Critrios para a escolha da estrutura de dados adequada....................................................31
Unidade 3
Listas .................................................................................................................................... 35
Captulo 1 - Listas ............................................................................................................... 37
Introduo.............................................................................................................................37
Denio do TAD Lista...........................................................................................................37
Implementao do TAD Lista usando alocao esttica ............................................................... 38
Implementao do TAD Lista usando alocao dinmica ............................................................. 43
Variaes sobre o TAD Lista ........................................................................................................... 49
Captulo 2 - Pilhas .............................................................................................................. 51
Implementaes do TAD Pilha usando vetores ..................................................................... 52
Implementao do TAD Pilha usando ponteiros ................................................................... 54
Captulo 3 - Filas ................................................................................................................. 57
Implementao do TAD Fila usando vetores ......................................................................... 57
Implementao do TAD Fila usando ponteiros ..................................................................... 60
Unidade 4
rvores ................................................................................................................................ 65
Captulo 1 - rvores ........................................................................................................... 67
rvore binria ......................................................................................................................68
Captulo 2 - rvore binria de busca .................................................................................. 71
Denio do TAD rvore Binria de Busca ........................................................................... 71
Implementao do TAD rvore Binria de Busca ................................................................. 72
Ordens de percurso em rvores binrias....................................................................................... 77
Relao entre o nmero de ns de uma rvore
binria e sua altura......................................................................................................................... 79
Captulo 3 - rvores AVL...................................................................................................... 81
Unidade 5
Busca avanada .................................................................................................................... 89
Captulo 1 - Tabela de disperso......................................................................................... 91
A funo de disperso............................................................................................................92
Estratgias para resoluo de colises................................................................................... 94
Encadeamento .............................................................................................................................. 94
Tcnicas de sondagem.................................................................................................................... 95
Captulo 2 - Busca digital..................................................................................................... 97
rvore digital.........................................................................................................................98
Captulo 3 - Estruturas autoajustveis................................................................................ 100
Listas autoajustveis..............................................................................................................100
O constante aumento da complexidade dos sistemas e suas demandas computa-
cionais relacionadas a tempo e espao, impem o desafo de projetar solues algortmi-
cas cada vez mais efi cientes. Neste contexto, as estruturas de dados e seus algoritmos
tm um papel fundamental uma vez que constituem os blocos construtores utilizados
na resoluo dos mais diversos problemas em todas as areas da computao.
O objetivo do presente livro apresentar de forma clara e amigvel diferentes
estruturas de dados e seus algoritmos de manipulao, analisando a estratgia mais
efi ciente para a sua implementao, em termos de complexidade. Esta anlise envolve
a utilizao de tcnicas de projeto associadas a tcnicas de programao, as quais so
adequadas s caracteristicas da aplicao especfi ca.
O livro est organizado em cinco unidades. As primeiras fornecem as bases ne-
cessrias para a anlise e o projeto de uma boa soluo algortmica incluindo concei-
tos bsicos sobre complexidade, tipos e estruturas de dados. A Unidade 3 apresenta o
conceito central de Listas, a partir do qual duas importantes e amplamente utilizadas
estruturas so derivadas: Pilhas e Filas.
A Unidade 4 apresenta a estrutura de rvore, sua conceituao, implementao
e algoritmos de manipulao bsicos. Mais especifi camente, nesta unidade so explo-
radas as rvores Binrias de Busca analizando suas caractersticas e as implicaes
em relao efi cincia. Neste contexto, a fundamentao e funcionamento das rvores
balanceadas (AVL) so apresentados. Finalmente, na Unidade 5 so descritas as tcni-
cas avanadas de pesquisa aplicadas sobre estruturas de dados especfi cas, tais como
tabelas de disperso, busca digital e estruturas autoajustveis.
O contedo apresentado destina-se principalmente para professores e alunos de
graduao em Cincias da Computao ou reas afi ns, fornecendo um embassamento
terico e uma clara noo das estratgias a serem seguidas na implementao dos
algoritmos para a manipulao efi ciente das estruturas de dados mais amplamente
utilizadas.
A autora
Unidade
1
Introduo Complexidade
de Algoritmos
Objetivos:
Nesta unidade introduzido o conceito de complexidade de algoritmos. Este
conceito central na Cincia da Computao, uma vez que possibilita avaliar
e comparar solues algortmicas, fornecendo os insumos necessrios para
determinar qual o algoritmo mais adequado para resolver determinada classe
de problemas.
Captulo 1
Introduo
ESTRUTURA DE DADOS 11
A correta avaliao destes critrios infl uenciada por diversos fatores,
tais como: caractersticas do hardware, sistema operacional, linguagens e
compiladores, plataforma, etc. Estes fatores so considerados acidentais
uma vez que no esto diretamente relacionados qualidade da soluo.
Em contrapartida, os fatores essenciais so inerentes soluo e determi-
nantes para a sua qualidade. O tempo gasto e o espao fsico na memria
so considerados fatores essenciais. Consequentemente preciso de um
mtodo formal para medir o tempo e a memria requeridos pelo algoritmo,
independentemente das caractersticas de plataforma de hardware e sof-
tware sendo utilizadas.
12 ESTRUTURA DE DADOS
#include <stdio.h>
main() {
for(;;) {
Printf (Hello Word!\n);
}
}
Considerando que impossvel fazer uma predio exata do tempo e
memria a serem utilizados a estratgia consiste em estabelecer uma apro-
ximao, com base em conceitos e modelos matemticos.
ESTRUTURA DE DADOS 13
Captulo 2
Medidas de Complexidade
14 ESTRUTURA DE DADOS
1. Determine o caso otimista e o caso pessimista a partir das seguintes
especifi caes:
a. Encontrar o maior elemento de um vetor (desordenado) de inteiros.
b. Encontrar o maior elemento de um vetor ordenado de forma decres-
cente de inteiros.
c. Remover um dado elemento de um vetor de inteiros.
d. Idem anterior considerando um vetor ordenado em forma crescente.
2. Considere o problema de encontrar o maior elemento de um vetor de
inteiros. O algoritmo a seguir apresenta uma soluo simples para o
problema.
int Max (A Vetor){
int i, Temp;
Temp = A[0];
for (i := 1; i < n; i++)
if (Temp < A[i]) Temp := A[i];
return (Temp);
}
a. Determine o nmero de comparaes realizadas entre os elementos
de A, considerando que A contem n elementos.
b. Descreva quais so as situaes que representam o melhor caso, o
pior caso e o caso mdio para o algoritmo.
ESTRUTURA DE DADOS 15
O estudo da complexidade consiste em determinar a ordem de magni-
tude do nmero de operaes fundamentais realizadas pelo algoritmo, des-
critas a partir da defi nio da funo custo. A partir desse estudo possvel
realizar a comparao do comportamento assinttico atravs da anlise
dos grficos correspondentes.
Comportamento observa-
do de f(n) quando n tende
a infi nito.
16 ESTRUTURA DE DADOS
da entrada n aumenta, a funo linear n cresce mais rapidamente do que
a funo log(n), que por sua vez cresce mais lentamente do que a funo
quadrtica n 2, e assim por diante.
ESTRUTURA DE DADOS 17
A notao utilizada para denotar a dominao assinttica foi introdu-
zida por Knuth em 1968. De acordo com esta notao, a expresso g(n) =
O(f(n)) expressa que f(n) domina assintticamente g(n). A expresso pode ser
lida da seguinte forma: g(n) da ordem no mximo de f(n). As defi nies a
seguir formalizam a notao de Knuth.
A notao mais comumente usada para medir algoritmos O, uma vez
que determina um limite superior da complexidade:
lhor resposta.
1. Suponha g(n) = n e f(n) = n2, demostre qual das seguintes afi rmaes
verdadeira:
a. f(n) = O(g(n))
b. g(n) = O(f(n))
18 ESTRUTURA DE DADOS
2. Determine a ordem mxima para as seguintes funes e justifique a sua
resposta detalhando os valores de c e n adequados.
a. g(n) = 3n3 + 2n2 + n
b. h(n) = n2 + n + 1
ESTRUTURA DE DADOS 19
ressaltar que pode existir aninhamento de comandos de repe-
tio. Neste caso a anlise feita de dentro para fora. O lao
pode ser defi nido (for) ou indefi nido (while).
4) Um comando de atribuio possibilita que um valor possa ser atri-
budo a uma varivel.
Um comando de atribuio consome tempo constante.
20 ESTRUTURA DE DADOS
Considere o algoritmo buscaBinaria descrito a seguir:
int buscaBinaria (int array[], int chave, int n){
int inf = 0; //Limite inferior
int sup = n - 1; //Limite superior
int meio;
while (inf <= sup) {
meio = (inf + sup) / 2;
if (chave == array[meio])
return meio;
else if (chave < array[meio])
sup = meio - 1;
else inf = meio + 1;
}
return -1; // no encontrado
}
1. Descreva o funcionamento do algoritmo buscaBinaria. Qual situao
representa o pior caso? e o melhor?
2. Considerando a execuo do algoritmo buscaBinaria em um vetor com
15 elementos, quantas repeties (nmero de passos) so necessrios
para o algoritmo detectar que uma determinada chave de busca no se
encontra no vetor.
3. Determine a complexidade temporal do algoritmo buscaBinaria anali-
sando passo-a-passo a complexidade de cada comando.
ESTRUTURA DE DADOS 21
CORMEN T. H., LEISERSON C. E., RIVEST R. L., STEIN C. (2001). Intro-
duction to Algorithms. McGraw-Hill e The Mit Press.
KNUTH D. E. (1968). The Art of Computer Programming, Vol. 1: Funda-
mental Algorithms. Addison-Wesley.
KNUTH D. E. (1971). Mathematical Analysis of Algorithms. Procedings
IFIP Congress 71, vol. 1, North Holland, 135-143.
WIRTH N. (1986). Algorithms and Data Strutures. Prentice-Hall.
ZIVIANI N. (2005). Projeto de Algoritmos com implementaes em Pas-
cal e C, 2da. Edio. Thomson.
22 ESTRUTURA DE DADOS
Unidade
2
Representao dos Dados
Objetivos:
Nesta unidade descrito o processo de abstrao seguido para a modelagem e
desenvolvimento de uma soluo computacional a partir de um problema do mundo
real. Neste contexto, os conceitos de tipos de dados, estruturas e tipos abstratos
so introduzidos, ressaltando sua importncia para a adequada modelagem,
manipulao e representao na memria do computador.
Captulo 1
Modelagem Conceitual
Tipo de dados
O tipo de dados associado a uma varivel, numa linguagem de progra-
mao, defi ne o conjunto de valores que a varivel pode assumir. Isto , a O sistema operacional
(SO) um programa ou
declarao da varivel como sendo de um tipo especfi co determina: conjunto de programas
1. A quantidade de bits que devem ser reservados na memria. responsvel por gerenciar
todos os recursos do sis-
2. Como o dado representado por esse padro de bits deve ser inter- tema, tais como: coman-
dos do usurio, arquivos,
pretado (p.e., uma cadeia de bits pode ser interpretada como sendo
memria, etc.
um inteiro ou real).
ESTRUTURA DE DADOS 25
Os tipos tm geralmente associaes com valores na memria ou va-
riveis. Consequentemente, tipos de dados podem ser vistos como mtodos
para interpretar o contedo da memria do computador, o que pode variar
conforme o sistema operacional e a linguagem de implementao.
struct{
char Nome[9]
int Idade
fl oat Qualificao
} Empregado
26 ESTRUTURA DE DADOS
ver a estrutura de dados correspondente uma nica vez, associando-a a um
nome descritivo, e utilizar esse nome todas as vezes que for necessrio.
typedef struct {
char Nome[9]
int Idade
float Qualificao
} TipoEmpregado
ESTRUTURA DE DADOS 27
de tais estruturas. Consequentemente, algoritmos de manipulao preci-
sam ser desenvolvidos de forma a possibilitar a correta utilizao e acesso
s novas estruturas defi nidas.
1. Defi na os conceitos de tipo de dado bsico e tipo de dado defi nido pelo
usurio.
2. Cite como exemplos tipos de dados bsicos que voc conhece e detalhe
suas caractersticas e as operaes permitidas sobre esses tipos.
3. Defi na um tipo de dado estruturado que descreva de forma adequada e
completa as seguintes informaes:
a. Livro
b. Crculo
c. Filme
d. Pessoa
e. Aluno
O paradigma orientado a
objetos envolve um con- f. Item de estoque
junto de tcnicas, mto-
dos e ferramentas para g. Conta bancaria
anlise, projeto e imple-
mentao de sistemas
de software baseado na
composio e interao de
componentes de software Tipo abstratos de dados
denominados de objetos.
Um tipo de dado definido pelo usurio, incrementado com a defi nio e
implementao das operaes necessrias para a sua manipulao, consti-
tui um Tipo Abstrato de Dados (TAD), conceito central no contexto do Para-
digma Orientado a Objetos. A utilizao de TADs permite que linguagens
de programao de propsito geral sejam personalizadas para um domnio
de aplicao mais especfi co. Uma vez defi nidos, podem ser empregados
como primitivas da linguagem, e possibilitam o desenvolvimento de compo-
nentes de software reusveis e extensveis.
TADs estendem a noo de tipo de dado (estrutura de dados + ope-
raes) com base na utilizao de tcnicas de ocultamento da informao
Uma interface lista os ser-
vios fornecidos por um
referente estrutura de dados utilizada e implementao das operaes
componente, restringindo defi nidas. Este objetivo alcanado atravs de uma clara separao entre
o acesso de entidades ex- interface e implementao.
ternas ao objeto.
A interface lista todos os Na abordagem orientada a objetos (OO), o processo de abstrao utili-
mtodos e argumentos zado para chegar a uma modelagem computacional de entidades do mundo
que o objeto entende e
real baseado na anlise das suas funcionalidades. Desta forma, os obje-
capaz de realizar.
Defi ne a interface de aces- tos so categorizados com base na estrutura e no comportamento comum
so estrutura sem fazer atravs da implementao de classes. Uma classe defi ne um TAD a partir
qualquer referncia im- de trs componentes: defi nio da interface pblica, defi nio da estrutura
plementao utilizada, e
possibilita uma clara se- de dados, e a implementao da interface com base na estrutura de dados
parao entre implemen- escolhida. A interface pblica, uma vez que possibilita o acesso aos da-
tao e especifi cao. dos da classe, enquanto que a implementao privada, ou seja, oculta ao
28 ESTRUTURA DE DADOS
usurio da classe. A seguir apresentada uma ilustrao que descreve a
organizao de um TAD.
typedef struct {
oat altura, largura;
} TipoRetangulo
ESTRUTURA DE DADOS 29
Finalmente, todos os mtodos da interface so implementados na lin-
guagem de programao. Exemplos da implementao de alguns dos mto-
dos da interface so apresentados a seguir.
30 ESTRUTURA DE DADOS
1. Defi na os conceitos de Tipo Abstrato de Dados e de Classe. Estabelea o
relacionamento que vincula ambos conceitos.
2. Defi na TADs para os tipos de dados estruturados para as entidades
listadas a seguir especifi cando detalhadamente a interface completa. A
interface deve incluir todas as operaes necessrias para a correta ma-
nipulao do tipo, dentre elas os mtodos de inicializao, modifi cao,
e consulta.
a. Livro
b. Crculo
c. Filme
d. Pessoa
e. Aluno
f. Item de estoque
g. Conta bancria
3. Implemente duas das interfaces propostas no exerccio anterior utili-
zando a linguagem de programao da sua escolha ou pseudo-cdigo
prximo da linguagem.
Uso da memria
A memria o dispositivo
Informalmente, podemos dizer que existem trs maneiras de reservar- que permite a um compu-
tador guardar dados de
mos espao de memria para o armazenamento de informaes: forma temporria ou per-
Uso de variveis globais (e estticas). O espao reservado para uma manente.
varivel global existe enquanto o programa estiver sendo executado.
Uso de variveis locais. Neste caso o espao fi ca reservado apenas
enquanto a funo que declarou a varivel est sendo executada,
sendo liberado para outros usos quando a execuo da funo ter-
mina. Por este motivo, a funo que chama no pode fazer refe-
rncia ao espao local da funo chamada. As variveis globais ou
locais podem ser simples ou vetores, sendo que no caso dos vetores,
preciso informar o nmero mximo de elementos ou tamanho do
vetor. A partir do tamanho informado, o compilador reserva o espa-
o correspondente.
ESTRUTURA DE DADOS 31
Requisies ao sistema em tempo de execuo. Este espao alocado
dinamicamente permanece reservado at que explicitamente seja
liberado pelo programa. Uma vez que o espao liberado fica dispo-
nvel para outros usos. Se o espao alocado no for liberado explici-
tamente pelo programa, este ser automaticamente liberado quando
a sua execuo terminar. A seguir ilustrada esquematicamente a
alocao da memria pelo sistema operacional.
Quando requisitamos ao sistema
operacional para executar um de-
terminado programa, o cdigo em
linguagem de mquina do progra-
ma deve ser carregado na memria.
O sistema operacional reserva tam-
bm o espao necessrio para ar-
mazenarmos as variveis globais (e
estticas) utilizadas ao longo do
programa. O restante da memria
utilizado pelas variveis locais e pe-
las variveis alocadas dinamica-
mente enquanto o programa est
executando.
Cada vez que uma determinada fun-
o chamada, o sistema reserva o
espao necessrio para as variveis
locais da funo. Este espao per-
tence pilha de execuo e, quando
a funo termina, desempilhado e
liberado. A parte da memria no ocupada pela pilha de execuo pode ser
requisitada dinamicamente. Se ao longo de diversas chamadas a funo, a
pilha cresce atingindo o espao disponvel existente, dizemos que ela estou-
rou e o programa abortado com erro. Similarmente, se o espao de mem-
ria livre for menor que o espao requisitado dinamicamente, a alocao no
feita e o programa pode prever um tratamento de erro adequado (por exem-
plo, podemos imprimir a mensagem Memria insuficiente e interromper a
execuo do programa).
32 ESTRUTURA DE DADOS
Em contrapartida, no caso de alocao dinmica, a memria ge-
renciada sob demanda, ou seja, os espaos de memria so alocados e de-
salocados dependendo da necessidade, durante a execuo do programa.
Consequentemente, a alocao no acontece necessariamente de forma
contgua (ou sequencial), podendo, os dados, fi carem esparsos na memria
do computador. A partir desta confi gurao onde os dados so armazena-
dos de forma no sequencial, o acesso alcanado atravs de variveis do
tipo ponteiro, indicando o endereo de memria correspondente. A seguir
ilustrada esquematicamente a distribuio dos elementos integrantes de
uma cadeia ao longo da memria. Na primeira coluna indicado o endereo
correspondente ao contedo. A coluna ponteiro indica o endereo do prxi-
mo elemento na cadeia. Note que o segundo elemento no ocupa o endereo
consecutivo ao a1.
Endereo Contedo Ponteiro Observao O ponteiro ou apontador
Primeiro elemento acessado um tipo de dado que ar-
L=3FFB a1 1D34 mazena o endereo de um
a partir de L
outro dado.
1D34 a2 BD2F A partir do ponteiro, o
dado que se encontra no
BD2F a3 AC13 respectivo endereo pode
1500 an-2 16F7 ser acessado e manipu-
lado.
16F7 an-1 5D4A
ltimo elemento da cadeia.
5D4A an null O endereo null indica que o
elemento no tem sucessor.
ESTRUTURA DE DADOS 33
no linearidade na alocao dos dados, o acesso a um determina-
do elemento i torna necessrio o percurso pelos i 1 elementos an-
teriores na sequncia. Esta propriedade, que caracteriza o acesso
sequencial aos dados, torna a operao de busca por um elemento
de custo O(n).
34 ESTRUTURA DE DADOS
Unidade
3
Listas
Objetivos:
Existem certas estruturas clssicas que se comportam como padres uma vez
que so utilizadas na prtica em diversos domnios de aplicao. Nesta unidade
apresentada a estrutura de dados Lista e o correspondente Tipo Abstrato,
detalhando a sua interface e apresentando duas implementaes: vetores e
ponteiros. Variantes do tipo abstrato listas, na forma de Pilhas e Filas, de ampla
utilizao prtica, so descritas.
Captulo 1
Listas
Introduo
Um conjunto de elementos pode ser intuitivamente representado atra-
vs de uma lista linear. Listas so estruturas extremamente fl exveis que
possibilitam uma ampla manipulao das informaes uma vez que inser-
es e remoes podem acontecer em qualquer posio.
Uma lista pode ser defi nida como uma estrutura linear, fi nita cuja or-
dem dada a partir da insero dos seus elementos componentes. As listas
so estruturas compostas, constitudas por dados de forma a preservar a
relao de ordem linear entre eles. Cada elemento na lista pode ser um dado
primitivo ou arbitrariamente complexo.
Em geral, uma lista segue a forma a1, a2, a 3, ..., an, onde n determina o
tamanho da lista. Quando n = 0 a lista chamada nula ou vazia. Para toda
lista, exceto a nula, ai + l segue (ou sucede) ai (i < n), e ai - 1 precede ai (i > 1). O
primeiro elemento da lista a1, e o ltimo an. A posio correspondente ao
elemento ai na lista i.
As caractersticas bsicas da estrutura de dados lista so as seguintes:
Homognea. Todos os elementos da lista so do mesmo tipo. Uma estrutura dita de
linear uma vez que seus
A ordem nos elementos decorrente da sua estrutura linear, no elementos componentes
entanto os elementos no esto ordenados pelo seu contedo, mas se encontram organizados
pela posio ocupada a partir da sua insero. de forma que todos, a ex-
ceo do primeiro e lti-
Para cada elemento existe anterior e seguinte, exceto o primeiro, que mo, possuem um elemen-
no possui anterior, e o ltimo, que no possui seguinte. to anterior e um posterior,
somente.
possvel acessar e consultar qualquer elemento na lista.
possvel inserir e remover elementos em qualquer posio.
ESTRUTURA DE DADOS 37
Interface do TAD Lista
38 ESTRUTURA DE DADOS
que existe uma clara noo do tamanho da entrada a ser processada, e uma
perspectiva que indica que as aplicaes que iro utilizar o TAD no estaro
executando muitas operaes de insero e remoo que possam vir a alte-
rar signifi cativamente o tamanho preestabelecido. A estruturao da lista
utilizando alocao esttica apresentada grafi camente a seguir. Note que,
a partir do endereo correspondente ao primeiro elemento no vetor (pos), e
conhecendo o tamanho (c) de cada componente na lista, possvel calcular
o endereo na memria de qualquer elemento armazenado no vetor. Isso
garante o acesso direto aos elemento em O(1).
#defi ne tamanho
Uma lista um tipo de dado que estrutura elementos cujo tipo pode
ser arbitrariamente complexo, envolvendo inclusive, a utilizao de outros
TADs. A defi nio a seguir especifi ca o tipo base dos elementos da lista
como inteiros.
typedef struct {
tipo _ base v[tamanho];
int quant _ Elem;
} no _ Lista;
ESTRUTURA DE DADOS 39
Finalmente a lista definida como um ponteiro estrutura de dados
onde os elementos so agregados.
Lista Criar () {
Lista l = (Lista) malloc (sizeof (no _ Lista));
If (l != NULL){
l -> quant _ Elem = 0;
return (l);
}
else printf (No existe memria suficiente);
return;
}
Outra operao que pode ser de utilidade a checagem pelo caso em que
a estrutura que armazena a lista possa estar cheia, uma vez que esta situao
pode inviabilizar a insero de um novo elemento. Este mtodo de fundamen-
tal importncia, principalmente no caso de utilizao de alocao de memria
esttica onde a tentativa de insero de um novo elemento pode acarretar o
estouro da memria, fazendo com que o programa termine com erro.
40 ESTRUTURA DE DADOS
int Cheia (Lista l) {
if (l -> quant _ Elem == tamanho) return (1)
else return (0);
}
ESTRUTURA DE DADOS 41
de insero requerida fique disponvel para o novo elemento a ser inserido.
A situao ilustrada na figura a seguir.
42 ESTRUTURA DE DADOS
O pior caso possvel para esta busca, consiste na situao onde o
elemento procurado no se encontra na lista. Nesta situao a lista ser
percorrida na totalidade, sem sucesso, passando pelos n elementos que de-
terminam seu tamanho. Consequentemente, o custo desta operao no seu
pior caso O(n), ou seja linear.
ESTRUTURA DE DADOS 43
posio m, se torna necessrio percorrer os m - 1 elementos anteriores. Com
isso, no pior caso, a busca por um elemento na lista demanda custo O(n).
A seguir apresentada a defi nio da estrutura de dados e imple-
mentao das operaes defi nidas na interface para o TAD Lista utilizando
alocao dinmica de memria atravs de ponteiros. A notao utilizada na
implementao prxima linguagem C. Esta estrutura representa uma
seqncia de elementos encadeados por ponteiros, ou seja, cada elemento
deve conter, alm do dado propriamente dito, uma referncia para o prximo
elemento da lista. Grafi camente, a estrutura de dados para a implementa-
o de listas utilizando ponteiros a seguinte:
Por exemplo, uma lista com valores de ponteiros a endereos reais tem
a seguinte forma:
struct node {
tipo _ base elemento;
no _ ptr prox;
};
44 ESTRUTURA DE DADOS
de um ponteiro auxiliar para o percurso ao longo da lista pode ser de gran-
de utilidade. Com esse objetivo definimos um tipo Corrente, a ser utilizado
como cpia da lista de forma a possibilitar a sua manipulao com segu-
rana.
ESTRUTURA DE DADOS 45
O acesso s informaes contidas nos ns da lista realizado atravs
da funo Consulta, que retorna o contedo de informao armazenado no
n referenciado pelo ponteiro corrente.
46 ESTRUTURA DE DADOS
A insero em uma lista pode acontecer em qualquer posio, que
pode ser no inicio, no fi nal ou qualquer outra posio no meio da lista. O
contedo do parmetro pos representa a posio de insero requerida para
o elemento novo a ser inserido, no caso de insero na cabea da lista pos
null. Neste caso, o ponteiro L que apontava ao primeiro elemento da lista
aponta agora para o novo elemento inserido.
ESTRUTURA DE DADOS 47
int Vazia (Lista L) {
if (L == NULL) return (1)
else return (0);
}
Utilizando o TAD Lista defi nido nesta unidade, implemente como apli-
cao um programa que, dadas duas listas A e B, crie uma terceira lista L
intercalando os elementos das duas listas A e B.
48 ESTRUTURA DE DADOS
Considerando a implementao do TAD utilizando alocao dinmica de
memria resolva as questes a seguir:
1. Implemente a operao que retorna a quantidade de elementos na lista,
cujo cabealho : int Tamanho (Lista l). Determine a complexidade da
operao implementada.
2. Implemente uma rotina para a remoo de uma lista desalocando a me-
mria utilizada. O cabealho da rotina void Remove_list (Lista L).
3. Implemente a rotina auxiliar chamada anterior usada na remoo, de
acordo com o seguinte cabealho corrente anterior (Lista L, corrente
pos). Esta rotina retorna a posio do elemento anterior a uma outra
posio pos. Se o elemento no for encontrado retorna NULL.
4. Utilizando as operaes defi nidas na interface do TAD Lista implemente
um mtodo que dadas duas listas L1 e L2, calcule L1 L2 (unio) e L1
L2 (interseo). O resultado das operaes deve ser retornado em uma
terceira lista L3.
5. Utilizando as operaes defi nidas na interface do TAD Lista implemente
um mtodo que dada uma lista retorne uma segunda lista onde os ele-
mentos pertencentes primeira estejam ordenados em forma crescente.
Determine a complexidade do seu algoritmo.
6. Escreva um programa que, utilizando o TAD Lista, faa o seguinte:
a) Crie quatro listas (L1, L2, L3 e L4);
b) Insira sequencialmente, na lista L1, 10 nmeros inteiros obtidos de
forma randmica (entre 0 e 99);
c) Idem para a lista L2;
d) Concatene as listas L1 e L2, armazenando o resultado na lista L3;
e) Armazene na lista L4 os elementos da lista L3 (na ordem inversa);
f) Exiba o contedo das listas L1, L2, L3 e L4.
ESTRUTURA DE DADOS 49
A partir da existncia de um critrio de ordenao na lista, a funo res-
ponsvel pela busca por um determinado contedo na lista pode ser adaptado
de forma a tornar a busca mais eficiente.
Lista circular
A conveno consiste em manter a ltima clula apontando para a pri-
meira. Desta forma, o teste por fim de lista nunca satisfeito. Com isso, pre-
cisa ser estabelecido um critrio de parada de forma a evitar que o percurso
na lista no encontre nunca o fim. Uma forma padro estabelecido com base
no nmero de elementos existentes na lista.
50 ESTRUTURA DE DADOS
Captulo 2
Pilhas
ESTRUTURA DE DADOS 51
Interface do TAD Pilha
52 ESTRUTURA DE DADOS
#define tamanho;
ESTRUTURA DE DADOS 53
int Vazia (Pilha p) {
if (p -> topo == 0) return (1)
else return (0);
}
54 ESTRUTURA DE DADOS
typedef struct node *no _ ptr;
struct no {
tipo _ base elemento;
no _ ptr prox;
};
ESTRUTURA DE DADOS 55
2. Implemente o algoritmo que consulta e retorna o contedo correspon-
dente ao elemento que se encontra no topo, atendendo ao seguinte cabe-
alho: tipo _ base Top (Pilha p).
3. Implemente uma operao que libere a memria alocada pela pilha. De-
termine a complexidade do seu algoritmo.
4. Explique por que mais conveniente a definio do topo da pilha no ini-
cio e no no fim da estrutura, no caso de utilizao de ponteiros.
5. Utilizando as operaes definidas na interface do TAD Lista e do TAD
Pilha, elabore um algoritmo que dada uma lista ordenada, inverta a or-
dem dos elementos na lista, utilizando para isso uma pilha. Determine
a complexidade do seu algoritmo.
6. Utilizando as operaes definidas na interface do TAD Pilha escreva um
algoritmo para ordenar pilhas, sendo que no final do processamento os
elementos da pilha devem estar dispostos em ordem crescente de seus
valores. Determine qual a estrutura auxiliar mais adequada para supor-
tar o processo. Determine a complexidade do seu algoritmo.
7. Utilizando as operaes definidas na interface do TAD Pilha escreva um
algoritmo que fornea o maior, o menor e a mdia aritmtica dos elemen-
tos de uma pilha dada como entrada.
56 ESTRUTURA DE DADOS
Captulo 3
Filas
ESTRUTURA DE DADOS 57
De acordo com esta estratgia e depois da remoo de b e a, e da
insero de f e 1, a situao da fila seria a seguinte:
No entanto existe um problema potencial uma vez que a fila pode ficar
aparentemente cheia, no entanto vrios elementos podem ter sido removi-
dos, podendo existir na verdade poucos elementos na fila (observe a figura
anterior).
A soluo para contornar este problema implementar o chamado
incremento circular encima do vetor, onde sempre que os ndices de inicio ou
de fim chegam no final do vetor, estes so redefinidos na primeira posio
do vetor. Esta estratgia requer um cuidado especial na hora do percurso
sobre a estrutura, uma vez que o fim do vetor precisa ser determinado logi-
58 ESTRUTURA DE DADOS
camente (p.e., pela quantidade de elementos na fila), e no mais fisicamente
pelo fim da estrutura. A figura a seguir exemplifica o funcionamento da fila
utilizao o vetor circular, onde o contedo c foi removido e adicionado o
contedo m.
ESTRUTURA DE DADOS 59
Considerando a implementao do TAD utilizando alocao esttica de me-
mria resolva as questes a seguir:
1. Implemente os algoritmos Criar, Remover e Vazia, de acordo com os res-
pectivos cabealhos defi nidos na interface do TAD.
2. Explique por que mais conveniente a realizao da operao de inser-
o no fi m e de remoo no inicio. Como seria se fosse ao contrario?
3. Escreva um algoritmo para ordenar fi las, sendo que no fi nal do proces-
samento os elementos da fi la devem estar dispostos em ordem crescente
de seus valores. Determine qual a estrutura auxiliar mais adequada
para suportar o processo. Determine a complexidade do seu algoritmo.
typedef struct no {
tipo _ base elemento;
no _ ptr prox;
};
60 ESTRUTURA DE DADOS
A estrutura de dados envolve a definio de uma lista de elementos, no
mesmo formato em que foi definida para o caso de listas e pilhas. Adicional-
mente, a estrutura correspondente ao n cabealho precisa ser especificada
uma vez que inclui campos diferenciados.
struct cabealho {
no _ ptr ini;
no _ ptr fim;
};
ESTRUTURA DE DADOS 61
1. Implemente os algoritmos Criar, Remover e Vazia, de acordo com os res-
pectivos cabealhos defi nidos na interface do TAD Fila utilizando pon-
teiros.
2. Explique por que mais conveniente a realizao da operao de inser-
o no fi m e de remoo no inicio. Como seria se fosse ao contrrio?
3. Utilizando as operaes defi nidas na interface do TAD implemente como
aplicao uma operao que libere a memria alocada pela fi la. Deter-
mine a complexidade do seu algoritmo.
4. Utilizando as operaes defi nidas na interface do TAD Fila, escreva um
algoritmo que fornea o maior, o menor e a mdia aritmtica dos elemen-
tos de uma Fila.
5. Utilizando as operaes defi nidas na interface dos TAD Fila e Pilha es-
crever um algoritmo que leia um nmero indeterminado de valores intei-
ros. Considere que o valor 0 (zero) fi naliza a entrada de dados. Para cada
valor lido, determinar se ele um nmero par ou mpar. Se o nmero for
par, ento inclu-lo na FILA PAR; caso contrrio inclu-lo na FILA M-
PAR. Aps o trmino da entrada de dados, retirar um elemento de cada
fi la alternadamente (iniciando-se pela FILA MPAR) at que ambas as
fi las estejam vazias. Se o elemento retirado de uma das fi las for um va-
lor positivo, ento inclu-lo em uma PILHA; caso contrrio, remover um
elemento da PILHA. Finalmente, escrever o contedo da pilha.
62 ESTRUTURA DE DADOS
KNUTH D. E. (1971). Mathematical Analysis of Algorithms. Prociedings
IFIP Congress 71, vol. 1, North Holland, 135-143.
SZWARCFITER J. l., MARKENZON L. (2010). Estruturas de Dados e Seus
Algoritmos. 3. Edio. LTC.
WIRTH N. (1986). Algorithms and Data Strutures. Prentice-Hall.
ZIVIANI N. (2005). Projeto de Algoritmos com implementaes em Pas-
cal e C, 2da. Edio. Thomson.
ESTRUTURA DE DADOS 63
Unidade
4
rvores
Objetivos:
Diversas aplicaes requerem de uma organizao e manipulao de dados mais
complexa daquela propiciada atravs de estruturas lineares, analisadas na unidade
anterior. Uma rvore uma estrutura de dados no linear muito eficiente para
armazenar informao de forma a representar relacionamentos de aninhamento
ou hierarquia entre os elementos envolvidos. Nesta unidade so apresentados os
conceitos iniciais relativos a rvores e a sua representao clssica e implementao
atravs da definio do tipo abstrato correspondente. rvores binrias de busca e
balanceadas (AVL) so introduzidas.
Captulo 1
rvores
ESTRUTURA DE DADOS 67
Se T um conjunto vazio, ou seja n = 0, a rvore nula, ou vazia, ou
Existe um n especial, r, chamado raiz da rvore;
Os demais ns constituem um conjunto vazio ou so particionados
em conjuntos disjuntos no vazios, as sub-rvores de r;
Cada sub-rvore, por sua vez, tambm uma rvore.
Sejam T uma rvore e v um n, tal que v T, Tv a sub-rvore de T que
tem v como raiz. Defi nem-se as seguintes propriedades:
O grau de sada do no v o nmero de sub-rvores que ele possui.
O grau da rvore T o maior grau dentre os de todos os seus ns.
Os fi lhos de v so as razes das sub-rvores de v.
Um n que no tem descendentes chamado de folha ou terminal.
Uma propriedade fundamental de todas as rvores que s existe um
caminho da raiz para qualquer n. Com isto, podemos defi nir a altura de
uma rvore como sendo o comprimento do caminho mais longo da raiz at
uma das folhas. Assim, a altura de uma rvore com um nico n raiz zero.
Um caminho em T uma sequncia de ns v1, v2, ..., vm, tal que para
cada par (vi, vi+1), vi pai de vi+1. O comprimento do caminho m-1.
O nvel do n v o nmero de ns no caminho da raiz at v. O nvel
do n raiz 0, por defi nio.
A altura de um n v o nmero de ns no maior caminho de v at
um dos seus descendentes. Folhas tm altura 1. A altura da raiz
determina a altura da rvore.
rvore binria
Em uma rvore binria, cada n tem zero, um ou dois fi lhos. De ma-
neira recursiva, podemos defi nir uma rvore binria como sendo:
Uma rvore vazia; ou
Pesquise sobre aplicaes
da estrutura de dados
Um n raiz v tendo duas sub-rvores, identifi cadas como a sub-
rvore. rvore da direita (sad) e a sub-rvore da esquerda (sae) de v.
Pela defi nio, uma sub-rvore de uma rvore binria sempre espe-
cifi cada como sendo a sae ou a sad de uma rvore maior, e qualquer das
duas sub-rvores pode ser vazia.
Uma rvore binria T um conjunto fi nito de n ns ou vrtices, tais que:
Se T um conjunto vazio, ou seja, n=0, a rvore nula ou vazia, ou
Existe um n especial, r, chamado raiz da rvore;
Os demais ns constituem um conjunto vazio ou so particiona-
dos em dois conjuntos disjuntos: sub-rvore esquerda e direita de r,
cujas razes so chamadas de fi lho esquerdo e direito de r;
Cada sub-rvore, por sua vez, tambm uma rvore binria;
68 ESTRUTURA DE DADOS
Uma rvore estritamente binria aquela em que cada n possui zero
ou dois filhos, como representado na figura a seguir.
ESTRUTURA DE DADOS 69
Dependendo do percurso da rvore a mesma expresso pode ser re-
presentada em forma expresses infi xas, prefi xas e psfi xas.
70 ESTRUTURA DE DADOS
Captulo 2
rvore binria de busca
ESTRUTURA DE DADOS 71
Interface do TAD ABB
/* Retorna o contedo de um n.
element _ type Conteudo (no _ ptr a)
struct no _ rvore {
element _ type info;
no _ ptr esq;
no _ ptr dir;
};
72 ESTRUTURA DE DADOS
Da mesma forma que uma lista encadeada representada por um
ponteiro para o primeiro n, a estrutura da rvore como um todo repre-
sentada por um ponteiro para o n raiz, a partir do qual todos os ns da
rvore podem ser alcanados.
Para criar rvores no vazias, podemos ter uma operao que cria um
n raiz contendo a informao e os ponteiros s suas duas sub-rvores,
esquerda e direita. Essa funo tem como valor de retorno o endereo do
n raiz criado e inicializado, como segue:
ESTRUTURA DE DADOS 73
que a chave que se encontra no n da rvore, a procura continua na sub-r-
vore da esquerda, e no caso contrrio na sub-rvore direita, recursivamente.
74 ESTRUTURA DE DADOS
Na remoo vrias possibilidades devem ser consideradas. Se o n que
vai ser removido folha a remoo imediata.
Se o n tem somente um filho ele pode ser removido ajustando os pon-
teiros entre seu pai e seu filho de modo de realizar um by pass encima do
n. Por exemplo, considere a rvore a seguir, onde o n correspondente ao
dado (5) precisa ser removido. O processo a ser seguido descrito na rvore
que aparece direita.
ESTRUTURA DE DADOS 75
void Remover (element _ type x, ABB pai, ABB no){
no _ ptr tmp _ no, filho;
else {
tmp _ no = no;
if(no -> esq == NULL
filho = no -> dir;
if(no -> dir == NULL )
filho = no -> esq;
if (pai -> dir ==T)
pai -> dir = filho;
else
pai -> esq = filho;
76 ESTRUTURA DE DADOS
Escreva uma funo que verifi que se uma rvore cheia. Uma rvore
dita cheia se todos os ns que no so folhas tm os dois fi lhos, isto ,
no pode existir n com apenas um fi lho. A funo deve retornar 1 no caso
da rvore ser cheia ou 0 no caso de no ser. No caso da rvore ser vazia, a
funo deve retornar 1.
ESTRUTURA DE DADOS 77
void ImprimirSimetrica (no _ ptr a){
if ( !Vazia(a) ){
ImprimirSimetrica (retornaSAE(a));
printf (Conteudo(a));
ImprimirSimetrica (retornaSAD(a));
}
return;
}
Inordem: 5 + 9 * 3 - 7 + 7
Preordem: + * +5 9 3 7 7
Posordem: 5 9 + 3 7 - * 7 +
78 ESTRUTURA DE DADOS
c) A partir da rvore obtida no inciso anterior, remover os ns: 9, a seguir
o 5, e fi nalmente o 20.
2. Implemente um algoritmo que determine se uma rvore binria de busca
efetivamente uma rvore binria de busca.
3. Implemente o mtodo que retorna o maior elemento a partir de um deter-
minado n cujo cabealho : no _ ptr buscaMAX (ABB T). Implemente
o mtodo na sua verso recursiva e no recursiva.
4. Dada uma rvore binria de busca, onde cada n constitudo pelas
seguintes informaes: NOME, SEXO (M ou F), IDADE e PESO. Sa-
bendo que a rvore foi construda com a chave NOME e que j existe um
ponteiro chamado RAIZ que aponta para o n raiz da rvore, construir
um algoritmo que, a partir desta rvore, gere duas listas ordenadas por
NOME, uma para homens e outra para mulheres.
5. Escreva um algoritmo recursivo que encontre o maior valor armazenado
em uma rvore binria de busca j construda.
6. Adapte os algoritmos de insero e remoo em rvores binrias de bus-
ca de forma a tratar a ocorrncia de contedos-chave repetidos, manten-
do um contador de ocorrncias em cada n.
7. Para a rvore binria a seguir, escreva as sequncias de ns visitados
aps a execuo dos percursos pr-ordem, inordem e ps-ordem. Codifi -
que os algoritmos correspondentes a cada um dos percursos.
ESTRUTURA DE DADOS 79
Portanto, uma AB de altura h pode ter no mximo O (2h) ns. A partir
desta definio temos que o nmero de ns em uma AB dada por n = 2h
ns. Para despejar h temos que aplicar a definio de logaritmo: log n = h.
log 2. Portanto uma rvore binria com n ns pode ter uma altura mnima de
O (log n).
Por outro lado, se a rvore tem altura h, deve existir um caminho de
comprimento h da raiz at um dos ns, digamos n0, n1, ... nh, e todos os h+1
ns deste caminho devem ficar em nveis diferentes. Assim, a rvore dever
ter pelo menos h+1 ns.
Esta relao entre o nmero de ns e a sua altura importante, pois
significa que a partir da raiz, qualquer n pode ser alcanado em no mximo
O (log n) passos. Note que se tivssemos n ns numa lista linear o nmero
mximo de passos seria O (n).
A altura da rvore uma medida do tempo necessrio para encontrar
um n. Esta propriedade atinge a eficincia mxima quando a rvore binria
balanceada, ou seja, todos os ns internos, ou quase todos possuem dois
filhos.
fcil prever que aps vrias operaes de insero e remoo, a rvore
tende a ficar desbalanceada. Em especial, a operao de remoo numa ABB
dependendo da estratgia utilizada (substituio do n a ser removido pelo
maior da sub-rvore esquerda ou o menor da sub-rvore direita), favorece
sistematicamente uma das sub-rvores.
A soluo a este problema consiste em sempre manter a altura das sub-
rvores no mnimo, ou prximo do mnimo. Para isso necessrio de proces-
sos de insero e remoo mais complexos que mantenham as sub-rvores
balanceadas.
80 ESTRUTURA DE DADOS
Captulo 3
rvores AVL
Com esta restrio, todas as operaes sobre rvores podem ser exe-
cutadas em tempo O(log n), exceto possivelmente a insero. No entanto,
para manter a propriedade de balanceamento, alm dos algoritmos de per-
curso, incluso e excluso j discutidos, so necessrios algoritmos que
restabeleam o equilbrio aps incluses e excluses, caso algum n fique
desregulado. Por exemplo, na insero, pode ser preciso atualizar a infor-
mao de balanceamento para os ns no caminho de volta para a raiz, pois
somente aqueles ns tiveram as suas sub-rvores alteradas. No caso das
rvores binrias de busca representadas a seguir, a rvore da esquerda se
encontra balanceada uma vez que todos os ns mantem suas sub-rvores
com uma diferena de at um nvel. J a rvore da direita apresenta um
desbalanceamento na raiz.
ESTRUTURA DE DADOS 81
A insero de 6.5 na primeira rvore provocar o desbalanceamento
do n 8. A propriedade de balanceamento restaurada atravs de operaes
de rotao.
Seja o no desbalanceado. Desde que todo n tem no mximo dois
filhos e o desbalanceamento da altura requer que a altura das duas sub-
rvores deferem em 2, a violao da propriedade pode acontecer como con-
sequncia de operaes de insero ou remoo.
O fator de balanceamento (FB) de um determinado n r calculado
como a diferencia entre a altura da sub-rvore esquerda de r e da sub-rvo-
re direita de r. Se o valor obtido for menor ou igual a 1 o n est balanceado.
Caso contrrio o n se encontra desbalanceado. O FB de um n folha 0.
if (no = NULL)
Altura := -1
else {
Alt _ Esq := Altura (retornaSAD (no));
Alt _ Dir := Altura (retornaSAE (no));
82 ESTRUTURA DE DADOS
nor ou igual que a sub-rvore direita, ento realizar uma rotao
dupla para a direita;
Exemplo
Comeando a partir de uma rvore vazia, so inseridos os nmeros de
(1), (4) e (7). O primeiro problema acontece na insero do (7): a propriedade
ESTRUTURA DE DADOS 83
de balanceamento violada na raiz. Para resolver executada uma rotao
simples a esquerda.
84 ESTRUTURA DE DADOS
Como resultado da rotao, o n com a chave (8) se torna a nova raiz
da rvore, e com isso, a sua sub-rvore esquerda (7) se transforma na nova
sub-rvore direita do (4).
Continuando o exemplo, a insero da chave (10) desbalanceia o n
(9), desencadeando uma nova rotao dupla a esquerda.
1. Considerando que a altura (h) de uma rvore dada pelo caminho mais
longo desde a raiz at uma folha, explique com as suas palavras a re-
lao existente entre altura (h) de uma rvore binria e a quantidade
(mnima e mxima) de ns.
a) Qual a relao entre a altura (h) de uma rvore e o tempo requerido
(custo) para encontrar um n?
b) Em qual situao a busca em uma rvore binria pode atingir efi ci-
ncia mxima?
ESTRUTURA DE DADOS 85
2. Defi na uma rvore AVL estabelecendo as suas propriedades, vantagens
e desvantagens da sua utilizao.
3. Dada a seguinte rvore (binria de busca) AVL, simule o processo de in-
sero e remoo das seguintes chaves na rvore na ordem dada: inser-
o 25 - insero 70 - insero 15 - insero 12 - insero 18 - remoo
15. Verifi que a cada passo se a propriedade de balanceamento continua
sendo mantida. Em caso de desbalanceamento, indicar o n desbalance-
ado e as operaes de rotao indicadas para resolver o problema.
86 ESTRUTURA DE DADOS
AHO, J.E. Hopcroft, and J.D. Ullman. Data structures and algorithms.
Addison-Wesley, Reading, Mass., 1983.
CORMEN T. H., LEISERSON C. E., RIVEST R. L., STEIN C. (2001). Intro-
duction to Algorithms. McGraw-Hill e The Mit Press.
HOROWITZ and S. Sahni (1987). Fundamentals of data structures, Com-
puter Science Press. Editora Campus.
KNUTH D. E. (1968). The Art of Computer Programming, Vol. 1: Funda-
mental Algorithms. Addison-Wesley.
SZWARCFITER J. l., MARKENZON L. (2010). Estruturas de Dados e Seus
Algoritmos. 3. Edio. LTC.
ZIVIANI N. (2005). Projeto de Algoritmos com implementaes em Pas-
cal e C, 2da. Edio. Thomson.
ESTRUTURA DE DADOS 87
Unidade
5
Busca avanada
Objetivos:
A eficincia alcanada para resolver o problema da busca ou recuperao de
informao a partir de uma estrutura de dados um indicador da eficincia da
estrutura. Nesta unidade so apresentados mtodos especficos de busca que
objetivam reduzir a complexidade em relao aos mtodos de busca padro
apresentados em unidades anteriores. Em particular, apresentado o uso de
tabelas de ndices que possibilitam o acesso direto informao, idealmente. No
domnio especifico de tratamento de cadeias a busca digital apresentada como
soluo para o problema de casamento de padres. Finalmente, o funcionamento
de estruturas auto-ajustveis descrito.
Captulo 1
Tabela de disperso
ESTRUTURA DE DADOS 91
A utilizao de tabela de disperso para o armazenamento e recupe-
rao da informao visa tornar estas operaes mais efi cientes em termos
de esforo, em relao aos outros mecanismos de busca estudados, alcan-
ando uma complexidade mdia de O(1). O ganho com relao a outras es-
truturas associativas (como um vetor simples) passa a ser maior conforme
a quantidade de dados aumenta. Em contrapartida, em uma tabela de dis-
perso virtualmente impossvel estabelecer uma ordem para os elementos.
Em outras palavras, a funo de disperso estabelece uma indexao sobre
as chaves mas no preserva a ordem entre elas.
O mtodo de pesquisa com uso de transformao de chave envolve
duas etapas.
1. Desenvolver e aplicar a funo de transformao aritmtica do valor
da chave para um endereo na memria.
A ocorrncia de colises 2. Dependendo da quantidade de chaves e da efi cincia da funo de
pode ser abordada do
ponto de vista probabilis-
transformao na gerao de endereos, pode ser necessrio ela-
tico. O paradoxo do ani- borar uma estratgia de tratamento para colises para tratar os
versrio estabelece que, casos em que duas chaves gerem o mesmo endereo.
se tomadas aleatoriamen-
te 50 pessoas, pelo menos Considere a existncia de n chaves a serem armazenadas na tabela T,
duas pessoas teriam a de dimenso m. A tabela considerada uma estrutura sequncial, portanto
mesma data de anivers-
rio ou coliso. as posies ou endereos se encontram no intervalo [0, m 1]. Se o nmero
de chaves n for igual ao nmero de posies na tabela, m, e, alm disso, os
valores das chaves forem de 0 a m 1, ento, cada chave x poderia ser ar-
mazenada no endereo x correspondente.
Tabelas de disperso so tipicamente utilizadas para indexao de
grandes volumes de informao, tais como bases de dados. Outros exem-
plos de uso das tabelas de disperso so as tabelas de transposio em
jogos de xadrez para computador.
A funo de disperso
A funo de disperso a responsvel por gerar um ndice a partir de
determinada chave. A defi nio da funo de fundamental importncia,
uma vez que se no for adequada para o tratamento dos dados em questo,
a manipulao da tabela ter um mau desempenho.
O ideal para a funo de disperso que sejam sempre fornecidos
ndices nicos para as chaves de entrada. A funo perfeita seria a que,
para quaisquer entradas A e B, sendo A diferente de B, fornecesse sadas
diferentes. Quando as entradas A e B so diferentes e, passando pela fun-
o de disperso, geram a mesma sada, acontece uma coliso. De forma
simplifi cada temos que: Pos (elemento) = H (elemento, n), onde H a funo
de disperso aplicada ao elemento, considerando o tamanho n da tabela.
92 ESTRUTURA DE DADOS
No exemplo, a funo de disperso aplicada sobre a chave nome,
para obter um ndice de acesso ao vetor onde o registro armazenado. O
registro pode agregar vrios campos de informao, alm do campo chave.
No entanto, na prtica, difcil encontrar uma funo de disperso
perfeita que consiga espalhar de forma uniformemente esparsa as chaves
ao longo da estrutura. Dando sequncia ao exemplo acima, a aplicao da
funo de disperso para o nome Luiza pode vir a gerar o mesmo ndice do
que Luiz (790), provocando uma coliso. Esta situao indesejvel uma vez
que reduz o desempenho do sistema. No entanto muito comum acontecer,
por isso que diversas tcnicas de tratamento de colises tem sido propos-
tas na literatura.
ESTRUTURA DE DADOS 93
1. Defi na o conceito de tabela de disperso e descreva o processo envolvido
na aplicao desta tcnica.
2. Estabelea vantagens e desvantagens em relao a outros mecanismos
de armazenamento e recuperao de informao.
3. Pesquise na literatura sobre funes de disperso comumente utilizadas
e que tem demostrado desempenho aceitvel.
a) Mtodo da diviso
b) Mtodo da dobra
4. Apresente um exemplo prtico de gerao de uma tabela de disperso
utilizando os mtodos pesquisados no item anterior.
Encadeamento
A utilizao de listas encadeadas a soluo mais simples para o
tratamento de colises. Neste caso, a partir do ndice em confl ito mantido
um ponteiro para uma lista encadeada onde so armazenados os registros
em confl ito. A insero na tabela requer e insero dentro da lista encade-
ada. Analogamente, a remoo requer atualizar os ndices dentro da lista.
O TAD lista na sua verso encadeada atravs de ponteiros foi apresentado
na Unidade 3.
Grafi camente, a soluo de colises atravs de listas encadeadas
representada a seguir. A situao de coliso entre as chaves Luiz e Luiza
seria resolvida adicionando o registro correspondente chave repetida na
lista associada ao ndice.
94 ESTRUTURA DE DADOS
Esta soluo adiciona um nvel de indireo s operaes de insero
e recuperao da informao, uma vez que o registro no mais acessado
diretamente a partir da chave, no entanto, o custo de acesso continua se
mantendo baixo. Estruturas de dados alternativas podem ser utilizadas no
lugar das listas encadeadas. Por exemplo, a partir da utilizao de rvores
binrias balanceadas (AVL) possvel melhorar o tempo mdio de acesso
da tabela disperso para O(log n) ao invs de O(n) demandado no caso da
utilizao de listas.
Tcnicas de sondagem
Em contrapartida tcnica de encadeamento, as tcnicas de sonda-
gem para o tratamento de colises no fazem uso de nenhuma estrutura
auxiliar para o armazenamento da informao. Em caso de coliso, os re-
gistros em conflito so armazenados dentro da prpria tabela, utilizando
buscas padronizadas at encontrar um registro vazio ou o registro buscado.
Outras formas mais complexas de implementar a tcnica de sondagem
consiste em determinar a posio do novo elemento em coliso a partir de
uma funo quadrtica, incrementando o ndice exponencialmente. Desta
forma, caso a chave procurada no se encontre na posio 10, em uma se-
gunda tentativa ser procurada na posio 100, 1000, e assim por diante.
Uma terceira possibilidade envolve a aplicao de uma nova funo
de disperso (tambm chamado de double hashing), cuja chave de entrada
ser o valor gerado pela funo anterior. Esta soluo pode ser til em casos
muito especficos, com enormes quantidades de dados, no entanto a sobre-
carga no sistema nem sempre justifica a experincia.
ESTRUTURA DE DADOS 95
1. Explique o conceito de coliso e por que acontecem.
2. Pesquise as diferentes formas de resoluo de coliso e analise suas van-
tagens e desvantagens. Exemplifi que.
96 ESTRUTURA DE DADOS
Captulo 2
Busca digital
ESTRUTURA DE DADOS 97
rvore digital
A estrutura mais apropriada para realizar a busca digital atravs da
rvore digital.
Formalmente, uma sequncia S = {s1, ..., sn} um conjunto de n chaves
em que cada si formada por uma sequncia de elementos dj denominados
dgitos. Supe-se que existe em S o total de m dgitos distintos que determi-
nam o alfabeto ordenado de S. Os primeiros p dgitos de uma chave com-
pem o prefi xo de tamanho p da chave.
Uma rvore digital para S uma rvore m-ria T, no vazia, tal que:
1. Se o n v o j-ssimo fi lho de seu pai, ento v corresponde ao dgito
dj do alfabeto S, 1 <= j <= m.
2. Para cada n v, a sequncia de dgitos defi nida pelo caminho desde
a raiz de T at v corresponde a um prefi xo de alguma chave de S.
Na anlise de um texto em linguagem natural, S seria o conjunto de
frases do texto, onde si cada frase que pode ser buscada e n o nmero de
frases, e m = 26.
Em um caso especfi co da rvore digital, no entanto o mais utilizado,
temos a rvore digital binria, onde o grau da rvore m = 2. O alfabeto
considerado neste caso {0, 1}. A partir da construo da rvore digital com
estas caractersticas, as chaves a serem consideradas nas buscas envolvem
sequncias binrias.
0010
010
010111
010110
00100
11
110
1101
98 ESTRUTURA DE DADOS
Uma vez criada a rvore, a busca acontece como resultado do percur-
so a partir da raiz: o fi lho esquerdo representa o dgito 0 e o fi lhor direita
representa o dgito 1. Note que a busca localiza no somente uma chave
vlida completa, mas tambm prefi xos. A busca por prefi xos pode ser de
grande utilidade dependendo da aplicao, como por exemplo lingustica.
ESTRUTURA DE DADOS 99
Captulo 3
Estruturas autoajustveis
Listas autoajustveis
O TAD Lista foi abordado na Unidade 3. Como foi visto, o tipo lista
pode ser implementado utilizando a abordagem de alocao de memria
esttica (vetores) ou dinmica (ponteiros). Considerando que na sua verso
mais simples no estabelecido um critrio de ordenao entre os elemen-
tos, alguns elementos na lista podem ser requisitados mais frequentemente
do que outros. A partir desta constatao, uma lista autoajustvel imple-
menta estratgias para reduzir o tempo de acesso em operaes subsequen-
tes. A estratgia geral consiste em posicionar os ns mais procurados mais
prximos do inicio da lista, de forma que em futuras buscas possam ser
alcanados mais rapidamente. Esta estratgia pode ser implementada uti-
lizando diversos mtodos.
O mtodo de mover para frente transfere o n procurado para o inicio
da lista. Repare que dependendo da implementao utilizada para imple-
mentar a lista, esta operao pode ser custosa. Por outro lado, ns com bai-
xa probabilidade de acesso podem ser eventualmente acessados, tornando
mais custosas as buscar por ns com maior probabilidade.
No mtodo de transposio uma vez acessado o n procurado, este
transferido para a posio imediatamente anterior. Na medida em que o n
for acessado, mais prximo do inicio ser posicionado.
A implementao do mtodo de contador de frequncias envolve a in-
corporao de um campo adicional na estrutura do n da lista, responsvel