Prof. Dr. Alexandre C. B. Ramos ramos@unifei.edu.br www.ici.unifei.edu.br/ramos
Algoritmos e Estruturas de Dados
Objetivos Mapear o domnio do problema no domnio da soluo utilizando estruturas de armazenamento de informaes adequadas e algortimos eficientes. Construir estruturas a partir de abstraes tanto de informaes quanto do procedimentos. Construir e analisar algortimos para manipular e armazenar dados em programas. Critrio de avaliao: 70% - Prova bimestral 30% - Trabalhos
Programa 1. bimestre Introduo Tipos abstratos de dados Registros Procedimentos e funes Recursividade Complexidade de algoritmos Introduo Tipos de complexidade Notao O Algoritmos timos Programa 1. bimestre Listas, filas e pilhas Alocao sequencial Listas encadeadas Listas circulares Listas duplamente encadeadas Filas e pilhas rvores Percurso em rvores rvores AVL rvores rubro-negras rvores mltiplas
Bibliografia Tenenbaum, A. M. et all. Estruturas de Dados Usando C. Makron Books. So Paulo, 1995. Estruturas de dados. Paulo Veloso, Clsio Veloso dos Santos e outros. Ed. Campus. Algortmos e Estruturas de dados. Guimares Lages. Ed. LTC. Estruturas de dados Fundamentais: conceitos e aplicaes. Silvio do Lago. Ed. rica
Avaliaes Trabalhos prticos individuais = 10pts Seminrios em grupo = 20pts Avaliao escrita = 70 pts (26/09/2012)
Seminrios Apresentao e exerccios com correo. Temas e datas: rvores AVL : Diogenes, Ricardo e Wellison : 12/09 rvores Rubro-negras : Daniele e Henrique : 12/09 rvores B e B* : Iuri, Orlando e Rodrigo : 19/09 rvores de Bit : Joo e Danillo : 19/09 rvores R : Felipe e Flvio : 19/09
Avaliao: 26/09
Introduo Desenvolvimento de Programas O processo de soluo de problemas por meio de computador pode ser descrito a partir das seguintes etapas: 1. Especificao do problema 2. Projeto em alto nvel 3. Anlise de alternativas 4. Refinamento e codificao 5. Verificao do comportamento Desenvolvimento de Programas Nesta descrio devemos ressaltar 3 pontos: Estruturas de dados, que retratam as relaes lgicas existentes entre os dados, de modo anlogo ao uso de um modelo matemtico para espelhar alguns aspectos de uma realidade fsica. Operaes, manipulam as estruturas de dados transformando-as. Estruturas de Representao, que so formas de armazenar na memria os dados, isto , as estruturas de dados manipuladas pelas operaes, que devem: Preservar as relaes lgicas existentes entre os dados. Permitir que as operaes sejam descritas por procedimentos simples e eficientes.
Exerccio 1 Escreva um algoritmo para solucionar o seguinte problema: Trs missionrios e trs canibais se encontram em um lado do rio. Todos concordam que precisam chegar do outro lado. Mas os missionrios no confiam nos canibais. Assim, os missionrios querem atravessar o rio de modo tal que o nmero de missionrios em qualquer das margens nunca seja inferior ao nmero de canibais que estiver do mesmo lado. O nico barco disponvel s carrega 2 pessoas por vez. Como todos podero chegar ao outro lado, sem que os missionrios arrisquem suas vidas? Exerccio 1bis Escreva um programa em linguagem C que, de forma interativa, ajude o usurio a resolver o problema. O programa dever ser apresentado na tela de texto, sendo os canibais representados pela letra C e os missionarios pela letra M. O usurio dever escolher o conjunto certo de C e M para atravessar o rio para o lado desejado. A aparencia do programa podera ser:
CC MMM C
Vai: C C Volta: Tipos Abstratos de Dados Tipos Abstratos de Dados Para descrever os algortimos e procedimentos durante o curso, vamos utilizar uma linguagem de descrio algoritmica. A noo do tipo de dados ocorre na maioria das linguagens de programao. O tipo da varivel delimita o conjunto de valores que ela pode tomar e as operaes que podemos efetuar com elas. Geralmente uma linguagem de programao oferece 2 tipos de Tipos de dados: Tipos Primitivos: So tipos bsicos pr definidos Tipos construdos: tipos criados a partir de mecanismos presentes na linguagem.
Tipos primitivos Operaes aceitas inteiro - int + - * div mod real - real + - * / lgico - log e ou no (.e. & .ou. V ) caracter- car = =
Exemplos: Tipos inteiro ? Real ? Lgico ? Caracter ?
5 div 2 = 2 5 mod 2 = 1 5 2 1 2 V= F e F = V Funes de Transferncia So operaes especiais que manipulam variveis de tipos primitivos, diferentes entre si, por exemplo: X i sendo X real e inteiro. Comparaes tambm podem ser consideradas funes de transferncia, por exemplo:X < i sendo X real e i inteiro e o resultado lgico F(V) Trunc, converte um numero real em inteiro trunc (75.37)=75 Tier, converte inteiro em real tier (75)= 75.0 Ord, transforma car em int que seu numero de ordem no conjunto de caracteres ASCII ord (0) <...< ord (9)<...< ord(A)<...< ord(a). Mais funes de transferencia podem ser obtidas nos tipos construdos. Utilizados para construir tipos novos a partir de tipos primitivos, segundo a definio: Tipos nome_do_tipo: definio_do_tipo a ser utilizada com os seguintes mecanismos: Tipos construdos forma Geral Vetor - Vet Vet (limite inferior...limite superior) de tipo
registro - reg reg (seletor1: tipo1, seletor2: tipo2,...,seletorn: tipon)
seqncia- seq seq de tipo p/ ex: tipo cadeia:: seq car
referncia - ref ref a tipo p/ ex: tipo matricula:: ref int
alternativa - alt alt (tipo1 | tipo2 |...| tipon ) p/ ex: tipo questo:: alt (int | car)
string ponteiro Mecanismo para construo de tipos Exemplos: Vetor= tipo dia :: vet [0...30] de int [1,2,3,4,...31] onde dia[2] = 3 dia [i] = 31 ento i= 30 Registro= tipo inscrio::reg (disciplina: int, turma: car) Se matricula: inscrio Se matricula uma varivel do tipo inscrio, ento matricula (103, a) da temos: matricula.turma= a matricula.disciplina= 103 O elemento da turmaa, quer inscrever-se na disciplina 103
Seqncia= tipo cadeia:: seq car Se x: cadeia e x< r, a, m> Seq. De comprimento 3 y: cadeia e y<e, m, i, g, r, a> Seq. De comprimento 6 Ento princ x = r cont x = < a, m> yconc x = < e, m, i, g, r, a, r, a, m> Se Z: cadeia e Z< a > Ento princ Z=a cont z=<>
Seqncia nula de comprimento 0 Referncia Tipo de matricula :: ref int Este mecanismo permite uma modalidade dinmica de alocao, ao contrrio dos mecanismos anteriores (vet, seq, etc.) cuja alocao contnua. Se geografia: matrcula o espao necessrio para a varivel geografia compreende 2 partes: 1 parte do valor: armazena um valor do tipo int; 2 parte de posio: armazena uma indicao de posio da localizao da parte de valor.
Aloque geografia a) aps a declarao da varivel
b)aps a execuo do comando aloque
Desaloque geografia c)aps a execuo do comando (Na memria) Parte de posio (geografia) Parte de posio Parte de valor geografia Parte de posio Sejam os comandos:
Alternativa= tipo questo:: alt ( int | car ) Se resposta : questo Ento resposta? tem valor igual a 1 (int) ou 2 (car)
Enumerao Permite definir tipos de dados por meio dos valores que os dados daquele tipo podem tomar. Tipo ms= (jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez) seja ms_nasc: ms Se ms_nasc= dez Ento Processo qualquer Permite que uma mesma varivel possa, em momentos diferentes, ter valores e tipos diferentes jan<fev<mar<...<dez Variveis, Declaraes e Expresses Nomes (identificadores) podem ser usados para denotar variveis, do seguinte modo: var nome: tipo; ou nome1, nome2,...,nome3: tipo; Todas as variveis existentes no programa fonte devem ser declaradas uma vez ( e somente uma vez) no seu cabealho, exemplos: Tipos Variveis matr10:: vet [0..9] de vet [0..9] de real; adj, custo: matr10; status:: reg (no: int, ferias: log, dia: int); folha: seq de status; nome:: seq car; alfa: vet [1970...1975] de nome; celula:: ref int; onde : celula
Exerccio 2 Escreva um algoritmo que leiam duas strings de 0s e 1s representando inteiros no-negativos binrios, e imprima a string representando a soma, a diferena e o produto, respectivamente. Comandos Bsicos Comandos Bsicos So utilizados para manipular as variveis, so eles: Atribuio varivel expresso Entrada Leia ( lista_de_variveis) Sada Escreva ( lista_de_variveis) Se condio ento comando Condicionais Se condio ento comando seno comando Interao Enquanto condio faa comando Repita comando at (que) condio para varivel de valor_inicial incr valor_do_incremento at valor_inicial. Faa comando Escape de malha Sada ou escape Seleo Conforme varivel, Faa lista_dos_casos Atribuio V e (e precisa ser do mesmo tipo de V) X (Y+Z)/2.0 x,y e z: real; O valor de X depois da avaliao ser mdia aritmtica dos valores de Y e Z antes i i+1 exemplo comum para contagens Variveis de tipo contrudo: var custo: vet[1..5] de real; custo[1] custo[2] + 7.8 var matr: reg(disc: int, turma: car); matr (2015, a ); Exemplos:
Entrada de Dados Leia (V1, V2, V3, ... , Vn); Neste caso todas as variveis listadas recebem vetores do dispositivo de entrada. Por exemplo: var x: real; i: int; a: vet [1..3] de int; Incio leia (x,a,i) Fim. Causar a leitura do dispositivo de entrada para x, a e i de um real, um vetor e um inteiro. Exemplos: Sada de Dados Escreva (V1, V2, V3, ...Vn); Neste caso todas as variveis listadas sero escritas no dispositivo de sada, por exemplo: var i: int; a: vet [1..5] de int; x: real; Incio x 2.1; i i+ 2; a[2] i; escreva(i,a,x); Fim. Exemplos:
Condicional Se L Ento A Seno B var x,y,z: real; {Calcula o menor de 2 nos.} Se x < y Ento z x {comando simples} Seno Incio {comando composto} z y; Se x < z Ento z x; Fim; A avaliao da condio no altera o valor de nenhuma varivel mesmo que ela contenha expresses como: Se (2.0*y < x/3.2) .e. (z<>0) Ento... Exemplos: Iterao - Enquanto Enquanto L Faa A Var x, y: int; Incio Enquanto x =< y Faa x 2*y; Enquanto x <> y Faa Se x > y Ento x x - y Seno y Y - x; Fim. Causa a repetio do comando at que x=y. Caso o sejam no incio o programa termina aps o primeiro teste. Iterao - Repita Repita A at L Var x,y: int; Incio Se x >< y Ento Repita Se x > y Ento x x-y Seno y y-x; At x=y; Fim. Iterao - Para Para V de i incr P at F Faa A Var i, soma: int; valor: vet [1..10] de int; Incio Soma 0.0; Para i 1 at 10 Faa soma soma+valor[i]; Fim. Seleo Caso V Faa (V1:C1, V2:C2,...,Vn:Cn) ou Caso V Faa (V1:C1, V2:C2,...,Vn:Cn) Seno Faa (V1:C2, V2:C3,...,Vn:Cn+1) Onde Vi so valores e Ci so comandos, exemplo: Var Ch: car; Incio Caso Ch Faa A..Z,a..z: Escreva (Letra); 0..9: Escreva(Digito); +,-,*,/: Escreva (Operador); Seno Escreva (Caracter especial); Fim; Fim.
Exerccio 3 Escreva um algoritmo para ler uma string de 0s e 1s representando um inteiro positivo em notao binria e imprima uma string de 0s, 1s e 2s representando o mesmo nmero em notao ternria Escreva um programa em C que realize essa converso Variveis Indexadas - Vetores A utilizao de vetores em computao uma tcnica muito til para a otimizao de tempo e memria e torna um programa mais elaborado e eficiente. Forma geral: Tipo vetor:: vet[1..3] de int; Var A, B, C: vetorz;
Leitura e Escrita de um Vetor Exemplo: Leitura Var x: vet[1..4] de int; Incio Para i:= 1 at 4 Faa leia(x[i]); Fim. Exemplo: Escrita Var x: vet[1..4] de int; Incio Para i:=1 at 4 Faa Escreva(x[i]); Fim. bom lembrar que poderamos usar os comandos Repita e Enquanto, tanto na leitura quanto na escrita. Variveis Indexadas - Matrizes Uma matriz uma varivel indexada que possui 2 dimenses e portanto precisa de 2 ndices para marcao de valor. Sua representao matemtica : dimenso: m - linhas representao: Amxn n - colunas Forma geral: Tipo matriz:: vetor[1..3,1..3] de int; Var A, B, C: matriz;
Leitura e Escrita de uma Matriz Faz-se necessrio 2 varreduras, uma com a varivel j percorrendo as colunas e outra com a varivel i percorrendo as linhas: Exemplo: Leitura Para i:= 1 at m Faa Para j:= 1 at n Faa Leia(A[i,j]); Exemplo: Escrita Para i:= 1 at m Faa Para j:= 1 at n Faa Escreva(A[i,j]);
Exemplo Fazer um algoritmo Algoritmo Matriz; para ler e imprimir Var A: vet[1..3,1..3] de int; i,j: int; a matriz: Inicio Para i:= 1 ate 3 Faa Para j:= 1 ate 3 Faa Leia(A[i,j]); Para i:= 1 ate 3 Faa Para j:= 1 ate 3 Faa Leia(A[i,j]); Fim. Registros So conjuntos de dados logicamente relacionados, mas de tipos diferentes (inteiro, real, car etc.); Utilizamos registros, quando vetores ou matrizes possuem diferentes componentes dentro de um mesmo campo, por exemplo: Como criar uma matriz desse tipo, onde existem 2 tipos de variveis (int e car)? Percebe-se que impossvel a utilizao de matrizes, pois na mesma declarao s pode conter um tipo de elemento. Por isso utiliza-se reg.
Forma Geral de Registro Tipo pagantes:: reg (cadast: int, nome: caract, bandeira: caract, pagamento: caract); Pode-se utilizar vetor composto por reg ou matriz composta por reg, exemplo: Escreva um algoritmo que dados 10 codigos de profisso, emita o nome da profisso correspondente. Algoritmo Profissao; Tipo lista: reg(codigo: int, nome:caract); Var tab: vet [1..100] de lista; cod,i,k: int; Inicio Para i:= 1 ate 10 Faa leia(tab[i].codigo, tab[i].nome); Leia (cod); {recebe o codigo para comparar} Repita i:= 1; Enquanto(tab[i].cod<>cod) e (i=<10) Faa i:=i+1; Se (i>10) Ento Escreva(Codigo invalido) Seno Escreva(Cod. Desejado ,tab[i].nome); Ate(cod=0); Fim. Arquivos So estruturas de dados manipuladas fora do ambiente do programa. Considera-se como ambiente do programa a memria principal, onde nem sempre possvel ou conveniente manter certas estruturas de dados. No ambiente do programa, tem de ser declaradas as estruturas externas de dados: declara-se primeiro o tipo do arquivo e depois os nomes dos arquivos deste tipo. Um exemplo: Algoritmo arquivo; Var dados: text; Incio Fim. Abertura e Fechamento de um Arquivo Para abrir um arquivo novo, utiliza-se o comando: Rewrite (NomeArquivo); Este comando ignora os dados existentes e imprime os novos dados no lugar dos antigos. Para a associao desta identificao interna com o nome externo do arquivo usa-se o comando: Assign (NomeArquivo, NomeExtern); Para abrir um arquivo cujo problema no perder os dados existentes: Reset(NomeArquivo); Assim, os dados no so perdidos e a impresso realizada depois da ltima linha de dados. Associao de Arquivos no Programa Para a associao, tambm utiliza-se o comando: Assign(dados,dados.txt); Exemplo: Algortimo Arquivo; var dados:text; Inicio Assign(dados,dados.txt); Reset(dados); Fim.
Fechamento de Arquivo Para terminar a gerao do arquivo, faz-se necessrio o comando de fechamento antes do End. final do programa, forma geral: close(NomeArquivo); exemplo: ........ close(dados); Fim. Escrevendo e Lendo de Arquivos Toda vez que no for desejado ler da tela, ou imprimir na tela, uma pequena modificao deve ser feita nos comandos Escreva e Leia, por exemplo: Leia (dados, x, y); Escreva (dados, x,y); Assim a estrutura completa fica: var dados: text; x,y: int; Inicio Assign(dados,dados.txt); Reset(dados); leia(dados,x,y); ........ Escreva(dados,x,y);....... Close(dados); Fim.
Exercicio 4 Desenvolver um algoritmo que leia os valores de duas matrizes mxn quaisquer e A e B, do arquivo entrada.dat e escreva os valores da matriz C=A+B no arquivo saida.dat. Escreva um programa que realize este algoritmo. Procedimentos So trechos de programa que possuem seus objetos (variveis, arquivos etc.) e comandos prprios e que para serem executados devem ser ativados por um programa principal ou outro procedimento: Forma Geral: Procedimento nome; declarao dos objetos locais ao procedimento Inicio comandos do procedimento Fim; Exemplo de Procedimento Algoritmo proced; var A,B,C,X,Y,Z: int; teste:log; Procedimento Repete; Inicio x SQR(A)+B*SQR(B)+SQR(C)*SQR(C); y A+C; Fim; Inicio Teste false; Leia (A,B,C); Repete; Se x>y Entao teste true; A A+1; Leia(z); Repete; Escreva(x,y,z,teste); Fim.
Funes Usada para atribuir o resultado da chamada de um procedimento a uma varivel. Forma Geral: Funo nome: tipo; declarao dos objetos locais a funo; Inicio comandos da funo; Fim; Exemplo de Funo Algoritmo funcao; var A, B, C: real; Inicio Funcao ABS(x): real; Var x: real; Inicio Se x>= 0 Entao ABS X Senao ABS -X; Fim; A 5; B -3; C -10; Escreva (ABS(A)); Escreva (ABS(-3)); E ABS(E**3) * A+B; Escreva (E); Fim. Ponteiros So utilizados para alocao dinmica de variveis. Alocao dinmica: o programa capaz de alocar rea de memria, que no foram declaradas anteriormente; Para alocar uma varivel dinamicamente, deve-se: 1. Criar espaos para as novas variveis em tempo de execuo; e 2. Definir ligaes entre essas variveis dinamicamente. A gerao de uma varivel dinmica de tipo qualquer feita pelo operador NEW. Exemplo de Ponteiro New(p); {Gera uma varivel de tipo qualquer e a} {coloca em P o endereo da varivel } Program Aloca; P Type ptr= integer; Var P:^ptr; {estatica} Memria usada Memria Livre Begin pelo programa do sistema New(P); {dinamica} P $5C2D p^:= 1234; $5C2D 1234 writeln(p^); End.
Exemplo de Ponteiro em Pascal Exerccio 5 Escrever um algoritmo que leia uma tabela contendo registros de matriculas, nomes e notas (B1, B2 e MF) e permita ao usurio as funes inserir, excluir, alterar e pesquisar registros pelo numero da matricula. Escreva um programa que realize este algoritmo. Recursividade Recursividade Chama-se mtodo recursivo um mtodo que, para ser aplicado a uma estrutura, envolve a aplicao dele mesmo s subestruturas componentes. Todo procedimento recursivo (ou no) deve possuir pelo menos uma chamada proveniente de um local exterior a ele (chamada externa). Em termos de programao, isso implica em procedimentos que chamam a si prprios, exemplo: Proc fat : int (n:int) Suponha k <- fat(5) Se n=0 como n <> 0 Ento 5*fat(4) retorne 1 4*fat(3)..... Seno 1*fat(0) retorne n * fat (n 1) como n=0 a recursividade para e o resultado calculado Recursividade A todo procedimento recursivo corresponde um outro no recursivo que executa, exatamente, a mesma computao, por exemplo: Fa[0] = 1 Para j = 1,...,n faa fat[j] = j x fat[j-1] Exerccio 6 1. Imagine A como um vetor de inteiros. Apresente algoritmos recursivos para calcular: O elemento mximo do vetor O elemento mnimo do vetor A soma dos elementos do vetor O produto dos elementos do vetor A mdia dos elementos do vetor 2. Determine o que a seguinte funo calcula: Func(n) int n; { if (n==0) return (0); return (n+func(n-1); }
Exerccio 6 3. Responder certo ou errado: Todo procedimento recursivo deve incorporar terminaes sem chamadas recursivas, caso contrrio ele seria executado um nmero infinito de vezes. O algoritmo que calcula o fatorial de forma recursiva, requer apenas uma quantidade constante de memria O algoritmo fatorial no recursivo, requer o armazenamento do vetor fat, com n+1 elementos 4. Mostrar que o algoritmo para o problema da torre de Hanoi, requer exatamente 2 n 1 movimentos de disco para terminar. 5. Elaborar um programa no recursivo para a torre de Hanoi. Complexidade de Algoritmos Complexidade de Algoritmos A Complexidade de um Algoritmo consiste na quantidade de trabalho necessria para a sua execuo. A expresso matemtica que define a complexidade de um algoritmo determinada pela contagem de uma grandeza (por exemplo, as operaes dominantes realizadas). Operao dominante o conjunto de operaes bsicas que so executadas repetidas vezes. Complexidade de Algoritmos Um algoritmo serve para resolver um determinado problema, e todos os problemas tm sempre uma entrada de dados (N) O tamanho desse N afeta sempre diretamente no tempo de resposta de um algoritmo Dependendo do problema, j existem alguns algoritmos prontos, ou que podem ser adaptados O problema : qual algoritmo escolher?
Complexidade de Algoritmos A complexidade de um algoritmo pode ser dividida em: Complexidade Espacial: Quantidade de recursos utilizados para resolver o problema; Complexidade Temporal: Quantidade de Tempo utilizado. Pode ser visto tambm como o nmero de instrues necessrias para resolver determinado problema; Em ambos os casos, a complexidade medida de acordo com o tamanho dos dados de entrada (N)
Complexidade de Algoritmos Exemplo 1: inverso de uma sequncia Para i = 1,...,[n/2] faa temp = S[i] S[i] = S[n-i+1] S[n-i+1] = temp
Nesse algoritmo cada entrada uma sequencia que se deseja inverter e o algoritmo efetua sempre as mesmas operaes para as sequencias de mesmo tamanho n. Cada passo executa uma troca de posies, ento o nmero de passos igual ao numero de execues do bloco Para, ou seja, [n/2] sendo n>1. Complexidade de Algoritmos Exemplo 2: Soma de matrizes para i = 1,...,n faa para j = 1,...,n faa cij = aij + bij Qual o numero total de passos?
Como no exemplo o algoritmo sempre efetua as mesmas operaes sempre que a e b forem matrizes nxn e n o parmetro independente. Cada passo desse algoritmo corresponde a execuo da soma aij + bij e o nmero total de passos igual ao nmero total de somas, isto , o algoritmo efetua n 2
passos. Complexidade de Algoritmos Exemplo 3: Multiplicao de matrizes para i = 1,...,n faa para j = 1,...,n faa cij = 0 para k = 1,...,n faa cij = cij + aik * bkj Qual o numero total de passos?
Como no exemplo o algoritmo sempre efetua as mesmas operaes sempre que A e b forem matrizes nxn e n o parmetro independente. Cada passo desse algoritmo corresponde a execuo do produto aik * bkj e o nmero total de passos igual ao nmero total de somas, isto , o algoritmo efetua n 3 passos. Complexidade de Algoritmos Existem trs escalas de complexidade: Melhor Caso - mega Caso Mdio - theta Pior Caso - micron Nas trs escalas, a funo f(N) retorna a complexidade de um algoritmo com entrada de N elementos
Melhor Caso Definido pela letra grega (mega) o menor tempo de execuo em uma entrada de tamanho N pouco usado, por ter aplicao em poucos casos. Ex.: Se tivermos uma lista de N nmeros e quisermos encontrar algum deles assume-se que a complexidade no melhor caso f(N) = (1), pois assume-se que o nmero estaria logo na cabea da lista.
Caso Mdio Definido pela letra grega (Theta) Dos trs, o mais difcil de se determinar Deve-se obter a mdia dos tempos de execuo de todas as entradas de tamanho N, ou baseado em probabilidade de determinada condio ocorrer No exemplo anterior: A complexidade mdia P(1) + P(2) + ... + P(N) Para calcular a complexidade mdia, basta conhecer as probabilidades de Pi; Pi = 1/N, 1 <= i <= N Isso resulta em P(1/N) + P(2/N) + ... + P(N/N) Que resulta em 1/N(1+2+...+N)
Que resulta em 1 N(N+1) = (N+1) N 2 2
Que resulta em f(N) = (N+1) 2 Pior Caso Representado pela letra grega O (micron) ou O maisculo. o mtodo mais fcil de se obter. Baseia-se no maior tempo de execuo sobre todas as entradas de tamanho N Ex.: Se tivermos uma lista de N nmeros e quisermos encontrar algum deles, assume-se que a complexidade no pior caso O (N), pois assume-se que o nmero estaria, no pior caso, no final da lista.
Complexidade de Algoritmos Mas como saber qual a complexidade de um determinado algoritmo implementado? Para resolver esse problema, dividiu-se os algoritmos em Classes de Problemas, de acordo com o parmetro que afeta o algoritmo de forma mais significativa
Classes de Algoritmos So elas: Complexidade Constante Complexidade Linear Complexidade Logartmica NlogN Complexidade Quadrtica Complexidade Cbica Complexidade Exponencial
Complexidade Constante So os algoritmos de complexidade O(1) Independe do tamanho N de entradas o nico em que as instrues dos algoritmos so executadas num tamanho fixo de vezes Ex.: Function Vazia(Lista: TipoLista): Boolean; Begin Vazia := Lista.Primeiro = Lista.Ultimo; End;
Complexidade Linear So os algoritmos de complexidade O(N) Exemplo 4:
Complexidade Linear Uma operao realizada em cada elemento de entrada Exemplo 5: pesquisa de elementos em uma lista
Procedure Busca(Lista: TipoLista; x: TipoElem; Var pos: integer) Var i: integer; Begin i:=1; while Lista.Elemento[i] <> x do i := i+1; if i >= Lista.MaxTam then pos := -1 else pos := i; End;
Complexidade Linear Exemplo 6: Determinar a complexidade do lao for (i = soma = 0; i < n; i++) soma += a[i]; Primeiro, duas variveis so inicializadas, ento o lao for itera n vezes e, durante cada iterao, executa duas atribuies, uma das quais a soma e a outra atualiza i. Assim, existem 2 +2n atribuies para a rodada completa desse lao for; sua complexidade O(n). Complexidade de Linear Exemplo 7: Determinar a complexidade do cdigo de inverso de sequncias for ( i = 1; i <= n/2; i++) { temp = S[i]; S[i] = S[n-i+1]; S[n-i+1] = temp; } Nesse caso o cdigo apresenta a propriedade de o nmero de passos manter-se o mesmo quando aplicado a entradas diferentes de mesmo tamanho, isto , para um mesmo valor de n o resultado permanece constante. A varivel independente o valor de n, ento as complexidades de pior, mdio e melhor caso so iguais entre si. O cdigo sempre efetua [n/2] passos, logo sua complexidade O(n) E para o caso de soma e multiplicao de matrizes? Complexidade Logartmica So os algoritmos de complexidade O(logN) Ocorre tipicamente em algoritmos que dividem o problema em problemas menores Ex.: O algoritmo de Busca Binria
Complexidade NlogN Como o prprio nome diz, so algoritmos que tm complexidade O(NlogN) Ocorre tipicamente em algoritmos que dividem o problema em problemas menores, porm juntando posteriormente a soluo dos problemas menores A maioria dos algoritmos de ordenao externa so de complexidade logartmica ou N Log N
Complexidade Quadrtica So os algoritmos de complexidade O(N) Itens so processados aos pares, geralmente com um loop dentro do outro
Complexidade Quadrtica So os algoritmos de complexidade O(N) Itens so processados aos pares, geralmente com um loop dentro do outro Ex.: Procedure SomaMatriz(Mat1, Mat2, MatRes: Matriz); Var i, j: integer; Begin for i:=1 to n do for j:=1 to n do MatRes[i,j] := Mat1[i, j] + Mat2[i,j];
Complexidade Quadrtica Exemplo 8: Determinar a complexidade do cdigo que produz a soma de todas as submatrizes que comeam com a posio 0 for (i = 0; i < n; i++) { for (j = 1, soma = a[0]; j < n-i; j++) soma += a[j]; cout<<soma para submatriz 0 at <<i<<e <<soma<<endl; } Antes que os laos comecem, i inicializado. O lao mais externo realizado n vezes, executando em cada iterao um lao for mais interno, uma impresso e as atribuies para 1, j e soma. O lao mais interno executado i vezes para cada i {1,...,n-1} com duas atribuies para cada iterao: uma para soma e outra para j. Assim existem 1+3n+ i=1 n-1 2i = 1+3n+2(1+2+...+n-1)= 1+3n+n(n-1)= =O(n)+O(n 2 ) = O(n 2 ) atribuies so executadas antes que o programa termine. Complexidade Cbica So os algoritmos de complexidade O(N) Itens so processados trs a trs, geralmente com um loop dentro do outros dois Ex.: Procedure SomaElementos_Vetor_Indices_Matriz (mat: Matriz, vet: Vetor); Var i, j: integer; Begin for i:=1 to n do for j:=1 to n do for k:=1 to n do mat[i, j] := mat[i, j] + vet[k];
Complexidade Exponencial So os algoritmos de complexidade O(2 N ) Utilizao de Fora Bruta para resolv-los (abordagem simples para resolver um determinado problema, geralmente baseada diretamente no enunciado do problema e nas definies dos conceitos envolvidos) Geralmente no so teis sob o ponto de vista prtico
Ordens mais comuns n 2 n f n log n (linear) (exponencial) log n (constante) Clculo da complexidade Foi visto que, para calcular a complexidade de um algoritmo, deve-se analisar o pior caso A anlise deve ser feita no programa todo, de acordo com a tabela a seguir
Algumas operaes com a notao O Exemplo 9 Procedure Verifica_Item_Lista (Lista: TipoLista; x: TipoItem; pos: integer);
Var i: integer; Begin i:=1; achou := false; while (i <= Lista.Tamanho) and not achou do begin inc(i); if Lista.Item[i] = x then achou := true; end; if achou then pos := i else pos := -1; O(1) O(N) f(N) = O(9 * O(1) + O(N)) = O(O(1) + (O(N)) = O(N) O(1) Exemplo 10 Procedure Verifica_Item(Lista: TipoLista; x: TipoItem; pos: integer); Var i: integer; Begin i:=1; achou := false; while (i <= Lista.Tamanho) and not achou do if Lista.Item[i] = x then achou := true; if achou then pos := i else for i:= Lista.Tamanho +1 to MaxTam; Lista.Item[i] := x; O(1) O(N) O(1) f(N) = O(7 * O(1) + 2*O(N)) = O(O(1) + (O(N)) = O(N) O(N) O(1) Exerccio 7 1. Escrever as seguintes funes em notao O: n 3 1 n 2 + 2 log n 3n n +5 * 2 n (n-1) n + n n-1 2. Certo ou errado: E - Se f,g so funes tais que f=O(g) e g= (f) ento f = (g) E - Se a complexidade de melhor caso de um algoritmo for f, ento o nmero de passos que o algoritmo efetua, qualquer que seja a entrada (f) E - Se a complexidade de pior caso de um algoritmo for f, ento o nmero de passos que o algoritmo efetua, qualquer que seja a entrada (f)
Listas Lineares Listas Lineares So estruturas que permitem representar um conjunto de dados de forma a preservar a relao de ordem linear (ou total) entre eles.* Definio: conjunto de n > 0 ns X1, X2, X3, ..., Xn, organizados estruturalmente de forma a refletir as posies relativas dos mesmos: Se n > 0, ento X1 o primeiro n e Xn o ltimo n. Quando n=0 a lista vazia:
Operaes com Listas Lineares Acessar o k-simo n para obter ou alterar seu contedo Inserir um novo n aps (ou antes) o k-simo n da lista Remover o k-simo n da lista Concatenar duas listas Determinar o nmero de ns de uma lista Localizar o n que contm um dado valor Algoritmo para Acessar o K-simo N de uma Lista Algoritmo AcessarKesimo; var x:vet[1..10] de int; k,fim: int; sinal:log, val: int; Inicio x[2] 3; leia(k); fim 5; {Uso 5 elementos da lista} Se (K=<0) ou (k>fim) {Verifica a validade de K} Entao sinal false Senao Inicio val x[k]; sinal true; Fim; Escreva (O k-simo vale: ,x[k]); Fim. Programa para Acessar o K-simo N de uma Lista Algoritmo para Alterar o valor do K-simo N Algoritmo AlterarKesimo; var x:vet[1..10] de int; k,fim: int; sinal:log, val: int; Inicio x[3] 1; leia(k); leia(val); fim 5; {Uso 5 elementos da lista} Se (K=<0) ou (k>fim) {Verifica a validade de K} Entao sinal false Senao Inicio x[k] val; sinal true; Fim; Escreva (O k-simo vale: x[,k,]= ,x[k]); Fim.
Algoritmo para Inserir um Novo N Algoritmo InserirKesimo; var x:vet[1..10] de int; i,k,fim: int; sinal:log, val: int; Inicio leia(k); leia(val); fim 5; {Uso 5 elementos da lista} Se (K=<0) ou (k>fim) Entao sinal false {Verifica a validade de K} Senao Para i fim inc -1 ate K Faa Inicio x[i+1] x[i]; fim fim+1; x[k] val; sinal true; Fim; Escreva (O k-simo vale: x[,k,]=,x[k]); Fim. Supe-se que haja ao menos um elemento disponvel Programa para inserir um novo n Algoritmo para Remover o K-simo da Lista Algoritmo RemoverKesimo; var x:vet[1..10] de int; i,k,fim: int; sinal:log, val: int; Inicio leia(k); leia(val); fim 10; {Uso todos elementos da lista} Se (K=<0) ou (k>fim) Entao sinal false {Verifica a validade de K} Senao Inicio Para i k inc 1 ate Fim-1 Faa x[i] x[i +1]; fim fim-1; sinal true; Fim; Escreva (O k-simo vale: x[,k,]=,x[k]); Fim.
Programa para remover um n Listas Encadeadas Resolvem o problema do comprimento mximo da lista permitindo a alterao dinmica do tamanho da lista aumentando seu comprimento inicial. Neste tipo de lista, cada n alm de conter o dado propriamente dito, dever tambm conter a indicao do n seguinte, caso existir (contiguidade lgica). X1 X2 Xn-1 Xn ... Representao: referncia tipo no:: reg(dado: real, proximo: ref no); dado proximo var primeiro: ref no;
p^.dado p^.proximo Obteno dos Ns A obteno dos ns para compor a lista feita por meio do comando new(p) onde p tambm uma varivel do tipo referncia a n. New(p) : aloca dinamicamente um espao na memria do computador correspondente a um n. O endereo deste espao atribudo varivel p.
Exemplo: Desenvolvimento de um algoritmo para criao de uma lista encadeada com um n apenas;
Algoritmo para a criao de um n Algoritmo listaUmNo; tipo no:: reg(dado: real, proximo: ref no); {especifica o tipo de no} var lista, p: ref no; valor: real; {lista e p apontam p/no} Inicio lista nil; { lista recebe nil} leia (valor); {le um dado em coloca em valor} new(p); { aloca 1 no o valor de p e o endereco do no} p^.proximo lista; { o componente proximo de p recebe lista} lista p; { lista recebe o valor da variavel p} p^.dado valor; { ou lista^.dado valor} Fim; Para incluir um outro n (1) new(p); (2) p^.proximo lista; (3) lista p; Para remover o ltimo n de uma lista (1) p lista; (2) lista p^.proximo; {ou lista lista^.proximo;} (3) dispose(p); Ao remover o ltimo n da lista, esta voltar situao inicial de lista vazia: lista /
Exemplo Algoritmo para determinar o comprimento de uma lista encadeada. Algoritmo MedeLista; Tipo no::reg(dado:real; proximo: ref no); Enquanto p^;proximo>< nil Faa Var lista, p: ref no; valor: real; Inicio INICIO q p; ...... p p^.proximo; Se lista = nil Entao execute rotinaerro2 fim; Senao Se lista^.proximo= nil Entao q^.proximo nil; Inicio dispose(p); dispose(lista); Fim; lista nil; ........... Fim FIM. Senao Inicio p lista;
Listas com Descritor Listas com Descritor Simplificam a representao das listas encadeadas pois reunem em um s elemento as referncias do primeiro e do ltimo elemento da lista chamado n descritor ou lder da lista. O n descritor: tipo descritor :: reg (i: ref n; n: int; f: ref n);
Neste caso a representao da lista vazia :
Utilizando listas com descritor Nesse tipo de lista deve-se criar uma lista vazia, que consiste em: 1. Alocar um n do tipo descritor; 2. Tornar suas duas referncias nulas; e 3. Fazer a varivel que indica o incio da lista apontar para o n. O procedimento ao lado Proc criar (d: ref descritor) implementa incio esta operao: aloque(d); d^.i nil; d^.n 0; d^.f nil; fim Inserindo um n esquerda da lista Inserimos um n com um dado valor esquerda da lista cujo descritor apontado pela varivel d. Inserindo um n direita da lista Inserimos um n com um dado valor direita da lista cujo descritor apontado pela varivel d. Removendo um n da esquerda O procedimento a seguir remove o primeiro n da lista, se houver, e retorna o dado que o n removido continha atravs do parmetro valor. Para remover um n da lista devemos percorrer todos os ns da lista a partir do primeiro (esq) at atingir o n da direita. Pilhas e Filas Pilhas e filas So utilizadas em aplicaes onde so impostos critrios para a insero e retirada de elementos cuja ordem no depende da ordem natural dos valores dos dados. So 2 os critrios mais usados: LIFO last in first out: o primeiro a ser retirado o ltimo que tiver sido inserido, ex.: pilha de pratos; FIFO first in first out: o primeiro elemento a ser retirado o primeiro que tiver sido inserido, ex.: fila de banco.
Pilhas Pilhas So estruturas essencialmente dinmicas. Implementamos utilizando sequncias. Supondo que os elementos do conjunto so do tipo dado (pilhas de dados), j definido, podemos definir: tipo pilha_seq:: seq dado; var p: pilha_seq; i,j: dado; Inicialmente a pilha est vazia: p<- <> Empilhar e Desempilhar Para inserir um elemento i (empilhar): p <- < i > conc p Para retirar um elemento (desempilhar): p <- cont p Obs.: o ltimo elemento inserido da pilha o primeiro componente da sequencia. Caso a pilha esteja vazia, a retirada de um elemento no implica em erro pois a continuao da sequncia nula a prpria sequncia nula. Acesso ao topo da pilha Em geral, s se admite acesso ao elemento do topo da pilha (o ltimo inserido). Para se obter esse elemento fazemos: Se p =< > entao erro {pilha vazia} seno j<- princ p Por serem estruturas dinmicas as pilhas podem crescer e decrescer aleatoriamente durante a execuo do programa. Definindo o tipo pilha Quando se pode prever o tamanho mximo de uma pilha, possvel implementa-la por meio de registros contendo um n inteiro e um vetor de dados: tipo pilha_vet :: (topo: int; elementos: vet[1..100] de dado); var p: pilha_vet; i,j: dado; Definindo e inicializando uma pilha em Pascal Inicializando a pilha e empilhando A inicializao como pilha vazia faz-se por: p.topo <- 0; Para o empilhamento, devemos verificar se ainda h espao no vetor para mais um elemento: Se p.topo = 100 entao erro {excesso de elementos} Senao inicio p.topo <- p.topo + 1; p.elementos[p.topo] <- i; fim Desempilhando Para o desempilhamento, verifica-se se a pilha est vazia: Se p.topo = 0 entao nada {a pilha esta vazia} senao p.topo <- p.topo - 1; Para obter o elemento do topo: Se p.topo = 0 entao erro {a pilha esta vazia} senao j <- p.elementos[p.topo]
Programa para empilhar e desempilhar Filas Filas Enquanto Pilhas sofrem inseres e retiradas na mesma extremidade (o topo), as filas exigem acesso s duas extremidades: a) comeo - onde feita a retirada; e b) fim - onde feita a insero. Definio de filas - forma geral: tipo fila_vet :: reg (comeco:int; termino:int; elementos: vet [1..10] de dado); var f: fila_vet; i,j: dado; Operaes bsicas Inicializao f.comeco <- 1; f.termino <- 0; Insero Se f.termino =10 entao erro {excesso de elementos} Senao inicio f.termino <- f.termino + 1; f.elementos[f.termino] <- i; fim; Definindo e inicializando filas Operaes bsicas Retirada: Se f.termino < f.comeco entao nada { fila vazia } Senao f.comeco <- f.comeco + 1; Consulta ao elemento no comeo da fila Se f.termino < f.comeco entao erro {fila vazia} Senao j <- f.elementos[f.comeco]; Representao na memria Aps a inicializao, a fila vazia tem o seguinte aspecto:
A atribuio do valor 1 inicial a f.comeco para garantir que f.termino < f.comeco notando que se f.comeco = f.termino no indica fila vazia e sim uma fila com somente um elemento. A insero dos elementos: 26,18,12,9,3,11,4,2,13 faz: Representando na memria Havendo 4 retiradas da fila temos:
Como a retirada envolve o incremento de f.comeco nota- se que a fila vai se deslocando da esquerda para a direita do vetor. Para inserir mais um elemento (17, por exemplo) soma-se 1 a f.termino, o qual passa a conter o ndice 10, posio em que colocamos o valor 17. Se agora quisermos inserir mais um valor, isso no ser possvel (f.termino = 10 indica erro se for tentada uma insero) o que de certo modo absurdo, j que as posies 1 a 4 esto livres
Resolvendo inconsistncias Para permitir a reutilizao de posies j ocupadas, inserimos mais um componente f.tamanho que indica quantos elementos existem na fila no momento. Portanto as operaes sero executadas conforme os algoritmos: Inicializao: f.comeco <- 1; f.termino <- 0; f.tamanho <- 0; Resolvendo inconsistncias Insero: Se f.tamanho = 10 entao erro {excesso de elementos} Senao inicio f.tamanho <- f.tamanho + 1; f.termino <- (f.termino mod 10) + 1; f.elementos[f.termino] <- i; fim; Antes de incrementar f.termino tomamos o resto de sua diviso pelo n de elementos do vetor, ex.: para inserir mais um elemento, f.termino ser calculado por 10 mod 10 + 1 e o novo elemento ser inserido na primeira posio do vetor. Resolvendo inconsistncias Retirada: Se f.tamanho = 0 entao nada {fila vazia} Seno inicio f.tamanho <- f.tamanho - 1; f.comeco <- (f.comeco mod 10) + 1; fim; Consulta: Se f.tamanho = 0 entao erro {fila vazia} Senao j <- f.elementos[f.comeco];
Trabalho Individual 1 Desenvolver um programa que seja capaz de avaliar expresses aritmticas inteiras utilizando a estrutura de dados Pilha. Utilizar os operadores: +, -, *, / (div), % (mod), ^ (potncia). Supor que as expresses possuem identificadores contendo somente uma nica letra em maiscula, conforme visto em sala de aula. Seu programa deve possibilitar a leitura de expresses do tipo: A*B+C/B-A%D^3 Obs.: A expresso deve ser corretamente parentizada pelo usurio antes de ser analisada.
Valor do trabalho: 5.0 pts. Referncia Bibliogrfica: PEREIRA, S. L. Estrutura de dados fundamentais: conceitos e aplicaes. So Paulo: Erica, 1996. Trabalho Individual 2 Um simulador um programa que modela o funcionamento de algum fenmeno do mundo real. Ele deve tratar eventos que ocorrem no decorrer do tempo. Para isso, ele implementa um motor de simulao, que gerencia o funcionamento do simulador. A passagem do tempo implementada atravs de ciclos. Em cada ciclo o motor de simulao deve: Gerar eventos aleatoriamente; Tratar o prximo evento. - Funcionamento de um Simulador de Aeroporto: O aeroporto apresenta 3 pistas que podem ser usadas para pousos ou decolagens. Duas pistas comportam avies de grande e pequeno porte. A terceira pode ser usada apenas por monomotores (pequeno porte). A escolha da pista a ser usada para pouso ou decolagem realizada pela torre de controle, que tem como objetivo otimizar o uso das pistas sem provocar colises ou acidentes por falta de combustvel. Colises ocorrem quando dois avies usam a mesma pista no mesmo Instante. O problema da falta de combustvel ser descrito a seguir. A cada instante (ciclo do simulador): o Um nmero varivel de avies pode chegar ao aeroporto. o Os avies aguardando pouso tm sua quantidade de combustvel decrescida de uma unidade. Esta quantidade atribuda pelo simulador (aleatoriamente) no instante em que o avio chega no aeroporto. o Cabe torre de controle gerenciar uma fila de pousos de forma que no ocorram quedas de avies por falta de combustvel. o A torre de controle pode autorizar um pouso ou decolagem em cada pista.Ao final, o simulador deve gerar alguns eventos estatsticos, como por exemplo, aquantidade de avies que pousaram, quantos decolaram, etc rvores Baseado em: Material do prof. L. Baldochi http://pt.wikipedia.org/wiki/arvore_binaria rvores Utilizadas em muitas aplicaes Modela uma hierarquia entre elementos rvore genealgica Diagrama hierrquico de uma organizao Modelagem de algoritmos O conceito de rvores est diretamente ligado recurso rvores Um conjunto finito de elementos onde um elemento chamado de raiz os outros so divididos em subconjuntos disjuntos, onde cada um define uma rvore cada elemento um n ou vrtice da rvore arcos ou arestas conectam os vrtices rvores Uma coleo no vazia de vrtices e ramos que satisfazem a certos requisitos vrtice (ou n): um objeto simples que pode ter um nome e mais alguma outra informao associada arco ou aresta (direcionado ou no): uma conexo entre dois ns
Representao r v o r e E F B G H I C L M O S P Q R N K J C A Terminologia e Propriedades cada vrtice (exceto a raiz) tem exatamente um antecessor imediato ou pai cada vrtice tem ns sucessores imediatos ou filhos, a no ser: ns sem filhos terminais ou folhas ou externos filhos de um mesmo pai - irmos ns com pelo menos um filho no-terminais ou internos Terminologia e Propriedades caminho em uma rvore: uma lista de vrtices distintos e sucessivos, conectados por arcos (arestas) da rvore n raiz existe exatamente um caminho entre a raiz e cada um dos ns da rvore se existir mais de um caminho ou nenhum grafo Terminologia e Propriedades grau o nmero de subrvores de um n no exemplo: grau de A 3; de N 4; de J 1 qualquer n a raiz de uma sub-rvore consistindo dele e dos ns abaixo r v o r e E F B G H I C L M O S P Q R N K J C A rvores r v o r e ( 1 ) E F B C G D A r v o r e ( 2 ) C G D E F B A rvores A nica diferena entre as duas rvores a ordem das sub- rvores Uma rvore ordenada definida como uma rvore onde as sub-rvores formam um conjunto ordenado Em uma rvore ordenada define-se o primeiro, segundo e ltimo irmo, de acordo com alguma propriedade Terminologia os vrtices da rvore esto classificados em nveis o nmero de ns no caminho entre o vrtice e a raiz E F B G H I C L M O S P Q R N K J D A nvel da raiz zero nvel de C 1 nvel de K 3 nvel de um n = nvel de seu pai + 1 nvel de P 5 Terminologia Altura de uma rvore corresponde ao maior nvel maior distncia entre a raiz e qualquer n Floresta um conjunto de rvores se removemos a raiz e os arcos que a ligam s sub- rvores, ficamos com uma floresta rvore Binria um conjunto finito de elementos que ou vazio ou composto de trs conjuntos disjuntos (aqueles sem elementos em comum) o primeiro contm um nico elemento, a raiz os outros dois subconjuntos so rvores binrias as sub-rvores da esquerda e da direita As sub-rvores da esquerda ou da direita podem estar vazias rvore Binria A B G F E D C H I U A B C D E F G H I rvores Binrias Considerando que os dois filhos de cada n interno so ordenados: o filho da esquerda e o filho da direita Cada n interno tem que ter filho da direita ou da esquerda, sendo que um ou ambos podem ser ns externos rvores Binrias uma rvore binria vazia: consiste de nenhum n interno e um n externo uma rvore binria uma rvore ordenada, na qual cada n tem 0, 1, ou 2 filhos cada filho corresponde a uma rvore binria
rvores Binrias O nmero de sub-rvores a esquerda e a direita vazias em uma rvore binria com n ns de n+1 se n = 1 ento 2 subrvores vazias
se n = 2 ento 3 subrvores vazias
Se vale para n 1 ento, em uma rvore com n ns uma subrvore vazia foi substituda por um vrtice interno e 2 subrvores vazias o nmero de subrvores vazias ento: n -1+2 = n +1 rvores Binrias Definio de rvores uma rvore um nico n ou um n raiz conectado a um conjunto de rvores
Definio de rvores Binrias uma rvore binria um n externo ou um n raiz (interno) conectado a esquerda e a direita a rvores binrias rvore Binria Estrita todo n no folha possui filhos a esquerda e a direita rvore Binria Estrita
Uma rvore binria estrita com n folhas sempre contm 2n- 1 ns rvore Binria Estrita B F G D E C A rvore Binria Estrita B F G 1 G 2 G D E C A rvore Binria Estrita rvore binria estrita com: 1 folha um n 2 folhas 3 ns hiptese: n folhas 2n-1 ns rvore Binria Nvel: A raiz tem nvel 0 A raiz de outro n o nvel do n pai +1. A profundidade de uma rvore o maior nvel para todas as folhas Markeson: raiz tem nvel 1 Langsan : raiz tem nvel 0 rvore Binria rvore binria cheia de nvel d: rvore binria estrita com todas as folhas no nvel d
rvore binria completa de nvel d: uma rvore binria estrita com todas as folhas no nvel d ou no nvel d-1 rvore Binria Completa D E B H I F G C A rvore Binria Cheia H I D J K E B L M F N O G C A Exerccio 8 Classificar: A) B) rvore Binria Para muitas aplicaes, importante a relao entre altura e nmero de ns rvore Binria de altura mxima F E D C B A Para rvores com n ns: altura mxima: cada n no folha s possui um filho - ziguezague sua altura n-1
rvore Binria - altura mnima Seja T uma rvore binria de altura mnima Se T no completa retira-se uma folha w de seu ltimo nvel e coloca-se como filho de uma folha de nvel superior (acima do penltimo) Repete-se a operao at no ser possvel mais realiz-la A rvore resultante T completa Se a altura de T for menor que a de T esta no seria mnima. T no pode ser de altura maior nenhum n foi retirado T e T possuem a mesma altura rvore Binria - altura mnima Nvel 0 (somente a raiz) contm um n Nvel 1 contm no mximo 2 ns ..... No nvel L - pode conter no mximo 2 L ns
rvore binria cheia de altura d tem exatamente 2 L ns em cada nvel 0 s L
s d rvore Binria O total de ns n em uma rvore binria cheia (que seria o mximo) de altura d a soma do nmero de ns a cada nvel d n = 2 0 + 2 1 + 2 2 + ..... + 2 d = E
2 j j=0
n =
2 d+1 -1
d = log (n+1) 1
pode-se mostrar tambm por induo! OBS.: nmero de folhas de uma rvore cheia com n ns 2 d = 2 log(n+1)-1 = 2 log(n+1) = n+1
2 2 rvore Binria Cheia H I D J K E B L M F N O G C A rvore Binria Cheia de altura 3 2 3+1 -1 = 15 ns rvore Binria Cheia a rvore binria com o mximo de ns para uma dada altura, mas a distncia da raiz pequena
Lema: Seja T uma rvore binria completa com n>0 ns. Ento, T possui altura h mnimo. Alm disso, h = log n
rvore Binria Completa Seja T uma rvore binria completa com n ns, ento sua altura h = log 2 n
Seja T a rvore obtida pela remoo dos k ns do ltimo nvel T cheia j que T s tinha folhas no ltimo e no penltimo nvel (definio de completa) ns de T n = n - k = 2 d +1 -1 , onde d a altura de T rvore Binria Completa h(T) = d e h(T) = d+1 d = log 2 (n+1) -1 h(T) = log 2 (n+1) -1 +1 = log 2 (n+1) e k? (no mximo nmero de folhas da rvore cheia 2) 1 s k
s n +1 h(T) = log 2 (n+1) = log 2 (n + k) = log 2 (n)
Exerccio 8 a 1. Uma rvore cheia tem 1023 ns. Qual sua profundidade e o nmero de ns terminais? Resposta: 9 e 512. 2. Uma rvore completa tem 37 ns. Qual sua profundidade e o nmero de ns terminais? Resposta: 5 e 19. 3. Uma rvore completa tem 37 ns terminais. Qual sua profundidade e nmero total de ns? Resposta: 6 e 73. Representando rvores Binrias typedef struct { int info; tipo_no * esq; tipo_no * dir; } tipo_no; B C A A B C Representando rvores Binrias Typedef struct { char info; tipo_no * esq; tipo_no * dir; tipo_no * pai; } tipo_no B C A A B C Representando rvores Binrias Na representao ns externos podem ser NULL ponteiro para o prprio n B C A A B C Representando rvores Binrias a * b + d - e * ( f + g ) a b * f g + e * - Representando Florestas rvores binrias possuem dois ponteiros em cada n interno, um para cada filho, e portanto sua representao imediata O que fazer para rvores gerais ou florestas, com um nmero arbitrrio de filhos por n, que requerem um nmero arbitrrio de ponteiros
Representao depende da Aplicao Representando Florestas Se no necessrio caminhar para os nveis de baixo da rvore mas s para os de cima Percorre-se a vores dos ns terminais para os no terminais e por ltimo a raiz B C A B A C Representando Florestas typedef struct { char info; tipo_no * filho; tipo_no * irmo; } tipo_no A B C D E D E B C A Representando Florestas Se necessrio caminhar para os nveis mais altos Empregar uma lista encadeada conectando o n com seus irmos e outra com seus filhos Ao invs de empregar um n dummy para terminar cada lista pode-se apontar de volta para seu pai permitindo mover para cima ou para baixo Esses ponteiros para pai tem que estar marcados para poder ser distingui-los dos ponteiros para irmos Alternativamente pode-se armazenar o nome do pai de forma que a busca pra quando o n for revisitado Representando Florestas Essa representao cada n possui exatamente dois ponteiros 1 para filho e 1 para um irmo Onde est a diferena entre essa estrutura e uma rvore binria?? no existe Visite(p) contedo do n apontado por p Esquerda(p) ponteiro para o filho da esquerda de Direita(p) ponteiro para o filho da direita de p Pai(p) ponteiro para o pai de p Irmo(p) ponteiro para o irmo de p eh_esq(p) Retorna true se p filho da esquerda e se filho da direita eh_dir(p) Retorna true se p filho da esquerda e se filho da direita Operaes em rvores Binrias Operaes em rvores Binrias p = cria(x) Cria uma AB com apenas um n com contedo x Retorna o ponteiro para a nova rvore. resp = filho_esq(p,x) Cria um filho esquerda do n apontado por p, com contedo x. Retorna false caso j exista um filho esquerdo e true caso contrio. resp = filho_dir (p,x) Cria um filho direita do n apontado por p, com contedo x. Retorna false caso j exista um filho direito e true Aplicaes Com rvores Binrias uma estrutura til quando uma de duas decises devem ser tomadas no decorrer do processo. Encontrar todas as duplicatas em uma lista de nmeros Uma forma de fazer isso comparar o nmero com todos os que o precedem isto no uma soluo eficiente
Aplicaes Com rvores Binrias Soluo: empregar uma rvore binria Armazenam-se os nmeros na rvore de forma a: O 1 nmero armazenado na raiz de uma rvore com apenas um n interno Cada um dos prximos nmeros na lista comparado com a raiz: caso seja igual uma duplicata caso seja menor, armazenado na sub-rvore da direita seguindo-se recursivamente o mesmo procedimento caso seja maior, armazenado na sub-rvore da esquerda seguindo-se recursivamente o mesmo procedimento
Aplicaes Com rvores Binrias 14, 18, 4, 9, 7, 15, 3, 5, 17, 4, 20, 9, 5 3 5 7 9 4 17 15 20 18 14 Aplicaes com rvores Binrias Outra aplicao comum atravessar a rvore binria, visitando cada n como sistematicamente visitaremos cada n? Operao trivial para listas lineares Para rvores, existem diferentes formas de proceder os mtodos diferem conforme a ordem em que se visitam os ns Atravessando rvores Binrias Mtodos Pr-ordem:visite a raiz, ento visite a subrvore da esquerda, depois a subrvore da direita Em-ordem ou ordem simtrica: visite a subrvore da esquerda, ento visite a raiz, depois a subrvore da direita Ps-ordem: visite a subrvore da esquerda, ento visite a subrvore da direita, depois a raiz pr-ordem: - * a b * + f g e
em-ordem: a*b - f+g * e
ps-ordem: a b * f g + e * - Atravessando rvores Binrias a * b + d - ( f + g ) * e a b * f g + e * - Atravessando rvores Binrias Implementao simples dos mtodos - recursiva Como se visita uma subrvore de cada vez, seguindo-se a regra recursiva , cada subrvore visitada comeando pela raiz Pr-ordem pre_ordem (pt) { if (pt == NULL) return (); visite(raiz); pre_ordem (pt->esq); pre_ordem (pt-> dir); }
Exerccio 9 Representar, atravs de uma rvore, a seguinte expresso aritmtica: [(a+b)(c+d)/e]-[(f+g)h] Justificar!
A partir dos procedimentos anteriores montar um programa completo para atravessamento em-ordem rvore Binria Completa Representao em lista sequencial Cada n pode receber um nmero de 1 a N Um n de nmero i est na posio i da lista Seus filhos da esquerda e da direita nas posies 2i+1 e 2i+2, respectivamente
No necessita ponteiros Restringe um tamanho para a rvore Tambm chamada de representao seqencial H (8) I (9) D (4) E (5) B (2) F (6) G (7) C (3) A (1) A B C D E F G H I rvore Binria quase Completa Exerccios 10 1. Implementar os procedimentos pr-ordem, em- ordem e ps-ordem de forma no recursiva
2. Calcular a altura de cada n de uma rvore binria
Em-ordem p = raiz; do { /* segue pelo ramo da esq. at NULL */ while (p != NULL) { push(p); p=p->esq; } /* verifica se j processou toda rvore */ if (pilha_no_vazia()){ p = pop(); visite(p); p = p->dir; } } while(pilha_no_vazia() || p != NULL); } H I D E B C A rvore Binria de Busca Construda de tal forma que, para cada n: Ns com chaves menores esto na sub-rvore esquerda Ns com chaves maiores (ou iguais) esto na sub- rvore direita
A insero dos ns da rvore deve satisfazer a essa propriedade rvore Binria de Busca Para a busca de uma chave v na rvore binria de busca: Primeiro compare com a raiz Se menor, v para a sub-rvore esquerda se maior, para a sub-rvore direita
Aplique o mtodo recursivamente
Exerccio 10a Dos exemplos abaixo quais so rvores binrias de busca:
Sim sim no rvore Binria de Busca 2 3 5 4 6 9 8 6 rvore Binria de Busca 2 3 5 4 6 9 8 6 rvore Binria de Busca 2 3 5 4 6 9 8 6 rvore Binria de Busca A cada passo, garante-se que nenhuma outra parte da rvore contm a chave sendo buscada
O procedimento pra quando O n com v encontrado Seno, chega-se a NULL rvore Binria de Busca busca_arvore_nao_recursivo (v, pt) { do { if (v < pt->info) pt = pt-> esq; else pt = pt-> dir; }while (pt != NULL) && (v != pt->info); return(pt); } Inserindo em rvore Binria de Busca Para inserir um n na rvore: fazer uma busca com insucesso alocar um novo n necessrio saber por qual n se chegou a NULL ser o pai do novo n Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca Inserindo em rvore Binria de Busca 2 3 5 4 7 6 9 8 6 Insero rvore Binria de Busca insere_rvore (int valor, tipo_n * pt) { tipo_n * pai; do{ pai = pt ; if (valor < pt->chave) pt = pt ->esq ; else pt = pt->esq; } while(pt != NULL); if (pt == NULL){ pt = aloca(); pt ->chave = valor; pt->esq = NULL; pt->dir = NULL; if (v < pai->chave) pai ->esq = pt ; else pai ->dir = pt ; return(pt); } } Insero rvore Binria de Busca A rvore est classificada se percorrida da forma correta (pre, pos ou em-ordem?) as chaves aparecem em ordem se lidas da esquerda para a direita Podemos ordenar uma sequncia como se fosse uma srie de inseres o programa tem apenas os ponteiros para se preocupar Remoo em rvore Binria de Busca At ento, vimos que a implementao da operao de insero simples
A remoo de um elemento j mais complexa remoo de um n folha os ponteiros esquerdo e direito do pai so setados para NULL se possui apenas um filho o ponteiro apropriado do pai passa a apontar para o filho se o n possui dois filhos se um desses dois filhos no possui filhos, use esse n para substituir o n removido
Remoo em rvore Binria de Busca
Seno: substituir o valor do n a ser removido substitua este com o elemento cuja chave imediatamente maior (ou menor) sempre folha? seno for folha v repetindo o procedimento algoritmo? Remoo em rvore Binria de Busca 2 3 5 4 8 7 10 9 6 Removendo 5: basta que o ponteiro a direita de 4 aponte para NULL Remoo em rvore Binria de Busca 2 3 4 8 7 10 9 6 Removendo 5: basta que o ponteiro a direita de 4 aponte para NULL Remoo em rvore Binria de Busca Removendo 3: basta substituir o n 3 pelo n 2 continua valendo a regra de formao da rvore 2 3 5 4 8 7 10 9 6 Remoo em rvore Binria de Busca Removendo 3: asta substituir o n 3 pelo n 2 continua valendo a regra de formao da rvore 2 5 4 8 7 10 9 6 Remoo em rvore Binria de Busca Removendo 4: basta substituir 4 pelo 5 continua valendo a regra de formao da rvore
2 3 5 4 8 7 10 9 6 Remoo em rvore Binria de Busca Removendo 4: Basta substituir 4 pelo 5 continua valendo a regra de formao da rvore
2 3 5 8 7 10 9 6 Remoo em rvore Binria de Busca Removendo 7 (raiz): substituir o 7 pelo imediatamente maior: 8 como determinar? resulta na remoo do elemento de chave 8 2 3 5 4 9 8 12 11 10 7 Remoo em rvore Binria de Busca Removendo 7 (raiz): substituir o 7 pelo imediatamente maior: 8 como determinar? resulta na remoo do elemento de chave 8 2 3 5 4 9 8 12 11 10 8 Remoo em rvore Binria de Busca Removendo 7 (raiz): substituir o 7 pelo imediatamente maior: 8 como determinar? resulta na remoo do elemento de chave 8 2 3 5 4 9 12 11 10 7 rvore Binria de Busca A rvore obtida depende da seqncia de insero de ns Para que a rvore binria de busca seja completa completa tem altura mnima o conjunto das chaves deve ser reordenado rvore comum - O (n) rvore completa - O (log n)
rvore Binria de Busca Uma rvore binria de busca completa
o conjunto das chaves deve ser re-ordenado sejam s o e s n+1 duas chaves fictcias e j inseridas a cada passo inserir em T uma nova chave que seja de ndice mdio entre i e j - duas chaves j inseridas
rvore Binria de Busca rvore completa: tima para a busca quando a freqncia de acesso aos ns igual
Normalmente estas freqncias so diferentes
interessante construir uma rvore binria que seja a melhor possvel no que diz respeito busca para freqncias conhecidas Eficincia da rvore de Busca Depende da ordem original dos dados Se o array original est ordenado (ascendente ou descendente), as rvores resultantes s tem filhos a direita ou a esquerda a insero do 1o. n - 0 comparaes a insero do 2o. n - 2 comparaes a insero do 3o. n - 3 comparaes 2 + 3 +....+n = n*(n+1)/2 -1 Complexidade - O(n 2 ) - para inserir n ns Eficincia da rvore de Busca Se a lista original estiver organizada, e se uma rvore completa (parecida com completa) for se formando:
complexidade da insero = O( n log n ) Eficincia da rvore de Busca 12, 8, 17, 4, 26 A rvore balanceada
4 8 26 17 12 rvores AVL Baseado em: Material do prof. D. Lobato http://pt.wikipedia.org/wiki/arvore_binaria Baseado em: Material do prof. D. Lobato http://pt.wikipedia.org/wiki/arvore_binaria rvores AVL Os algoritmos convencionais podem gerar rvores degeneradas ou timas rvores de crescimento irrestrito rvores AVL (Adelson-Velskki & Landis) rvores de busca binria auto-balanceada Nesse tipo de rvore, al alturas das duas sub-rvores a partir de cada n difere no mximo em uma unidade. Mesmo depois de incluses e excluses o custo se mantem O (log n) onde n o numero de ns Inseres e eliminaes podem requerer o rebalanceamento da rvore, exigindo uma ou mais rotaes. AVL uma ABB com |Ah| s 1 AVL Observe as rvores abaixo: Todas armazenam os Mesmos dados. Qual delas a melhor? E a pior? No pior caso, quantas Comparaes so Necesssrias para Encontrar um elemento Na rvoce a) e na rvore b)? AVL Balanceamento: Dizemos que uma rvore est balanceada em altura (ou profundidade) quando, para cada n, a diferena entre as alturas de suas sub-rvores igual a -1, 0 ou 1. AVL rvore no AVL
A mesma rvore aps balanceamento por altura, agora AVL AVL Fator de equilbrio de um n Fe(A) = hEsq hDir Fe(A) = 2 3 = -1 Fe(C) = 2 1 = 1 AVL Fe(N) e {-1, 0, +1}; N Fe()??? AVL Fator de equilbrio dos ns Fe(A) = 2 3 = -1 Fe(B) = 1 1 = 0 Fe(C) = 2 1 = 1 Fe(D) = 0 0 = 0 Fe(E) = 0 0 = 0 Fe(F) = 1 1 = 0 Fe(G) = 0 0 = 0 Fe(H) = 0 0 = 0 Fe(I) = 0 0 = 0 AVL Calcular o fator de equilbrio dos ns
AVL Calcular o fator de equilbrio dos ns Resposta AVL Vantagem da rvore balanceada:
Com base na tabela acima, se tivssemos 1.048.575 elementos, poderamos armazen-los em uma rvore binria perfeitamente balanceada com 20 nveis. Em outras palavras, poderamos localizar um elemento qualquer dentro dessa rvore com apenas 20 comparaes. AVL O que pode acontecer quando um novo n inserido numa rvore balanceada ? Dada uma raiz r com subrvores L (left) e R (right), e supondo que a insero deve ser feita na sub-rvore da esquerda. Podemos distriguir 3 casos:
Se hL = hR, ento L e R ficam com alturas diferentes mas continuam balanceadas. Se hL < hR, ento L e R ficam com alturas iguais e balanceamento foi melhorado. Se hL > hR, ento L fica ainda maior e balanceamento foi violado. Exemplo Dada a rvore: Inserir o n 9 ou 11 Inseridos normalmente Inserir o n 3 5 ou 7 Requer rebalanceamento
AVL Uma rvore AVL balanceada quando para cada n da rvore, a diferena entre as alturas das suas sub-rvores (D e E) no maior que 1. Onde no inserir ns??? H->(dir|esq) I->(dir|esq) Nos dois casos Fe(C) = 3-1= 2 Todas as outras levam algum | Fe | para alm de 1 Tente... AVL Inserindo em H ou I, dois casos Em H: Fe(F) = 1, Fe(C) = 2, F(A) = -2 Em I: Fe(F) = -1, Fe(C) = 2, F(A) = - 2 Inserir e depois rotacionar visto ser necessrio alguns ajustes, tal que: Continue ABB Continue balanceada
AVL Rotao simples Ocorre devido ao seu desbalanceamento, uma rotao simples ocorre quando um n est desbalanceado e seu filho estiver no mesmo sentido da inclinao, formando uma linha reta.
Rotao dupla Ocorre quando um n estiver desbalanceado e seu filho estiver inclinado no sentido inverso ao pai, formando um joelho.
AVL Rebalanceamento mapeado em dois casos Raz (2|-2) e filho (1|-1) com o mesmo sinal Rotao simples do n com |Fe| = 2 na direo correta Raz (2|-2) com um sinal e filho(-1|1) com outro Rotao do n com |Fe| = 1 na direo correta Rotao do n que tinha |Fe| = 2 na direo oposta AVL Rotao direita
Numa rvore binria basta empurrar o nodo N para baixo e para a direita. O filho esquerda de N o substitui, e o filho direita do filho esquerda vem a ser o novo filho esquerda de N. Segue pseudocdigo:
Seja Y o filho esquerda de X Torne X o filho direita de Y Torne o filho direita de Y o filho esquerda de X.
interessante observar que as rotaes duplas nada mais so que duas rotaes simples seguidas, independentes se direita ou esquerda.
AVL Rotao esquerda Em uma rvore binria, basta empurrar o n N para baixo e para a esquerda. O filho direita de N o substitui, e o filho esquerda do filho direita vem a ser o novo filho direita de N. Segue pseudocdigo:
Seja Y o filho direita de X Torne X filho esquerda de Y Torne o filho esquerda de Y o filho direita de X. AVL Exemplo Rotao Simples ( direita) A altura da sub-rvoce de raiz 4 difere de mais de 1 unidade da de chave 7. Como a altura da sub-rvore esquerda de 6 difere de 2 em relao sua sub-rvore direita, rotaciona-se em torno do 4. AVL Exemplo Rotao Simples (continuao) Ento 4 passa a ser a nova raiz A sub-rvore com raiz 6 vira filho direito de 4
5 passa a ser filho esquerdo de 6 Balanceada! AVL Procedimentos Rotao a esquerda ou direita void roda_dir(ARVORE p) { ARVORE q, temp; q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; } 8 4 2 3 6 10 p q temp Raz (2|-2) e filho (1|-1) com o mesmo sinal Rotao simples do n com |Fe| = 2 na direo correta Fe(8) = 3-1 = 2 Fe(4)= 2-1 = 1 8 9 14 q temp 12 temp q p AVL Procedimentos Rotao a esquerda ou direita void roda_dir(ARVORE p) { ARVORE q, temp; q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; } 8 4 2 3 6 10 p q temp AVL Procedimentos Rotao a esquerda ou direita void roda_dir(ARVORE p) { ARVORE q, temp; q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; } 8 4 2 3 6 10 p q temp AVL Procedimentos Rotao a esquerda ou direita void roda_dir(ARVORE p) { ARVORE q, temp; q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; } 8 4 2 3 6 10 p q temp AVL Procedimentos Rotao a esquerda ou direita void roda_dir(ARVORE p) { ARVORE q, temp; q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; } 8 4 2 3 6 10 p AVL Procedimentos Rotao a esquerda ou direita A esquerda anlogo... Tente! AVL Exemplo Rotao Simples ( esquerda) A altura da sub-rvore de raiz 7 difere de mais de 1 unidade da de chave 3. AVL Rebalanceamento mapeado em dois casos Raz (2|-2) e filho (1|-1) com o mesmo sinal Rotao simples do n com |Fe| = 2 na direo correta Raz (2|-2) com um sinal e filho(-1|1) com outro Rotao do n com |Fe| = 1 na direo correta Rotao do n que tinha |Fe| = 2 na direo oposta AVL - Procedimentos E a, o que fazer? Rotacionar 4 para a esquerda Rotacionar 8 para a direita 8 4 2 6 10 5 Raz (2|-2) com um sinal e filho(-1|1) com outro Rotao do n com |Fe| = 1 na direo correta Rotao do n que tinha |Fe| = 2 na direo oposta Fe(8) = 3 1 = 2 Fe(4) = 1 2 = -1 AVL - Procedimentos E a, o que fazer? Rotacionar 4 para a esquerda Rotacionar 8 para a direita 8 6 4 2 10 5 Raz (2|-2) com um sinal e filho(-1|1) com outro Rotao do n com |Fe| = 1 na direo correta Rotao do n que tinha |Fe| = 2 na direo oposta Fe(8) = 3 1 = 2 Fe(4) = 1 2 = -1 AVL - Procedimentos E a, o que fazer? Rotacionar 4 para a esquerda Rotacionar 8 para a direita 8 6 4 2 10 5 AVL Exemplo rotao dupla Rotao dupla: Se um n estiver desbalanceado e seu filho estiver inclinado no sentido inverso ao pai. Nesse caso faz-se duas rotaes simples seguidas! Seu filho, o 6, est no sentido inverso do 7, seu pai. AVL Exemplo rotao dupla direita:
Rotao simples esquerda
Rotao simples direita AVL Exemplo rotao dupla direita: 5 ser a nova raiz da sub-rvore de raiz 7 Como a nova raiz passa a ser o 5, o n 3 passa a no ser mais filho de 7
Alm disso, as arestas de 4 e 6 com 5 so desfeitas AVL Exemplo rotao dupla direita (continuao): As sub-rvores de raizes 3 e 7 se ligam a 5
4 se liga a 3 e 6 se liga a 7 Balanceada! Exerccios 11 Balancear:
Exerccios 11 Inserir: 5 3 7 10 33 15 17 (pag 66)
Excluir: 3 17
Excluir: 10 (considerando a rvore inicial) Exerccios 11 Na rvore AVL abaixo: inserir 15, 7 e 28 Excluir 4 e 8
8 6 4 2 10 5 rvores B e B+ rvore B ou B-Tree um tipo de rvore muito utilizada em banco de dados e sistema de arquivos. Para inserir ou remover variveis de um n, o n no poder ultrapassar sua ordem e nem ser menor que sua ordem dividida por dois. rvores B no precisam ser rebalanceadas como so freqentemente as rvores de busca binria com rvore AVL. rvores B tm vantagens substanciais em relao a outros tipos de implementaes quanto ao tempo de acesso e pesquisa aos ns. O criador das rvores B, Rudolf Bayer, no definiu claramente de onde veio o B das rvores B. Ao que parece, o B vem de balanceamento onde todos os ns da rvore esto em um mesmo nvel. Tambm possvel que o B tenha vindo de seu sobrenome Bayer, ou ainda do nome da empresa onde trabalhava Boeing, no Boeing Scientific Research Labs. Estrutura do N Ns em rvores B, geralmente so representados por um conjunto de elementos apontando para seus filhos. Alguns autores consideram a ordem de uma rvore B como sendo a quantidade de registros que a pgina pode suportar. Outros consideram a ordem como a quantidade de campos apontadores. Todo n da rvore tem um mnimo de elementos definido pela sua ordem, que a metade da ordem, arredondando-se para baixo, caso a rvore seja de ordem mpar, exceto a raiz da rvore, que pode ter um mnimo de um registro. Por exemplo, os ns de uma rvore de ordem 5, devem ter, no mnimo 5 / 2 registros, ou seja, dois registros. A quantidade de filhos que um n pode ter sempre a quantidade de registros do n mais 1 (V+1). Por exemplo, se um n tem 4 registros, este n ter obrigatoriamente 5 apontamentos para os ns filhos. Insero Primeiro, pesquise a posio onde este n ser includo. Ento, insira o valor dentro do n. Se nenhum n ficou errado, acima ou abaixo da ordem div 2, o processo terminado. Se algum n ficar acima da ordem, dividimos o n, o valor central do n dividido sobe para a posio do pai, continuando assim recursivamente por toda a rvore. Se o n estourar na raiz, ento criado um novo n raiz ((podendo ter um nico elemento)).
Excluso Primeiro, busque um valor a ser excludo. Ento, remova-o de dentro de um n. Se nenhum n teve problema, o processo terminado. Se algum n estiver errado, ento h duas possibilidades: Se o n ao lado do n errado pode transferir um ou mais de seus ns filho ao n atual, ento o n atual voltar ao normal. Aps ter atualizado os valores da separao do pai e dos dois filhos, o processo terminado. Se o n ao lado do n errado no tem um filho extra porque est no limite mais baixo, ento ambos os ns sero fundidos em um nico n. Continuando at que o n atual esteja normal.
Exerccios 12 Na rvore B da figura: Inserir 5 e 6 na rvore da figura
Remover 2 e 3. rvores-B Objetivo principal Minimizar o nmero de acessos ao disco para recuperar um registro 25 10 20 30 40 2 5 7 8 13 14 15 18 22 24 26 27 28 32 35 38 41 42 45 46 rvores-B Devido a organizao, altura da rvore log m N Ordem da rvore-B: m Nmero de chaves: N Altura da rvore AVL melhor caso Aplicaes Sistema de arquivos: ponteiros para clusters rvores-B Como representar em C? #define ORDEM 2 #define TAMANHO (ORDEM*2)-1
typedef struct Pagina *PonteiroPagina; typedef struct { int chave; PonteiroPagina p; } item;
typedef struct { int m; // numero de itens na pagina PonteiroPagina p0; item e[TAMANHO]; } Pagina; Busca em rvores-B Busca binria na pgina atual No encontrando K i < x < K i+1 com 1 s i < m Continuar a busca na pgina p i Km < x Continuar a busca na pgina p m x < K 1 Continuar a busca na pgina p 0 Pgina atual == NULL no existe Busca em rvores-B Implemente uma funo de busca em rvore-B com o prottipo Int Pesquisa (int, PonteiroPagina, int *) Busca em rvore-B Possvel implementao int Pesquisa(int x, PonteiroPagina pag, int *achou) { int i; *achou = 0 if (pag == NULL) return 0; i = 1; while ((i <= TAMANHO) && (x > pag->e[i-1].chave)) i++; if (x == pag->e[i-1].chave) { *achou = 1; return x; } else if (x < pag->e[i-1].chave) Pesquisa (x, pag->e[i-1].p, achou); else Pesquisa (x, pag->e[i].p, achou); } Insero em rvores-B A criao de uma rvore-B trivial Inserir que o problema... Respeitar as limitaes de ocupao dos ns no-raiz (entre m e 2m)! Crescimento das folhas para a raz Se folhas no acomodarem, aumentar a altura da rvore e manter folhas no mesmo nvel Insero em rvores-B Considerar uma rvore-B ordem 2 Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 40 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 10 20 40 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 10 20 30 40 15 10, 15, 20, 30, 40 Mediana promovida Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 10 15 30 40 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 10 15 30 35 40 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 7 10 15 30 35 40 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 7 10 15 26 30 35 40 Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22 20 7 10 18 15 26 30 35 40 22 22, 26, 30, 35, 40 Mediana promovida Insero em rvores-B Inserir as chaves abaixo na ordem dada 20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20 30 7 10 15 18 22 26 35 40 Exerccios 13 Na rvore anterior, continuar inserindo chaves 5, 42, 13, 46, 27, 8, 32, 38, 24, 45, 25 Cuidado com as divises de pgina!
Remoo em rvores-B Algumas situaes podem ocorrer Chave na pgina folha Remover se no violar condies Chave em pgina intermediria Trocar a chave pelo seu sucessor in-ordem da D E (maior chave menor que a chave) em uma pgina folha e remova a chave na folha Se ocorrer violao (pgina com menos de m chaves), ajustar Balancear (pgina vizinha) Intercalao (acaba removendo uma pgina) Remoo em rvores-B Algumas situaes podem ocorrer Ajuste de violao Troca com intercalao direita Troca com intercalao esquerda Balanceamento direita/esquerda se nmero de chaves das pginas mais pai > 2m+1 Intercalao com direita/esquerda, se nmero de chaves das pginas mais pai s 2m Remoo em rvores-B Eliminar chave 24 22 34 6 11 14 19 24 26 38 42 46 5 > 2m+1 Balanceamento 26, 34, 38, 42, 46 Promove mediana! Remoo em rvores-B Eliminar chave 24
E para eliminar 26??? 22 38 6 11 14 19 26 34 42 46 4 s 2m Intercalao Remoo em rvores-B Eliminar chave 26
E para eliminar 22??? 22 6 11 14 19 34 38 42 46 Exerccio 14 Considerando inseridas todas as chaves da rvore B do exerccio anterior, mostrar as arvores intermedirias das excluses de 20, 25, 38 e 40. rvore B+ Uma rvore B+ uma variao da rvore B. Representa a ordenao de dados de uma maneira que permita uma insero e remoo eficiente de elementos. um ndice dinmico de multi-nveis com ligaes mximas e mnimas no nmero de chaves em cada nodo. Os sistemas de arquivos NTFS para o Microsoft Windows, o sistema de arquivos ReiserFS para Unix, o XFS para IRIX e Linux, e o JFS2 para AIX, OS/2 e Linux, usam este tipo de rvore. Numa rvore-B+, contrastando com uma rvore-B, todos dos dados so gravados nas folhas. Os nodos internos contm apenas chaves e apontadores da rvore. Todas as folhas esto no mesmo nvel mais baixo. Os nodos das folhas tambm esto ligados entre si como uma lista para efetuar consultas facilmente. Conceitos O nmero mximo de apontadores num registro chamado de ordem da rvore B+. O nmero mnimo de chaves por registro metade do nmero mximo de chaves. Por exemplo: Se a ordem de uma rvore B+ for n+1, cada nodo (exceto o da raiz) dever ter entre (n+1)/2 e n chaves. Se n for um nmero primo, o nmero mnimo de chaves pode ser (n+1)/2 ou (n-1)/2, mas ter de ser o mesmo em toda a rvore. Um exemplo simples de uma rvore B+ ligando as chaves 1-7 aos valores de dados d1-d7. Notar a lista ligada (em vermelho) permitindo uma atualizao ordenada rpida. Conceitos O nmero de chaves que poder ser indexado ao usar a rvore B+ uma funo da ordem da rvore e da sua altura. Para uma rvore B+ de ordem n com uma altura h: O nmero mximo de nodos nh O nmero mnimo de chaves 2(n / 2)h 1.
A rvore B+ foi descrita pela primeira vez em "Rudolf Bayer, Edward M. McCreight: Organization and Maintenance of Large Ordered Indices. Acta Informatica 1: 173-189 (1972)".
Uma extenso de uma rvore B+ chamada de rvore B# que usa a estrutura da rvore B+ e adiciona mais restries. Exerccios 15 1. Inserir as chaves abaixo em uma rvore B+ na ordem dada 20, 40, 10, 30, 15, 35, 7 2. Excluir 30 e 15
Variantes de rvores-B rvores-B* Todas as chaves esto nas folhas, e ns intermedirios so, apenas, ndices Folhas encadeadas para permitir acesso seqencial Usada em bancos de dados para aumentar a concorrncia Insero em pgina segura com at 2m registros Remoo em pginas seguras com pelo menos m registros
rvores Rubro-Negras um tipo de rvore criada em 1972 com o nome de rvores binrias simtricas. Assim como as rvores binrias comuns, as rvores rubro-negras possuem um conjunto de operaes (tais como insero, remoo e busca), porm so geralmente mais eficientes devido ao fato de estarem sempre balanceadas. Este balanceamento se d justamente pela caracterstica que d nome rvore, que vem de um bit extra em cada n que determina se este "vermelho" ou "preto" dentro do conjunto de regras que rege a rvore. Alm deste bit, cada n tambm conta com os campos dados do n, filho esquerdo do n, filho direito do n e pai do n. Definio do n struct node * grandparent(struct node *n) { if ((n != NULL) && (n->parent != NULL)) return n->parent->parent; else return NULL; }
struct node * uncle(struct node *n) { struct node *g = grandparent(n); if (g == NULL) return NULL; // No grandparent means no uncle if (n->parent == g->left) return g->right; else return g->left; }
Regras Uma rvore rubro-negra estar sempre balanceada pois segue o seguinte conjunto de regras: cada n da rvore possui um valor a cada novo n inserido na rvore obedecer o esquema de menor para o lado esquerdo e maior para o lado direito. a cada n associada uma cor: vermelha ou preta. o n raiz sempre preto. ns vermelhos que no sejam folhas possuem apenas filhos pretos. para cada n, todos os caminhos do n at qualquer folha passa pelo mesmo nmero de ns pretos.
Regras - Insero A cada vez que uma operao realizada na rvore, testa-se o conjunto de propriedades descritos anteriormente e so efetuadas rotaes e ajuste de cores at que a rvore satisfaa todas estas regras. Uma rotao uma operao realizada na rvore para garantir seu balanceamento. Na rubro-negra pode ser feita a direita e a esquerda, onde so alterados os ponteiros dos ns rotacionados. Ao inserir um elemento em uma rvore rubro-negra, esta comparada com os elementos e alocada em sua posio conforme a regra 2. Ao inserir um elemento ele sempre da cor vermelha (exceto se for o nodo raiz). A seguir a rvore analisa o antecessor da folha. Se este for vermelho ser necessrio alterar as cores para garantir a regra 5. Regras - Inserir Existem trs casos para corrigir as cores aps uma insero: Caso 1: O tio do elemento inserido VERMELHO. Caso 2: O tio do elemento inserido PRETO e o elemento inserido um filho da direita. Caso 3: O tio do elemento inserido PRETO e o elemento inserido um filho da esquerda. O n raiz Ao inserir o primeiro n na rvore (raiz) este ser preto. void insert_case1(struct node *n) { if (n->parent == NULL) n->color = BLACK; else insert_case2(n); }
Insero caso 2 void insert_case2(struct node *n) { if (n->parent->color == BLACK) return; /* Tree is still valid */ else insert_case3(n); }
Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 O n raiz sempre preto! Exemplo Inserir 11,2,14,1,7,13,15,5,8 Na insero o n de menor valor vai para o lado esquerdo e o de maior para o lado direito. Exemplo Inserir 11,2,14,1,7,13,15,5,8 Ao inserir um elemento ele sempre da cor vermelha, exceto o n raiz. Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Na insero o n de menor valor vai para o lado esquerdo e o de maior para o lado direito. Exemplo Inserir 11,2,14,1,7,13,15,5,8 Na insero o n de menor valor vai para o lado esquerdo e o de maior para o lado direito. Exemplo Inserir 11,2,14,1,7,13,15,5,8 Aps inserir um elemento da cor vermelha, a rvore analisa o antecessor da folha. Se este for vermelho ser necessrio alterar as cores para garantir a regra 6 (ns vermelhos que no sejam folhas possuem apenas filhos pretos). Exemplo Inserir 11,2,14,1,7,13,15,5,8 14 o irmo de 2 e vermelho. O preto pode ser transferido do pai a seus dois filhos vermelhos (o pai, em seguida, toma a cor vermelha), sem afetar a contagem do nodo preto por qualquer caminho. Exemplo Inserir 11,2,14,1,7,13,15,5,8 Desde que o pai 11 a raiz, o processo pode ser interrompido neste ponto porque... Exemplo Inserir 11,2,14,1,7,13,15,5,8 A raiz sempre deve ser preta, sem afetar a contagem de nodos pretos em qualquer caminho.
Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 O irmo 1 de 7 vermelho, deve-se puxar o preto do 2 para baixo. Exemplo Inserir 11,2,14,1,7,13,15,5,8 O preto pode ser transferido de um pai de seus dois filhos vermelhos (o pai, em seguida, toma a cor vermelha), sem afetar o numero de nodos pretos de qualquer caminho. No entanto, uma dupla violao vermelha poder ser resultante dessa mudana. Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 11,2,14,1,7,13,15,5,8 Exemplo Inserir 4 Exemplo Inserir 4 Exemplo Inserir 4 Exemplo Inserir 4 Exemplo Inserir 4 O irmo 8 do 5 vermelho, puxar o preto para baixo a partir de 7 do conjunto atual de 2 Exemplo Inserir 4 O preto pode ser transferido de um pai para seus dois filhos vermelhos (o pai, em seguida, toma a cor vermelha), sem afetar a contagem do caminho do nodo preto. No entanto, uma dupla violao vermelha poder ocorrer. Portanto, definir 2 para a raiz da sub-rvore. Exemplo Inserir 4 O pai 11 de 2 do lado direito e seu filho 7 vermelho e est direita: girar no sentido anti-horrio em torno de 2, fixando no 7 Exemplo Inserir 4 Desde que 11 pai direita de 2, se o filho vermelho 7 ficou a esquerda, pode-se girar o 11 preto e ento mudar de volta para eliminar a dupla violao vermelha (isto explicado com mais detalhes no Prximo passo). Exemplo Inserir 4 Ento, ns usamos este passo para configurar essa possibilidade por rotao no sentido anti-horrio em torno de 2. O resultado vermelho 7 esquerda de 11 e vermelho preto 2, esquerda do vermelho 7. Exemplo Inserir 4 O pai 11, de 7 est do lado direito e seu filho 2 vermelho esquerda: girar no sentido horrio em torno de 11 Exemplo Inserir 4 Desde que 11 preto pai, direita do vermelho 7 e vermelho 2 filho e est sua esquerda, uma rotao no sentido horrio por 11 vai subtrair um negro do caminho atravs da 2. Mas este desequilbrio pode ser corrigido por troca de cores, de 11 e 7.
Exemplo Inserir 4 Ao faz-lo (na prxima etapa), tambm elimina a dupla violao vermelha. Exemplo Inserir 4 Mudana de cores. O 2 filho vermelho esquerda de 7 tem um n preto contar que muito baixo por 1. Trocando as cores entre os atuais e seu filho negro direita (11) elimina a conta do dficit e da dupla violao vermelho. O nodo preto direita do filho atual no afetado. Exemplo Inserir 4 Regras - Remoo Existem dois tipos de remoo em uma rvore: De acordo com a remoo efetiva, com as operaes de rotao e alterao de cor, remove-se o nodo e estabelece-se as propriedades da rvore. De acordo com a remoo preguiosa, marca-se um nodo como removido, mas efetivamente no o retira. Sendo desta maneira nenhuma alterao efetuada na rvore, porm so necessrios novos mecanismos de busca e insero para que reconheam o nodo como "ausente". Exerccio 16 Excluir 7