Você está na página 1de 241

http://www.computacao.gigamundo.

com

ESTRUTURA DE DADOS I

Christiano Lima Santos

http://www.computacao.gigamundo.com

Tipos de Dados e Tipos Abstratos de Dados (Aula 1)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Motivao Tipos de Dados Operaes Tipos Primitivos ou Escalares


Tipos Colees ou NoEscalares


Tipo Vetor Tipo Registro Tipo Conjunto

Tipos Inteiros Tipos Reais Tipos Lgicos Tipo Caracter Funes Para Converso

Tipos Abstratos de Dados Alocao de Memria Vantagens e Desvantagens da Alocao Dinmica

http://www.computacao.gigamundo.com

Motivao
Por

que estudar os tipos de dados?

Duas

so as principais preocupaes em um projeto de software


Os procedimentos a serem executados; Os dados sobre os quais os procedimentos atuam;

http://www.computacao.gigamundo.com

Motivao
Estruturas

de Dados busca descrever modelos de estruturas de dados e procedimentos

Exemplos: Arrays, Registros, Listas, Pilhas, Filas e rvores, etc.

http://www.computacao.gigamundo.com

Motivao
Os

tipos de dados e operaes determinam as estruturas de dados


Exemplo: em uma pilha ou fila voc possui operaes push e pop para colocar e retirar elementos dela;
A

forma como os dados so inseridos ou removidos que difere uma estrutura da outra!

http://www.computacao.gigamundo.com

Tipos de Dados

Define a forma como um dado deve ser armazenado ou recuperado, bem como os possveis valores que ele pode assumir ou as operaes que podem ser efetuadas sobre os mesmos

Exemplo em Pascal:
integer permite valores inteiros e operaes de adio, multiplicao, subtrao e diviso; string permite valores literais e operaes de concatenao;

http://www.computacao.gigamundo.com

Tipos de Dados
Primitivos,

derivados ou colees;

Os principais tipos primitivos so: inteiro, real, lgico, caracter, ponteiro;

Estticos

ou dinmicos (instanciados em tempo de execuo);

http://www.computacao.gigamundo.com

Operaes

Um conjunto de instrues a fim de manipular um determinado tipo de dado a fim algum objetivo;

Criao (declarao) Percurso Busca Alterao Retirada Insero (em tipos dinmicos)

http://www.computacao.gigamundo.com

Tipos Primitivos ou Escalares


Inteiro Real

(integer, longint, etc.);

(real, double, etc.); (boolean); (char);

Lgico

Caracter

http://www.computacao.gigamundo.com

Tipos Inteiros
Operaes

numricas contidas no conjunto dos nmeros inteiros:


Soma, subtrao, multiplicao, diviso inteira, resto da diviso;

Permitem

comparaes de igualdade e/ou de desigualdade;

http://www.computacao.gigamundo.com

Tipos Reais
Satisfaz

as operaes e comparaes possveis com tipos inteiros; numricas contidas no conjunto dos nmeros reais:

Operaes

Soma, subtrao, multiplicao, diviso;

http://www.computacao.gigamundo.com

Tipos Lgicos
Permite

operaes lgicas (booleanas):

E, OU, NO;

Deve-se

ter muito cuidado na construo de expresses lgicas


Quanto maiores elas so, maiores as chances de cometermos equvocos.

http://www.computacao.gigamundo.com

Tipo Caracter

Permite a representao de um nico caracter; Operaes de igualdade e desigualdade; Por ser armazenado internamente como um valor inteiro, podemos fazer um casting e efetuar outras operaes.

http://www.computacao.gigamundo.com

Funes para converso

De real para inteiro:

Trunc, Floor, Ceil, Round;

De caracter para inteiro:

Ord;

De inteiro para caracter:

Char;

Obs: Dependendo de quais os tipos/classes envolvidos, podemos efetuar typecasting;

http://www.computacao.gigamundo.com

Tipos Colees ou No-Escalares


Vetor; Registro; Conjunto.

http://www.computacao.gigamundo.com

Tipo Vetor
Coleo

de dados homognea indexada que pode ser acessada por meio de um ndice numrico; v = array [1..5] of integer;

var

v[3];

http://www.computacao.gigamundo.com

Tipo Registro

Coleo de dados heterognea cujas informaes podem ser acessadas por meio de um campo; var r = record c1: integer; c2: boolean; end;

r.c1;

http://www.computacao.gigamundo.com

Tipo Conjunto
Coleo

de objetos (ou informaes) correlatos que podem estar presentes ou no em um dado momento; c = set of (V1, V2, V3);

var c

:= [V1, V2]; V1 in c;

http://www.computacao.gigamundo.com

Tipos Abstratos de Dados


Segundo

a Wikipdia:

Especificao de um conjunto de dados e operaes que podem ser executadas sobre esses dados;

Exemplo:

Quando usamos arrays e registros para criar uma estrutura de dados em vez de usar variveis de tipos primitivos.

http://www.computacao.gigamundo.com

Tipos Abstratos de Dados


Vetores,

registros e conjuntos so interessantes...


... Mas h um problema, so estticos!

que acontece se eu tiver um vetor de 5 posies e precisar de outras 1000? se meu vetor tiver 100000 posies e eu somente uso 5, isso bom?

http://www.computacao.gigamundo.com

Alocao de Memria
Alocao

esttica Varivel alocada ocupa espao fixo e contguo na memria; dinmica Varivel alocada ocupa espao varivel e criada segundo a necessidade do programa.

Alocao

http://www.computacao.gigamundo.com

Vantagens e Desvantagens da Alocao Dinmica

Se alocamos dinamicamente, podemos aumentar e diminuir o tamanho de nossa estrutura quando quisermos! Entretanto, necessitaremos de mais algumas operaes para buscar, inserir e/ou remover informaes; Alm disso, um array (esttico) de vinte posies geralmente ocupa menos espao que uma lista cujos elementos foram criados um a um dinamicamente.

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

http://www.computacao.gigamundo.com

Matrizes (Aula 2)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio
Definio

e Representao de Matrizes de Matrizes

Compactao

Matrizes Diagonais Matrizes Triangulares Matrizes Esparsas

http://www.computacao.gigamundo.com

Definio e Representao de Matrizes


Na

Matemtica, uma matriz pode ser considerada um conjunto de informaes numricas que podem ser referenciadas por meio de dois parmetros, comumente chamados linha e coluna;
1 2 0 2 0 1 3 3 2 4 1 5

A =

http://www.computacao.gigamundo.com

Definio e Representao de Matrizes


Na

Computao, podemos representar as matrizes matemticas por meio de estruturas conhecidas como vetores ou arrays, onde cada posio/valor pode ser referenciada por um ou mais parmetros (dependendo da quantidade de dimenses de nosso vetor);

var A = array [1..3, 1..4] of real;

http://www.computacao.gigamundo.com

Definio e Representao de Matrizes

Enquanto que na Matemtica uma matriz possui sempre duas dimenses, na Computao podemos chamar qualquer vetor de matriz, podendo assim ter uma ou mais dimenses;

Matrizes unidimensionais; Matrizes bidimensionais; Matrizes n-dimensionais.

http://www.computacao.gigamundo.com

Compactao de Matrizes
Quanto

memria ocupa uma matriz 5000 x 5000 de reais?


Um valor real = 4 bytes; Aproximadamente 100 MB!

se somente alguns poucos elementos da matriz fossem diferentes de zero, poderamos reduzir o tamanho dela?

http://www.computacao.gigamundo.com

Compactao de Matrizes
Como

representar de forma compactada:

Matrizes Diagonais; Matrizes Triangulares; Matrizes Esparsas;

http://www.computacao.gigamundo.com

Matrizes Diagonais

Os

elementos da diagonal de uma matriz so: a[1,1], a[2,2], a[3,3], ... a[n,n]; armazen-los, ento, em uma matriz unidimensional de n elementos.

Podemos

http://www.computacao.gigamundo.com

Matrizes Triangulares

Podem

ser superior ou inferior;

Podemos

armazenar todos os elementos da parte triangular em uma matriz unidimensional de m elementos (inclui os elementos da diagonal).

http://www.computacao.gigamundo.com

Matrizes Esparsas

Podem ser n-dimensionais; Podemos armazenar somente os elementos diferentes de zero em uma matriz unidimensional; Problemas:

Como saber qual o ndice de cada elemento na matriz?

Armazenar tambm o ndice (tupla ndice-valor);

E se um dos elementos for alterado para um valor nonulo?

Deve-se reservar algumas posies vazias para o caso de incluir novos elementos.

http://www.computacao.gigamundo.com

Exerccios

De volta s aulas? De volta aos jogos. Vamos criar um simulador de explorao espacial (modo texto, claro)! Crie um universo que possa ser navegado tridimensionalmente por meio da indicao de trs coordenadas X, Y e Z, onde o jogador precisa pilotar uma nave at um dos planetas existentes.

O sistema de coordenadas de nosso universo vai de 0 a 4100 (para cada coordenada); Temos um total de 100 planetas no espao; Para facilitar para o jogador, cada vez que ele indicar as coordenadas, dizer quo longe ele est do planeta mais prximo; O jogo encerra quando ele encontrar um dos planetas; Os planetas so criados em posies aleatrias a cada vez que gerada uma nova partida; E h um total de combustvel para o jogador, o qual consumido de acordo com a distncia percorrida!

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
VELOSO,

Paulo, SANTOS, Clsio, AZEREDO, Paulo, FURTADO, Antnio, Estruturas de Dados, Editora Campus Ltda

http://www.computacao.gigamundo.com

Recursividade (Aula 3)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio
Definio

de Recurso Exemplo de Recurso Recurso versus Iterao Observaes Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Definio de Recurso
Possibilidade

de um objeto buscar definir-se em funo dele prprio; Computao, um mtodo recursivo quando ele invoca a si prprio a fim de resolver um problema;

Na

http://www.computacao.gigamundo.com

Definio de Recurso
Na

Matemtica, podemos encontrar claramente a recursividade na resoluo de problemas por meio de recorrncia;

Fatorial de um nmero; Potenciao; Seqncia de Fibonacci.

http://www.computacao.gigamundo.com

Exemplo de Recurso

Recorrncia

para encontrar um elemento da seqncia de Fibonacci:


x1 = 1; x2 = 1; xn = xn-1 + xn-2;

http://www.computacao.gigamundo.com

Exemplo de Recurso

Funo em Pascal:
function fibonacci(n: integer): integer; begin if (n < 1) then fibonacci := 0 else if (n <= 2) then fibonacci := 1 else fibonacci := fibonacci(n-1) + fibonacci(n-2); end;

http://www.computacao.gigamundo.com

Recurso versus Iterao

Iterao na definio de algoritmos cada um dos passos/repeties de um comando de repetio (loop); Diversos problemas resolvidos de forma recursiva podem ser resolvidos de forma iterativa;

Chamadas recursivas precisam salvar o contexto atual da execuo do programa a fim de recuper-lo aps a execuo de cada chamada recursiva; A implementao do clculo do fatorial de forma iterativa, por exemplo, consome menos memria e processamento.

http://www.computacao.gigamundo.com

Recurso versus Iterao

Por outro lado, h problemas que no podem ser resolvidos de forma iterativa;

Percorrer uma rvore para encontrar um elemento, por exemplo;

Alm disso, recurso muito til na resoluo de diversos problemas que possam se beneficiar do dividir-para-conquistar, exemplos:

Ordenao por meio de quicksort ou mergesort; Programao dinmica; Diversas tcnicas de busca em grafos.

http://www.computacao.gigamundo.com

Observaes

Quando escrevendo funes recursivas, atente-se a:

Ordem em que cada comando deve aparecer dentro da funo o resultado final pode ser totalmente diferente se trocarmos duas linhas de cdigo de lugar! Definio de todos os casos base se esquecermos de definir um dos casos base e o algoritmo procurar por ele em algum momento, ele no saber que um caso de parada e continuar a sua execuo, talvez indefinidamente! Cuidado com a passagem de parmetros por valor ou por referncia.

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
COSTA,

Raimundo M, Programao Pascal, 1995 Recursividade em Cincia da Computao, disponvel em http://pt.wikipedia.org/wiki/Recursividade_( cincia_da_computao)

WIKIPDIA,

http://www.computacao.gigamundo.com

Noes de Complexidade de Algoritmos (Aula 4)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Motivao Alguns Mitos Como Medir a Eficincia de um Algoritmo?


Principais Classes de Comportamento Assinttico

Tabela Comparativa das Principais Classes O Melhor Caso O Pior Caso O Caso Mdio

Avaliao Emprica Contagem do Nmero de Operaes Efetuadas Determinao da Complexidade Assinttica de um Algoritmo

Os Trs Casos

Notao O Notao Notao

Calculando a Complexidade para cada Caso Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Motivao
Quais

os dois recursos de hardware mais importantes para a execuo de um algoritmo?


Tempo de processamento; Quantidade de memria consumida;

Devemos,

ento, observar quanto de cada recurso nossos algoritmos consomem;


Temos que medir quanto de cada recurso nossos programas utilizam!

http://www.computacao.gigamundo.com

Motivao
Um

exemplo bem simples o caso de dois programas que precisam fazer a ordenao de um grande conjunto de dados:

Cada qual deles pode usar uma abordagem bem diferente do outro; Desta forma, cada qual pode resolver o problema com mais ou menos tempo, ocupando mais ou menos memria; Como exmios Cientistas da Computao, buscamos sempre compreender e trabalhar com a melhor soluo possvel!

http://www.computacao.gigamundo.com

Alguns Mitos

Basta um computador mais rpido para resolver o problema;

Pena que at mesmo um grande cluster com dezenas de computadores no conseguem resolver eficientemente alguns problemas somente por fora bruta;

Ningum efetua clculo de complexidade ou busca de soluo mais eficiente em um sistema!

, se voc considerar somente os sistemas do tipo controle de locadora, pois sistemas de tempo real, simulaes fsicas, sistemas para clculos estatsticos e estimativas razoavelmente pesadas e tantos outros precisam!

http://www.computacao.gigamundo.com

Alguns Mitos
Por

que eu tenho que aprender sobre isso? Eu posso simplesmente contratar algum!
Pois , que tal algum da rea de Computao? Ei, esse algum voc!

http://www.computacao.gigamundo.com

Como Medir a Eficincia de um Algoritmo?


Avaliao

emprica (medir o tempo de execuo); do nmero de operaes

Contagem

efetuadas;

Determinao

da complexidade assinttica de um algoritmo;

http://www.computacao.gigamundo.com

Avaliao Emprica

Experimento 1: Verificar o tempo que dois programas levam para efetuar uma busca em um array e recuperar um dado;

Primeiro programa: 750 ns; Segundo programa: 600 ns;

Qual programa mais eficiente?


E se o primeiro foi executado em um core duo de 2,4 GHz cada, e o segundo em um 486 DX2? E se ambos foram executados na mesma mquina, mas o segundo executou em paralelo com algum outro programa? Somente por avaliao emprica, conseguimos ter certeza de qual o programa mais eficiente?

http://www.computacao.gigamundo.com

Consideraes sobre a Avaliao Emprica

Em meu supercomputador o programa rodou normal...

... Mas nos computadores do cliente no!

Programas podem possuir casos especiais para alguns tipos de casos

Deve-se ento aumentar o nmero de casos de testes tentando cobrir o maior nmero possvel de situaes;

Em uma dada linguagem, um programa pode ser mais eficiente do que quando implementado em outra linguagem;

No estamos analisando o algoritmo em si, mas somente o programa!

http://www.computacao.gigamundo.com

Contagem do Nmero de Operaes Efetuadas

Experimento 2: Dado o algoritmo abaixo, vamos contar quantas operaes so necessrias para calcular fatorial(5): function fatorial (n: integer): longint; var f, i: integer; begin if (n < 0) then f := -1 else begin f := 1; for i := 1 to n do f := f*i; end; fatorial := f; end;

http://www.computacao.gigamundo.com

Contagem do Nmero de Operaes Efetuadas


No

algoritmo anterior:

fatorial(1) 5 operaes; fatorial(5) 13 operaes; fatorial(10) 23 operaes; fatorial(n) 2*n + 3;

Perceba

que para calcular o fatorial de um nmero N qualquer, vamos executar 2*N operaes, ou seja, um nmero de operaes diretamente proporcional;

http://www.computacao.gigamundo.com

Consideraes do Nmero de Operaes Efetuadas

Em Computao, geralmente no nos preocupamos com a eficincia do algoritmo quando tratando poucos elementos

Se so poucos, por pior que nosso algoritmo seja, provavelmente ele executar rpido e sem ocupar muito espao! 2*n + 3 operaes parecem piores que n2 operaes para n = 0, 1 ou 2;

Entretanto, quanto maior o nmero de elementos ou o valor do dado de entrada...


Para n = 1.000, 2*n + 3 2003; Mas e se nosso algoritmo executasse n2 operaes? 1.000.000!

http://www.computacao.gigamundo.com

Determinao da Complexidade Assinttica de um Algoritmo

Definio de Complexidade

Quantidade de "trabalho" necessria para a execuo de um algoritmo, expressa em funo das operaes fundamentais, as quais variam de acordo com o algoritmo, e em funo do volume de dados;

Complexidade Assinttica

Trata-se de uma funo que expressa a relao entre o volume de dados ( n ) e o tempo ( t ) necessrio para o processamento dos mesmos; No algoritmo do experimento 2, poderamos dizer que:
f(n) = 2*n + 3

http://www.computacao.gigamundo.com

Determinao da Complexidade Assinttica de um Algoritmo

Notaes

O (O Grande), (Omega) e

(Theta);
Obs:

Funes assintoticamente nonegativas;

http://www.computacao.gigamundo.com

Notao O

Dadas duas funes f e g, diz-se que f est na ordem O de g ( f = O(g) ) se: f(n) c * g(n) Para algum c positivo e para todo n suficientemente grande. g(n) , ento, o limite assinttico superior (upper bound) de f(n) Exemplos: 3x2 + 5 = O ( x2 ) x3/2 = O ( x3) 1 + 2 + 3 + ... + x = O ( x2 )

http://www.computacao.gigamundo.com

Notao

Dadas duas funes f e g, diz-se que f est na ordem O de g ( f = (g) ) se: f(n) c * g(n) Para algum c positivo e para todo n suficientemente grande. g(n) , ento, o limite assinttico inferior (lower bound) de f(n) Exemplos: 3x3 + 5 = ( x2 ) x3/2 = ( x3/3)

http://www.computacao.gigamundo.com

Notao
Dadas

duas funes f e g, diz-se que f est na ordem O de g ( f = (g) ) se: f(n) c1 * g(n) e f(n) c2 * g(n) Para algum c1 e c2 positivos e para todo n suficientemente grande.

Exemplo:

3x3+ 5 = ( x3 )

http://www.computacao.gigamundo.com

Principais Classes de Comportamento Assinttico

O (1) : O uso do algoritmo independe do tamanho de n. Neste caso as instrues do algoritmo so executadas um nmero fixo de vezes; O (log n): ocorre tipicamente em algoritmos que resolvem um problema transformando-o em problemas menores; O (n): linear Um conjunto de operaes de tamanho constante aplicado a cada elemento da entrada; O (n log n): Ocorre em algoritmos que resolvem um problema quebrando-o em problemas menores, resolvendo cada um deles independentemente e depois juntando as solues;

http://www.computacao.gigamundo.com

Principais Classes de Comportamento Assinttico

O (n2): quadrtico. Algoritmos desta ordem de complexidade ocorrem quando os itens de dados so processados aos pares, muitas vezes em um loop dentro de outro. teis para resolver problemas de tamanhos relativamente pequenos; O (nk): polinomial OK para k pequeno; O (kn), O (n!), O (nn): exponencial Geralmente no so teis sob o ponto de vista prtico. Eles ocorrem na soluo de problemas quando se usa fora bruta para resolv-los.

http://www.computacao.gigamundo.com

Tabela Comparativa das Principais Classes

CLASSE NOTAO O constante O(1) logaritmico O(lg n) linear O(n) O(n lg n) O(n lg n) quadrtico O(n) cbico O(n) exponencial O(2^n)

n=10 1 3,32 10 33,2 100 1000 1024

n=100 1 6,64 100 664 10000 1000000 10^30

n=1000 1 9,97 1000 9970 1000000 10^9 10^301

... n=1000000 1 19,93 1000000 199,3*10^5 10^12 10^18 10^301030

http://www.computacao.gigamundo.com

Os Trs Casos

Para qualquer algoritmo, sempre h situaes em que ele resolver de forma muito rpida e outras em que nem tanto;

Exemplo: ordenao dos dados de um vetor


Se ele j estiver ordenado? timo! E se os dados estiverem em ordem inversa? Dependendo do algoritmo, pode ser muito ruim;

Desta forma, para determinar a eficincia de um algoritmo, precisamos conhecer a sua complexidade para o melhor caso, o pior caso e o caso mdio.

http://www.computacao.gigamundo.com

Melhor Caso
Caso

para o qual o algoritmo executa da melhor forma possvel:


Menor nmero de instrues; Menor tempo de processamento necessrio; Menor consumo de memria.

http://www.computacao.gigamundo.com

Pior Caso
Ao

contrrio do melhor caso, este o caso para o qual o algoritmo executa da pior forma possvel;

http://www.computacao.gigamundo.com

Caso Mdio
A

complexidade para o caso mdio dada por meio de clculo tempo mdio esperado para a resoluo de um problema qualquer, independente de como os dados esto (se ordenados ou no, etc);

http://www.computacao.gigamundo.com

Calculando a Complexidade Para Cada Caso


Geralmente,

necessrio conhecer qual o volume de dados que atende a cada um dos casos e, ento, busca-se definir a funo matemtica que expressa o nmero de operaes necessrias para cada caso; caso de algoritmos recursivos, deve-se determinar primeiro a frmula de recorrncia capaz de express-los e, ento, resolv-la.

No

http://www.computacao.gigamundo.com

Referncias Bibliogrficas

MADEIRA, Gonalo, Complexidade Computacional, disponvel em http://w3.ualg.pt/~hshah/algoritmos/aula8/Aula8.htm SILVA, Elton, Anlise Assinttica da Complexidade de Algoritmos, disponvel em http://www.decom.ufop.br/prof/elton/cic210/cap2.pdf

http://www.computacao.gigamundo.com

Exerccios Sobre Matrizes, Recursividade e Complexidade de Algoritmos (Aula 5)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Primeiro Exerccio

Implemente um programa capaz de armazenar e recuperar dados de uma matriz triangular inferior; Qual a ordem de complexidade desse algoritmo para:

Armazenar n elementos; Para recuperar um elemento qualquer, dada a sua posio na matriz inicial; Para buscar a posio de um elemento qualquer, dado o valor do elemento;

Voc consegue identificar quais so os casos pior, mdio e melhor?

http://www.computacao.gigamundo.com

Segundo Exerccio

Implemente um programa que localiza uma substring dentro de outra string; Qual a ordem de complexidade desse algoritmo para:

Encontrar uma letra em uma frase de tamanho N; Encontrar uma palavra de tamanho K em uma frase de tamanho N;

Voc consegue identificar quais so os casos pior, mdio e melhor?

http://www.computacao.gigamundo.com

Terceiro Exerccio

Implemente um programa que armazena os telefones armazenados em ordem alfabtica de acordo com os nomes das pessoas seguindo a seguinte frmula:

Toda vez que for inserir um novo telefone, procura qual ser a posio correta dele e, para inseri-lo ali, move antes todo mundo daquela posio em diante para uma aps e, ento, copia seus dados para l (insero direta);

Qual a ordem de complexidade deste algoritmo? Voc consegue identificar quais so os casos pior, mdio e melhor?

http://www.computacao.gigamundo.com

Quarto exerccio
Implemente

a funo de potenciao de forma recursiva; a complexidade deste algoritmo?

Qual Faa

uma comparao das vantagens e desvantagens desta implementao em relao iterativa.

http://www.computacao.gigamundo.com

Ponteiros e Alocao Dinmica (Aula 6)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio
Motivao; Definio

de ponteiro; Tipos de ponteiro; Apontando para um endereo nulo; Apontando e recuperando uma varivel; Apontando e Invocando um Subprograma; Alocao Dinmica de Memria; Alocando e desalocando memria; Referncias Bibliogrficas.

http://www.computacao.gigamundo.com

Motivao

Por que estudar alocao dinmica se podemos criar todas as estruturas de forma esttica? O que acontece em um programa com alocao esttica quando precisamos de estruturas maiores do que as que foram criadas? Ponteiros e alocao dinmica permite-nos criar diversos Tipos Abstratos de Dados;

fcil cri-los somente com alocao esttica? Como seria?

http://www.computacao.gigamundo.com

Definio de ponteiro

Tipo de varivel que aponta para um outro endereo de memria; O contedo de uma varivel ponteiro o endereo de memria para o qual est apontando; Um ponteiro pode referenciar e des-referenciar;

http://www.computacao.gigamundo.com

Definio de ponteiro
Um

ponteiro pode apontar para:

Uma rea com informao (uma varivel ou contedo de uma varivel); Uma rotina (procedimento ou funo); Endereo nulo.

http://www.computacao.gigamundo.com

Tipos de Ponteiro
Tipado

ir interpretar o dado do endereo referenciado segundo o seu tipo;


Declarao:
var

p : ^integer;

No-Tipado

no est associado a um tipo, logo, necessrio fazer o typecasting da informao referenciada a fim de acess-la;

Declarao:
var

p : Pointer;

http://www.computacao.gigamundo.com

Apontando para um endereo nulo

Em Pascal, nil representa um endereo nulo que qualquer ponteiro pode apontar; ponteiro := nil; if ponteiro = nil then writeln(No est apontando) else writeln(Est apontando para , ponteiro);

http://www.computacao.gigamundo.com

Apontando e Recuperando uma varivel


program ponteiro1; uses crt; var p: ^integer; a: integer; BEGIN a := 12; p := @a; writeln(O endereo de a : , p); writeln(O valor de a : , p^); p^ := 6; writeln(O novo valor de a : , p^, . Confirmando: , a); readkey; END.

http://www.computacao.gigamundo.com

Apontando e Invocando um Subprograma


program ponteiro2; uses crt; var D: procedure(Arg: Byte); procedure rotina1(Arg: Byte); Begin writeln('Rotina 1 recebeu ', Arg); end; procedure rotina2(Arg: Byte); Begin writeln('Rotina 2 recebeu ', Arg); end; BEGIN D := @rotina2; D(10); { Ir imprimir: 'Rotina 2 recebeu 10' } END.

http://www.computacao.gigamundo.com

Alocao Dinmica de Memria

a criao (reserva) de um endereo de memria para uma dada varivel do tipo ponteiro; quando alocamos dinamicamente um endereo de memria, devemos desaloc-la (na alocao esttica, o compilador encarregado disso).

Geralmente,

http://www.computacao.gigamundo.com

Alocando e Desalocando Memria


program ponteiro3; uses crt; var p: ^integer; BEGIN new(p); p^ := 12; writeln(Endereo apontado: , p); writeln(Valor armazenado: , p^); readkey; dispose(p); END.

No confunda nil com new!

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
Blog

de Joo Morais, http://blog.joaomorais.com.br/2008/08/23/ponteiros

http://www2.dc.ufscar.br/~bsi/materiais/ed/u7.html

http://www.computacao.gigamundo.com

Listas (Aula 7)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio
Definio

de Lista Caractersticas Tipos de Implementao


Lista Seqencial Lista Encadeada ou Dinmica


Outros

Tipos de Listas

Implementao

de uma Lista Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Definio de Lista
TAD

que permite representao e manipulao de seus elementos de forma linear; chamada lista linear;

Tambm

L e1, e2, ... , en;

http://www.computacao.gigamundo.com

Caractersticas

Uma Itens

coleo de dados homognea; dispostos em seqncia;

Quantificvel; Ordenvel;

http://www.computacao.gigamundo.com

Tipos de Implementao

Seqencial

Encadeada

ou Dinmica

http://www.computacao.gigamundo.com

Lista Seqencial
Os

itens so armazenados em posio contgua na memria; ser implementadas por meio de um

Podem

array!

programa executa um determinado clculo para encontrar a posio na memria em que se encontra o elemento ei;

http://www.computacao.gigamundo.com

Lista Encadeada ou Dinmica

A lista cresce dinamicamente, isto , cada novo elemento criado e inserido nela em tempo de execuo; Se criado em tempo de execuo, precisamos usar ponteiros... Onde estar o ponteiro para cada elemento?

Cada elemento possui o ponteiro para o prximo elemento;

Listas podem ser encadeadas, duplamente encadeadas ou n-uplamente encadeadas (s depende de sua criatividade)!

http://www.computacao.gigamundo.com

Outros Tipos de Listas


Podemos

precisar de listas que satisfaam certas restries quanto forma de recuperar um elemento ou de insero do mesmo;

Pilhas; Filas.

http://www.computacao.gigamundo.com

Implementao de uma Lista

Lista Seqencial var lista: array [1..N] of integer; Lista Encadeada type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; var lista: TNo;

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

http://www.computacao.gigamundo.com

Buscas em Listas (Aula 8)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Definio de Busca Tipos de Busca Busca Seqencial


Busca Interpolada

Implementao Complexidade

Implementao Complexidade Implementao Complexidade

Busca Binria

Comparando os Trs Mtodos Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Definio de Busca
Operao

de percurso de uma estrutura de dados e recuperao de uma informao baseado em algum campo-chave; de informaes em uma lista uma operao importante e o tempo que operaes de insero, remoo e busca levam para serem processadas afetam diretamente a eficincia de um algoritmo.

Recuperao

http://www.computacao.gigamundo.com

Tipos de Busca

Busca Seqencial baseia-se no percurso de todos os elementos de uma lista de forma seqencial; Busca Binria baseia-se no percurso dos elementos de uma lista levando em considerao o valor de chave esperado e o valor encontrado; Busca Interpolada similar busca binria, introduz clculo de prxima posio a ser verificada levando em considerao os valores dos elementos-limite.

http://www.computacao.gigamundo.com

Busca Seqencial
Se

voc no sabe por onde comear, comece pelo comeo; se conhece uma ordenao dentro da

No

lista;
Somos

forados a verificar um por um.

http://www.computacao.gigamundo.com

Busca Seqencial - Implementao


function buscaSeq(lista: TLista; tamanho, chave: integer): integer; var i : integer; Begin For i := 1 to tamanho do If lista[i] = chave then Begin buscaSeq := i; exit; End; buscaSeq := -1; End;

http://www.computacao.gigamundo.com

Busca Seqencial - Complexidade

Qual

a complexidade para:

O melhor caso; O pior caso; O caso mdio.

http://www.computacao.gigamundo.com

Busca Binria

Quando

os elementos de uma lista esto ordenados segundo um campo-chave, podemos tirar proveito disso;

O primeiro elemento o menor; O ltimo elemento o maior; O elemento do meio... o do meio!

http://www.computacao.gigamundo.com

Busca Binria

Suponha uma lista com valores ordenados de forma crescente; Dado um intervalo [A, B] (inicialmente, A 1 e B o tamanho da lista), calculo um elemento X = floor((A + B) / 2); Se lista[X] o valor que procuro, retorno a posio / elemento encontrado; Seno, se lista[X] maior que o valor que procuro, ento devo olhar o intervalo que possui os valores menores que lista[X], ou seja, [A, X-1]; Seno, se lista[X] menor que o valor que procuro, ento devo olhar o intervalo que possui os valores maiores que lista[X], ou seja, [X+1, B]; Repito todo o processo at encontrar (ou no!) o elemento.

http://www.computacao.gigamundo.com

Busca Binria - Implementao


function buscaBin(lista: TLista; tamanho, chave: integer): integer; var A, B, X: integer; Begin A := 1; B := tamanho; While (A <= B) do Begin X := floor( (A + B) / 2); If lista[X] = chave then Begin buscaBin := X; exit; End Else If lista[X] < chave then A := X + 1 Else B := X - 1; End; buscaBin := -1; End;

http://www.computacao.gigamundo.com

Busca Binria - Complexidade

Qual

a complexidade para:

O melhor caso; O pior caso; O caso mdio.

http://www.computacao.gigamundo.com

Busca Interpolada

Similar

busca binria, leva em conta a ordenao dos dados de uma lista; em vez de olhar sempre o elemento mediano, efetua um clculo que busca estimar onde o elemento desejado deve estar.

Entretanto,

http://www.computacao.gigamundo.com

Busca Interpolada
Se

tenho uma lista ordenada crescente com 50 elementos, o primeiro o 1 e o ltimo o 1000, onde provavelmente estar o 999?

Prximo do incio; No meio; Prximo do fim.

http://www.computacao.gigamundo.com

Busca Interpolada
Basta

mudar o clculo do termo X:

X := 1 + floor((tamanho - 1)*(chave lista[A])/(lista[B] lista[A]));

http://www.computacao.gigamundo.com

Busca Interpolada - Implementao


function buscaInterp(lista: TLista; tamanho, chave: integer): integer; var A, B, X: integer; Begin A := 1; B := tamanho; While (A <= B) do Begin X := 1 + floor((tamanho - 1)*(chave lista[A])/(lista[B] lista[A])); If lista[X] = chave then Begin buscaInterp := X; exit; End Else If lista[X] < chave then A := X + 1 Else B := X - 1; End; buscaInterp := -1; End;

http://www.computacao.gigamundo.com

Busca Interpolada - Complexidade

Qual

a complexidade para:

O melhor caso; O pior caso; O caso mdio.

http://www.computacao.gigamundo.com

Comparando os Trs Mtodos


Em O

que ocasies o busca seqencial melhor?

que melhor: busca interpolada ou busca binria? se na busca binria / interpolada comparssemos tambm os valores dos extremos com o valor da chave, melhoraramos a eficincia?

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

http://www.computacao.gigamundo.com

Listas Encadeadas (Aula 9)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Definio de Lista Encadeada Listas Encadeadas Estticas Listas Encadeadas Dinmicas Listas Encadeadas Simples Operaes em Listas Encadeadas Definindo nossa Lista Encadeada Insero na Lista Encadeada Busca na Lista Encadeada Remoo na Lista Encadeada Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Definio de Lista Encadeada


Toda

lista linear onde cada elemento (geralmente chamado n) possui algum apontador para o prximo elemento; | |

...

Esse

encadeamento produz a estrutura linear da lista.

http://www.computacao.gigamundo.com

Lista Encadeadas Estticas

Alguns autores consideram a possibilidade de listas encadeadas criadas de forma esttica; Exemplo de lista encadeada no dinmica; O apontadores so inteiros.

0 1 2 3 4 5 Carlos Erica Beth Ana Davi

4 5 -1 1 3 2

http://www.computacao.gigamundo.com

Listas Encadeadas Dinmicas

Permitem

a insero de novos elementos com menos restries quanto posio (no precisa ser contgua) ou quantidade.

http://www.computacao.gigamundo.com

Listas Encadeadas Simples

Cada n possui um nico apontador para o prximo n; Para fins de facilitar a insero, alterao (quando ordenada), remoo e busca pelo valor presente em um n qualquer da lista, podemos eleger um campo (ou atributo) do n para ser o campo-chave do mesmo; Podem ser implementadas com listas seqenciais ou dinmicas.

http://www.computacao.gigamundo.com

Operaes em Lista Encadeada


Criao; Insero; Busca

/ Recuperao;

Remoo.

http://www.computacao.gigamundo.com

Definindo Nossa Lista Encadeada (opo 1)


type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; TLista = PNo;

http://www.computacao.gigamundo.com

Definindo Nossa Lista Encadeada (opo 2)


type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; TLista = record primeiro: PNo; ultimo: PNo; tamanho: integer; end;

http://www.computacao.gigamundo.com

Insero na Lista Encadeada


//Insero no fim da Lista
procedure inserirFim(var a: TLista; var v: integer); var p, t: PNo; Begin new(p); p^.valor := v; p^.proximo := nil; if a = nil then a := p else begin t := a; while (t^.proximo <> nil) do t := t^.proximo; t^.proximo := p; end; end;

http://www.computacao.gigamundo.com

Insero na Lista Encadeada


//Insero no incio da Lista
procedure inserirInicio(var a: TLista; var v: integer); var p, t: PNo; Begin new(p); p^.valor := v; p^.proximo := a; a := p; end;

http://www.computacao.gigamundo.com

Insero na Lista Encadeada


//Insero ordenada
procedure inserirOrdenado(var a: TLista; var v: integer); var p, t: PNo; Begin new(p); p^.valor := v; p^.proximo := nil; if a = nil then a := p else if a^.valor >= v then begin p^.proximo := a; a := p; end else begin t := a; while ((t^.proximo <> nil) && ((t^.proximo^).valor < v)) do t := t^.proximo; if (t.proximo = nil) then t^.proximo := p else begin p^.proximo := t^.proximo; t^.proximo := p; end; end; end;

http://www.computacao.gigamundo.com

Busca na Lista Encadeada


//Busca Seqencial
function buscaSeq(a: TLista; v: integer): PNo; var t: PNo; Begin t := a; while ((t <> nil) && (t^.valor <> v)) t := t^.proximo; buscaSeq := t; End;

http://www.computacao.gigamundo.com

Busca na Lista Encadeada

Em

Listas Encadeadas Dinmicas, Busca Binria ou Interpolada, possvel? H vantagens em seu uso em relao Busca Seqencial?

http://www.computacao.gigamundo.com

Remoo na Lista Encadeada

Como seria a remoo de um elemento em uma lista encadeada? E a remoo de todos os elementos? No caso de remoo de um elemento (e), tomar o cuidado para garantir que o anterior (t) dele passe a apontar para o sucessor dele (t.proximo := e.proximo); No caso de remoo de todos os elementos, a idia percorrer todos os elementos da lista, removendo-os (dispose); Cuidado para no remover um elemento antes de guardar a referncia para o prximo como saber quem o prximo elemento de um elemento que no mais existe?

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

http://www.computacao.gigamundo.com

Pilhas & Filas (Aula 10)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio
Definio

de Pilha

Exemplo de Pilha no Mundo Real Implementao de uma Pilha

Definio

de Fila

Exemplo de Fila no Mundo Real Implementao de uma Fila

Exerccios Referncias

Bibliogrficas

http://www.computacao.gigamundo.com

Definio de Pilha
Toda

lista linear onde o ltimo elemento a entrar o primeiro a sair (ou o primeiro a entrar o ltimo a sair, FILO); satisfazer esta condio, basta que a insero e remoo sejam feitas na mesma extremidade da lista (head);

Para

Obviamente, no necessrio ordenar;

http://www.computacao.gigamundo.com

Exemplo de Pilha no Mundo Real


Um

baralho de cartas, colocadas uma a uma sobre a mesa, umas sobre as outras, formando um monte; carta mais ao topo (a primeira a ser removida) foi a ltima a ser colocada sobre o monte;

http://www.computacao.gigamundo.com

Implementao de uma Pilha


type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; TPilha = record head: PNo; end; function push(var pilha: TPilha; valor: integer): Boolean; function pop(var pilha: TPilha): integer;

http://www.computacao.gigamundo.com

Implementao de uma Pilha


Push:

Nada mais que o nosso mtodo inserirInicio! Como devemos inserir e remover da mesma extremidade da lista, devemos ento remover do incio, devolvendo ento o valor daquele elemento.

Pop:

http://www.computacao.gigamundo.com

Implementando o Mtodo Push


function push(var pilha: TPilha; valor: integer): Boolean; var p, t: PNo; Begin new(p); p^.valor := v; p^.proximo := pilha.head; pilha.head := p; push := true; end;

http://www.computacao.gigamundo.com

Implementando o Mtodo Pop


function pop(var pilha: TPilha): integer; var p: PNo; Begin if (pilha.head = nil) then pop := -1 else begin p := pilha.head; pilha.head := pilha.head^.proximo; pop := p^.valor; dispose(p); end; end;

http://www.computacao.gigamundo.com

Definio de Fila
Toda

lista linear onde o primeiro elemento a entrar o primeiro a sair (FIFO); satisfazer esta condio, basta que a insero seja feita em uma extremidade (tail) da lista e a remoo seja feita na outra extremidade (head);

Para

Obviamente, tambm no necessrio ordenar;

http://www.computacao.gigamundo.com

Exemplo de Fila no Mundo Real


Muitas A

coisas so ordenadas por fila;

fila de um banco por exemplo;


... e a fila do RESUN?

Muitos

processos e requisies em um computador so organizados e gerenciados por meio de filas.

http://www.computacao.gigamundo.com

Implementao de uma Fila


type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; TFila = record head: PNo; tail: PNo; end; function push(var pilha: TFila; valor: integer): Boolean; function pop(var pilha: TFila): integer;

http://www.computacao.gigamundo.com

Implementao de uma Fila


Push:

Apesar de inserir no final, ns no precisaremos percorrer toda a fila para inserir no fim;

Ns mantemos um ponteiro para o ltimo elemento!

Pop:

A remoo continua sendo feita na cabea, o que facilita muito as coisas.

http://www.computacao.gigamundo.com

Implementando o Mtodo Push


function push(var fila: TFila; valor: integer): Boolean; var p, t: PNo; Begin new(p); p^.valor := v; p^.proximo := nil; if (fila.tail = nil) then fila.head := p else fila.tail^.proximo := p; fila.tail := p; push := true; end;

http://www.computacao.gigamundo.com

Implementando o Mtodo Pop


function pop(var fila: TFila): integer; var p: PNo; Begin if (fila^.head = nil) then pop := -1; else begin p := fila; fila^.head := fila^.head^.proximo; if (fila^.head = nil) then fila^.tail := nil; pop := p^.valor; dispose(p); end; end;

http://www.computacao.gigamundo.com

Exerccio

Crie um jogo para ser disputado por duas pessoas com dois modos (o modo pilha e o modo fila) e a opo de sair; Primeiro, Deve-se escolher quantos nmeros sero embaralhados e ocultos e qual o modo de organizao dos mesmos; Em segundo lugar, o jogo dever ir inserindo cada nmero (0 <= K <= 9) na pilha/fila, mostrando um de cada vez na tela (lembre-se de limpar ela por inteiro a cada nmero mostrado); Aps isso, os jogadores devem alternar-se tentando adivinhar qual o prximo nmero a ser removido do jogo. Ganha quem no errar. Caso acabem todos os nmeros, declarar empate; Quando os jogadores escolherem sair, mostrar o placar final e encerrar o jogo.

http://www.computacao.gigamundo.com

Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Outros Tipos de Listas (Aula 11)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio
Lista

Duplamente Encadeada

Declarao Operaes

Lista

Circular

Declarao Operaes

Exerccios Referncias

Bibliogrficas

http://www.computacao.gigamundo.com

Lista Duplamente Encadeada

Uma estrutura de dados linear que se utiliza de dois ponteiros (um apontando o elemento anterior e outro o posterior) a fim de permitir percorrer a mesma no somente avanando, como tambm recuando;

...

http://www.computacao.gigamundo.com

Lista Duplamente Encadeada


Vantagem:

Facilidades na hora de procurar um elemento, principalmente se o mesmo estiver antes da atual posio pesquisada;

Desvantagem:

Nas inseres, remoes e alteraes, isso significa mais ponteiros para atualizar, o que pode levar programadores no muito bons a cometer falhas (o que no o caso de vocs!).

http://www.computacao.gigamundo.com

Declarao de uma Lista Duplamente Encadeada (opo 1)


type PNo = ^TNo; TNo = record valor: integer; anterior: PNo; proximo: PNo; end; TLista = PNo;

http://www.computacao.gigamundo.com

Declarao de uma Lista Duplamente Encadeada (opo 2)


type PNo = ^TNo; TNo = record valor: integer; anterior: PNo; proximo: PNo; end; TLista = record primeiro: PNo; ultimo: PNo; tamanho: integer; end;

http://www.computacao.gigamundo.com

Operaes em Lista Duplamente Encadeada


Operaes

Bsicas:

Criao; Insero; Busca / Recuperao; Remoo;

Como

seriam essas operaes em uma Lista DE se ela no estiver ordenada? E se estiver ordenada?

http://www.computacao.gigamundo.com

Lista Circular

Estrutura de dados linear em que o ltimo elemento aponta para o primeiro; Lista em que todo elemento possui um sucessor (o sucessor do ltimo o primeiro elemento); Pode-se adotar encadeamento simples, duplo ou outro qualquer;

http://www.computacao.gigamundo.com

Lista Circular
Observaes:

No h mais elementos apontando para nil, logo no podemos mais identificar o ltimo elemento desta forma!
Mas

podemos parar quando percebermos que o prximo o primeiro elemento (apontado pela lista circular);

Podemos at mesmo deslocar a cabea da lista sem que se perca a referncia para nenhum dos elementos;
Mas

isso no interessante caso a lista seja ordenada.

http://www.computacao.gigamundo.com

Declarao de uma Lista Circular (opo 1)


type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; TLista = PNo;

http://www.computacao.gigamundo.com

Declarao de uma Lista Circular (opo 2)


type PNo = ^TNo; TNo = record valor: integer; proximo: PNo; end; TLista = record primeiro: PNo; tamanho: integer; end;

http://www.computacao.gigamundo.com

Operaes em Lista Circular


Operaes

Bsicas:

Criao; Insero; Busca / Recuperao; Remoo;

Como

seriam essas operaes em uma Lista Circular se ela no estiver ordenada? E se estiver ordenada?

http://www.computacao.gigamundo.com

Exerccios
Implemente

as operaes de insero, busca, alterao e remoo para:

Lista duplamente encadeada no-ordenada; Lista duplamente encadeada ordenada; Lista circular.

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

http://www.computacao.gigamundo.com

rvores (Aula 12)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Definio de rvore Representao Grfica Classificao das rvores Declarao de uma rvore N-ria Declarao de uma rvore No N-ria Nvel de um N Altura ou Profundidade de uma rvore Percurso de uma rvore Insero em uma rvore

Remoo em uma rvore rvores Binrias rvores Binrias de Busca Insero em uma rvore Binria de Busca Busca em uma rvore Binria de Busca Deleo em uma rvore Binria de Busca Comparaes entre Ordens de Complexidade Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Definio de rvore
Estrutura Um

de dados no linear;

grafo totalmente conexo e acclico; a uma rvore (reino vegetal):

Analogia

Raiz; Folhas; galhos ou sub-rvores conceito de poda.

http://www.computacao.gigamundo.com

Representao Grfica

http://www.computacao.gigamundo.com

Classificao das rvores


Uma

rvore pode ser classificada de diversas formas diferentes, uma delas pelo nmero mximo de ns-filhos que cada npai pode ter:

Binria (dois ns); Ternria (trs ns); Quaternria (quatro ns); N-ria (N ns); No N-ria (quando no conhecemos ou no h um nmero mximo de ns-filhos para cada npai).

http://www.computacao.gigamundo.com

Declarao de uma rvore N-ria


const N = 2; type PNo = ^Tno; TNo = record valor: integer; filhos: array [1..N] of PNo; end; TArvore = PNo;

http://www.computacao.gigamundo.com

Declarao de uma rvore No N-ria


type PNo = ^TNo; TNo = record valor: integer; irmao: PNo; filho: PNo; end; TArvore = PNo;

http://www.computacao.gigamundo.com

Nvel de um N
Refere-se

distncia do mesmo at a raiz;


0 1

2 3

http://www.computacao.gigamundo.com

Altura ou Profundidade de uma rvore

o nvel mximo que um n da rvore atinge;


0 1 2 3

A altura desta rvore 3!

Ela possui 4 nveis!

http://www.computacao.gigamundo.com

Percurso de uma rvore

Tambm conhecido como travessia; Consiste em percorrer (em uma dada ordem) todos os ns de um rvore ou at encontrar algum que satisfaa ao problema em questo; empregado, por exemplo, na busca de um n a partir de uma chave;

http://www.computacao.gigamundo.com

Percurso de uma rvore


Tipos

Pr-ordem / pre-order; Em-ordem / in-order; Ps-ordem / pos-order.

http://www.computacao.gigamundo.com

Percurso Pr-Ordem
Processa

primeiro a informao do n atual, para s ento processar a informao de seus filhos;

funo x (no) Incio processa no; aplica funo x para cada filho de no; Fim;

http://www.computacao.gigamundo.com

Percurso Pr-Ordem
function buscaTelefone(no: PNode; nome: String): String; var s: String; Begin if no = nil then buscaTelefone := else if no.nome = nome then buscaTelefone := no.telefone else begin s := buscaTelefone(no.filho1, nome); if s <> then buscaTelefone := s else begin s := buscaTelefone(no.filho2, nome); if s <> then buscaTelefone := s else buscaTelefone := ; end; end; End;

http://www.computacao.gigamundo.com

Percurso Em-Ordem

Neste caso, um filho (ou parte dos filhos) processado primeiro, o n atual ento processado e, por fim, o outro filho (ou parte dos filhos);

funo x (no) Incio aplica funo x para parte dos filhos de no; processa no; aplica funo x para parte dos filhos de no; Fim;

http://www.computacao.gigamundo.com

Percurso Ps-Ordem

Neste caso, todos os filhos do n atual devem ser processados antes que o mesmo o seja;

funo x (no) Incio aplica funo x para cada filho de no; processa no; Fim;

http://www.computacao.gigamundo.com

Insero em uma rvore


Cria-se

o novo n (mtodo new) e popula-se o mesmo com as informaes desejadas; utilizar algum critrio para determinar em qual n e em qual posio o novo n dever ficar; pai deve apontar para o filho.

Pode

http://www.computacao.gigamundo.com

Remoo em uma rvore

Utiliza-se de um outro ponteiro ( t ) para apontar para o objeto que se deseja remover; Aps isso, reorganiza-se seus filhos a fim de que seu pai possa apontara para esses e ningum ficar abandonado, eliminando o vnculo entre a rvore e o n-alvo; Por fim, elimina-se o n (mtodo dispose); E se nosso objetivo for remover TODOS os ns de uma rvore, qual mtodo de percurso voc utilizaria? Por qu?

http://www.computacao.gigamundo.com

rvores Binrias

rvores onde cada n possui no mximo dois filhos; Muito usadas em computao; Cada nvel pode ter no mximo 2N ns, onde N o valor do nvel; Quantidade de nveis que uma rvore binria com N ns pode ter:

Mximo: N; (rvore degenerada) Mnimo: Log2 N + 1; (rvore completa)

http://www.computacao.gigamundo.com

rvores Binrias
Dado

um n qualquer, ele possuir uma subrvore esquerda e uma sub-rvore direita (podendo qualquer uma delas ou ambas no possuir elementos);
Sub-rvore direita Sub-rvore esquerda

http://www.computacao.gigamundo.com

rvores Binrias de Busca


Ou rvores de busca binria (tanto faz!); So rvores em que possvel determinar em que direo buscar um dado n a partir do valor do pai e levando-se em considerao alguma regra quanto disposio dos filhos;

Ns com valores menores que o pai esquerda, ns com valores maiores que o pai direita; Ns que satisfazem uma condio expressa pelo pai de um lado e ns que no satisfazem do outro;

O que acontecer se a rvore de busca no estiver bem balanceada?

http://www.computacao.gigamundo.com

Insero em uma rvore Binria de Busca


function inserir(var arvore: TArvore; valor: integer): boolean; var p, t: PNode; Begin new(p); p.valor := valor; p.filho[1] := nil; p.filho[2] := nil; if arvore = nil then arvore := p else begin t := arvore; while t <> nil do begin if (t^.valor > valor) then begin if t^.filho[1] = nil then begin t^.filho[1] := p; inserir := true; exit; end else t := t^.filho[1]; end else if t^.valor < valor then begin if t^.filho[2] = nil then begin t^.filho[2] := p; inserir := true; exit; end else t := t^.filho[2]; end else begin inserir := false; exit; end; end; inserir := false; end;

http://www.computacao.gigamundo.com

Busca em uma rvore Binria de Busca


function buscar(arvore: TArvore; valor: integer): PNode; var t:PNode; Begin if (arvore = nil) then buscar := nil else begin t := arvore; while (t <> nil) do begin if t^.valor > valor then t := t^.filho[1] else if t^.valor < valor

then

t := t^.filho[2] else begin buscar := t; exit; end; end; buscar := nil; end; end;

http://www.computacao.gigamundo.com

Deleo em uma rvore Binria de Busca


Caso

1: Remover um n que no possui

filhos

http://www.computacao.gigamundo.com

Deleo em uma rvore Binria de Busca


Caso

2: Remover um n que possui um filho

http://www.computacao.gigamundo.com

Deleo em uma rvore Binria de Busca

Caso 3: Remover um n que possui dois filhos


Escolher o n mais esquerda da sub-rvore direita (ou mais direita da sub-rvore esquerda) para substitu-lo; Com isso, teremos que remover o n selecionado de onde ele est abordagem recursiva.

http://www.computacao.gigamundo.com

Comparaes entre Ordens de Complexidade

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

http://www.computacao.gigamundo.com

rvores AVL (Aula 13)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Definio de rvore AVL Representao Grfica Operaes


Insero Remoo Rotao

Simples
Esquerda Direita

Dupla

Pesquisa

Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Definio de rvore AVL


Trata-se

de uma rvore de Busca Binria Auto-Balanceada, isto , que mantm o balanceamento de sua rvore em cada operao executada; maior diferena possvel entre os nveis de dois ns-folhas 1;

http://www.computacao.gigamundo.com

Representao Grfica

rvore No-Balanceada

rvore AVL (Balanceada)

http://www.computacao.gigamundo.com

Operaes
Insero Remoo Rotao

Simples ( esquerda ou direita); Dupla.

http://www.computacao.gigamundo.com

Insero
Efetua-se

a busca pelo n (igual a qualquer outra rvore de busca binria); o n;

Insere-se

Verifica-se

se ela est balanceada, caso no esteja, efetuar rotao (simples ou dupla) at que esteja.

http://www.computacao.gigamundo.com

Remoo

Efetua-se a busca pelo n (igual a qualquer outra rvore de busca binria); Rotaciona-se at que o mesmo seja um n-folha e remova-o;

Por qu? A remoo de um n sem filhos o caso mais simples!

Verifique se a rvore se encontra balanceada, caso no esteja, efetue rotaes.

http://www.computacao.gigamundo.com

Rotao
Operao

em que a ordem dos ns em uma rvore de busca binria pode ser invertida a fim de manter o balanceamento da mesma; ser simples (um nico passo, rotacionando esquerda ou direita) ou dupla (efetuando mais de uma vez a rotao, em qualquer combinao de rotaes simples);

Pode

http://www.computacao.gigamundo.com

Rotao Simples

Ocorre

quando o n desbalanceado e o seu filho esto no mesmo sentido de inclinao da rvore; uma linha reta;

Formam

http://www.computacao.gigamundo.com

Rotao Esquerda

Dado um n X com um filho direita Y e este tendo um filho esquerda Z;

Pseudo-cdigo: Seja Y o filho direita de X; Torne X o filho esquerda de Y; Torne o filho esquerda de Y (Z) o filho direita de X;

http://www.computacao.gigamundo.com

Rotao Direita

Dado um n X com um filho esquerda Y e este tendo um filho direita Z;

Pseudo-cdigo: Seja Y o filho esquerda de X; Torne X o filho direita de Y; Torne o filho direita de Y (Z) o filho esquerda de X;

http://www.computacao.gigamundo.com

Rotao Dupla

Ocorre

quando o n desbalanceado est em um sentido da inclinao e o seu filho em outro; assim, um joelho.

Formam,

http://www.computacao.gigamundo.com

Pesquisa

tempo mdio para encontrar um elemento em uma rvore AVL da ordem de O (log n) 1.44 log2 n no pior caso

Aproximadamente

http://www.computacao.gigamundo.com

Referncias Bibliogrficas

http://www.csi.uottawa.ca/~stan/csi2514/applets/av

- Aplicao interessante para compreender rvores AVL


http://pt.wikipedia.org/wiki/rvore_AVL

http://www.computacao.gigamundo.com

Classificao de Dados (Aula 14)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumrio

Por que estudar mtodos para classificao de dados? Alguns tipos de algoritmos de classificao Seleo Direta (Selection Sort) Insero Direta (Insertion Sort) Mtodo da Bolha (Bubble Sort) Mtodo do Balde (Bucket Sort) QuickSort MergeSort HeapSort Referncias Bibliogrficas

http://www.computacao.gigamundo.com

Por que estudar mtodos para classificao de dados?

Qual a importncia da ordenao dos dados quando se deseja uma busca mais eficiente ou classificar os mesmos segundo algum critrio? H muita diferena entre o tempo de processamento de um algoritmo de ordenao O(n log n) e o tempo de um algoritmo de ordenao O(n2), quando executados sobre uma base com um milho de dados? Sendo assim, torna-se interessante o estudo dos diversos tipos de algoritmos de ordenao?

http://www.computacao.gigamundo.com

Alguns Tipos de Algoritmos de Classificao


Seleo

direta (selection sort) Insero direta (insertion sort) Mtodo da Bolha (bubble sort) Mtodo do Balde (bucket sort) Quicksort Mergesort Heapsort

http://www.computacao.gigamundo.com

Seleo Direta (Selection Sort)

Definio

Trata-se de um algoritmo de comparao in-loco, isto , executa comparaes e operaes de troca na prpria estrutura original, sem necessidade de usar uma estrutura auxiliar; o algoritmo mais simples de implementar, infelizmente, tambm o mais ineficiente de todos os aqui apresentados; Dado um array/lista no ordenado, varre-o por completo procurando o primeiro menor elemento presente no mesmo, trocando o mesmo de lugar com o primeiro elemento do array; Aps isso, procura o segundo menor elemento presente no mesmo e troca de posio com o segundo elemento do array. Procede desta forma at processar os N elementos;

http://www.computacao.gigamundo.com

Seleo Direta (Selection Sort)


Ilustrao

http://www.computacao.gigamundo.com

Seleo Direta (Selection Sort)

Implementao

function selecaoDireta(var a: array [1..N] of real):boolean; var i, j, menor : integer; v: real; begin for i := 1 to N do begin menor := i; for j := i+1 to N do begin if a[menor] > a[j] then menor := j; end;

if menor <> i then begin v := a[i]; a[i] := a[menor]; a[menor] := v; end; end; selecaoDireta := true; end;

http://www.computacao.gigamundo.com

Seleo Direta (Selection Sort)


Complexidade

Tanto para o pior caso, quanto para o caso mdio e para o melhor caso, o algoritmo sempre precisar efetuar:
N

operaes para encontrar o primeiro menor elemento; N-1 operaes para encontrar o segundo menor elemento;

...
1

operao para encontrar o n-simo menor elemento; Total: 1 + 2 + ... + N = N(N+1)/2 = O(n2)

http://www.computacao.gigamundo.com

Insero Direta (Insertion Sort)


Definio

Dado um array/lista Y no ordenado, inicia com uma lista X vazia. Pega o primeiro elemento de Y e varre toda a lista X procurando a posio correta para inseri-lo e, ento, o insere. Pega o segundo elemento e tambm varre toda a lista X, procurando a posio correta e insere-o. Procede desta forma at processar os N elementos;

http://www.computacao.gigamundo.com

Insero Direta (Insertion Sort)


Ilustrao

http://www.computacao.gigamundo.com

Insero Direta (Insertion Sort)

Implementao
while (x <> nil) do begin y[i] := x^.valor; x := x^.proximo; dispose(t); t := x; end; insercaoDireta := true; end;

function insercaoDireta(var y: array [1..N] of real):boolean; var x,t: TLista; i: integer; begin x := nil; for i := 1 to N do insercaoOrdenada(x, y[i]); t := x; i := 1;

http://www.computacao.gigamundo.com

Insero Direta (Insertion Sort)


Complexidade

Melhor Caso: O(n), pois ele simplesmente pegar cada elemento e inserir na cabea da lista; Pior Caso: O(n2), pois para cada elemento ele ter que inseri-lo na cauda da lista, o que significar 1 + 2 + 3 + ... + N = N(N+1)/2 operaes; Caso Mdio: O(n2).

http://www.computacao.gigamundo.com

Mtodo da Bolha (Bubble Sort)

Definio

Varre do incio ao fim, sempre checando se o elemento xi menor ou igual ao xi+1. Se for, passa para o prximo par (xi+1 e xi+2), caso no seja, inverte suas posies e recua uma posio para checar ento com o anterior (xi-1 e xi). Procede desta forma at varrer toda a estrutura e chegar ao fim; Este algoritmo de classificao tambm in-loco, isto , dispensa a utilizao de estruturas auxiliares para efetuar a classificao dos dados.

http://www.computacao.gigamundo.com

Mtodo da Bolha (Bubble Sort)


Ilustrao

http://www.computacao.gigamundo.com

Mtodo da Bolha (Bubble Sort)

Implementao else begin c := y[i]; y[i] := y[i+1]; y[i+1] := c; i := i 1; if (i < 1) then i := 1; end; metodoDaBolha := true; end;

function metodoDaBolha(insercaoDireta (var y: array [1..N] of real):boolean; var i: integer; c: real; begin i := 1; while (i < N) do begin if (y[i] <= y[i+1]) then i := i + 1

http://www.computacao.gigamundo.com

Mtodo da Bolha (Bubble Sort)


Complexidade

Melhor Caso: O(n), pois passa uma vez s por cada par (todos os dados j esto ordenados); Pior Caso: O(n2), onde os dados esto na ordem inversa e portanto levar executar 1 + 2 + ... + N trocas; Caso mdio: O(n2);

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)

Definio

Cria K buckets identificados e ordenados segundo algum critrio (buckets contendo elementos de 1 a 10, buckets contendo elementos de 11 a 20, etc.) e ento armazena os elementos dentro de cada bucket correspondente. Aps isso, pode-se aplicar a cada bucket o algoritmo de ordenao que melhor convier; Este mtodo geralmente se utiliza de um array de buckets como estrutura auxiliar, cada qual podendo ser implementado como um array ou uma lista.

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)


Ilustrao

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)

Implementao (pseudo-cdigo)

function bucket-sort(array, n) is buckets new array of n empty lists for i = 0 to (length(array)-1) do insert array[i] into buckets[position(array[i], k)] for i = 0 to n - 1 do next-sort(buckets[i]) return the concatenation of buckets[0], ..., buckets[n-1]

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)

Implementao

function metodoDoBalde(var y: array [1..N] of real; k: integer):Boolean; var bucket: array [1..k] of record slots: array [1..N] of real; index: integer; end; menor, maior: real; i,j,c: integer;

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)

Implementao (continuao)

begin menor := y[1]; maior := y[1]; for i := 1 to N do begin if y[i] > maior then maior := y[i]; if y[i] < menor then menor := y[i]; end;

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)


Implementao

(continuao)

for i := 1 to N do begin j := 1 + k*(y[i] - menor)/(maior menor + 1); bucket[j].index := bucket[j].index + 1; bucket[j].slots[bucket[j].index] := y[i]; end; c := 1;

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)

Implementao (continuao)

for j := 1 to k do begin selecaoDireta(bucket[j].slots, bucket[j].index); for i := 1 to bucket[j].index do begin y[c] := bucket[j].slots[i]; c := c + 1; end; end; metodoDoBalde := true; end;

http://www.computacao.gigamundo.com

Mtodo do Balde (Bucket Sort)


Complexidade

Depende do algoritmo de classificao a ser usado em cada bucket;

http://www.computacao.gigamundo.com

Quicksort

Definio

Algoritmo dividir para conquistar. Escolhe um piv dentro da lista de dados a ordenar e cria dois grupos, um com os nmeros menores que ele ( esquerda) e outro com nmeros maiores que ele ( direita). Aps isso, o algoritmo executado para cada grupo, escolhendo-se novamente um piv e dividindo-se em dois grupos menores. O processo procee at que cada grupo contenha somente um elemento, concatenando todos e formando uma lista ordenada;

http://www.computacao.gigamundo.com

Quicksort
Ilustrao

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Quicksort

Implementao if (i <= j) then begin aux := y[i]; y[i] := y[j]; y[j] := aux; i := i + 1; j := j 1; end; until (i > j); if (j > IniVet) then quicksort(y, IniVet, j); if (i < FimVet) then quicksort(y, i, FimVet) end;

function quicksort(var y: array [1..N] of real, IniVet, FimVet: integer): boolean; var i, j: integer; pivo, aux: real; Incio i := IniVet; j := FimVet; pivo := y[(IniVet + FimVet) div 2]; repeat while (y[i] < pivo) AND (i < FimVet) do i := i + 1; while (y[j] > pivo) AND (j > FimVet) do j := j 1;

http://www.computacao.gigamundo.com

Quicksort
Complexidade

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Mergesort
Definio

Tambm algoritmo dividir para conquistar. Quebra a lista em listas menores, at que cada lista contenha somente um elemento, quando ento comea a orden-las fazendo um merge, isto , juntando duas listas diferentes por vez mantendo a nova ordem dos elementos;

http://www.computacao.gigamundo.com

Mergesort
Ilustrao

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Mergesort
Implementao

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Mergesort
Complexidade

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Heapsort
Definio

Utiliza uma rvore binria chamada heap para ordenar os dados. Todo o problema aqui resumese criao desta rvore, bem como a remoo de cada n da mesma sem alterar a ordenao.

http://www.computacao.gigamundo.com

Heapsort
Ilustrao

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Heapsort
Implementao

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Heapsort
Complexidade

[Ops! No escrevi aqui!]

http://www.computacao.gigamundo.com

Referncias Bibliogrficas
[No

foram definidas]

Você também pode gostar