Você está na página 1de 241

ESTRUTURA DE DADOS I

Adriano Sena

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

Adriano Sena

Sumrio

Motivao Tipos de Dados Operaes Tipos Primitivos ou Escalares


Tipos Colees ou No-Escalares


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

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;

Motivao

Estruturas de Dados busca descrever modelos de estruturas de dados e procedimentos

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

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!

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;

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);

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)

Tipos Primitivos ou Escalares

Inteiro (integer, longint, etc.);

Real (real, double, etc.);


Lgico (boolean); Caracter (char);

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;

Tipos Reais

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

Soma, subtrao, multiplicao, diviso;

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.

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.

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;

Tipos Colees ou No-Escalares

Vetor;

Registro;
Conjunto.

Tipo Vetor

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

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;

Tipo Conjunto

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

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

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.

Tipos Abstratos de Dados

Vetores, registros e conjuntos so interessantes...

... Mas h um problema, so estticos!

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

Alocao de Memria

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

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.

Referncias Bibliogrficas

[No foram definidas]

Matrizes (Aula 2)

Adriano Sena

Sumrio

Definio e Representao de Matrizes Compactao de Matrizes


Matrizes Diagonais Matrizes Triangulares Matrizes Esparsas

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 =

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;

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.

Compactao de Matrizes

Quanto memria ocupa uma matriz 5000 x 5000 de reais?


Um valor real = 4 bytes; Aproximadamente 100 MB!

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

Compactao de Matrizes

Como representar de forma compactada:

Matrizes Diagonais;
Matrizes Triangulares; Matrizes Esparsas;

Matrizes Diagonais

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

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).

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.

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!

Referncias Bibliogrficas

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

Recursividade (Aula 3)

Adriano Sena

Sumrio

Definio de Recurso Exemplo de Recurso Recurso versus Iterao Observaes Referncias Bibliogrficas

Definio de Recurso

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

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.

Exemplo de Recurso

Recorrncia para encontrar um elemento da seqncia de Fibonacci:


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

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;

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.

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.

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.

Referncias Bibliogrficas

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

Noes de Complexidade de Algoritmos (Aula 4)

Adriano Sena

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

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!

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!

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!

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!

Como Medir a Eficincia de um Algoritmo?

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

Determinao da complexidade assinttica de um algoritmo;

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?

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!

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;

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;

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!

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

Determinao da Complexidade Assinttica de um Algoritmo

Notaes O (O Grande), (Omega) e (Theta); Obs: Funes assintoticamente nonegativas;

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 )

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)

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 )

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;

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.

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

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.

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.

Pior Caso

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

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);

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; No caso de algoritmos recursivos, deve-se determinar primeiro a frmula de recorrncia capaz de express-los e, ento, resolv-la.

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

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

Adriano Sena

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?

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?

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?

Quarto exerccio

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

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

Ponteiros e Alocao Dinmica (Aula 6)

Adriano Sena

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.

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?

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;

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.

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;

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);

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.

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.

Alocao Dinmica de Memria

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

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!

Referncias Bibliogrficas

Blog de Joo Morais, http://blog.joaomorais.com.br/2008/08/23/po nteiros.html http://www2.dc.ufscar.br/~bsi/materiais/ed/u7 .html

Listas (Aula 7)

Adriano Sena

Sumrio

Definio de Lista Caractersticas Tipos de Implementao


Lista Seqencial Lista Encadeada ou Dinmica

Outros Tipos de Listas

Implementao de uma Lista Referncias Bibliogrficas

Definio de Lista

TAD que permite representao e manipulao de seus elementos de forma linear; Tambm chamada lista linear; L e1, e2, ... , en;

Caractersticas

Uma coleo de dados homognea; Itens dispostos em seqncia;

Quantificvel;
Ordenvel;

Tipos de Implementao

Seqencial

Encadeada ou Dinmica

Lista Seqencial

Os itens so armazenados em posio contgua na memria; Podem ser implementadas por meio de um array!

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

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)!

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.

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;

Referncias Bibliogrficas

[No foram definidas]

Buscas em Listas (Aula 8)

Adriano Sena

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

Definio de Busca

Operao de percurso de uma estrutura de dados e recuperao de uma informao baseado em algum campo-chave; Recuperao 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.

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.

Busca Seqencial

Se voc no sabe por onde comear, comece pelo comeo; No se conhece uma ordenao dentro da lista; Somos forados a verificar um por um.

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;

Busca Seqencial - Complexidade

Qual a complexidade para:

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

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!

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.

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;

Busca Binria - Complexidade

Qual a complexidade para:

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

Busca Interpolada

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

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.

Busca Interpolada

Basta mudar o clculo do termo X:

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

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;

Busca Interpolada - Complexidade

Qual a complexidade para:

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

Comparando os Trs Mtodos


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

Referncias Bibliogrficas

[No foram definidas]

Listas Encadeadas (Aula 9)

Adriano Sena

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

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.

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 Carlos

4 5

2
3 4

Erica
Beth Ana Davi

-1
1 3 2

Listas Encadeadas Dinmicas

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

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.

Operaes em Lista Encadeada

Criao;

Insero;
Busca / Recuperao; Remoo.

Definindo Nossa Lista Encadeada (opo 1)


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

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;

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;

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;

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;

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;

Busca na Lista Encadeada

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

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?

Referncias Bibliogrficas

[No foram definidas]

Pilhas & Filas (Aula 10)

Adriano Sena

Sumrio

Definio de Pilha

Exemplo de Pilha no Mundo Real Implementao de uma Pilha Exemplo de Fila no Mundo Real Implementao de uma Fila

Definio de Fila

Exerccios Referncias Bibliogrficas

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); Para satisfazer esta condio, basta que a insero e remoo sejam feitas na mesma extremidade da lista (head);

Obviamente, no necessrio ordenar;

Exemplo de Pilha no Mundo Real

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

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;

Implementao de uma Pilha

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

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;

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;

Definio de Fila

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

Obviamente, tambm no necessrio ordenar;

Exemplo de Fila no Mundo Real


Muitas coisas so ordenadas por fila; A 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.

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;

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.

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;

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;

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.

Referncias Bibliogrficas

Outros Tipos de Listas (Aula 11)

Adriano Sena

Sumrio

Lista Duplamente Encadeada


Declarao Operaes Declarao Operaes

Lista Circular

Exerccios Referncias Bibliogrficas

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;

...

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!).

Declarao de uma Lista Duplamente Encadeada (opo 1)


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

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;

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?

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;

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.

Declarao de uma Lista Circular (opo 1)


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

Declarao de uma Lista Circular (opo 2)


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

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?

Exerccios

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

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

Referncias Bibliogrficas

[No foram definidas]

rvores (Aula 12)

Adriano Sena

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

Definio de rvore

Estrutura de dados no linear;

Um grafo totalmente conexo e acclico;


Analogia a uma rvore (reino vegetal):

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

Representao Grfica

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).

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;

Declarao de uma rvore No N-ria


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

end; TArvore = PNo;

Nvel de um N

Refere-se distncia do mesmo at a raiz;


0
1

2
3

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!

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;

Percurso de uma rvore

Tipos

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

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;

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;

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;

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;

Insero em uma rvore

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

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?

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)

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

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?

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;

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;

Deleo em uma rvore Binria de Busca

Caso 1: Remover um n que no possui filhos

Deleo em uma rvore Binria de Busca

Caso 2: Remover um n que possui um filho

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.

Comparaes entre Ordens de Complexidade

Referncias Bibliogrficas

[No foram definidas]

rvores AVL (Aula 13)

Adriano Sena

Sumrio

Definio de rvore AVL Representao Grfica Operaes

Insero Remoo Rotao

Simples

Esquerda Direita

Dupla

Pesquisa

Referncias Bibliogrficas

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; A maior diferena possvel entre os nveis de dois ns-folhas 1;

Representao Grfica

rvore No-Balanceada

rvore AVL (Balanceada)

Operaes

Insero

Remoo
Rotao

Simples ( esquerda ou direita); Dupla.

Insero

Efetua-se a busca pelo n (igual a qualquer outra rvore de busca binria); Insere-se o n;

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

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.

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; Pode ser simples (um nico passo, rotacionando esquerda ou direita) ou dupla (efetuando mais de uma vez a rotao, em qualquer combinao de rotaes simples);

Rotao Simples

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

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;

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;

Rotao Dupla

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

Pesquisa

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

Referncias Bibliogrficas

http://www.csi.uottawa.ca/~stan/csi2514/appl ets/avl/BT.html - Aplicao interessante para compreender rvores AVL http://pt.wikipedia.org/wiki/rvore_AVL

Classificao de Dados (Aula 14)

Adriano Sena

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

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?

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

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;

Seleo Direta (Selection Sort)

Ilustrao

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;

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)

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;

Insero Direta (Insertion Sort)

Ilustrao

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;

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).

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.

Mtodo da Bolha (Bubble Sort)

Ilustrao

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

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);

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.

Mtodo do Balde (Bucket Sort)

Ilustrao

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]

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;

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;

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;

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;

Mtodo do Balde (Bucket Sort)

Complexidade

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

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;

Quicksort

Ilustrao

[Ops! No escrevi aqui!]

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;

Quicksort

Complexidade

[Ops! No escrevi aqui!]

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;

Mergesort

Ilustrao

[Ops! No escrevi aqui!]

Mergesort

Implementao

[Ops! No escrevi aqui!]

Mergesort

Complexidade

[Ops! No escrevi aqui!]

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.

Heapsort

Ilustrao

[Ops! No escrevi aqui!]

Heapsort

Implementao

[Ops! No escrevi aqui!]

Heapsort

Complexidade

[Ops! No escrevi aqui!]

Referncias Bibliogrficas

[No foram definidas]