Académique Documents
Professionnel Documents
Culture Documents
Adriano Sena
Adriano Sena
Sumrio
Tipos Inteiros Tipos Reais Tipos Lgicos Tipo Caracter Funes Para Converso
Motivao
Por que estudar os tipos de dados? Duas so as principais preocupaes em um projeto de software
Motivao
Motivao
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
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 Inteiros
Tipos Reais
Satisfaz as operaes e comparaes possveis com tipos inteiros; Operaes numricas contidas no conjunto dos nmeros reais:
Tipos Lgicos
E, OU, NO;
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.
Ord;
Char;
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;
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.
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.
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
Matrizes (Aula 2)
Adriano Sena
Sumrio
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 =
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);
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;
Compactao de Matrizes
E se somente alguns poucos elementos da matriz fossem diferentes de zero, poderamos reduzir o tamanho dela?
Compactao de Matrizes
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
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;
Exemplo de Recurso
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;
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.
Por outro lado, h problemas que no podem ser resolvidos de forma iterativa;
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
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)
Adriano Sena
Sumrio
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
Motivao
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
Pena que at mesmo um grande cluster com dezenas de computadores no conseguem resolver eficientemente alguns problemas somente por fora bruta;
, 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!
Avaliao Emprica
Experimento 1: Verificar o tempo que dois programas levam para efetuar uma busca em um array e recuperar um dado;
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?
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;
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;
No algoritmo anterior:
Perceba que para calcular o fatorial de um nmero N qualquer, vamos executar 2*N operaes, ou seja, um nmero de operaes diretamente proporcional;
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;
Para n = 1.000, 2*n + 3 2003; Mas e se nosso algoritmo executasse n2 operaes? 1.000.000!
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
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 )
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;
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.
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)
Os Trs Casos
Para qualquer algoritmo, sempre h situaes em que ele resolver de forma muito rpida e outras em que nem tanto;
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
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);
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
Adriano Sena
Primeiro Exerccio
Implemente um programa capaz de armazenar e recuperar dados de uma matriz triangular inferior;
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;
Segundo Exerccio
Encontrar uma letra em uma frase de tamanho N; Encontrar uma palavra de tamanho K em uma frase de tamanho N;
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
Faa uma comparao das vantagens e desvantagens desta implementao em relao iterativa.
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;
Definio de ponteiro
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
Tipos de Ponteiro
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;
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);
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).
Referncias Bibliogrficas
Listas (Aula 7)
Adriano Sena
Sumrio
Definio de Lista
TAD que permite representao e manipulao de seus elementos de forma linear; Tambm chamada lista linear; L e1, e2, ... , en;
Caractersticas
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;
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?
Listas podem ser encadeadas, duplamente encadeadas ou n-uplamente encadeadas (s depende de sua criatividade)!
Podemos precisar de listas que satisfaam certas restries quanto forma de recuperar um elemento ou de insero do mesmo;
Pilhas; Filas.
Referncias Bibliogrficas
Adriano Sena
Sumrio
Busca Interpolada
Implementao Complexidade
Busca Binria
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.
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 Binria
Quando os elementos de uma lista esto ordenados segundo um campo-chave, podemos tirar proveito disso;
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 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
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
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
Toda lista linear onde cada elemento (geralmente chamado n) possui algum apontador para o prximo elemento;
...
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
Permitem a insero de novos elementos com menos restries quanto posio (no precisa ser contgua) ou quantidade.
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.
Criao;
Insero;
Busca / Recuperao; Remoo.
Em Listas Encadeadas Dinmicas, Busca Binria ou Interpolada, possvel? H vantagens em seu uso em relao Busca Seqencial?
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
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
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);
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;
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.
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);
Push: Apesar de inserir no final, ns no precisaremos percorrer toda a fila para inserir no fim;
Pop: A remoo continua sendo feita na cabea, o que facilita muito as coisas.
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
Adriano Sena
Sumrio
Lista Circular
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;
...
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!).
Operaes Bsicas:
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;
Operaes Bsicas:
Como seriam essas operaes em uma Lista Circular se ela no estiver ordenada? E se estiver ordenada?
Exerccios
Lista duplamente encadeada no-ordenada; Lista duplamente encadeada ordenada; Lista circular.
Referncias Bibliogrficas
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
Representao Grfica
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).
Nvel de um N
2
3
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;
Tipos
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;
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.
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:
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
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;
t := t^.filho[2] else begin buscar := t; exit; end; end; buscar := nil; end; end;
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.
Referncias Bibliogrficas
Adriano Sena
Sumrio
Simples
Esquerda Direita
Dupla
Pesquisa
Referncias Bibliogrficas
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
Operaes
Insero
Remoo
Rotao
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
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
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
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
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
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?
Seleo direta (selection sort) Insero direta (insertion sort) Mtodo da Bolha (bubble sort) Mtodo do Balde (bucket sort) Quicksort Mergesort Heapsort
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;
Ilustrao
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;
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)
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;
Ilustrao
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;
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).
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.
Ilustrao
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
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);
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.
Ilustrao
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]
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;
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;
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;
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;
Complexidade
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
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
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
Mergesort
Implementao
Mergesort
Complexidade
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
Heapsort
Implementao
Heapsort
Complexidade
Referncias Bibliogrficas