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

Sumário
  

Motivação Tipos de Dados Operações Tipos Primitivos ou Escalares
– –

Tipos Coleções ou Não-Escalares
– – –

Tipo Vetor Tipo Registro Tipo Conjunto


– –

Tipos Inteiros Tipos Reais Tipos Lógicos Tipo Caracter Funções Para Conversão

  

Tipos Abstratos de Dados Alocação de Memória Vantagens e Desvantagens da Alocação Dinâmica

http://www.computacao.gigamundo.com

Motivação
 

Por que estudar os tipos de dados? Duas são as principais preocupações em um projeto de software
– –

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

Pilhas. . Filas e Árvores.computacao. Registros.com Motivação  “Estruturas de Dados” busca descrever modelos de estruturas de dados e procedimentos – Exemplos: Arrays.http://www. Listas. etc.gigamundo.

gigamundo.  A forma como os dados são inseridos ou removidos é que difere uma estrutura da outra! .com Motivação  Os tipos de dados e operações determinam as estruturas de dados – Exemplo: em uma pilha ou fila você possui operações push e pop para colocar e retirar elementos dela.http://www.computacao.

computacao. . multiplicação.com Tipos de Dados  Define a forma como um dado deve ser armazenado ou recuperado.gigamundo. bem como os possíveis valores que ele pode assumir ou as operações que podem ser efetuadas sobre os mesmos – Exemplo em Pascal:   integer permite valores inteiros e operações de adição.http://www. subtração e divisão. string permite valores literais e operações de concatenação.

lógico. .http://www. – Os principais tipos primitivos são: inteiro. caracter.  Estáticos ou dinâmicos (instanciados em tempo de execução).computacao. derivados ou coleções.gigamundo.com Tipos de Dados  Primitivos. ponteiro. real.

com Operações  Um conjunto de instruções a fim de manipular um determinado tipo de dado a fim algum objetivo.computacao.gigamundo. – – – – – – Criação (declaração) Percurso Busca Alteração Retirada Inserção (em tipos dinâmicos) .http://www.

gigamundo. Lógico (boolean). Caracter (char).).http://www.com Tipos Primitivos ou Escalares  Inteiro (integer.   . longint. double.computacao. etc.  Real (real. etc.).

computacao. subtração.gigamundo.http://www. . divisão inteira.com Tipos Inteiros  Operações numéricas contidas no conjunto dos números inteiros: – Soma. multiplicação.  Permitem comparações de igualdade e/ou de desigualdade. resto da divisão.

computacao. Operações numéricas contidas no conjunto dos números reais: –  Soma.com Tipos Reais  Satisfaz as operações e comparações possíveis com tipos inteiros.http://www. subtração. multiplicação.gigamundo. divisão. .

computacao.gigamundo. . OU.http://www.com Tipos Lógicos  Permite operações lógicas (booleanas): – E.  Deve-se ter muito cuidado na construção de expressões lógicas – Quanto maiores elas são. NÃO. maiores as chances de cometermos equívocos.

Operações de igualdade e desigualdade.   . Por ser armazenado internamente como um valor inteiro.com Tipo Caracter  Permite a representação de um único caracter.gigamundo. podemos fazer um “casting” e efetuar outras operações.http://www.computacao.

 Obs: Dependendo de quais os tipos/classes envolvidos.  De inteiro para caracter: – Char.  De caracter para inteiro: – Ord.computacao. Ceil.com Funções para conversão  De real para inteiro: – Trunc. .http://www. Floor.gigamundo. podemos efetuar “typecasting”. Round.

http://www.gigamundo.computacao.com Tipos Coleções ou Não-Escalares  Vetor.  Registro. Conjunto.  .

com Tipo Vetor  Coleção de dados homogênea indexada que pode ser acessada por meio de um índice numérico.computacao. v[3].   . var v = array [1.http://www.gigamundo.5] of integer..

 var r = record c1: integer.  r. c2: boolean.com Tipo Registro  Coleção de dados heterogênea cujas informações podem ser acessadas por meio de um campo.http://www. end.gigamundo. .c1.computacao.

gigamundo.    c := [V1. .computacao.com Tipo Conjunto  Coleção de objetos (ou informações) correlatos que podem estar presentes ou não em um dado momento. var c = set of (V1. V2. V2]. V3). V1 in c.http://www.

computacao.com Tipos Abstratos de Dados  Segundo a Wikipédia: – Especificação de um conjunto de dados e operações que podem ser executadas sobre esses dados.gigamundo. .http://www.  Exemplo: – Quando usamos arrays e registros para criar uma estrutura de dados em vez de usar variáveis de tipos primitivos.

.http://www. Mas há um problema. – ...com Tipos Abstratos de Dados  Vetores. são estáticos!  O que acontece se eu tiver um vetor de 5 posições e precisar de outras 1000? E se meu vetor tiver 100000 posições e eu somente uso 5.gigamundo.computacao. registros e conjuntos são interessantes. isso é bom?  ..

gigamundo.computacao.  . Alocação dinâmica  Variável alocada ocupa espaço variável e é criada segundo a necessidade do programa.com Alocação de Memória  Alocação estática  Variável alocada ocupa espaço fixo e contíguo na memória.http://www.

  Além disso. . um array (estático) de vinte posições geralmente ocupa menos espaço que uma lista cujos elementos foram criados um a um dinamicamente.http://www. podemos aumentar e diminuir o tamanho de nossa estrutura quando quisermos! Entretanto. inserir e/ou remover informações. necessitaremos de mais algumas operações para buscar.computacao.gigamundo.com Vantagens e Desvantagens da Alocação Dinâmica  Se alocamos dinamicamente.

http://www.com Referências Bibliográficas  [Não foram definidas] .computacao.gigamundo.

http://www.gigamundo.computacao.com Matrizes (Aula 2) Christiano Lima Santos .

gigamundo.computacao.http://www.com Sumário  Definição e Representação de Matrizes Compactação de Matrizes – – –  Matrizes Diagonais Matrizes Triangulares Matrizes Esparsas .

comumente chamados linha e coluna. uma matriz pode ser considerada um conjunto de informações numéricas que podem ser referenciadas por meio de dois parâmetros.com Definição e Representação de Matrizes  Na Matemática.gigamundo. 1 2 0 2 0 1 3 3 2 4 1 5 A = .http://www.computacao.

var A = array [1.. podemos representar as matrizes matemáticas por meio de estruturas conhecidas como vetores ou arrays. 1.computacao. .3.gigamundo.http://www. onde cada posição/valor pode ser referenciada por um ou mais parâmetros (dependendo da quantidade de dimensões de nosso vetor).4] of real.com Definição e Representação de Matrizes  Na Computação..

na Computação podemos chamar qualquer vetor de matriz.com Definição e Representação de Matrizes  Enquanto que na Matemática uma matriz possui sempre duas dimensões. podendo assim ter uma ou mais dimensões.gigamundo.http://www. – Matrizes unidimensionais. – – . Matrizes bidimensionais. Matrizes n-dimensionais.computacao.

computacao.gigamundo.com Compactação de Matrizes  Quanto memória ocupa uma matriz 5000 x 5000 de reais? – – Um valor real = 4 bytes. poderíamos reduzir o tamanho dela? .http://www. Aproximadamente 100 MB!  E se somente alguns poucos elementos da matriz fossem diferentes de zero.

– – . Matrizes Esparsas.gigamundo.http://www.computacao. Matrizes Triangulares.com Compactação de Matrizes  Como representar de forma compactada: – Matrizes Diagonais.

http://www. . então. em uma matriz unidimensional de n elementos.gigamundo.  . a[n. Podemos armazená-los.2]. a[3.n]..com Matrizes Diagonais  Os elementos da diagonal de uma matriz são: a[1.3].computacao.1]. a[2..

Podemos armazenar todos os elementos da parte triangular em uma matriz unidimensional de m elementos (inclui os elementos da diagonal).com Matrizes Triangulares  Podem ser superior ou inferior.computacao.gigamundo.http://www.  .

.http://www.gigamundo. E se um dos elementos for alterado para um valor nãonulo?  Deve-se reservar algumas posições vazias para o caso de incluir novos elementos. Problemas: – –  Como saber qual o índice de cada elemento na matriz?  Armazenar também o índice (tupla índice-valor).computacao.com Matrizes Esparsas  Podem ser n-dimensionais.  Podemos armazenar somente os elementos diferentes de zero em uma matriz unidimensional.

http://www.computacao.gigamundo.com

Exercícios
 

De volta às aulas? De volta aos jogos.  Vamos criar um simulador de exploração espacial (modo texto, claro)! Crie um universo que possa ser “navegado tridimensionalmente” por meio da indicação de três 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 espaço; Para facilitar para o jogador, cada vez que ele indicar as coordenadas, dizer quão longe ele está do planeta mais próximo; O jogo encerra quando ele encontrar um dos planetas; Os planetas são criados em posições aleatórias a cada vez que é gerada uma nova partida; E há um total de combustível para o jogador, o qual é consumido de acordo com a distância percorrida!

http://www.computacao.gigamundo.com

Referências Bibliográficas

VELOSO, Paulo, SANTOS, Clésio, AZEREDO, Paulo, FURTADO, Antônio, Estruturas de Dados, Editora Campus Ltda

http://www.computacao.gigamundo.com

Recursividade (Aula 3)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumário

   

Definição de Recursão Exemplo de Recursão Recursão versus Iteração Observações Referências Bibliográficas

um método é recursivo quando ele invoca a si próprio a fim de resolver um problema.http://www. Na Computação.com Definição de Recursão  Possibilidade de um objeto buscar definir-se em função dele próprio.computacao.  .gigamundo.

podemos encontrar claramente a recursividade na resolução de problemas por meio de recorrência. Seqüência de Fibonacci.com Definição de Recursão  Na Matemática. – – .gigamundo.http://www. – Fatorial de um número.computacao. Potenciação.

x2 = 1.gigamundo.computacao. xn = xn-1 + xn-2.http://www.com Exemplo de Recursão  Recorrência para encontrar um elemento da seqüência de Fibonacci: – – – x1 = 1. .

begin if (n < 1) then fibonacci := 0 else if (n <= 2) then fibonacci := 1 else fibonacci := fibonacci(n-1) + fibonacci(n-2). end. .com Exemplo de Recursão  Função em Pascal: function fibonacci(n: integer): integer.gigamundo.http://www.computacao.

A implementação do cálculo do fatorial de forma iterativa. .http://www.computacao.gigamundo. –  – Chamadas recursivas precisam salvar o “contexto” atual da execução do programa a fim de recuperá-lo após a execução de cada chamada recursiva. por exemplo. Diversos problemas resolvidos de forma recursiva podem ser resolvidos de forma iterativa.com Recursão versus Iteração  Iteração na definição de algoritmos – cada um dos “passos”/repetições de um comando de repetição (“loop”). consome menos memória e processamento.

gigamundo. – Percorrer uma árvore para encontrar um elemento.computacao.com Recursão versus Iteração  Por outro lado. recursão é muito útil na resolução de diversos problemas que possam se beneficiar do “dividir-para-conquistar”.http://www. por exemplo. Diversas técnicas de busca em grafos. exemplos: – – – Ordenação por meio de quicksort ou mergesort. há problemas que não podem ser resolvidos de forma iterativa. Programação dinâmica.  Além disso. .

. talvez indefinidamente! Cuidado com a passagem de parâmetros por valor ou por referência.gigamundo.http://www.com Observações  Quando escrevendo funções recursivas. ele não saberá que é um caso de parada e continuará a sua execução.computacao. atente-se a: – – – Ordem em que cada comando deve aparecer dentro da função – o resultado final pode ser totalmente diferente se trocarmos duas linhas de código de lugar! Definição de todos os casos base – se esquecermos de definir um dos casos base e o algoritmo procurar por ele em algum momento.

disponível em http://pt.com Referências Bibliográficas  COSTA.computacao. Raimundo M.org/wiki/Recursividade_(ci ência_da_computação)  .wikipedia.http://www. 1995 WIKIPÉDIA.gigamundo. Programação Pascal. Recursividade em Ciência da Computação.

gigamundo.com Noções de Complexidade de Algoritmos (Aula 4) Christiano Lima Santos .computacao.http://www.

http://www.gigamundo.computacao.com Sumário    Motivação Alguns Mitos Como Medir a Eficiência de um Algoritmo? – – –  Principais Classes de Comportamento Assintótico – Tabela Comparativa das Principais Classes O Melhor Caso O Pior Caso O Caso Médio Avaliação Empírica Contagem do Número de Operações Efetuadas Determinação da Complexidade Assintótica de um Algoritmo  Os “Três Casos” – – –     Notação O Notação Ω Notação θ  Calculando a Complexidade para cada Caso Referências Bibliográficas .

– Temos que medir quanto de cada recurso nossos programas utilizam! . então. Quantidade de memória consumida.computacao.http://www.com Motivação  Quais os dois recursos de hardware mais importantes para a execução de um algoritmo? – – Tempo de processamento.gigamundo.  Devemos. observar quanto de cada recurso nossos algoritmos consomem.

buscamos sempre compreender e trabalhar com a melhor solução possível! .http://www.computacao. Como exímios Cientistas da Computação. cada qual pode resolver o problema com mais ou menos tempo.gigamundo. Desta forma. ocupando mais ou menos memória.com Motivação  Um exemplo bem simples é o caso de dois programas que precisam fazer a ordenação de um grande conjunto de dados: – – – Cada qual deles pode usar uma abordagem bem diferente do outro.

– Pena que até mesmo um grande cluster com dezenas de computadores não conseguem resolver eficientemente alguns problemas somente por “força bruta”. se você considerar somente os sistemas do tipo “controle de locadora”.computacao. sistemas para cálculos estatísticos e estimativas razoavelmente pesadas e tantos outros precisam! .com Alguns Mitos  Basta um computador mais rápido para resolver o problema.gigamundo.  Ninguém efetua cálculo de complexidade ou busca de solução mais eficiente em um sistema! – É.http://www. pois sistemas de tempo real. simulações físicas.

esse alguém é você! .com Alguns Mitos  Por que eu tenho que aprender sobre isso? Eu posso simplesmente contratar alguém! – Pois é. que tal alguém da área de Computação? Ei.http://www.computacao.gigamundo.

.http://www.com Como Medir a Eficiência de um Algoritmo?  Avaliação empírica (medir o tempo de execução).   Determinação da complexidade assintótica de um algoritmo.computacao.gigamundo. Contagem do número de operações efetuadas.

computacao. Segundo programa: 600 ns.4 GHz cada.com Avaliação Empírica  Experimento 1: Verificar o tempo que dois programas levam para efetuar uma busca em um array e recuperar um dado. – – Primeiro programa: 750 ns.http://www. mas o segundo executou em paralelo com algum outro programa? Somente por avaliação empírica.  Qual programa é mais eficiente? – – – E se o primeiro foi executado em um core duo de 2. e o segundo em um 486 DX2? E se ambos foram executados na mesma máquina.gigamundo. conseguimos ter certeza de qual o programa mais eficiente? .

. Mas nos computadores do cliente não!  Programas podem possuir “casos especiais” para alguns tipos de casos – Deve-se então aumentar o número de casos de testes tentando cobrir o maior número possível de situações...http://www. mas somente o programa! .computacao.  Em uma dada linguagem.com Considerações sobre a Avaliação Empírica  Em meu supercomputador o programa “rodou” normal. – . – Não estamos analisando o algoritmo em si.gigamundo.. um programa pode ser mais eficiente do que quando implementado em outra linguagem.

computacao.http://www. end. vamos contar quantas operações são necessárias para calcular fatorial(5): function fatorial (n: integer): longint. for i := 1 to n do f := f*i. fatorial := f.com Contagem do Número de Operações Efetuadas  Experimento 2: Dado o algoritmo abaixo. i: integer. var f. end. begin if (n < 0) then f := -1 else begin f := 1. .gigamundo.

 Perceba que para calcular o fatorial de um número N qualquer. fatorial(n)  2*n + 3.http://www. fatorial(10)  23 operações. vamos executar 2*N operações. ou seja.com Contagem do Número de Operações Efetuadas  No algoritmo anterior: – – – – fatorial(1)  5 operações. um número de operações diretamente proporcional.gigamundo.computacao. fatorial(5)  13 operações. .

. quanto maior o número de elementos ou o valor do dado de entrada.http://www. por pior que nosso algoritmo seja. – – Para n = 1. provavelmente ele executará rápido e sem ocupar muito espaço! 2*n + 3 operações parecem piores que n2 operações para n = 0..com Considerações do Número de Operações Efetuadas  Em Computação. Mas e se nosso algoritmo executasse n2 operações? 1.000. 2*n + 3 é 2003.000.computacao. 1 ou 2.000! . geralmente não nos preocupamos com a eficiência do algoritmo quando tratando poucos elementos – – Se são poucos.gigamundo.  Entretanto.

as quais variam de acordo com o algoritmo.gigamundo.computacao. poderíamos dizer que: f(n) = 2*n + 3 . No algoritmo do experimento 2.com Determinação da Complexidade Assintótica de um Algoritmo  Definição de Complexidade – Quantidade de "trabalho" necessária para a execução de um algoritmo.  Complexidade Assintótica – – Trata-se de uma função que expressa a relação entre o volume de dados ( n ) e o tempo ( t ) necessário para o processamento dos mesmos. e em função do volume de dados. expressa em função das operações fundamentais.http://www.

 .com Determinação da Complexidade Assintótica de um Algoritmo  Notações O (“O Grande”).computacao.http://www. Ω (Omega) e θ (Theta).gigamundo. Obs: Funções assintoticamente nãonegativas.

com Notação O  Dadas duas funções f e g.http://www. 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. então.computacao. + x = O ( x2 )  .. o limite assintótico superior (upper bound) de f(n) Exemplos: 3x2 + 5 = O ( x2 ) x3/2 = O ( x3) 1 + 2 + 3 + .gigamundo. g(n) é..

http://www.computacao. o limite assintótico inferior (lower bound) de f(n) Exemplos: 3x3 + 5 = Ω ( x2 ) x3/2 = Ω ( x3/3)  .com Notação Ω  Dadas duas funções f e g. g(n) é. 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. então.gigamundo.

computacao. Exemplo: 3x3+ 5 = θ ( x3 )  .gigamundo. 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.http://www.com Notação θ  Dadas duas funções f e g.

Neste caso as instruções do algoritmo são executadas um número fixo de vezes. resolvendo cada um deles independentemente e depois juntando as soluções.computacao.gigamundo.http://www.com Principais Classes de Comportamento Assintótico     O (1) : O uso do algoritmo independe do tamanho de n. O (log n): ocorre tipicamente em algoritmos que resolvem um problema transformando-o em problemas menores. O (n log n): Ocorre em algoritmos que resolvem um problema quebrando-o em problemas menores. . O (n): linear – Um conjunto de operações de tamanho constante é aplicado a cada elemento da entrada.

com Principais Classes de Comportamento Assintótico    O (n2): quadrático. Eles ocorrem na solução de problemas quando se usa força bruta para resolvê-los. muitas vezes em um loop dentro de outro. Algoritmos desta ordem de complexidade ocorrem quando os itens de dados são processados aos pares.computacao. Úteis para resolver problemas de tamanhos relativamente pequenos.gigamundo. O (n!). O (nk): polinomial – OK para k pequeno. . O (kn). O (nn): exponencial – Geralmente não são úteis sob o ponto de vista prático.http://www.

93 1000000 199.64 100 664 10000 1000000 10^30 n=1000 1 9.2 100 1000 1024 n=100 1 6.com Tabela Comparativa das Principais Classes CLASSE NOTAÇÂO O constante O(1) logaritmico O(lg n) linear O(n) O(n lg n) O(n lg n) quadrático O(n²) cúbico O(n³) exponencial O(2^n) n=10 1 3.computacao..32 10 33.97 1000 9970 1000000 10^9 10^301 .3*10^5 10^12 10^18 10^301030 .gigamundo.http://www. n=1000000 1 19..

pode ser muito ruim. – Exemplo: ordenação dos dados de um vetor   Se ele já estiver ordenado? Ótimo! E se os dados estiverem em ordem inversa? Dependendo do algoritmo. .gigamundo.  Desta forma. para determinar a eficiência de um algoritmo.computacao. o pior caso e o caso médio.http://www. sempre há situações em que ele resolverá de forma muito rápida e outras em que “nem tanto”.com Os “Três Casos”  Para qualquer algoritmo. precisamos conhecer a sua complexidade para o melhor caso.

http://www. Menor consumo de memória. Menor tempo de processamento necessário.gigamundo. .computacao.com Melhor Caso  Caso para o qual o algoritmo executa da melhor forma possível: – – – Menor número de instruções.

.http://www.computacao. este é o caso para o qual o algoritmo executa da pior forma possível.gigamundo.com Pior Caso  Ao contrário do melhor caso.

. independente de como os dados estão (se ordenados ou não.com Caso Médio  A complexidade para o caso médio é dada por meio de cálculo tempo médio esperado para a resolução de um problema qualquer.computacao.http://www. etc).gigamundo.

busca-se definir a função matemática que expressa o número de operações necessárias para cada caso.computacao.com Calculando a Complexidade Para Cada Caso  Geralmente.gigamundo. então. é necessário conhecer qual o volume de dados que atende a cada um dos casos e. “resolvê-la”. então. No caso de algoritmos recursivos.  .http://www. deve-se determinar primeiro a fórmula de recorrência capaz de expressá-los e.

Gonçalo. Análise Assintótica da Complexidade de Algoritmos.http://www. Elton. disponível em http://w3.ualg.pdf  .pt/~hshah/algoritmos/aula8/Aula8. Complexidade Computacional.decom.com Referências Bibliográficas  MADEIRA.computacao.ufop.gigamundo.br/prof/elton/cic210/cap2. disponível em http://www.htm SILVA.

com Exercícios Sobre Matrizes.computacao.gigamundo.http://www. Recursividade e Complexidade de Algoritmos (Aula 5) Christiano Lima Santos .

Para recuperar um elemento qualquer. dada a sua posição na matriz inicial.http://www.computacao.  Qual a ordem de complexidade desse algoritmo para: – – – Armazenar n elementos.gigamundo.com Primeiro Exercício  Implemente um programa capaz de armazenar e recuperar dados de uma matriz triangular inferior. Para buscar a posição de um elemento qualquer. dado o valor do elemento.  Você consegue identificar quais são os casos pior. médio e melhor? .

 Qual a ordem de complexidade desse algoritmo para: – – Encontrar uma letra em uma frase de tamanho N.com Segundo Exercício  Implemente um programa que localiza uma substring dentro de outra string.  Você consegue identificar quais são os casos pior. Encontrar uma palavra de tamanho K em uma frase de tamanho N. médio e melhor? .http://www.gigamundo.computacao.

gigamundo.com Terceiro Exercício  Implemente um programa que armazena os telefones armazenados em ordem alfabética de acordo com os nomes das pessoas seguindo a seguinte “fórmula”: – Toda vez que for inserir um novo telefone.computacao. procura qual será a posição correta dele e. então.http://www. copia seus dados para lá (inserção direta). para inseri-lo ali. move antes todo mundo daquela posição em diante para uma após e.   Qual a ordem de complexidade deste algoritmo? Você consegue identificar quais são os casos pior. médio e melhor? .

computacao.gigamundo.com Quarto exercício  Implemente a função de potenciação de forma recursiva. Qual a complexidade deste algoritmo?   Faça uma comparação das vantagens e desvantagens desta implementação em relação à iterativa. .http://www.

http://www.com Ponteiros e Alocação Dinâmica (Aula 6) Christiano Lima Santos .gigamundo.computacao.

computacao. Apontando e recuperando uma variável.com Sumário          Motivação. Definição de ponteiro. Alocando e desalocando memória. Alocação Dinâmica de Memória. . Referências Bibliográficas. Tipos de ponteiro. Apontando para um endereço nulo.http://www. Apontando e Invocando um Subprograma.gigamundo.

computacao. –  É fácil criá-los somente com alocação estática? Como seria? .gigamundo.http://www.com Motivação  Por que estudar alocação dinâmica se podemos criar todas as estruturas de forma estática?  O que acontece em um programa com alocação estática quando precisamos de estruturas maiores do que as que foram criadas? Ponteiros e alocação dinâmica permite-nos criar diversos Tipos Abstratos de Dados.

 O conteúdo de uma variável ponteiro é o endereço de memória para o qual está apontando.computacao.  .com Definição de ponteiro  Tipo de variável que “aponta” para um outro endereço de memória. Um ponteiro pode referenciar e “des-referenciar”.http://www.gigamundo.

http://www. .computacao. Endereço nulo.com Definição de ponteiro  Um ponteiro pode apontar para: – Uma área com informação (uma variável ou conteúdo de uma variável). – – Uma rotina (procedimento ou função).gigamundo.

– Declaração:  var p : ^integer. . – Declaração:  var p : Pointer.http://www.com Tipos de Ponteiro  Tipado – irá interpretar o dado do endereço referenciado segundo o seu tipo. é necessário fazer o typecasting da informação referenciada a fim de acessá-la.gigamundo. logo.  Não-Tipado – não está associado a um tipo.computacao.

if ponteiro = nil then writeln(„Não está apontando‟) else writeln(„Está apontando para ‟.http://www.gigamundo. ponteiro := nil.com Apontando para um endereço nulo  Em Pascal. nil representa um endereço nulo que qualquer ponteiro pode apontar. . ponteiro).computacao.

http://www. uses crt. END. a: integer. p^ := 6. . writeln(„O novo valor de a é: ‟. writeln(„O endereço de a é: ‟. p^. p^).gigamundo. readkey. a). writeln(„O valor de a é: ‟. p := @a. „. var p: ^integer. BEGIN a := 12.computacao. p).com Apontando e Recuperando uma variável program ponteiro1. Confirmando: ‟.

var D: procedure(Arg: Byte). Arg). Begin writeln('Rotina 1 recebeu '. . uses crt. procedure rotina1(Arg: Byte). procedure rotina2(Arg: Byte). D(10). BEGIN D := @rotina2. end.computacao.com Apontando e Invocando um Subprograma program ponteiro2.gigamundo. { Irá imprimir: 'Rotina 2 recebeu 10' } END. end. Begin writeln('Rotina 2 recebeu '. Arg).http://www.

http://www.  .gigamundo.computacao.com Alocação Dinâmica de Memória  É a criação (reserva) de um endereço de memória para uma dada variável do tipo ponteiro. devemos desalocá-la (na alocação estática. o compilador é encarregado disso). quando alocamos dinamicamente um endereço de memória. Geralmente.

http://www. Não confunda nil com new! . p^ := 12.com Alocando e Desalocando Memória program ponteiro3. writeln(„Endereço apontado: ‟.gigamundo. readkey. END. BEGIN new(p). p^).computacao. var p: ^integer. uses crt. dispose(p). writeln(„Valor armazenado: ‟. p).

ufscar.joaomorais.html http://www2.http://www. http://blog.br/2008/08/23/po nteiros.com Referências Bibliográficas  Blog de João Morais.com.dc.br/~bsi/materiais/ed/u7 .computacao.gigamundo.html  .

com Listas (Aula 7) Christiano Lima Santos .computacao.http://www.gigamundo.

computacao.com Sumário    Definição de Lista Características Tipos de Implementação – – Lista Seqüencial Lista Encadeada ou Dinâmica  Outros Tipos de Listas   Implementação de uma Lista Referências Bibliográficas .http://www.gigamundo.

en.http://www. Também chamada lista linear. .computacao. L  e1. ..  .gigamundo. e2..com Definição de Lista  TAD que permite representação e manipulação de seus elementos de forma linear.

 .gigamundo.http://www.com Características  Uma coleção de dados homogênea.computacao.   Quantificável. Ordenável. Itens dispostos em seqüência.

gigamundo.http://www.com Tipos de Implementação  Seqüencial  Encadeada ou Dinâmica .computacao.

http://www.computacao.gigamundo.com

Lista Seqüencial

Os itens são armazenados em posição contígua na memória; Podem ser implementadas por meio de um array!

O programa executa um determinado cálculo para encontrar a posição na memória em que se encontra o elemento ei;

http://www.computacao.gigamundo.com

Lista Encadeada ou Dinâmica

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

Cada elemento possui o ponteiro para o próximo 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 satisfaçam certas restrições quanto à forma de recuperar um elemento ou de inserção do mesmo;

Pilhas; Filas.

http://www.computacao.gigamundo.com

Implementação de uma Lista

Lista Seqüencial var lista: array [1..N] of integer;

Lista Encadeada type PNo = ^TNo; TNo = record
valor: integer; proximo: PNo; end; var lista: TNo;

computacao.gigamundo.http://www.com Referências Bibliográficas  [Não foram definidas] .

com Buscas em Listas (Aula 8) Christiano Lima Santos .computacao.gigamundo.http://www.

gigamundo.computacao.com Sumário    Definição de Busca Tipos de Busca Busca Seqüencial – –  Busca Interpolada – – Implementação Complexidade Implementação Complexidade Implementação Complexidade    Busca Binária – – Comparando os Três Métodos Referências Bibliográficas .http://www.

remoção e busca levam para serem processadas afetam diretamente a eficiência de um algoritmo.computacao. Recuperação de informações em uma lista é uma operação importante e o tempo que operações de inserção.gigamundo.http://www.com Definição de Busca  Operação de percurso de uma estrutura de dados e recuperação de uma informação baseado em algum campo-chave.  .

com Tipos de Busca  Busca Seqüencial  baseia-se no percurso de todos os elementos de uma lista de forma seqüencial.   Busca Interpolada  similar à busca binária. Busca Binária  baseia-se no percurso dos elementos de uma lista levando em consideração o valor de chave esperado e o valor encontrado. introduz cálculo de próxima posição a ser verificada levando em consideração os valores dos “elementos-limite”.http://www.gigamundo.computacao. .

Não se conhece uma ordenação dentro da lista.http://www. Somos forçados a verificar um por um.computacao. comece pelo começo”.gigamundo.com Busca Seqüencial  “Se você não sabe por onde começar.   .

http://www. chave: integer): integer. . tamanho. End. buscaSeq := -1.com Busca Seqüencial .computacao. exit. var i : integer. Begin For i := 1 to tamanho do If lista[i] = chave then Begin buscaSeq := i. End.Implementação function buscaSeq(lista: TLista.gigamundo.

gigamundo.com Busca Seqüencial . O pior caso.Complexidade  Qual a complexidade para: – O melhor caso. – – .computacao.http://www. O caso médio.

O último elemento é o maior.computacao... O elemento do meio. podemos tirar proveito disso. é o do meio! .gigamundo. – – – O primeiro elemento é o menor.http://www.com Busca Binária  Quando os elementos de uma lista estão ordenados segundo um campo-chave.

então devo olhar o intervalo que possui os valores maiores que lista[X]. retorno a posição / elemento encontrado. Dado um intervalo [A. X-1]. então devo olhar o intervalo que possui os valores menores que lista[X].http://www. ou seja. Se lista[X] é o valor que procuro.gigamundo. ou seja. A é 1 e B é o tamanho da lista). B]. .computacao. [A. se lista[X] é menor que o valor que procuro. se lista[X] é maior que o valor que procuro. Senão. [X+1. B] (inicialmente. calculo um elemento X = floor((A + B) / 2). Repito todo o processo até encontrar (ou não!) o elemento.com Busca Binária       Suponha uma lista com valores ordenados de forma crescente. Senão.

X: integer. If lista[X] = chave then Begin buscaBin := X. End Else If lista[X] < chave then A := X + 1 Else B := X .gigamundo. buscaBin := -1. tamanho. .1.com Busca Binária . End. chave: integer): integer.http://www. End. exit. While (A <= B) do Begin X := floor( (A + B) / 2). B. B := tamanho. var A.Implementação function buscaBin(lista: TLista.computacao. Begin A := 1.

Complexidade  Qual a complexidade para: – O melhor caso.http://www.com Busca Binária .gigamundo. O pior caso. – – . O caso médio.computacao.

em vez de “olhar” sempre o elemento mediano. Entretanto.computacao.http://www. leva em conta a ordenação dos dados de uma lista.gigamundo.  . efetua um cálculo que busca estimar onde o elemento desejado deve estar.com Busca Interpolada  Similar à busca binária.

computacao. – No meio. onde provavelmente estará o 999? – Próximo do início. – . Próximo do fim.com Busca Interpolada  Se tenho uma lista ordenada crescente com 50 elementos. o primeiro é o 1 e o último é o 1000.http://www.gigamundo.

computacao.http://www.gigamundo. .1)*(chave – lista[A])/(lista[B] – lista[A])).com Busca Interpolada  Basta mudar o cálculo do termo X: X := 1 + floor((tamanho .

computacao. var A.com Busca Interpolada . B.1. While (A <= B) do Begin X := 1 + floor((tamanho . chave: integer): integer.Implementação function buscaInterp(lista: TLista. Begin A := 1.1)*(chave – lista[A])/(lista[B] – lista[A])). buscaInterp := -1. tamanho. X: integer.http://www. End. If lista[X] = chave then Begin buscaInterp := X. End. . End Else If lista[X] < chave then A := X + 1 Else B := X .gigamundo. B := tamanho. exit.

– – .com Busca Interpolada . O caso médio.computacao.http://www.Complexidade  Qual a complexidade para: – O melhor caso. O pior caso.gigamundo.

melhoraríamos a eficiência?  .http://www.gigamundo.computacao.com Comparando os Três Métodos   Em que ocasiões o busca seqüencial é melhor? O que é melhor: busca interpolada ou busca binária? E se na busca binária / interpolada comparássemos também os valores dos extremos com o valor da chave.

com Referências Bibliográficas  [Não foram definidas] .computacao.gigamundo.http://www.

gigamundo.com Listas Encadeadas (Aula 9) Christiano Lima Santos .http://www.computacao.

gigamundo.com Sumário           Definição de Lista Encadeada Listas Encadeadas Estáticas Listas Encadeadas Dinâmicas Listas Encadeadas Simples Operações em Listas Encadeadas Definindo nossa Lista Encadeada Inserção na Lista Encadeada Busca na Lista Encadeada Remoção na Lista Encadeada Referências Bibliográficas .computacao.http://www.

.computacao. | Esse encadeamento produz a estrutura linear da lista.com Definição de Lista Encadeada  Toda lista linear onde cada elemento (geralmente chamado nó) possui algum apontador para o próximo elemento...gigamundo. |  | .http://www.

O apontadores são inteiros. 0 1 Carlos 4 5 2 3 4 Erica Beth Ana Davi -1 1 3 2   5 .com Lista Encadeadas Estáticas  Alguns autores consideram a possibilidade de listas encadeadas criadas de forma estática.computacao. Exemplo de lista encadeada não dinâmica.gigamundo.http://www.

gigamundo.http://www. .computacao.com Listas Encadeadas Dinâmicas  Permitem a inserção de novos elementos com menos restrições quanto à posição (não precisa ser contígua) ou quantidade.

 Para fins de facilitar a inserção. remoção e busca pelo valor presente em um nó qualquer da lista.com Listas Encadeadas Simples  Cada nó possui um único apontador para o próximo nó. alteração (quando ordenada). Podem ser implementadas com listas seqüenciais ou dinâmicas.computacao. podemos eleger um campo (ou atributo) do nó para ser o campo-chave do mesmo.gigamundo.  .http://www.

Remoção.http://www. Busca / Recuperação.  Inserção.gigamundo.   .com Operações em Lista Encadeada  Criação.computacao.

proximo: PNo. TLista = PNo. .gigamundo.com Definindo Nossa Lista Encadeada (opção 1) type PNo = ^TNo. TNo = record valor: integer. end.computacao.http://www.

TNo = record valor: integer.gigamundo. end. tamanho: integer. .com Definindo Nossa Lista Encadeada (opção 2) type PNo = ^TNo. ultimo: PNo. proximo: PNo.http://www. TLista = record primeiro: PNo. end.computacao.

valor := v.computacao. end. t: PNo.http://www. end. var p.com Inserção na Lista Encadeada //Inserção no fim da Lista procedure inserirFim(var a: TLista. p^. if a = nil then a := p else begin t := a. Begin new(p). .gigamundo.proximo := nil. p^.proximo := p.proximo <> nil) do t := t^. while (t^. t^.proximo. var v: integer).

var p. Begin new(p). p^. t: PNo.proximo := a. a := p. . var v: integer). end.gigamundo.valor := v. p^.http://www.computacao.com Inserção na Lista Encadeada //Inserção no início da Lista procedure inserirInicio(var a: TLista.

proximo = nil) then t^. end. t: PNo.proximo := p else begin p^. if (t. end. end.proximo. end else begin t := a.proximo <> nil) && ((t^.proximo := p. a := p. p^.proximo^).proximo := a. var v: integer). while ((t^.valor >= v then begin p^.valor := v.computacao.gigamundo.proximo.http://www. Begin new(p). t^.proximo := t^.com Inserção na Lista Encadeada //Inserção ordenada procedure inserirOrdenado(var a: TLista.valor < v)) do t := t^. p^. if a = nil then a := p else if a^. var p. .proximo := nil.

End.valor <> v)) t := t^.com Busca na Lista Encadeada //Busca Seqüencial function buscaSeq(a: TLista.http://www.gigamundo. Begin t := a.computacao. buscaSeq := t. v: integer): PNo. . while ((t <> nil) && (t^. var t: PNo.proximo.

gigamundo. Busca Binária ou Interpolada.http://www. é possível? Há vantagens em seu uso em relação à Busca Seqüencial? .com Busca na Lista Encadeada  Em Listas Encadeadas Dinâmicas.computacao.

proximo). removendo-os (dispose). Cuidado para não remover um elemento antes de guardar a referência para o próximo  como saber quem é o próximo elemento de um elemento que não mais existe?    . No caso de remoção de todos os elementos.com Remoção na Lista Encadeada  Como seria a remoção de um elemento em uma lista encadeada? E a remoção de todos os elementos? No caso de remoção de um elemento (e). a idéia é percorrer todos os elementos da lista.gigamundo.http://www. tomar o cuidado para garantir que o anterior (t) dele passe a apontar para o sucessor dele (t.proximo := e.computacao.

com Referências Bibliográficas  [Não foram definidas] .http://www.computacao.gigamundo.

http://www.gigamundo.computacao.com Pilhas & Filas (Aula 10) Christiano Lima Santos .

com Sumário  Definição de Pilha – – Exemplo de Pilha no Mundo Real Implementação de uma Pilha Exemplo de Fila no Mundo Real Implementação de uma Fila  Definição de Fila – –   Exercícios Referências Bibliográficas .computacao.http://www.gigamundo.

com Definição de Pilha  Toda lista linear onde o último elemento a entrar é o primeiro a sair (ou o primeiro a entrar é o último a sair. . não é necessário ordenar.computacao. basta que a inserção e remoção sejam feitas na mesma extremidade da lista (head).http://www.gigamundo. –  Obviamente. FILO). Para satisfazer esta condição.

A carta mais ao topo (a primeira a ser removida) foi a última a ser colocada sobre o monte.  . colocadas uma a uma sobre a mesa. formando um monte.com Exemplo de Pilha no Mundo Real  Um baralho de cartas. umas sobre as outras.computacao.gigamundo.http://www.

valor: integer): Boolean.http://www. TNo = record valor: integer. function push(var pilha: TPilha. function pop(var pilha: TPilha): integer. TPilha = record head: PNo. . end. proximo: PNo.gigamundo.computacao.com Implementação de uma Pilha type PNo = ^TNo. end.

gigamundo.http://www.  . devolvendo então o valor daquele elemento.com Implementação de uma Pilha  Push: Nada mais é que o nosso método inserirInicio! Pop: Como devemos inserir e remover da mesma extremidade da lista. devemos então remover do início.computacao.

. var p. p^. t: PNo.head := p. end. pilha. p^.head. push := true.computacao.com Implementando o Método Push function push(var pilha: TPilha.proximo := pilha.http://www.valor := v. Begin new(p). valor: integer): Boolean.gigamundo.

end. Begin if (pilha.gigamundo.head := pilha.head^. dispose(p). var p: PNo.valor.proximo.http://www. . pilha. end.head = nil) then pop := -1 else begin p := pilha. pop := p^.head.com Implementando o Método Pop function pop(var pilha: TPilha): integer.computacao.

com Definição de Fila  Toda lista linear onde o primeiro elemento a entrar é o primeiro a sair (FIFO).gigamundo.computacao. Para satisfazer esta condição. –  Obviamente. também não é necessário ordenar. basta que a inserção seja feita em uma extremidade (tail) da lista e a remoção seja feita na outra extremidade (head). .http://www.

computacao. e a fila do RESUN?  Muitos processos e requisições em um computador são organizados e gerenciados por meio de filas.com Exemplo de Fila no Mundo Real   Muitas coisas são ordenadas por fila.. – .http://www.. A fila de um banco por exemplo.gigamundo. .

proximo: PNo.com Implementação de uma Fila type PNo = ^TNo. end. function push(var pilha: TFila.computacao. valor: integer): Boolean. TNo = record valor: integer. .gigamundo. end.http://www. function pop(var pilha: TFila): integer. TFila = record head: PNo. tail: PNo.

– Nós mantemos um ponteiro para o último elemento!  Pop: A remoção continua sendo feita na cabeça.http://www.com Implementação de uma Fila  Push: Apesar de inserir no final. .gigamundo. nós não precisaremos percorrer toda a fila para inserir no fim. o que facilita muito as coisas.computacao.

end.valor := v.proximo := nil. t: PNo.tail := p.proximo := p. var p.tail = nil) then fila. push := true. if (fila. valor: integer): Boolean. p^.http://www.computacao.head := p else fila. Begin new(p). fila.com Implementando o Método Push function push(var fila: TFila.tail^. . p^.gigamundo.

if (fila^.com Implementando o Método Pop function pop(var fila: TFila): integer. fila^.head = nil) then pop := -1.gigamundo. end. dispose(p). var p: PNo.head := fila^.proximo.http://www.head = nil) then fila^. Begin if (fila^. else begin p := fila.computacao.head^.tail := nil. . pop := p^.valor. end.

. o jogo deverá ir inserindo cada número (0 <= K <= 9) na pilha/fila. mostrar o placar final e encerrar o jogo. declarar empate.computacao.gigamundo. Caso acabem todos os números. Quando os jogadores escolherem sair. Deve-se escolher quantos números serão embaralhados e ocultos e qual o modo de organização dos mesmos.http://www. os jogadores devem alternar-se tentando adivinhar qual o próximo número a ser removido do jogo. Após isso. Ganha quem não errar. Primeiro.com Exercício      Crie um jogo para ser disputado por duas pessoas com dois “modos” (o modo pilha e o modo fila) e a opção de sair. Em segundo lugar. mostrando um de cada vez na tela (lembre-se de limpar ela por inteiro a cada número mostrado).

http://www.computacao.gigamundo.com

Referências Bibliográficas

http://www.computacao.gigamundo.com

Outros Tipos de Listas (Aula 11)

Christiano Lima Santos

http://www.computacao.gigamundo.com

Sumário

Lista Duplamente Encadeada
– –

Declaração Operações Declaração Operações

Lista Circular
– –

 

Exercícios Referências Bibliográficas

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 não somente avançando, como também recuando;

I

|

|

|

...

|

.http://www. isso significa mais ponteiros para atualizar. remoções e alterações.com Lista Duplamente Encadeada  Vantagem: – Facilidades na hora de procurar um elemento. o que pode levar programadores não muito bons a cometer falhas (o que não é o caso de vocês!).gigamundo. principalmente se o mesmo estiver antes da atual posição pesquisada.computacao.  Desvantagem: – Nas inserções.

anterior: PNo.http://www.computacao. proximo: PNo. end. . TNo = record valor: integer.com Declaração de uma Lista Duplamente Encadeada (opção 1) type PNo = ^TNo.gigamundo. TLista = PNo.

end. ultimo: PNo.gigamundo. TLista = record primeiro: PNo. .computacao. proximo: PNo.http://www. end. TNo = record valor: integer. anterior: PNo.com Declaração de uma Lista Duplamente Encadeada (opção 2) type PNo = ^TNo. tamanho: integer.

Inserção.computacao.com Operações em Lista Duplamente Encadeada  Operações Básicas: – – – – Criação. Busca / Recuperação.  Como seriam essas operações em uma Lista DE se ela não estiver ordenada? E se estiver ordenada? .gigamundo.http://www. Remoção.

com Lista Circular  Estrutura de dados linear em que o último elemento aponta para o primeiro.computacao. Pode-se adotar encadeamento simples.http://www. Lista em que todo elemento possui um “sucessor” (o sucessor do último é o primeiro elemento).   . duplo ou outro qualquer.gigamundo.

computacao.http://www. logo não podemos mais identificar o último elemento desta forma!  Mas podemos parar quando percebermos que o próximo é o “primeiro elemento” (apontado pela lista circular). .com Lista Circular  Observações: – Não há mais elementos apontando para nil. – Podemos até mesmo deslocar a “cabeça” da lista sem que se perca a referência para nenhum dos elementos.gigamundo.  Mas isso não é interessante caso a lista seja ordenada.

end.http://www.computacao. TLista = PNo.com Declaração de uma Lista Circular (opção 1) type PNo = ^TNo. proximo: PNo.gigamundo. TNo = record valor: integer. .

com Declaração de uma Lista Circular (opção 2) type PNo = ^TNo. TLista = record primeiro: PNo. end. end. TNo = record valor: integer.computacao. . proximo: PNo.gigamundo.http://www. tamanho: integer.

gigamundo. Busca / Recuperação.  Como seriam essas operações em uma Lista Circular se ela não estiver ordenada? E se estiver ordenada? . Inserção.computacao.com Operações em Lista Circular  Operações Básicas: – – – – Criação.http://www. Remoção.

http://www.gigamundo. Lista duplamente encadeada ordenada. busca. alteração e remoção para: – Lista duplamente encadeada não-ordenada. Lista circular.computacao. – – .com Exercícios  Implemente as operações de inserção.

http://www.gigamundo.computacao.com Referências Bibliográficas  [Não foram definidas] .

computacao.com Árvores (Aula 12) Christiano Lima Santos .gigamundo.http://www.

com Sumário          Definição de Árvore Representação Gráfica Classificação das Árvores Declaração de uma Árvore N-ária Declaração de uma Árvore Não N-ária Nível de um Nó Altura ou Profundidade de uma Árvore Percurso de uma Árvore Inserção em uma Árvore         Remoção em uma Árvore Árvores Binárias Árvores Binárias de Busca Inserção em uma Árvore Binária de Busca Busca em uma Árvore Binária de Busca Deleção em uma Árvore Binária de Busca Comparações entre Ordens de Complexidade Referências Bibliográficas .computacao.http://www.gigamundo.

Folhas.http://www.computacao. “galhos” ou sub-árvores – conceito de poda.com Definição de Árvore  Estrutura de dados não linear.  Um grafo totalmente conexo e acíclico.gigamundo. . Analogia a uma árvore (reino vegetal): – – –  Raiz.

computacao.com Representação Gráfica .http://www.gigamundo.

Quaternária (quatro nós).http://www.gigamundo. N-ária (N nós). .com Classificação das Árvores  Uma árvore pode ser classificada de diversas formas diferentes. Ternária (três nós). Não N-ária (quando não conhecemos ou não há um número máximo de nós-filhos para cada nópai). uma delas é pelo número máximo de nós-filhos que cada nópai pode ter: – – – – – Binária (dois nós).computacao.

end. filhos: array [1. .gigamundo. TNo = record valor: integer.computacao. type PNo = ^Tno. TArvore = PNo..N] of PNo.http://www.com Declaração de uma Árvore N-ária const N = 2.

gigamundo. TArvore = PNo. irmao: PNo. end. filho: PNo.computacao. .http://www.com Declaração de uma Árvore Não N-ária type PNo = ^TNo. TNo = record valor: integer.

http://www.computacao. 0 1 2 3 .com Nível de um Nó  Refere-se à distância do mesmo até a raiz.gigamundo.

com Altura ou Profundidade de uma Árvore  É o nível máximo que um nó da árvore atinge.http://www.gigamundo.computacao. 0 1 2 3 A altura desta árvore é 3! Ela possui 4 níveis! .

gigamundo. na busca de um nó a partir de uma chave. por exemplo.   É empregado. .com Percurso de uma Árvore  Também conhecido como travessia.computacao. Consiste em percorrer (em uma dada ordem) todos os nós de um árvore ou até encontrar algum que satisfaça ao problema em questão.http://www.

computacao.com Percurso de uma Árvore  Tipos – – – Pré-ordem / pre-order.gigamundo. . Em-ordem / in-order. Pós-ordem / pos-order.http://www.

gigamundo.http://www.com Percurso Pré-Ordem  Processa primeiro a informação do nó atual. para só então processar a informação de seus filhos. função x (no) Início processa no. . Fim.computacao. aplica função x para cada filho de no.

filho2.computacao.telefone else begin s := buscaTelefone(no. if s <> “” then buscaTelefone := s else buscaTelefone := “”. if s <> “” then buscaTelefone := s else begin s := buscaTelefone(no. .com Percurso Pré-Ordem function buscaTelefone(no: PNode. End.gigamundo. nome: String): String. nome). end. end. nome).nome = nome then buscaTelefone := no.filho1. var s: String. Begin if no = nil then buscaTelefone := “” else if no.http://www.

http://www.computacao.gigamundo.com

Percurso Em-Ordem

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

função x (no) Início aplica função x para parte dos filhos de no; processa no; aplica função x para parte dos filhos de no; Fim;

http://www.computacao.gigamundo.com

Percurso Pós-Ordem

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

função x (no) Início aplica função x para cada filho de no; processa no; Fim;

http://www.computacao.gigamundo.com

Inserção em uma Árvore

Cria-se o novo nó (método new) e popula-se o mesmo com as informações desejadas; Pode utilizar algum critério para determinar em qual nó e em qual posição o novo nó deverá ficar; O pai deve apontar para o filho.

http://www.computacao.gigamundo.com

Remoção em uma Árvore
 

 

Utiliza-se de um outro ponteiro ( t ) para apontar para o objeto que se deseja remover; Após isso, reorganiza-se seus filhos a fim de que seu pai possa apontara para esses e ninguém ficar “abandonado”, eliminando o vínculo entre a árvore e o nó-alvo; Por fim, elimina-se o nó (método dispose); E se nosso objetivo for remover TODOS os nós de uma árvore, qual método de percurso você utilizaria? Por quê?

http://www.computacao. Cada nível pode ter no máximo 2N nós. (árvore completa) . (árvore degenerada) Mínimo: Log2 N + 1. Muito usadas em computação.com Árvores Binárias    Árvores onde cada nó possui no máximo dois filhos. Quantidade de níveis que uma árvore binária com N nós pode ter: – –  Máximo: N.gigamundo. onde N é o valor do nível.

com Árvores Binárias  Dado um nó qualquer. ele possuirá uma subárvore esquerda e uma sub-árvore direita (podendo qualquer uma delas ou ambas não possuir elementos). Sub-árvore direita Sub-árvore esquerda .http://www.gigamundo.computacao.

São árvores em que é possível determinar em que direção buscar um dado nó a partir do valor do pai e levando-se em consideração alguma regra quanto à disposição dos filhos.gigamundo.com Árvores Binárias de Busca   Ou árvores de busca binária (tanto faz!).http://www. nós com valores maiores que o pai à direita. – – Nós com valores menores que o pai à esquerda. Nós que satisfazem uma condição expressa pelo pai de um lado e nós que não satisfazem do outro.computacao.  O que acontecerá se a árvore de busca não estiver bem balanceada? .

computacao.valor := valor.filho[2] := nil. t: PNode. p. inserir := true. exit.filho[1] = nil then begin t^. inserir := false.gigamundo. end else begin inserir := false. end. exit. Begin new(p).http://www.filho[2] := p. p.com Inserção em uma Árvore Binária de Busca function inserir(var arvore: TArvore. while t <> nil do begin if (t^. end else t := t^.filho[1] := nil.filho[2]. p. inserir := true. end else if t^.valor < valor then begin if t^. . end.filho[1]. var p. exit.valor > valor) then begin if t^.filho[2] = nil then begin t^.filho[1] := p. valor: integer): boolean. if arvore = nil then arvore := p else begin t := arvore. end else t := t^. end.

valor: integer): PNode. end.http://www. Begin if (arvore = nil) then buscar := nil else begin t := arvore.filho[1] else if t^. . buscar := nil. end.gigamundo. var t:PNode. end.valor < valor then t := t^.valor > valor then t := t^. while (t <> nil) do begin if t^. end. exit.filho[2] else begin buscar := t.com Busca em uma Árvore Binária de Busca function buscar(arvore: TArvore.computacao.

computacao.gigamundo.http://www.com Deleção em uma Árvore Binária de Busca  Caso 1: Remover um nó que não possui filhos .

com Deleção em uma Árvore Binária de Busca  Caso 2: Remover um nó que possui um filho .computacao.http://www.gigamundo.

computacao. teremos que remover o nó selecionado de onde ele está  abordagem recursiva. . Com isso.http://www.gigamundo.com Deleção em uma Árvore Binária 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.

http://www.computacao.gigamundo.com Comparações entre Ordens de Complexidade .

gigamundo.http://www.com Referências Bibliográficas  [Não foram definidas] .computacao.

com Árvores AVL (Aula 13) Christiano Lima Santos .http://www.computacao.gigamundo.

http://www.gigamundo.computacao.com Sumário    Definição de Árvore AVL Representação Gráfica Operações – – – Inserção Remoção Rotação  Simples – À Esquerda – À Direita  Dupla – Pesquisa  Referências Bibliográficas .

computacao.com Definição de Árvore AVL  Trata-se de uma Árvore de Busca Binária Auto-Balanceada. isto é. que mantém o balanceamento de sua árvore em cada operação executada.  .http://www. A maior diferença possível entre os níveis de dois nós-folhas é 1.gigamundo.

computacao.http://www.gigamundo.com Representação Gráfica Árvore Não-Balanceada Árvore AVL (Balanceada) .

.computacao. Dupla.gigamundo.com Operações  Inserção  Remoção Rotação – –  Simples (à esquerda ou à direita).http://www.

.computacao.   Verifica-se se ela está balanceada. efetuar rotação (simples ou dupla) até que esteja.http://www.com Inserção  Efetua-se a busca pelo nó (igual a qualquer outra árvore de busca binária). Insere-se o nó. caso não esteja.gigamundo.

efetue rotações. caso não esteja.computacao. – Por quê? A remoção de um nó sem filhos é o caso mais simples!  Verifique se a árvore se encontra balanceada.http://www.  Rotaciona-se até que o mesmo seja um nó-folha e remova-o. .com Remoção  Efetua-se a busca pelo nó (igual a qualquer outra árvore de busca binária).gigamundo.

gigamundo. Pode ser simples (um único passo. rotacionando à esquerda ou à direita) ou dupla (efetuando mais de uma vez a rotação. em qualquer combinação de rotações simples).http://www.  .computacao.com Rotação  Operação em que a ordem dos nós em uma árvore de busca binária pode ser invertida a fim de manter o balanceamento da mesma.

gigamundo.  . Formam “uma linha reta”.computacao.com Rotação Simples  Ocorre quando o nó desbalanceado e o seu filho estão no mesmo sentido de inclinação da árvore.http://www.

Torne o filho à esquerda de Y (Z) o filho à direita de X.computacao.com Rotação à Esquerda  Dado um nó X com um filho à direita Y e este tendo um filho à esquerda Z. .http://www.gigamundo.  Pseudo-código: Seja Y o filho à direita de X. Torne X o filho à esquerda de Y.

http://www. . Torne o filho à direita de Y (Z) o filho à esquerda de X.computacao.  Pseudo-código: Seja Y o filho à esquerda de X. Torne X o filho à direita de Y.gigamundo.com Rotação à Direita  Dado um nó X com um filho à esquerda Y e este tendo um filho à direita Z.

“um joelho”.  .com Rotação Dupla  Ocorre quando o nó desbalanceado está em um sentido da inclinação e o seu filho em outro. assim.http://www.computacao. Formam.gigamundo.

computacao.gigamundo.44 log2 n no pior caso  .http://www.com Pesquisa  O tempo médio para encontrar um elemento em uma árvore AVL é da ordem de O (log n) Aproximadamente 1.

html .org/wiki/Árvore_AVL  .computacao.uottawa.csi.Aplicação interessante para compreender árvores AVL http://pt.wikipedia.ca/~stan/csi2514/appl ets/avl/BT.com Referências Bibliográficas  http://www.gigamundo.http://www.

gigamundo.com Classificação de Dados (Aula 14) Christiano Lima Santos .http://www.computacao.

computacao.com Sumário           Por que estudar métodos para classificação de dados? Alguns tipos de algoritmos de classificação Seleção Direta (Selection Sort) Inserção Direta (Insertion Sort) Método da Bolha (Bubble Sort) Método do Balde (Bucket Sort) QuickSort MergeSort HeapSort Referências Bibliográficas .gigamundo.http://www.

http://www. quando executados sobre uma base com um milhão de dados? Sendo assim.computacao.com Por que estudar métodos para classificação de dados?  Qual a importância da ordenação dos dados quando se deseja uma busca mais eficiente ou classificar os mesmos segundo algum critério? Há muita diferença entre o tempo de processamento de um algoritmo de ordenação O(n log n) e o tempo de um algoritmo de ordenação O(n2). torna-se interessante o estudo dos diversos tipos de algoritmos de ordenação?   .gigamundo.

com Alguns Tipos de Algoritmos de Classificação        Seleção direta (selection sort) Inserção direta (insertion sort) Método da Bolha (bubble sort) Método do “Balde” (bucket sort) Quicksort Mergesort Heapsort .computacao.gigamundo.http://www.

gigamundo. procura o segundo menor elemento presente no mesmo e troca de posição com o segundo elemento do array. varre-o por completo procurando o primeiro menor elemento presente no mesmo. trocando o mesmo de lugar com o primeiro elemento do array. infelizmente. sem necessidade de usar uma estrutura auxiliar. – – .com Seleção Direta (Selection Sort)  Definição – Trata-se de um algoritmo de comparação in-loco. Após isso. é também o mais ineficiente de todos os aqui apresentados.computacao. executa comparações e operações de troca na própria estrutura original. Procede desta forma até processar os N elementos.http://www. isto é. É o algoritmo mais simples de implementar. Dado um array/lista não ordenado.

computacao.gigamundo.http://www.com Seleção Direta (Selection Sort)  Ilustração .

j. begin for i := 1 to N do begin menor := i. a[i] := a[menor]. . end.com Seleção Direta (Selection Sort)  Implementação function selecaoDireta(var a: array [1. for j := i+1 to N do begin if a[menor] > a[j] then menor := j. end.. v: real.computacao. a[menor] := v.N] of real):boolean. var i. menor : integer. end. selecaoDireta := true.gigamundo. end.http://www. if menor <> i then begin v := a[i].

.com Seleção Direta (Selection Sort)  Complexidade – Tanto para o pior caso.. o algoritmo sempre precisará efetuar:     N operações para encontrar o primeiro menor elemento.http://www. . N-1 operações para encontrar o segundo menor elemento. + N = N(N+1)/2 = O(n2) .gigamundo. quanto para o caso médio e para o melhor caso. 1 operação para encontrar o n-ésimo menor elemento... Total: 1 + 2 + .computacao.

computacao. procurando a posição correta e insere-o.com Inserção Direta (Insertion Sort)  Definição – Dado um array/lista Y não ordenado. . então. Pega o segundo elemento e também varre toda a lista X. o insere. Procede desta forma até processar os N elementos. Pega o primeiro elemento de Y e varre toda a lista X procurando a posição correta para inseri-lo e.http://www.gigamundo. inicia com uma lista X vazia.

gigamundo.com Inserção Direta (Insertion Sort)  Ilustração .http://www.computacao.

. end. var x. t := x. x := x^. i := 1. t := x.com Inserção Direta (Insertion Sort)  Implementação while (x <> nil) do begin y[i] := x^.valor. insercaoDireta := true.t: TLista.gigamundo.computacao. .proximo. end. function insercaoDireta(var y: array [1.N] of real):boolean. i: integer. for i := 1 to N do insercaoOrdenada(x. begin x := nil. y[i]).http://www. dispose(t).

Caso Médio: O(n2). pois para cada elemento ele terá que inseri-lo na cauda da lista. .. o que significará 1 + 2 + 3 + . pois ele simplesmente pegará cada elemento e inserirá na cabeça da lista. + N = N(N+1)/2 operações.computacao.com Inserção Direta (Insertion Sort)  Complexidade – – – Melhor Caso: O(n)..http://www.gigamundo. Pior Caso: O(n2).

Se for. – . isto é.gigamundo. sempre checando se o elemento xi é menor ou igual ao xi+1.computacao. Procede desta forma até varrer toda a estrutura e chegar ao fim. Este algoritmo de classificação também é in-loco.http://www.com Método da Bolha (Bubble Sort)  Definição – Varre do início ao fim. dispensa a utilização de estruturas auxiliares para efetuar a classificação dos dados. inverte suas posições e recua uma posição para checar então com o anterior (xi-1 e xi). passa para o próximo par (xi+1 e xi+2). caso não seja.

gigamundo.computacao.com Método da Bolha (Bubble Sort)  Ilustração .http://www.

http://www. if (i < 1) then i := 1.N] of real):boolean. c: real. var i: integer.com Método da Bolha (Bubble Sort)  Implementação else begin c := y[i]. i := i – 1. function metodoDaBolha(insercaoDireta (var y: array [1. while (i < N) do begin if (y[i] <= y[i+1]) then i := i + 1 .gigamundo. end. begin i := 1. y[i] := y[i+1]. metodoDaBolha := true. end..computacao. y[i+1] := c.

+ N trocas.com Método da Bolha (Bubble Sort)  Complexidade – – – Melhor Caso: O(n).gigamundo.. pois passa uma vez só por cada par (todos os dados já estão ordenados).computacao. onde os dados estão na ordem inversa e portanto levará executará 1 + 2 + .http://www. Caso médio: O(n2).. . Pior Caso: O(n2).

gigamundo. cada qual podendo ser implementado como um array ou uma lista.com Método do Balde (Bucket Sort)  Definição – Cria K buckets identificados e ordenados segundo algum critério (buckets contendo elementos de 1 a 10. Este método geralmente se utiliza de um array de buckets como estrutura auxiliar. Após isso.http://www. pode-se aplicar a cada bucket o algoritmo de ordenação que melhor convier. etc.computacao. – . buckets contendo elementos de 11 a 20.) e então armazena os elementos dentro de cada bucket correspondente.

computacao.gigamundo.com Método do Balde (Bucket Sort)  Ilustração .http://www.

buckets[n-1] .gigamundo. 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].computacao..http://www.. k)] for i = 0 to n .. .1 do next-sort(buckets[i]) return the concatenation of buckets[0].com Método do Balde (Bucket Sort)  Implementação (pseudo-código) function bucket-sort(array.

j. var bucket: array [1.com Método do Balde (Bucket Sort)  Implementação function metodoDoBalde(var y: array [1.k] of record slots: array [1..http://www.N] of real... end. menor. index: integer. k: integer):Boolean. .N] of real. maior: real.c: integer.computacao.gigamundo. i.

gigamundo. maior := y[1]. end.com Método do Balde (Bucket Sort)  Implementação (continuação) begin menor := y[1]. if y[i] < menor then menor := y[i].computacao. . for i := 1 to N do begin if y[i] > maior then maior := y[i].http://www.

slots[bucket[j]. c := 1.index + 1.computacao.http://www.menor)/(maior – menor + 1). end.index] := y[i].gigamundo. .index := bucket[j].com Método do Balde (Bucket Sort)  Implementação (continuação) for i := 1 to N do begin j := 1 + k*(y[i] . bucket[j]. bucket[j].

slots[i]. .slots. metodoDoBalde := true. c := c + 1.http://www.computacao.index do begin y[c] := bucket[j]. end.index). bucket[j].com Método do Balde (Bucket Sort)  Implementação (continuação) for j := 1 to k do begin selecaoDireta(bucket[j].gigamundo. for i := 1 to bucket[j]. end. end.

http://www.gigamundo. .computacao.com Método do Balde (Bucket Sort)  Complexidade – Depende do algoritmo de classificação a ser usado em cada bucket.

http://www. escolhendo-se novamente um pivô e dividindo-se em dois grupos menores. O processo procee até que cada grupo contenha somente um elemento.com Quicksort  Definição – Algoritmo “dividir para conquistar”. Escolhe um pivô dentro da lista de dados a ordenar e cria dois grupos.gigamundo. concatenando todos e formando uma lista ordenada. o algoritmo é executado para cada grupo.computacao. um com os números menores que ele (à esquerda) e outro com números maiores que ele (à direita). Após isso. .

http://www.computacao.gigamundo.com Quicksort  Ilustração [Ops! Não escrevi aqui!] .

pivo. while (y[j] > pivo) AND (j > FimVet) do j := j – 1.computacao. y[i] := y[j]. end. function quicksort(var y: array [1. if (i < FimVet) then quicksort(y. i. FimVet) end. until (i > j).. y[j] := aux.com Quicksort  Implementação if (i <= j) then begin aux := y[i]. . j). IniVet. IniVet. Início i := IniVet. pivo := y[(IniVet + FimVet) div 2].gigamundo. aux: real.http://www. FimVet: integer): boolean. j := j – 1. var i. j: integer. i := i + 1.N] of real. if (j > IniVet) then quicksort(y. repeat while (y[i] < pivo) AND (i < FimVet) do i := i + 1. j := FimVet.

com Quicksort  Complexidade [Ops! Não escrevi aqui!] .computacao.gigamundo.http://www.

juntando duas listas diferentes por vez mantendo a nova ordem dos elementos.com Mergesort  Definição – Também algoritmo “dividir para conquistar”.gigamundo. “Quebra” a lista em listas menores.computacao. isto é. até que cada lista contenha somente um elemento. quando então começa a ordená-las fazendo um “merge”.http://www. .

http://www.gigamundo.computacao.com Mergesort  Ilustração [Ops! Não escrevi aqui!] .

gigamundo.computacao.http://www.com Mergesort  Implementação [Ops! Não escrevi aqui!] .

com Mergesort  Complexidade [Ops! Não escrevi aqui!] .computacao.gigamundo.http://www.

http://www. Todo o problema aqui resumese à criação desta árvore.computacao.com Heapsort  Definição – Utiliza uma árvore binária chamada “heap” para ordenar os dados.gigamundo. . bem como a remoção de cada nó da mesma sem alterar a ordenação.

gigamundo.com Heapsort  Ilustração [Ops! Não escrevi aqui!] .computacao.http://www.

computacao.com Heapsort  Implementação [Ops! Não escrevi aqui!] .http://www.gigamundo.

http://www.gigamundo.computacao.com Heapsort  Complexidade [Ops! Não escrevi aqui!] .

http://www.gigamundo.com Referências Bibliográficas  [Não foram definidas] .computacao.

Sign up to vote on this title
UsefulNot useful