You are on page 1of 28

Univer sidade de So Paulo

Escola de Ar tes, Cincias e Humanidades


Sistemas de I nfor mao

ACH2023 - AL GORI TM OS E
ESTRUTURAS DE DADOS I

Willian Yukio Honda


I vandr Par aboni

atualizada em 03/06/2011

Esta apostila encontra-se em fase de elaborao.


Por favor comunique eventuais erros, crticas ou sugestes escrevendo para ivandre@usp.br
1. I ntr oduo

Esta apostila apresenta uma coletnea de algoritmos sobre uma variedade de estruturas de dados de memria
principal estudadas na disciplina ACH2023 Algoritmos e Estruturas de Dados I, a saber:

Listas Lineares
Sequenciais
Ligadas
Implementao Esttica
Implementao Dinmica
Tcnicas Especiais: Cabea, Sentinela, Circularidade, Encadeamento Duplo
Filas
Implementao Esttica
Implementao Dinmica
Deques (Filas de duas Pontas)
Implementao Dinmica
Pilhas
Implementao Esttica
Implementao Dinmica
Implementao de Mltiplas Pilhas em um Vetor
Aplicaes
Matrizes Esparsas
Listas Generalizadas

Listas no Lineares
rvores Binrias
rvores de Busca Binria
rvores AVL

1.1. Notao utilizada


Para simplificar o cdigo apresentado ao longo desta apostila, tornando-o o mais genrico possvel,
pressupe-se as duas definies a seguir:

Observao: a varivel *ajustar utilizada para indicar se preciso verificar o balanceamento (e


eventuamente comandar uma rotao) nos ancestrais do n inserido. Esta varivel se torna true no momento
que o novo n criado, e se torna novamente false (encerrando portanto a verificao dos ancestrais) se o
balanceamento no foi afetado pela insero, ou se o equilbrio foi restaurado atravs de uma rotao.

ACH2023 Algoritmos e Estruturas de Dados I 2 55


Nas rotaes simples (LL e RR), existe um n u que filho de p (na direo de x). Este u passa a ser a nova 2. L istas L inear es
raiz da subrvore afetada. Nas rotaes duplas (LR e RL), o n u possui ainda um filho esquerdo ou direito
denominado v, tambm localizado em direo ao n x, que passa a ser a nova raiz da subrvore em questo Uma lista linear uma srie de elementos ordenados na qual cada elemento exceto o primeiro possui um e
(ou seja, substituindo p). A figura a seguir ilustra a modificao da estrutura aps cada uma das rotaes. apenas um antecessor, e cada elemento exceto o ltimo possui um e apenas um sucessor.

2.1. L istas L inear es Sequenciais


a lista linear na qual a ordem (lgica) dos elementos da lista coincide com sua posio fsica (em memria).
Ou seja, elementos adjacentes da lista ocupam posies contguas de memria.

A forma mais comum de implementao de uma lista sequencial atravs de um vetor de elementos (A) do
tipo REGISTRO de tamanho mximo possvel definido pela constante MAX.

O vetor conjugado a um contador de nmero de posies efetivamente ocupadas (nroElem). A ocupao do


vetor se d sempre em posies contguas, ou seja, nroElem-1 indica o ltimo elemento existente na estrutura.

Os registros contm campos de informaes variadas que so dependentes da aplicao. Por exemplo, um
registro de aluno conteria campos como nome, idade, NroUSP etc. Para efeito de demonstrao da busca em
estruturas ordenadas e outras operaes de identificao de elementos, definimos tambm um campo chave
em cada registro.

Vantagens:
Acesso direto a qualquer elemento com base no seu ndice. O tempo constante O(1). No entanto, em
muitas aplicaes o ndice do dado procurado no conhecido, o que faz desta uma vantagem apenas
relativa.
Se a lista estiver ordenada pela chave em questo, a busca por uma chave pode ser efetuada atravs de
busca binria O(lg n), que excelente.

Desvantagens:
Mesmo em uma estrutura ordenada, o pior caso de insero e excluso (na frente da lista) exige
movimentao de todos os n elementos da lista, ou seja, O(n). Isso pode ser inadequado para aplicaes em
que ocorrem muitas atualizaes, e principalmente por causa disso que a lista sequencial muitas vezes
substituda por uma estrutura de dados mais complexa.
Implementao esttica, exigindo que o tamanho do vetor seja previamente estabelecido. Embora
algumas linguagens de programao (como C) permitam a expanso posterior de um vetor deste tipo, esta
operao requer cpia de reas de dados inteiras em memria, a um custo O(n) que inviabiliza sua aplicao
no caso geral.

ACH2023 Algoritmos e Estruturas de Dados I 54 3


Duas rvores completas, porm s a da direita AVL.

Oper aes de Rotao AVL


Conhecendo-se a posio x em que um n foi inserido, preciso verificar os ancestrais de x em busca de um
possvel n p que tenha sido desregulado aps esta operao. O n p que deve ser encontrado o mais
prximo possvel da folha x, ou seja, a pesquisa feita da folha em direo raiz.

Se houver algum n p desregulado no caminho entre x e a raiz, este deve sofrer uma operao de rotao para
que seu equilbrio seja restaurado (e para que a rvore volte a ser AVL). A operao de rotao gira em torno
de p, e somente esta subrvore afetada.

A posio do n x que causou o desequilbrio em relao ao n desregulado p determina a operao


necessria. A partir de p, preciso verificar os dois nveis seguintes da estrutura na direo em que se

(ou a um de seus ancestrais), temos uma de quatro operaes p ossveis, divididas em duas rotaes simples
(LL ou RR) e duas duplas (LR ou RL).

ACH2023 Algoritmos e Estruturas de Dados I 4 53


Insero da chave 0 ( esquerda) e reorganizao de todos os n ns
para manter rvore completa ( direita).

3.1.4. r vor es Balanceadas em Altur a (AVL )


Ao invs de tentar manter uma rvore completa ao custo O(n), a soluo para manter a busca eficiente
tentar algo mais simples, exigindo que a rvore seja apenas balanceada. Uma ABB balanceada aquela que,
embora no tendo necessariamente altura mnima, mantm a complexidade de busca de ordem logartmica.
Embora a busca em rvore balanceada nem sempre seja to eficiente quanto seria em uma rvore completa, a
reorganizao necessria para manter uma rvore balanceada localizada, e muito mais rpida do que a
reorganizao O(n) da rvore completa, em geral tambm de ordem logartmica.

Existem muitos tipos de rvores balanceadas. Dentre as mais difundidas, e que serviram de base para vrios
outros modelos, esto as rvores balanceadas em altura, ou rvores AVL (dos criadores Adelson -Velskeii &
Landis) propostas em 1962. Uma rvore dita AVL se todos os seus ns so AVL. Um n dito AVL se as
alturas de sua subrvore direita (h D) e esquerda (h E) no diferem em mais de uma unidade em mdulo, ou
seja:

| hD hE | < = 1

A diferena entre a altura da subrvore direita e esquerda chamada fator de b alanceamento do n AVL.
Como o custo de clculo deste fator computacionalmente elevado, em geral o n possui um campo para
armazenar este tipo de informao, a qual deve ser atualizada pelos algoritmos de atualizao da estrutura.

ACH2023 Algoritmos e Estruturas de Dados I 52 5


Uso de sentinela: para reduzir o nmero de comparaes na busca, possvel criar (no momento da
inicializao da rvore) um n sentinela para o qual todos os ponteiros NULL da estrutura so direcionados.
No momento da busca, a chave em questo colocada no n sentinela e assim no se faz necessrio testar a
condio de fim da estrutura, pois a chave ser sempre encontrada (ou na sua posio real ou no sentinela).

A eficincia da busca em uma ABB com ou sem sentinela determinada pela altura da estrutura. Uma rvore
completa (de altura mnima da ordem lg n) permite uma busca de pior caso O(lg n), ou seja, to eficiente
quanto busca binria em vetor. Por outro lado, uma rvore assimtrica (de altura mxima da ordem n) exige
uma busca de pior caso O(n), ou seja, o mesmo que em uma lista ligada.

rvores completas so entretanto difceis de manter, ou seja, garantir que uma ABB continue sendo completa
depois de cada insero ou excluso pode exigir a movimentao de todos os ns da estrutura em tempo O(n),
ou seja, o mesmo problema que era verificado em listas sequenciais (vetores). No exemplo a seguir a insero
da chave 0 demonstra porque restaurar a condio de rvore completa invivel na prt ica.

ACH2023 Algoritmos e Estruturas de Dados I 6 51


2.2. L istas L inear es L igadas (ou Encadeadas)
rvores de Busca Binria (ABB)
Se a insero e excluso em listas sequenciais podem acarretar grande movimentao de dados, uma soluo
Da mesma forma que no caso das listas lineares de implementao esttica e dinmica, talvez a aplicao bvia permitir que os dados ocupem qualquer posio disponvel (e no necessariamente a posi o fsica
mais importante de rvores binrias seja seu uso como tabelas para armazenamento de dados de forma correta), e ento criar um esquema para preservar a ordem dos elementos e gerenciamento de ns livres /
eficiente. Para este propsito, os dados contidos na estrutura so ordenados de forma a viabilizar a busca ocupados.
binria de suas chaves.
Uma lista linear ligada (ou simplesmente lista ligada) uma lista linear na qual a ordem (lgica) dos
Uma rvore de busca binria uma rvore binria em que todos ns apresentam a seguinte propriedade: dado elementos da lista (chamado
um n p da estrutura, todos os descendentes esquerdos de p tm um valor de chave menor do que a chave de Pode ser implementada de forma esttica (usando-se um vetor) ou, em linguagens de programao que
p, e todos os descendentes direitos de p tm um valor de chave maior do que a chave de p. A estrutura oferecem suporte alocao dinmica, com uso de ponteiros.
obviamente no pode armazenar chaves repetidas, e seu formato depende inteiramente da ordem em que as
chaves so inseridas. Por este motivo, quanto menor a altura de uma rvore de busca melhor o seu 2.2.1. L istas L igadas de I mplementao Esttica
desempenho, pois o caminho para encontrar uma chave qualquer ser o mais curto possvel.
A lista formada pelo vetor de registros (A), um indicador de incio da estrutura (inicio) e um indicador de
A possibilidade de operar busca binria (em tempo logartmico, como fazemos em um vet or) aliada s incio da lista de ns disponveis (dispo). Na prtica, inicio e dispo so as entradas de duas listas que
vantagens da implementao dinmica (i.e., insero e excluso em tempo constante) so as principais razes compartilham o mesmo vetor, sendo uma para os elementos efetivos da lista, e a outra para armazenar as
do grande xito das rvores de busca binria como estruturas de armazenamento de tabelas de chaves, e, posies livres.
consequentemente, do seu uso generalizado na computao.

Cada registro contm, alm dos campos exigidos pela aplicao, um campo prox que contm um ndice para
o prximo elemento na srie (vazio ou ocupado, conforme descrito a seguir). Um campo prox com valor -1
ser usado para designar que o elemento em questo no possui sucessor.

Ao ser criada, a lista possui inicio = -1 (que indica que a lista est vazia) e dispo = 0 (ou seja, a primeira
Na excluso de uma chave em uma rvore de busca binria h 3 casos a tratar: posio do vetor est disponvel). Alm disso, os campos prox de cada registro (exceto o ltimo) apontam
1. o n a excluir no possui filhos; neste caso basta desalocar a memria e atualizar o ponteiro do n pai. para o registro seguinte, constituindo uma lista de registros vazios encabeada por dispo. O campo prox do
2. o n a excluir possui apenas um filho (direito ou esquerdo): neste caso o filho passa a ocupar a posio do ltimo registro recebe o valor -1 indicando que no h mais elementos depois daquele ponto.
n excludo.
3. o n a excluir possui os dois filhos: neste caso a chave a ser excluda substituda pela chave do maior A lista est cheia quando no h mais ns disponveis (i.e., quando disp o == -1). A lista esta vazia quando
descendente esquerda, ou pela chave do menor descendente direito do n em questo. Depois disso, este no h elemento inicial (i.e., quando inicio == -1).
n descendente cuja chave for promovida posio do n excludo excludo segundo o caso 1 ou 2
acima, j que ele prprio pode ter no mximo um filho (se tivesse dois filhos no poderia ser o maior
descendente esquerdo ou menor descendente direito).

ACH2023 Algoritmos e Estruturas de Dados I 50 7


O gerenciamen
um n da lista apontada por dispo. A alocao envolve descobrir o ndice de uma posio vlida no vetor na
qual novos dados possam ser inseridos, alm de retirar esta posio da lista de disponveis. A desalocao
envolve a devoluo de uma posio lista de disponveis para que possa ser reutilizada.

As rotinas de alocao/desalocao no devem ser chamadas sem que sejam seguidas da


correspondente insero/excluso, pois haver perda de dados e a estrutura se tornar inconsistente.

ACH2023 Algoritmos e Estruturas de Dados I 8 49


Algor itmos em r vor e Binr ia Comum

ACH2023 Algoritmos e Estruturas de Dados I 48 9


2.2.2. L istas L igadas de I mplementao Dinmica Outr os per cur sos

Para evitar a necessidade de definio antecipada do tamanho mximo da estrutura de implementao esttica
(i.e., o vetor), podemos tirar proveito dos recursos de alocao dinmica de memria das linguagens de
programao como C, deixando o gerenciamento de ns livres / ocupados a cargo do ambiente de
programao. Esta tcnica constitui implementao dinmica de listas ligadas, e requer o uso das funes
disponibilizadas em :

Em uma lista ligada de implementao dinmica, no h mais uso de vetores. Cada elemento da lista uma
estrutura do tipo NO, que contm os dados de cada elemento (inclusive a chave) e um ponteiro pr ox para o
prximo n da lista. Um nome auxiliar (estrutura) usado para permitir a auto-referncia ao tipo NO que est
sendo definido.

Em altura: DGHFBECA
Em nvel: ABCDEFGH
Os algoritmos para estes percursos no so recursivos. O percurso em nvel, por exemplo, mais facilmente
obtido com uma estrutura auxiliar do tipo fila, usada para armazenar os filhos de cada n visitado e ento
O tipo LISTA propriamente dito simplesmente um ponteiro inicio apontando para o primeiro n da visit-los na ordem em que so retirados da mesma.
estrutura (ou para NULL no caso da lista vazia). O ltimo elemento da lista possui seu ponteiro prox tambm
apontando para NULL. Embora no seja necessrio o encapsulamento deste ponteiro em um tipo LISTA
(afinal, uma lista apenas um ponteiro, que pode ser NULL ou no), esta medida ser adotada aqui por
questes de padronizao em relao aos tipos LISTA anteriores, e tambm porque alguns dos prximos
tipos agregaro mais informaes a esta definio.

A alocao e desalocao de ns feita dinamicamente pelo prprio compilador C atravs das primitivas
malloc e free, respectivamente.

// cria um novo n em memria, apontado por p


// a rea de memria apontada por p liberada;

Via de regra, malloc() usado em rotinas de insero ou criao de novos ns, enquanto que free() usado na
excluso. Rotinas que no criam ou destroem ns dificilmente precisam usar estas funes.

A nica diferena significativa entre as implementaes esttica e dinmica de listas ligadas est no fato de
e nos obriga a gerenciar as posies livres e

ACH2023 Algoritmos e Estruturas de Dados I 10 47


Algor itmos r ecur sivos

Os percursos bsicos em rvore binria so facilmente obtidos com uma implementao recursiva.

ACH2023 Algoritmos e Estruturas de Dados I 46 11


Pr-ordem: CBAEDF
Em-ordem: ABCDEF
Ps-ordem: ABDFEC

Algor itmos no-r ecur sivos


Os percursos bsicos em rvore binria (em especial, o de pr-ordem e o em ordem) podem ser obtidos com
uma implementao no recursiva usando uma estrutura auxiliar do tipo pilha.

ACH2023 Algoritmos e Estruturas de Dados I 12 45


Per cur sos em r vor e binr ia
Conveno: as operaes possveis (determinadas pelos ponteiros existentes) so trs: visitar a raiz, deslocar-
se para a esquerda e deslocar-se para a direita. A esquerda sempre tem prioridade sobre direita.
O n sentinela, criado ao final de uma lista, usado para armazenar a chave de busca e assim acelerar o
Os percursos possveis de acordo com esta conveno so: respectivo algoritmo, uma vez que reduz o nmero de comparaes necessrias pela metade.
- Pr-ordem: visita a raiz, esquerda e direita.
- Em ordem: esquerda, visita a raiz e direita.
- Ps-ordem: esquerda, direita e visita raiz.

ACH2023 Algoritmos e Estruturas de Dados I 44 13


I mplementao Esttica

Embora a implementao dinmica seja mais comum, rvores binrias podem ser representadas em um vetor.
Isso especialmente til em aplicaes que no sofrem grande volume de inseres e excluses; nos demais
casos a representao dinmica continua sendo a preferida.

Na representao esttica, o vetor deve ser grande o suficiente para conter o nmero mximo possvel de ns
para a altura mxima h max estabelecida, ou seja, deve ter no mnimo 2hmax 1 posies. Isso necessrio
porque mesmo os ns no existentes tero seu espao reservado no vetor, j que a posio relativa de
qualquer pai ou filho no vetor fixa, definida em funo das posies de seus antecessores.

Os ns da rvore so dispostos ao longo do vetor em nveis, da esquerda para a direita, comeando pela raiz
(que ocupa a primeira posio). Como os ns inexistentes deixam posies vazias no vetor, algum tipo de
controle deve ser feito para diferenciar posies livres e ocupadas (e.g., com uso de um campo booleano).

Uma vez que a raiz ocupa a primeira posio do vetor, os outros ns tm suas posies definidas como segue:

- pai(i) = cho (i / 2) se i == 0, no h pai


- filho_esq(i) = 2 * i se i > n, no h filho esquerdo
- filho_dir(i) = 2 * i + 1 se i > n, no h filho direito

I mplementao Dinmica

ACH2023 Algoritmos e Estruturas de Dados I 14 43


- Uma rvore binria de altura mxima para uma quantidade de n ns dita assimtrica. Neste caso, a altura
h = n e seus ns interiores possuem exatamente uma subrvore vazia cada.

Exemplos de rvores assimtricas

- Uma rvore binria de altura h cheia se possui exatamente 2h 1 ns.

Exemplo de rvore cheia possuindo o nmero mximo de ns para a sua altura.

ACH2023 Algoritmos e Estruturas de Dados I 42 15


- Uma rvore binria de altura h tem no mximo 2h 1 ns.

A altura mnima de uma rvore binria com n > 0 ns 1 + cho( log 2 n)

Uma rvore binria de altura mnima dita completa.

O n cabea, criado no incio de uma lista, usado para simplificar o projeto dos algoritmos de insero e
excluso. Pode tambm armazenar a chave de busca (funcionando como n sentinela) quando a lista for
circular.

A circularidade em geral exigncia da aplicao (e.g., que precisa percorrer continuamente a estrutura) mas
pode tambm facilitar inseres e excluses quando combinada com uso de um n cabea.

Os algoritmos a seguir so baseados em listas circulares com n cabea.

Exemplos de rvores completas. Seus ns no podem ser redistribudos formando


uma rvore de altura menor do que estas.

ACH2023 Algoritmos e Estruturas de Dados I 16 41


rvore binria resultante (as ligaes pai-filho originais so mantidas)

Pr opr iedades
i-1
- O nmero mximo de ns possveis no nvel i 2

ACH2023 Algoritmos e Estruturas de Dados I 40 17


rvore m-ria a ser convertida

Passo (a) ns irmos so interligados

Quando necessitamos percorrer a lista indistintamente em ambas as direes, usamos encadeamento duplo
(ligando cada n ao seu antecessor e ao seu sucessor).

Passo (b): ligaes pai-filho so removidas, exceto a primeira de cada grupo

ACH2023 Algoritmos e Estruturas de Dados I 18 39


3. L istas No L inear es

Quando existe mais de um caminho possveis pela estrutura, esta dita no linear. Exemplos clssicos de
estruturas deste tipo so as rvores e grafos (estes estudados em Algoritmos e Estruturas de Dados II).

3.1. r vor es
Uma rvore um conjunto de ns composto de um n especial (chamado raiz) e conjuntos disjuntos de ns
subordinados ao n raiz que so eles prprios (sub)rvores.

Ter minologia

Grau de um n: a quantidade de subrvores do n;


Grau de uma rvore: grau mximo dentre todos os ns da estrutura;
Folhas de uma rvore: ns de grau zero;
Filhos de x: razes das subrvores de x; x o n pai de seus filhos;
Ancestrais de x: todos ns no caminho desde a raiz at x.
Nvel de x: a raiz nvel 1; se um n est no nvel n, seus filhos esto no nvel n+1;
Altura de um n folha sempre 1;
Altura de um n no folha: a altura mxima dentre todas suas subrvores + 1;
Altura de uma rvore a altura de sua raiz.

Uma rvore de grau m dita m-ria. rvores m-rias so de difcil representao e manipulao (por
exemplo, a definio de muitos ponteiros em cada n representa um grande desperdcio de espao ocupado
por ponteiros NULL). Por este motivo, rvores m-rias so geralmente representadas por rvores binrias
(veja definio a seguir) sem perda de propriedades.

Em computao, rvores (e especialmente rvores binrias) so usadas para armazenar dados (chaves e outros
campos de informao) em seus ns da mesma forma que listas sequenciais e listas ligadas.

3.1.1. r vor es Binr ias

Uma rvore binria uma estrutura vazia ou um n raiz e duas subrvores chamadas esquerda e direita, as
quais so tambm rvores binrias (vazias ou no). importante observar que uma rvore binria no
apenas uma rvore de grau mximo dois, pois h tambm a questo de ordem (esquerda e direita) de
subrvores, conceito este que no existe na definio de rvore comum discutida no item anterior.

Uma vez que rvores m-rias no definem uma ordem especfica entre as subrvores de cada n, a converso
de rvore m-ria para binria trivial: basta eleger um filho qualquer como raiz da subrvore esquerda, e os
demais como subrvore direita e seus descendentes. O procedimento de converso compreende dois passos:

(a) todos os ns irmos da rvore m-ria so interligados;


(b) todas as conexes pai-filho so removidas, exceto a primeira de cada grupo.

A rvore assim resultante pode ser redesenhada na posio correta (preservando-se as ligaes esquerda e
direita estabelecidas) formando uma rvore binria.

ACH2023 Algoritmos e Estruturas de Dados I 38 19


2.3. Filas
Filas so listas lineares com disciplina de acesso FIFO (first-in, first-out, ou, primeiro a entrar o primeiro a
sair). Sua principal aplicao o armazenamento de dados em que importante preservar a ordem FIFO de
entradas e sadas.

O comportamento de fila obtido armazenando -se a posio das extremidades da estrutura (chamadas aqui
de fim e incio), e permitindo entrada

A implementao pode ser esttica (usando um vetor circular) ou dinmica (com ponteiros) sem diferenas
significativas em termos de eficincia, uma vez que estas operaes s podem ocorrer nas extremidades da
estrutura.

2.3.1. I mplementao dinmica

ACH2023 Algoritmos e Estruturas de Dados I 20 37


2.3.2. I mplementao Esttica

ACH2023 Algoritmos e Estruturas de Dados I 36 21


2.7. L istas Gener alizadas

So listas contendo dois tipos de elementos:


elementos que representam entradas para sublistas. Para decidir se um n armazena uma chave ou um
ponteiro de sublista, usamos um campo tag cuja manuteno responsabilidade do programador.
Dependendo do valor de tag, armazenamos em um campo de tipo varivel (um union em C) o dado
correspondente. Para evitar a criao de cdigos especiais para o tag, usamos a seguir uma enumerao d os
dois valores possveis (elemLista, inicioLista) para variveis do tipo IDENT. Note no entanto que o uso de
um tipo enumerado no obrigatrio e de fato no tem relao com o uso de union.

2.4. Deques (Filas de duas pontas double-ended queues)

Deques so filas que permitem tanto entrada quanto retirada em ambas extremidades. Neste caso no faz mais
sentido falar em incio e fim de fila, mas simplesmente incio1 e incio2.

Implementaes estticas e dinmicas so possveis, mas a dinmica mais comum, tirando proveito do
encadeamento duplo para permitir acesso a ambas extremidades em tempo O(1).

ACH2023 Algoritmos e Estruturas de Dados I 22 35


2.6.3. Casos Especiais: M atr izes Espar sas de Distr ibuio Regular

Se a matriz possui no-nulos distribudos de forma regular (e.g., em torno da diagonal principal) mais
conveniente elaborar uma frmula de endereamento para estes dados e mant -los em um vetor V de n
posies, onde n a quantidade de no-nulos a armazenar.

(1) M ATRIZES DIAGONAIS


Matriz cujos elementos no nulos esto na diagonal principal.

(a) tamanho do vetor de alocao: n


(b) elementos no nulos m(i,j) so tais que i == j;
(c) endereamento: m(i,j) == V(i) ou j...

(2) M ATRIZES TRIDIAGONAIS


Matriz cujos elementos no nulos esto na diagonal principal e nas linhas imediatamente acima e abaixo
desta.

(a) tamanho do vetor de alocao: 3n 2


(b) elementos no nulos m(i,j) so tais que |i j | 1
(c) endereamento ordenada por linhas, m[i, j ] == v[(2* i + j 2)]

(3) M ATRIZES TRIANGUL ARES


Matriz cujos elementos no-nulos esto na diagonal e acima (triangular superior) ou na diagonal e abaixo
(triangular inferior).
triangular superior triangular inferior

(a) tamanho do vetor de alocao (supondo matr iz quadr ada)


- H n2 elementos na matriz;
- H n elementos na diagonal principal;
- Logo, h (n2 + n) / 2 elementos no nulos.

(b) elementos no nulos:


Na triangular superior, m[i,j] 0 se i j.
Na triangular inferior, m[i,j] 0 se i j.

(c) ender eamento:


Triangular superior ordenada por colunas, m[i, j ] == v[(i - i) / 2 + j]
Triangular inferior ordenada por linhas, m[i, j ] == v[(j - j) / 2 + i]

ACH2023 Algoritmos e Estruturas de Dados I 34 23


2.5. Pilhas
Pilhas so listas lineares com disciplina de acesso FILO (first-in, last-out, ou, o primeiro a entrar o ltimo a
sair). Da mesma forma que as filas, sua principal aplicao o armazenamento de dados em que importante
preservar a ordem (neste caso, FILO) de entradas e sadas.

A pilha armazena apenas a posio de uma de suas extremidades (chamada topo), que o nico local onde
so realizadas todas as operaes de entrada e sada. A operao de entrada de dados (sempre no topo da
pilha ) chamada push e a retirada (tambm sempre do topo) chamada pop.

A implementao pode ser esttica (usando um vetor simples) ou dinmica (com ponteiros) sem diferenas
significativas em termos de eficincia, uma vez que a estrutura s admite estas operaes no topo da
estrutura.

2.5.1. I mplementao dinmica

ACH2023 Algoritmos e Estruturas de Dados I 24 33


O acesso a cada linha ou coluna indexado por meio de um vetor de ponteiros de linhas e outro de colunas.
Cada ponteiro destes vetores indica o incio de uma das listas da matriz.

Para uma matriz de MAXLIN x MAXCOL elementos, dos quais n so no-nulos, a representao por listas
cruzadas ser vantajosa (do ponto de vista da complexidade de espao) sempre que:

2.5.2. I mplementao Esttica

ACH2023 Algoritmos e Estruturas de Dados I 32 25


A economia de espao desta representao bastante significativa. Para uma matriz de MAXLIN x
MAXCOL elementos, dos quais n so no-nulos, seu uso ser vantajoso (do ponto de vista da complexidade
de espao) sempre que:

Por outro lado, a representao por linhas no apresenta bom tempo de resposta para certas operaes
matriciais. Em especial, percorrer uma linha da matriz exige que todas as linhas acima dela sejam percorridas.
2.5.3. Repr esentao de duas pilhas em um nico vetor Pior do que isso, percorrer uma coluna da matriz exige que a matriz inteira (ou melhor, todos os seus
elementos no-nulos) seja percorrida. Considerando-se que matrizes esparsas tendem a ser estruturas de
Duas pilhas de implementao esttica que no necessitam de toda sua capacidade simultaneamente podem grande porte, em muitas aplicaes estes tempos de execuo podem ser inaceitveis.
ser representadas economicamente em um nico vetor compartilhado.
2.6.2. Repr esentao por L istas Cr uzadas
As pilhas so posicionadas nas extremidades do vetor e crescem em direo ao centro. Supondo -se um vetor
com posies indexadas de 0 at MAX-1, o topo da primeira pilha inicializado com -1 e o topo da segunda Com um gasto adicional de espao de armazenamento, podemos representar uma matriz esparsa com tempo
inicializado com MAX, correspondendo as situaes de pilha vazia de cada estrutura. As duas pilhas esto de acesso proporcional ao volume de dados de cada linha ou coluna. Nesta representao, usamos uma lista
simultaneamente cheias quando no h mais posies livres entre elas, ou seja, quando (topo2 - topo1 == 1). ligada para cada linha e outra para cada coluna da matriz. As listas se cruzam, isto , compartilham os
mesmos ns em cada interseco, e por este motivo cada n armazena um ponteiro para a prxima linha
(abaixo) e prxima coluna ( direita).

1 2 3 4 5 6 7 8

2 A B
3

4 C
5 D
6 E F G H
7

ACH2023 Algoritmos e Estruturas de Dados I 26 31


2.6. M atr izes Espar sas

Uma matriz esparsa uma matriz extensa na qual poucos elementos so no -nulos (ou de valor diferente de
zero). O problema de representao destas estruturas consiste em economizar memria armazenando apenas
os dados vlidos (i.e., no nulos) sem perda das propriedades matriciais (i.e., a noo de posio em linha e
coluna de cada elemento). As implementaes mais comuns so a representao em linhas ou por listas
cruzadas.

2.6.1. Repr esentao por L inhas

A forma mais simples (porm no necessariamente mais eficiente) de armazenar uma matriz esparsa na
forma de uma tabela (na verdade, uma lista ligada) de ns contendo a linha e coluna de cada elemento e suas
demais informaes. A lista ordenada por linhas para facilitar o percurso neste sentido.

A matriz ser acessvel a partir do ponteiro de incio da lista ligada que a representa.

2.5.4. Repr esentao de 'NP' pilhas em um nico vetor

O caso geral de representao esttica de 'NP' pilhas compartilhando um nico vetor envolve o controle
individual do topo de cada pilha e tambm da sua base. Cada topo [k] aponta pa ra o ltimo elemento efetivo
de cada pilha (i.e., da mesma forma que o topo de uma pilha comum) mas, para que seja possvel diferenciar
uma pilha vazia de uma pilha unitria, cada base [k] aponta para o elemento anterior ao primeiro elemento
real da respectiva pilha.

Uma pilha k est vazia se base[k] == topo[k]. Uma pilha [k] est cheia se topo[k] == base[k+1], significando
que a pilha [k] no pode mais crescer sem sobrepor-se a pilha [k+1].

ACH2023 Algoritmos e Estruturas de Dados I 30 27


A especificao da estrutura inclui as NP pilhas reais (numeradas de 0 at NP -1) e mais uma pilha 'extra'
(fictcia) de ndice NP cuja funo descrita a seguir.

Na inicializao da estrutura, cada topo igualado a sua respectiva base, o que define uma pilha vazia. Alm
disso, para evitar acmulo de pilhas em um mesmo ponto do vetor (o que ocasionaria grande movimentao
de dados nas primeiras entradas de dados), todas as NP+1 pilhas so inicializadas com suas bases distribudas
a intervalos regulares ao longo da estrutura.
A incluso de um novo elemento no topo de uma pilha k deve considerar a existncia de espao livre e, se for
A pilha[0] fica na posio 1. A pilha[NP] - que apenas um artifcio de programao - fica o caso, movimentar as estruturas vizinhas para obt-lo. No exemplo a seguir, o programa tenta deslocar todas
permanentemente na posio MAX-1, servindo apenas como marcador de fim do vetor (i.e., esta pilha jamais as pilhas direita de k em uma posio para a direita. Se isso falhar, tenta deslocar todas as pilhas da
ser afetada pelas rotinas de deslocamento). A pilha extra ser sempre vazia e ser usada para simplificar o esquerda (inclusive k) uma posio para a esquerda. Se isso ainda no resultar em uma posio livre no topo
teste de pilha cheia, que pode se basear sempre na comparao entre um topo e a base da pilha seguinte, ao de k, ento o vetor est totalmente ocupado e a insero no pode ser realizada.
invs de se preocupar tambm com o fim do vetor.

Observe que este apenas um exemplo de estratgia possvel. Um procedimento talvez mais eficiente poderia
tentar primeiro deslocar apenas a pilha k+1 para direita. Apenas quando isso falhasse poderia ento tentar
deslocar apenas as pilha k-1 e a pilha k para a esquerda, e s em caso de ltima necessidade tentaria
o caso especial em que k a ltima pilha real (i.e., quando k == NP-1). deslocaria vrias pilhas simultaneamente como feito acima.

ACH2023 Algoritmos e Estruturas de Dados I 28 29

You might also like