Click here to load reader

UNIVERSIDADE SÃO JUDAS TADEU ENGENHARIA DE …underpop.free.fr/e/estrutura-de-dados/cap-01.pdf · UNIVERSIDADE SÃO JUDAS TADEU ENGENHARIA DE COMPUTAÇÃO / BACHARELADO EM CIÊNCIA

  • View
    214

  • Download
    0

Embed Size (px)

Text of UNIVERSIDADE SÃO JUDAS TADEU ENGENHARIA DE …underpop.free.fr/e/estrutura-de-dados/cap-01.pdf ·...

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 1

    Professor: H. Senger - Outubro de 1999

    Notas de AulaRVORES BINRIAS

    1 rvore Binria de Busca__________________________________________ 11.1 Implementao de uma rvore Binria de Busca____________________________ 2

    1.1.1 Incluso de um dado__________________________________________________________41.1.2 Busca de um dado ___________________________________________________________51.1.3 Remoo de um dado _________________________________________________________6

    1.2 Implementao _______________________________________________________ 81.3 Percurso em rvores __________________________________________________11

    1.3.1 Pr-ordem_________________________________________________________________ 121.3.2 In-ordem__________________________________________________________________ 131.3.3 Ps -ordem________________________________________________________________ 14

    1.4 Anlise de eficincia dos algoritmos ______________________________________151.5 rvores de busca com balanceamento - AVL _______________________________171.6 rvore de busca otimizada ______________________________________________19

    2 Roteiro de Estudo______________________________________________ 21Exerccio 1 - Programa de teste __________________________________________________ 21Exerccio 2 - Busca (resolvido)__________________________________________________ 21Exerccio 3 - Teste da rotina (quase resolvido)_______________________________________ 21Exerccio 4 - Remoo de dados : Remover ( ... )______________________________________ 22Exerccio 5 - Teste da rotina de remoo ___________________________________________ 22Exerccio 6 - Mini-Projeto I (opcional) _____________________________________________ 22Exerccio 7 - Ordenao por ttulo.________________________________________________ 24Exerccio 8 - Mini-Projeto II (opcional) ____________________________________________ 24Exerccio 9 - Mini-Projeto III (opcional) ____________________________________________ 26

    3 LISTA DE EXERCCIOS - I________________________________________ 28Exerccio 1 - Construo de uma ABB. ____________________________________________ 28Exerccio 2 - Remoo de dados de uma ABB _______________________________________ 28Exerccio 3 - Algoritmos de Percursos _____________________________________________ 28Exerccio 4 - Aplicaes de percurso______________________________________________ 28Exerccio 5 - Algoritmo de percurso_______________________________________________ 28Exerccio 6 - Reconstruo da rvore______________________________________________ 28Exerccio 7 - Propriedades de rvores _____________________________________________ 28Exerccio 8 - Propriedade de rvores ______________________________________________ 29Exerccio 9 - Algoritmo ________________________________________________________ 29Exerccio 10 - Algoritmo ________________________________________________________ 29Exerccio 11 - _________________________________________________________________ 30Exerccio 12 - _________________________________________________________________ 30Exerccio 13 - _________________________________________________________________ 30Exerccio 14 - _________________________________________________________________ 30Exerccio 15 - _________________________________________________________________ 30

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 2

    4 LISTA DE EXERCCIOS II (Exclusiva para disciplina de Anlise deAlgoritmos) _______________________________________________________ 32

    Exerccio 1 - (Resolvido)_______________________________________________________ 32Exerccio 2 - (resolvido) _______________________________________________________ 33Exerccio 3 - _________________________________________________________________ 34Exerccio 4 - _________________________________________________________________ 34Exerccio 5 - _________________________________________________________________ 35Exerccio 6 - (Resolvido)_______________________________________________________ 35Exerccio 7 - _________________________________________________________________ 36Exerccio 8 - _________________________________________________________________ 37Exerccio 9 - _________________________________________________________________ 37Exerccio 10 - _________________________________________________________________ 37Exerccio 11 - _________________________________________________________________ 37Exerccio 12 - _________________________________________________________________ 38

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 1

    Professor: H. Senger - Outubro de 1999

    Notas de Aula

    RVORES BINRIAS1 rvore Binria de BuscaPara que uma rvore binria seja adequada a operaes de busca, preciso haver um critrio dearmazenamento. O critrio que vamos adotar o seguinte: Todo dado com valor menor que o valor contido no n raiz deve ser armazenado na sua

    subrvore esquerda, Todo dado com valor maior que o valor contido no n raiz deve ser armazenado na sua

    subrvore direita, O mesmo critrio deve ser aplicado para ambas as subrvores da raiz, e para as subrvores das

    subrvores, etc., at o nvel das folhas.

    Obs. Poderia ser o contrrio, ou seja, os maiores esquerda e os menores direita.

    Assim, vejamos como construir uma rvore binria a partir da seqncia abaixo:

    26, 14, 30, 36, 23, 8, 35, 18

    Aps inserir o 26:

    Aps inserir o 14:

    Aps inserir 30:

    26

    26

    14

    26

    14 30

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 2

    Aps inserir 36:

    Aps inserir 23:

    E aps inserir 8, 35 e 18:

    1.1 Implementao de uma rvore Binria de Busca

    Cada n da rvore binria pode ser assim implementado :

    36

    26

    14 30

    23 36

    26

    14 30

    18

    8 23 36

    26

    14 30

    35

    item

    esq dir

    Cada n contm os campos :- item : guarda um item de dado- esq : ponteiro para sub-rvore esquerda- dir : ponteiro para sub-rvore direita

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 3

    Vejamos como representar essa estrutura de dados em linguagem C ou C++: Inicialmente, vamos declarar o tipo de dado que vai no interior de cada n :

    Neste caso, declaramos que TipoItem eqivale ao tipo int, pois queremos que nossa rvorebinria seja capaz de guardar nmeros inteiros.

    Em seguida, vamos construir um n da rvore :

    A declarao acima determina como a organizao de um n da rvore. Mas como quepodemos representar uma rvore inteira, e no apenas um n ? Uma forma de fazer isso criarmos um ponteiro capaz de guardar o endereo do n raiz de uma rvore.

    Assim, inicialmente declaramos um tipo especial chamado PONT, capaz de guardar o endereode um n, e em seguida, uma varivel do tipo PONT :

    Em seguida, poderamos construir a rvore, utilizando uma rotina capaz de adicionar um nicon rvore. Bastaria ler um punhado de dados, um por vez, chamando essa rotina para fazer aincluso de cada dado na rvore :

    A inicializao da rvore feita simplesmente atribuindo o valor NULL para o ponteiro Raiz.Assim, a rotina possui apenas uma atribuio em seu interior, algo parecido com o trechoabaixo:

    estrutura NO { TipoItem item; estrutura NO *esq, *dir;};

    novotipo inteiro TipoItem;

    novotipo estrutura NO * PONT;

    ...

    PONT Raiz; /* A varivel Raiz aponta para o n raiz */

    ... Inicializar(Raiz); faa { /* loop de construo da rvore */ exibir ("Dado (ou -1 p/finalizar): "); ler_teclado ("%d", &X); se (X!=-1) Inserir(Raiz, X); } enquanto (X>-1); . . .

    ...Raiz = NULL;...

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 4

    1.1.1 Incluso de um dado A incluso de um novo dado na rvore pode utilizar um algoritmo recursivo, ou no. Em se

    tratando de rvores, porm, os algoritmos recursivos em geral so mais simples do que osequivalentes no-recursivos.

    Um algoritmo recursivo para incluir um novo dado em uma rvore binria poderia proceder daseguinte forma : Se a rvore recebida est vazia, ento inclua o novo n neste ponto Seno, faa o seguinte Se o novo dado for menor que o dado da raiz, inclua-o na subrvore ESQUERDA Se o novo dado for maior que o dado da raiz, inclua-o na subrvore DIREITA

    INSERIR_ABB (Raiz, Dado)se Raiz = NULL, ento Raiz = alocar_novo_no ( ); Raizitem = Dado; Raizesq = NULO; Raizdir = NULO; seno se Dado < Raizitem ento INSERIR_ABB(Raizesq, Dado) seno se Dado > Raizitem ento INSERIR_ABB(Raizdir, Dado) seno Erro Dado duplicado

    Obs. Voc percebeu que estamos escrevendo = para indicar uma atribuio aoinvs de usar o smbolo ?. para evitar a confuso com o , usado com variveis do tipo ponteiro(operador de indireo da linguagem C/C++).

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 5

    1.1.2 Busca de um dadoQualquer operao de busca deve comear pela raiz da rvore, e ir descendo, ora para esquerda,ora para direita, at encontrar o dado.Ocorre que, s vezes o dado quer procuramos no est na rvore. fcil perceber isso, porque emum certo momento, ao tentar descer mais um n, simplesmente chegamos ao final da rvore.Vejamos como localizar o valor 18 na rvore abaixo :

    Se estivssemos procurando o valor 20 (que no existe nessa rvore), tentaramos descer aindamais um n, abaixo e direita do 18. Como no d para descer mais, eu descubro que 20 noexiste nessa rvore.

    18

    8 23 36

    26

    14 30

    35

    comece pela raiz

    como 18 < 26, desauma para esquerda

    e depois, umapara direita

    e uma paraesquerda

    BUSCA_ENDEREO (Raiz, Dado) se Raiz = NULO ento devolva NULO /* se no achou, devolve NULO */ seno se Dado = Raizitem ento devolva Raiz seno se Dado > Raizitem ento devolva BUSCA_ENDEREO(Raizdir, Dado) seno devolva BUSCA_ENDEREO(Raizesq, Dado)

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 6

    1.1.3 Remoo de um dadoAo se retirar um dado da rvore, 3 situaes podem ocorrer :a) O n removido um n folha (no tem filhos ) : ento basta remov-lo, colocando um NULO

    em seu lugar. Na rvore abaixo, 8, 18 e 35 so exemplos de n folha.b) O n removido tem um filho (que pode ser esquerda, ou direita) : nesse caso, o filho toma o

    lugar do n removido. Na rvore abaixo, se o n com valor 30 for removido, o 36 tomar seulugar.

    c) O n removido tem dois filhos: Se isso ocorrer, outro n deve ser escolhido para substituir o nremovido. Existem duas solues igualmente corretas e viveis : podemos pegar o n mais direita na subrvore esquerda de quem foi removido, para substitu-lo; ou pegar o n mais esquerda na subrvore direita do n removido para substitu-lo. Tanto faz. No exemplo abaixo,se tivermos de remover o 26, tanto o 23 como o 30 poderiam substitu-lo.

    Vamos implementar uma rotina para remover o dado. Porm, o que aconteceria se algumpedisse para apagar um dado da rvore, sendo que esse dado no existe ? A rotina de removerdeve fazer uma tentativa de remoo, avisando se conseguiu remover ou no.

    A varivel Status serve para observar se a resposta devolvida pela rotina indica se a tentativade remover teve sucesso ou no.

    . . .Status = REMOVER (Raiz, Dado);se Status FRACASSO ento DADO NO EXISTE, E NO PODE SER REMOVIDOseno OK DADO FOI REMOVIDO. . .

    18

    8 23 36

    26

    14 30

    35

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 7

    A rotina REMOVER dada abaixo :

    REMOVER (PONT& R, TipoItem Dado) PONT p, q; /* Se a arvore eh vazia, entao o dado procurado nao existe ...*/ se (R = NULO) ento devolva FRACASSO; seno se ( Dado > Ritem) ento devolva REMOVER (Rdir, Dado); seno se (Dado < Ritem) devolva REMOVER (Resq,Dado); seno /* encontrou o dado */ se ((Resq = NULO) E (Rdir =NULO)) { /* se nao tem filhos ...*/ desaloque ( R ); R = NULO; seno se (Resq = NULO) {/* s tem filho a direita */ p = Rdir; desaloque (R); R = p; seno se (Rdir = NULO ) {/*se s tem filho a esquerda */ p = Resq; desaloque (R); R = p; seno { /* tem dois filhos */ p = Resq; /* procura o maior da subarv. esq*/ q = NULO; enquanto (pdir != NULO) q = p; p = pdir; se ( q = NULO ) { /* se p e q no se moveram */ Resq = pesq; Ritem = pitem; desaloque (p); seno qdir = pesq; Ritem = pitem; desaloque (p);

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 8

    1.2 ImplementaoVejamos agora, como tudo pode ser ficaria implementado na prtica. No se esquea :

    Inicialmente, preciso declaras as estruturas de dados. Vamos declarar o tipo que define ocontedo de cada item de dado.

    #include

    #define SUCESSO 1 /* usado no retorno de algumas funes */#define FRACASSO 0

    typedef int TipoItem;struct NO { TipoItem item; struct NO *esq, *dir;};typedef struct NO *PONT;

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 9

    Aqui voc tem uma rotina capaz de inserir um novo dado na rvore (Inserir). Para criar uma rvorecompleta, basta cham-la diversas vezes, inserindo vrios ns.H tambm uma rotina para exibir o contedo de uma rvore. Com ela voc pode testar se a rotinaanterior criou a rvore corretamente.

    /* --------------------------------------------------- Dec. das Estruturas de dados --------------------------------------------------- */typedef int TipoItem;struct NO { TipoItem item; struct NO *esq, *dir;};typedef struct NO *PONT;

    /* ----------------------------------------------------- Funcoes de tratamento da rvore ----------------------------------------------------- */void Inicializar(PONT& R){

    R = NULL; /* Inicializa como vazia */}

    int Inserir (PONT& R, TipoItem Novo){ if (R == NULL)/* Se rv. recebida estiver vazia ...*/ { /* ento acrescenta novo n na raiz */ if ((R=(PONT)malloc(sizeof(struct NO)))==NULL) {

    printf ("ERRO em malloc\n"); exit(0);

    } R->item = Novo; R->esq = NULL; R->dir = NULL; return SUCESSO; } else if (Novo > R->item)

    return Inserir(R->dir, Novo); else if (Novo < R->item)

    return Inserir(R->esq, Novo); else return FRACASSO;

    }

    void Exibir(PONT R, int H){ int i; if (R!=NULL) { Exibir(R->dir, H+1); for(i=0; i

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 10

    void main (){

    PONT Raiz, end;TipoItem X;int opcao, status;

    Inicializar(Raiz);do {

    clrscr();printf("%s %s %s %s %s %s %s %s %s %s",

    " Menu :\n","1 - Inicializar \n", "2 - Construir\n","3 - Exibir \n", "4 - Procurar\n","5 - Remover\n", "6 - Pre-Ordem\n","7 - In-Ordem\n", "8 - Pos-Ordem\n","0 - FIM\n");

    printf(" Sua opcao :");scanf("%d",&opcao);switch(opcao) { case 1: Inicializar(Raiz);

    break; case 2: do {

    printf(" Forneca um dado ou -1 para finalizar:");scanf("%d",&X);if (X>-1) { status = Inserir(Raiz,X); if (status == FRACASSO)

    printf(" \n Problemas na insercao.\n"); else printf(" Ok\n");}

    } while (X>-1); break;

    case 3: printf("\n\n\n Exibicao da arvore ...\n"); Exibir(Raiz,0); break;

    case 4: printf(" Opcao ainda nao implementada ..."); break;

    case 5: printf(" Opcao ainda nao implementada ..."); break;

    case 6: printf(" Opcao ainda nao implementada ..."); break;

    case 7: printf(" Opcao ainda nao implementada ..."); break;

    case 8: printf(" Opcao ainda nao implementada ..."); break;

    case 0: printf(" Bye ..."); exit(0); break;

    }getchar();printf("\n\n Tecle enter ...");getchar();

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 11

    1.3 Percurso em rvoresDepois que uma rvore binria foi criada, existem diversas maneiras de percorr-la, exibindo seucontedo. Dependendo da forma com que uma rvore binria percorrida, seus dados seroexibidos em uma ordem diferente. Imagine uma rvore binria genrica, com este formato :

    Vamos ver algumas as principais formas de se percorrer uma rvore binria, visitando seus ns eexibindo seu contedo.

    raiz

    SE SD

    raiz N raiz

    SE Subrvore esquerda

    SD Subrvore direita

    Legenda

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 12

    1.3.1 Pr-ordem

    O algoritmo da pr-ordem o seguinte : Se a rvore recebida for vazia, no faa nada e a PRE-ORDEM termina caso contrrio

    visite o n raiz, exibindo seu contedo

    percorra a subrvore esquerda em PRE-ORDEM

    percorra a subrvore direita em PRE-ORDEM

    Veja a rvore binria abaixo. Se a percorrermos em PRE-ORDEM, teremos a seguinte seqnciadados :

    Veja o algoritmo da Pr-ordem :

    raiz

    SE

    SD

    PREORDEM (Raiz) se Raiz NULO ento exibir_contedo (Raiz) PREORDEM (Raizesq); PREORDEM (Raizdir);

    18

    8 23 36

    26

    14 30

    35

    Seqncia obtida, quando arvore percorrida em Pr-Ordem :

    26,14,8,23,18,30,36,35

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 13

    1.3.2 In-ordem

    O algoritmo da IN-ORDEM o seguinte : Se a rvore recebida for vazia, no faa nada e a IN-ORDEM termina caso contrrio

    percorra a subrvore esquerda em IN-ORDEM

    visite o n raiz, exibindo seu contedo

    percorra a subrvore direita em IN-ORDEM

    Veja a rvore binria abaixo. Se a percorrermos em IN-ORDEM, teremos a seguinte seqnciadados :

    Veja o algoritmo da In-ordem :

    raiz

    SD

    INORDEM (Raiz) se Raiz NULO ento INORDEM (Raizesq); exibir_contedo (Raiz) INORDEM (Raizdir);

    18

    8 23 36

    26

    14 30

    35

    Seqncia obtida, quando arvore percorrida em In-Ordem :

    8,14,18,23,26,30,35,36

    SE

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 14

    1.3.3 Ps -ordem

    O algoritmo da PS-ORDEM o seguinte : Se a rvore recebida for vazia, no faa nada e a PS-ORDEM termina caso contrrio :

    percorra a subrvore esquerda em PS-ORDEM

    percorra a subrvore direita em PS-ORDEM

    visite o n raiz, exibindo seu contedo

    Veja a rvore binria abaixo. Se a percorrermos em PS-ORDEM, teremos a seguinte seqnciadados :

    Veja o algoritmo da Ps-ordem :

    raiz

    SD

    PSORDEM (Raiz) se Raiz NULO ento POSORDEM (Raizesq); POSORDEM (Raizdir); exibir_contedo (Raiz);

    18

    8 23 36

    26

    14 30

    35

    Seqncia obtida, quando arvore percorrida em Ps-Ordem :

    8,18,23,14,35,36,30,26

    SE

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 15

    1.4 Anlise de eficincia dos algoritmosPergunta : Quanto tempo leva para fazer uma busca na rvore binria de busca (ABB) ?

    Resposta : Bem, isso depende. Depende da particular rvore na qual eu vou fazer a busca. Vamossupor que a minha rvore tenha n dados, inseridos aleatoriamente, ou seja, algum digitou ao acaso. No melhor caso, o dado que eu procuro o prprio que est na raiz. Assim, o tempo de busca

    nessa rvore de n ns T(n)=1. No pior caso, o dado que eu quero est em um n folha, ou ento no existe, o que significa

    que terei de chegar at um ponteiro NULO : Nesse caso, vou supor duas situaes extremas. Na primeira delas, a rvore binria gerada

    perfeitamente balanceada. Vamos supor que h seja a altura da rvore gerada. Em cada nvel i da rvore temos exatamente 2i ns. Por exemplo, no nvel ZERO (o

    mesmo nvel da raiz) existem 20 = 1 n. No nvel UM existem 21 = 2 ns, e assim pordiante.

    Assim, para a nossa rvore de altura h teremos um total de n ns, onde :

    1 2

    2h

    1

    0

    =

    =

    =

    n

    nh

    i

    i

    Como o nmero de comparaes para o pior caso a prpria altura da rvore, ou seja,h, temos : h = lgn+1. Assim, T(n)=O(lg n).

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 16

    Na segunda, a rvore degenerada : Nesse caso, cada n tem apenas um filho, at que o ltimo deles um folha. Assim, a

    altura da rvore dada pela quantidade de ns, ou seja, h = n. Assim, T(n) = n.

    Assim, podemos concluir que, no pior caso, o tempo de busca T(n) varia entre O(n) eO (log2 n).

    verdade que essa rvore degenerada pode ocorrer, mas para isso preciso que aseqncia de inseres siga uma tendncia crescente, ou decrescente.

    Na sua opinio, qual a probabilidade de algum digitar uma seqncia de n valores emordem crescente ou decrescente (considerando um n grande), sendo que os nmeros foramsorteados ao acaso ?

    Eu acho que isso muito difcil de ocorrer, voc no acha ?

    Mas e quanto ao caso mdio ? Qual o tempo mdio de busca de um dado na rvore dessetipo ? Para fazer essa estimativa, ns precisamos supor duas coisas : Que todos os valores da rvore tem a mesma probabilidade de acesso. E mesmo aqueles valores que no existem na rvore (mas que algum poderia tentar

    procurar) tambm tem a mesma probabilidade de acesso. Como um pouco de trabalho, e a matemtica adequada, podemos verificar que o tempo

    mdio de busca nessa rvore de 1.386 log2n, ou seja, que, em mdia, a rvore debusca est apenas cerca de 39% desbalanceada.1

    1 Se voc quiser ver como se chega a esse resultado, h dois livros que posso recomendar :- Tenenbaum, A.M., et.al. Estruturas de dados usando C, Makron, 1995. pg.517-520.- Knuth, D.E., The art of computer programming, Vol. 3 Sorting and searching, 1973. pg. 427.

    23

    34

    71

    95

    67

    09

    Seqncia de inseres :09, 23, 34, 67, 71, 95

    Na prtica, rvores degeneradas como as do exemplo acima so muito raras de acontecer, epor isso a busca nesse tipo de rvore tem um desempenho bastante aceitvel.

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 17

    1.5 rvores de busca com balanceamento - AVLEssa rvore chamada de AVL, em homenagem aos seus criadores, G.M. Adelson-Velskii eM.E. Landis (1962).Definio: Uma rvore AVL obedece sempre a seguinte propriedade : a diferena de altura suas

    duas subrvores s pode ser 1, 0 ou 1.

    Imagine que a rvore acima est balanceada, isto , segue a propriedade das rvores AVL.Quando inserimos ou removemos um n da rvore, a que pode ocorrer o desequilbrio entre asduas subrvores. Assim, a incluso e remoo so efetuadas de forma bastante parecida com aABB sem balanceamento que vimos em na seo 1, e a rvore em seguida consertada, baseadanas 4 transformaes ilustradas a seguir.

    p

    he hd

    Propriedade p/rvore AVL:

    |he hd| 1

    g

    T2T1

    p

    T3

    p

    T3T2

    g

    T1

    rotao direita

    g

    T2T1

    t

    T3

    t

    T3T2

    g

    T1

    rotao esquerda

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 18

    Knuth 2 provou que a altura h dessa rvore obedece a seguinte relao :

    log2(n+1) < h < 1,4404 log2(n+2) 0,328

    Isto significa que, no pior caso, a rvore AVL est 44% desbalanceada.Alm disso, a rvore AVL possui um tempo de busca, no pior caso, de :

    2 Knuth, D.E., The art of computer programming, Vol. 3 Sorting and searching, 1973. pg. 427.

    p

    T3T2

    g

    T1

    r

    T4g

    T2T1

    p

    r

    T4T3

    dupla rotao direita

    r

    T3T2

    z

    T4

    p

    T1

    p

    T2T1

    r

    z

    T4T3

    dupla rotao esquerda

    T(n) = h= O(lg n)

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 19

    1.6 rvore de busca otimizadaMas afinal, qual a melhor rvore de busca que se conhece ? Existe alguma rvore realmente tima?

    Existe uma rvore binria que leva esse nome, e que tenta otimizar a rvore, ou seja, minimizaro tempo de busca. Essa rvore apresentada em 3. Vamos apenas falar um pouquinho sobre ela,somente por curiosidade e informalmente.

    Essa rvore s serve quando eu conheo a freqncia relativa de acesso de cada n. Paraentender melhor, vamos ver a rvore abaixo :

    Imagine que os dados mais procurados sejam :

    Valor fri (freqnciarelativa)

    30 19%14 17%36 14%18 10%35 8%23 7%8 6%26 3%

    Um algoritmo poderia reorganizar a rvore, deixando os dados mais freqentemente acessados maisprximos da raiz.Existem um problema com esse tipo de rvore : Os algoritmos de organizao da rvore so caros ((n2)), o que pode encarecer a operao

    de reorganizao, ou mesmo inviabiliz-la para valores de n muito grande.

    3 Knuth , D.E. The Art of Computer Programming Vol. 3: Sorting and Searching, Addison-Wesley Publishing,Co., 1973, pg. 435

    18

    8 23 36

    26

    14 30

    35

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 20

    O estudo de estruturas de dados, seus algoritmos, sua eficincia e aplicaes vem sendodesenvolvido desde os anos 50, e tiveram seus principais resultados publicados nas dcadas de 60 e70. Nos anos 80 e 90 ainda acontecem avanos na rea, mas em pontos muito especficos.

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 21

    2 Roteiro de EstudoEste material tem por objetivo, fornecer um roteiro de estudo sobre rvores binrias. Seu contedoinclui exerccios propostos e exerccios resolvidos, intercalados de forma que o aluno possa evoluiratravs dele.

    Este material foi elaborado tendo em vista o ESTUDO INDIVIDUAL, de modo que vocpoder aproveit-lo melhor se tentar no depender da ajuda de colegas. Isto no significa quevoc est proibido de pedir ajuda ao colega, mas faa isso com moderao. Tente evoluir por contaprpria, sem exagerar no pedido de ajuda.

    O Professor agradece pelos comentrios que voc queira fazer sobre a organizao deste material;correes, melhorias, crticas, etc., atravs do e-mail [email protected] BOM ESTUDO !!!

    Exerccio 1 - Programa de teste

    Digite, ou tente obter por download o programa ilustrado na seo 1.2. Se voc tiver muitadificuldade no assunto, digite-o, pois isso facilita o seu entendimento.

    Exerccio 2 - Busca (resolvido)

    Veja o algoritmo proposto em 1.1.2, para procurar um dado dentro da rvore, devolvendo comoresposta o endereo do n onde o dado foi encontrado. Caso no encontre, a rotina deve devolverum ponteiro NULO como resposta. Note que preciso receber como parmetro, o dado e oponteiro para a raiz da rvore, pois sem eles no d para fazer busca nenhuma.Soluo:

    Obs.: Note o uso da recursividade nas linhas 8 e 10. Na linha 8, o algoritmo tenta efetuar uma novabusca na subrvore esquerda. Essa chamada recursiva ir retornar algum valor, no futuro.Quando isso ocorrer, a funo pega o mesmo valor que lhe foi devolvido, e o devolve aque a chamou. Na linha 10 o mesmo feito para o lado direito.

    Exerccio 3 - Teste da rotina (quase resolvido)

    Inclua no programa principal uma nova opo no switch....case..., para testar a rotina que voc fezno exerccio anterior.O trecho que voc deve inserir, deve ser parecido com este :

    1 - PONT Busca_Endereco (PONT R, TipoItem Dado)2 - {3 - if (R==NULL)4 - return NULL;5 - else if (Dado == R->item)6 - return R;7 - else if (Dado > R->item)8 - return Busca_Endereco (R->dir, Dado);9 - else10 - return Busca_Endereco (R->esq,Dado);11 - }

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 22

    Digite e teste a rotina de Busca.

    Exerccio 4 - Remoo de dados : Remover ( ... )

    Implemente um algoritmo para remover um dado de uma rvore binria, conforme o algoritmodescrito em 1.1.3.Essa rotina recebe como parmetro o valor do n que deve ser removido.

    Exerccio 5 - Teste da rotina de remoo

    Faa um trecho no programa principal, que chama a rotina de busca. Assim voc poder testar asua rotina.Dica : No se esquea de que ela deve retornar algo que diz se conseguiu remover ou no.

    Exerccio 6 - Mini-Projeto I (opcional)

    Estimativa de trabalho entre 5 e 10 horas-homem/mulher.O objetivo deste projeto construir um pequeno banco que ser armazenado em memria principal,baseado em rvores binrias. Para isso, vamos admitir algumas condies : Cada n contm um registro de dados, e cada registro contm os seguintes campos :

    Cdigo ISBN do livro : numrico, de 10 dgitos (Campo chave) Nome do autor ou autores : alfabtico, de 50 posies Ttulo do livro : alfabtico, de 50 posies Editora : alfabtico, de 15 posies Ano de publicao : numrico Preo de venda : real

    . . . case 4: printf(" Dado a ser procurado:"); scanf("%d",&X); end = Busca_Endereco (Raiz,X); if (end == NULL) printf(" \n %d nao foi encontrado.\n",X); else printf(" \nOk = %d\n",end->item); break; . . .

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 23

    A estruturas de dados devem estar assim declaradas :

    Veja como seria o leiaute de cada n :

    O ISBN utilizado como campo chave, ou seja, a rvore binria organizada segundo onmero de ISBN (menores esquerda, maiores direita).

    Implemente as seguintes rotinas : CadastrarLivro (Raiz, Livro) : Inclui os dados contidos no registro Livro na rvore

    binria cujo n raiz apontado pela varivel Raiz.Devolve : SUCESSO ou FRACASSO, indicando o resultado da operao. FRACASSOpode ocorrer, tanto na impossibilidade de alocar mais memria, quanto na tentativa decadastrar um livro com ISBN repetido (no se deve permitir dois livros cadastrados commesmo ISBN).

    ProcurarLivro (Raiz, IsbnProcurado) : Procura um livro cujo ISBN igual aIsbnProcurado, na rvore binria cujo n raiz apontado pelo argumento Raiz.Devolve : um ponteiro para o n onde foi encontrado o registro do livro que contm esseISBN, ou um ponteiro nulo (NULL) caso no encontre um livro com tal ISBN.

    ExibirLivro (Endereco) : Recebe o ponteiro Endereco que aponta para um n da rvore,e mostra todos os campos desse n na tela.Obs.: Para procurar um livro na rvore e mostrar seus dados, primeiro voc deve chamar arotina ProcurarLivro (Raiz, IsbnProcurado), que ir lhe devolver o endereo do n quecontm o livro que voc procura. A, voc pega esse endereo e envia para a funoExibirLivro( ...), que vai mostrar os dados na tela.

    struct RegLivro { long int ISBN; char autores[50]; char titulo[50]; char editora[15]; int ano; float preco;};

    typedef struct ReegLivro TipoItem;struct NO { TipoItem item; /*o item contem um registro completo de um livro*/ struct NO *esq, *dir;};typedef struct NO *PONT;

    preo

    esq dir

    Ttulo

    editora

    autor

    ISBN

    ano

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 24

    RemoverLivro (Raiz, Dado) : Remove o n cujo valor indicado por Dado, da rvorebinria cujo n raiz apontado por Raiz.Devolve : nada.

    ListarAcervo (Raiz) : Percorre a rvore apontada por Raiz. Voc pode, por exemplo,adotar a forma INORDEM (Ver item 1.3.2) para fazer isso, de modo que os livros sejamexibidos por nmero de ISBN em ordem crescente.

    Exerccio 7 - Ordenao por ttulo.

    No exerccio anterior, a rotina ListarAcervo ( ) provavelmente ir exibir os livros por ordemcrescente de ISBN. Discuta alternativas para exibir os livros por ordem alfabtica de autor ou dettulo. Seria necessrio utilizar outra estrutura de dados para nos auxiliar ? Como percorr-la(s) paracumprir o objetivo ?No preciso implementar, mas apenas discuta o problema, apresentando uma ou mais sugestesde como fazer isso. Esboce/desenhe como funcionaria sua soluo.

    Exerccio 8 - Mini-Projeto II (opcional)

    Estimativa de trabalho entre 10 e 15 horas-homem/mulher.Considere um problema parecido com o do Exerccio 6, do cadastro de livros. Eu gostaria deseparar os dados em duas estruturas de dados : Um ndice : que seria formado pela rvore binria com o ISBN de cada livro cadastrado. Os

    outros campos de cada livro no estariam dentro da rvore binria, mas dentro de uma tabelade dados (um vetor de registros). Cada n teria o ISBN de um livro e uma indicao sobreonde esto os dados desse livro na tabela de dados.

    A tabela de dados : seria um vetor, onde cada elemento uma struct RegLivro tal comodescrito abaixo.

    Veja um esboo das estruturas de dados declaradas :

    struct RegLivro { long int ISBN; char autores[50]; char titulo[50]; char editora[15]; int ano; float preco;};struct NO { long int ISBN; /* indicao do livro */ int posicao; /* posio da tabela, onde esse livro est */ struct NO *esq, *dir;};typedef struct NO *PONT;struct RegLivro Tabela[100]; /* Tabela com capacidade para armazenar at 100 livros */int QuantLivros; /* contador, que indica a quantidade real de livros cadastrados na tabela lembre-se que 100 o mximo*/

    esq dir

    Isbn posica

    N

    autor Ttulo

    Editora

    Preo

    Isbn

    Ano

    Um registro : RegLivro

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 25

    E veja um exemplo de como essas estruturas trabalhariam :

    Implemente as seguintes funes : CadastrarLivro (Raiz,Tabela,Livro) : Inclui os dados contidos no registro Livro na

    Tabela de dados. Cada vez que um registro cadastrado em Tabela, preciso atualizar ondice, ou seja, incluir um novo n na rvore binria cujo n raiz apontado pela varivelRaiz. Esse novo n deve conter o valor campo chave do livro (o ISBN) e a posio que eleocupa no vetor de dados.Devolve : SUCESSO ou FRACASSO, indicando o resultado da operao. FRACASSOpode ocorrer, tanto na impossibilidade de alocar mais memria (se a Tabela j estivercheia), ou na tentativa de cadastrar um livro com ISBN repetido (no se deve permitir doislivros cadastrados com mesmo ISBN).

    ProcurarLivro (Raiz,Tabela, IsbnProcurado) : Procura um livro cujo ISBN igual aIsbnProcurado, na rvore binria apontada por Raiz. Quando encontrar, lembre-se que osdados do livro no esto dentro da rvore, mas sim dentro do vetor Tabela. Dentro do nda rvore voc ir encontrar apenas o nmero da posio do vetor, onde buscar os dadosdo livro.Devolve : um ponteiro para o n onde foi encontrado o registro do livro que contm esseISBN, ou um ponteiro nulo (NULL) caso no encontre um livro com tal ISBN.

    ExibirLivro (Endereco) : Recebe o ponteiro Endereco que aponta para um n da rvore.Lembre-se esse n no guarda os dados do livro, mas guarda um nmero (campo posicao)que indica onde esto os dados do livro na Tabela.

    aaa xxxx

    ediedi

    50.00

    333

    1990

    mmm yyyy

    raedi

    32.50

    111

    1998

    ccc zzz

    toraed

    65.10

    888

    1960

    0 1 2 . . . 99

    333 00

    111 01 888 02

    ndice (rvore de Busca)

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 26

    Obs.: Para procurar um livro na rvore e mostrar seus dados, primeiro voc deve chamar arotina ProcurarLivro (Raiz, IsbnProcurado), que ir lhe devolver um endereo. A, vocpega esse endereo e envia para a funo ExibirLivro( ...), que vai mostrar os dados natela.

    RemoverLivro (Raiz, Dado) : Essa rotina deve procurar o Dado na rvore cuja raiz apontada pela varivel Raiz, e fazer o seguinte : Descobrir qual a posio de Tabela na qual o livro se encontra; ir l no vetor e apagar os dados; e apagar o n da rvore onde Dado foi encontrado. Devolver : nada.

    ListarAcervo (Raiz) : Percorre a rvore apontada por Raiz. Voc pode, por exemplo,adotar a forma INORDEM (Ver item 1.3.2) para fazer isso, de modo que os livros sejamexibidos por nmero de ISBN em ordem crescente.

    Exerccio 9 - Mini-Projeto III (opcional)

    Estimativa de trabalho entre 15 e 20 horas-homem/mulher.No Exerccio 8 cada registro de um livro consome aproximadamente 125 bytes. Isso

    porque no quisemos guardar outras informaes adicionais sobre cada livro. Se quisermosarmazenar 1.000 livros, por exemplo, o nosso vetor Tabela deveria consumir aproximadamente125 Kbytes de memria.

    Isso poderia piorar muito, se aumentarmos o tamanho do registro, ou a quantidade deregistros, o que, na prtica ocorre muito freqentemente.

    Que tal se ns quisssemos montar uma livraria on-line, para vender atravs da Internet ?Imagine que eu queira cadastrar novos campos para cada livro, como por exemplo: o assunto ou assuntos com os quais o livro est relacionado; o link da pgina do(s) autor(es); o tempo que a livraria eletrnica leva para despachar esse livro para a casa do cliente; outros livros comprados pelas pessoas que tambm compraram este livro; etc. etc.

    Qual seria o tamanho do meu registro ? 500 bytes ? Mais ? Menos ?No sei, mas acho uma pssima idia guardar tudo isso em um vetor de dados. Imagine se a

    quantidade de livros aumentasse para 10 mil. O meu vetor poderia ter 10.000 x 500 = 50.000.000bytes, ou seja aproximadamente 50 Megabytes.

    A soluo seria deixar os dados em um arquivo em disco. Crie um arquivo em disco, para armazenar os registros de livros. O arquivo deve ter as seguintes

    caractersticas: Ter tamanho fixo de registro : pode ser conveniente usar as funes fopen (modo binrio),

    fread e fwrite para manipular esse arquivo. Tratar o arquivo de modo anlogo a um vetor, lendo e gravando registros atravs da

    posio que ele ocupa no arquivo. Ver funo fseek. O ndice, ou seja, a rvore de busca ir registrar a posio que cada registro ocupa dentro do

    arquivo. Implemente as funes:

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 27

    CriarArquivo (...) : Cria um novo arquivo e respectivo ndice. Apaga possveis dados quej existissem nesse arquivo.

    GravaRegistro(...) : Inclui um registro no arquivo, registrando-o no ndice para buscarpida no futuro.

    LeRegistro (...) : Procura um determinado registro no arquivo, fazendo a busca rpida nondice, atravs do campo chave (ISBN).

    ApagaRegistro (...) : Remove um registro do arquivo e do ndice, tomando o cuidado dedeixar livre a rea do disco que foi liberada. Outro registro que venha a ser includo nofuturo poder ocupar essa posio que foi agora liberada.

    AbreArquivo (...) : Abre o arquivo para leitura e/ou expanso de dados. Note que,diferentemente da funo CriaArquivo( ), esta funo no deve destruir dados quepudessem previamente existir. Outro ponto importante , no momento da abertura, precisoreconstruir o ndice corretamente. H duas maneiras de fazer isso : Ler seqencialmente o arquivo de dados, e, a cada registro lido, registrar no ndice

    (rvore binria) cada campo chave lido, bem como seu endereo fsico no arquivo dedados. Isso pode tornar a operao AbreArquivo(...) muito lenta, conforme o tamanhodo arquivo de dados cresce.

    Outra alternativa gerar um arquivo em separado, s para o ndice : assim, cada vezque o arquivo aberto, preciso ler o contedo do arquivo de ndice, reconstituindo arvore binria. Ao fechar o arquivo, preciso baixar o ndice no disco, ou seja, gravar arvore binria que serve como ndice no arquivo, para recuperao futura. Como essearquivo de ndice s contm o campo chave e seu endereo no arquivo de dados, afuno AbreArquivo(...) pode ficar mais eficiente. Porm, como teremos de gerar umarquivo de ndice a cada fechamento de arquivo, para uso futuro, a funoFechaArquivo(...) vai ficar mais lenta.

    FechaArquivo (...) : Fecha o arquivo de dados, atualiza e fecha tambm o arquivo dendice (caso ele exista).

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 28

    3 LISTA DE EXERCCIOS - ITente resolver os exerccios contidos nesta lista. Muitos deles foram exerccio de prova em anosanteriores.Por aqui, voc pode ter uma idia do que pode ser cobrado em avaliaes sobre o assunto.

    Exerccio 1 - Construo de uma ABB.

    Construa uma rvore binria de busca com os dados abaixo, obedecendo a seqncia dada:33, 25, 14, 29, 46, 37, 78, 24, 26, 2, 98, 11, 18, 27, 32, 57, 85, 40, 52

    Obs.: Faa um novo desenho a cada 3 ou 4 inseres.

    Exerccio 2 - Remoo de dados de uma ABB

    Depois de construda, remova os dados:14, 37, 98, 27, 25 ,11e 57

    Obs. Desenhe novamente a rvore, no mximo a cada duas remoes.

    Exerccio 3 - Algoritmos de Percursos

    A partir da rvore que voc construiu no Exerccio 1, d sua PRE-ORDEM, IN-ORDEM e PS-ORDEM.

    Exerccio 4 - Aplicaes de percurso

    Observe a resposta do Exerccio 3. Voc notou algo especial em uma das trsordens ? Explique .

    Exerccio 5 - Algoritmo de percurso

    Construa uma rotina para percorrer rvores binrias em PRE-ORDEM inversa,ou seja, visite sempre a subrvore direita antes de visitar a esquerda.Faa o mesmo com a IN-ORDEM e POS-ORDEM.

    Exerccio 6 - Reconstruo da rvore

    Ao se percorrer uma certa rvore temos :PRE-ORDEM A B D G H E C F I J KIN-ORDEM G D H B E A I F K J C

    Desenhe como seria essa rvore.

    Exerccio 7 - Propriedades de rvores

    Qual o nmero mximo de comparaes para se localizar um dado em umarvore binria perfeitamente balanceada com aproximadamente :

    a ) 500 nsb ) 2000 nsc ) 1500 ns

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 29

    Exerccio 8 - Propriedade de rvores

    Quantos nveis so necessrios para armazenar 8000 ns em uma rvore binria.

    Exerccio 9 - Algoritmo

    Considere a rvore binria abaixo :

    Simule a rotina abaixo, mostrando a sada em tela gerada.

    void XYZ ( PONT R, int H){ int I; if ( R != NULL) { XYZ ( R->ESQ, H+1); for ( I = 1, i ITEM); XYZ ( R->DIR, H+1); }}

    Exerccio 10 - Algoritmo

    Faa uma rotina de insero recursiva para uma rvore binria de busca, ondecada n possui os seguintes campos :

    INFO informao contida no nQUANT quantidade de vezes que a informao foi inserida

    ESQ, DIR ponteiros para as duas sub-rvoresA rotina deve inserir um novo dado X na rvore. Caso esse dado j exista,simplesmente armazene a informao de que houve uma nova insero. Caso Xesteja sendo inserido pela primeira vez, isto , ainda no existia na rvore, entocrie um novo n indicando que existe uma unidade do item X.

    A

    B

    D E F

    C

    G

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 30

    Exerccio 11 -

    possvel utilizar rvores binrias para ordenar um conjunto de dados de formacrescente ? Explique.

    Exerccio 12 -

    Construa uma rotina em C/C++ para comparar duas rvores binrias. A rotinadeve receber como parmetros de entrada dois ponteiros ( que apontam para araiz de cada uma das rvores ). Em seguida, deve comparar se o contedo dasduas rvores so exatamente iguais. Devolver o valor TRUE caso sejam iguais eFALSE caso no sejam ( em linguagem C pode utilizar 0 ou 1 ).

    Exerccio 13 -

    Implemente uma rotina que verifica se uma rvore binria arvore binria debusca ou no. Lembre-se da definio de Arv. Bin. de Busca : Os dados com valor menor que a informao da raiz estaro sua

    ESQUERDA Os dados com valor maior que a informao da raiz estaro sua DIREITA.

    Exerccio 14 -

    Implemente uma rotina que recebe um ponteiro que aponta para a raiz de umarvore binria. A rotina dever contar quantos ns existem nessa rvore, edevolver esse resultado ( a quantidade ) como um nmero inteiro.

    Exerccio 15 -

    Implemente uma rotina que recebe um ponteiro para o n raiz de uma rvore. Arotina dever fazer com que todo n que tiver um ponteiro com o valor NULLpasse a apontar para si prprio.Ex : rvore original A

    B

    D F

    C

    G

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 31

    Aps a modificao dos ponteiros ela dever ficar assim :

    A

    B

    D F

    C

    G

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 32

    4 LISTA DE EXERCCIOS II (Exclusiva para disciplina deAnlise de Algoritmos)

    Exerccio 1 - (Resolvido)

    Implemente um algoritmo que l uma seqncia de dados digitados de forma aleatria, e constriuma lista ligada em ordem crescente.

    Soluo:Para resolver esse problema, eu vou fazer a coisa em duas etapas : Primeiro, fao o loop de leitura de dados, mandando inserir cada dado na lista.

    Imagine que seja digitada uma seqncia aleatria de valores, como a abaixo :

    4, 54, 17, 62, 174,...

    Depois eu crio uma funo, que faz o seguinte : Na primeira vez que for chamada : a lista estar vazia (L = NULO) e X valer 4. A

    funo simplesmente inclui o valor na lista, que ficar assim:

    Na segunda vez : a lista ter um n, e X valer 54. A funo simplesmente inclui o novovalor depois do n existente, por que 54 maior que 4:

    Nas prxima vez, o 17 deve entrar entre os valores 4 e 54, e assim por diante.

    ...L = NULO;faa ler_teclado(X); INSERIR_ORDENANDO(L,X);enquanto ( ... );

    4L

    4L 54

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 33

    Ento vamos generalizar o processo. A funo INSERIR_ORDENANDO(L,X) ir :

    Receber como parmetros de entrada uma lista L, e um dado X. Criar um novo n para guardar o valor X. Se a lista L recebida estiver vazia, simplesmente inclui X como sendo o nico elemento. Se a lista L no estiver vazia, ento h duas possibilidades :

    Se o novo dado X menor do que o primeiro dado da lista (e portanto, tambm menor do que todos os outros), ento eu acrescento esse dado no primeiro lugar dalista.

    Se X no menor que o primeiro da lista, ento eu devo percorrer a lista, e achar oponto exato onde X deve ser includo. Considere que a lista j tenha recebido nvalores x1, x2, ..., xn, eu preciso encontrar o lugar i (0 < i < n) da lista, tais que xi < X< xi+1 .

    Finalmente, eis aqui o algoritmo da funo:

    Exerccio 2 - (resolvido)

    Qual o tempo de execuo dessa funo ?Soluo: Considerando que a funo recebe uma lista L, e um dado X, vamos calcular o tempo de

    execuo pessimista, pelos motivos que foram apresentados no primeiro semestre. Ser pessimista significa considerar que a lista L contm n registros {l1,l2, . . ., ln}, e no pior

    caso, X > ln e portanto, deve ser includo na ltima posio de L.

    INSERIR_ORDENANDO(L,X) novo = alocar_memria ( ... ); novoitem = X; se ( L = NULO ) ento L = novo; seno se ( X < Litem ) ento /* se X menor que o primeiro ... */ novoproximo = L; L = novo; seno p = L ; q = NULO; enquanto ( pproximo NULO ) E ( pitem < X) q = p; p = p proximo; novoproximo = p; qproximo = novo;

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 34

    Portanto, vou desprezar os casos onde L est vazia, ou que X < l1.

    Assim, T(n) = 1 + 1 + 1 +1 +1 + 1 + n + (n-1) + (n-1) + 1 + 1 T(n) = 3n + 6

    Exerccio 3 -

    A funo INSERIR_ORDENANDO ( ...) apenas uma parte do algoritmo do Exerccio 1, e seutempo de execuo pessimista foi estimado no Exerccio 2. Calcule o tempo de execuo total, parao algoritmo completo, ou seja, considere o tempo gasto no loop principal de ordenao.Dica:Considere que S uma seqncia s1, s2,..., sm, de comprimento m, composta de dados sorteadosao acaso, e digitados como entrada para o algoritmo em questo.Calcule T(m), sabendo que o tempo de execuo da linha que contm a chamada para a funoINSERIR_ORDENANDO ( ... ) 3n+6, onde n o comprimento da lista naquele momento.

    Exerccio 4 -

    Prove ou desprove que :a) T(n) calculado no Exerccio 3 O (n2)b) T(n) calculado no Exerccio 3 O (n). Se provar que isto verdade, das duas uma : ou voc

    errou, ou pode ficar rico (ou pelo menos famoso), pois descobriu e implementou um algoritmode ordenao de dados com tempo de execuo pessimista linear.

    c) T(n) calculado no Exerccio 3 (n2)

    ... novo = alocar_memria ( ... ); 1 novoitem = X; 1 . . . desprezvel se ( L = NULO ) 1 ... desprezvel seno se ( X < Litem) 1 . . . desprezvel seno p = L ; 1 q = NULO; 1 enquanto ( pproximo NULO ) n q = p; n - 1 p = p proximo; n - 1 novoproximo = p; 1 qproximo = novo; 1

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 35

    Exerccio 5 -

    Voc percebeu que acabou de construir um algoritmo de ordenao de dados baseado em listasligadas ? Pois , alm dos tradicionais algoritmos como BubbleSort, ..., MergeSort, ShellSort,QuickSort, existe uma infinidade de outros. Que tal batiz-lo de ListSort ?

    Tente melhorar um pouco a eficincia desse algoritmo. O loop que busca o lugar correto para ainsero de X na lista pode ser melhorado. D para utilizar um nico ponteiro para percorr-la, aoinvs de dois (p e q).Para quanto foi a complexidade (O novo T(n)) ? Voc acha que valeu a pena quebrar a cabeapara obter essa nova soluo ? Por que ?

    Exerccio 6 - (Resolvido)

    No item 1.4 ns analisamos a eficincia do algoritmo de busca em uma ABB. Analise novamente,porm, com mais detalhes.Essa questo um tanto complexa, mas vamos tentar facilitar um pouco o trabalho. Considere umacerta rvore binria cheia, a menos do ltimo nvel que pode estar incompleto em um n, pois docontrrio s poderamos ter valores de n mpar.Uma rvore est cheia, se : todos os ns internos (no folha) possuem dois filhos, e todos os ns folha esto no mesmo nvel.

    Soluo :Antes vamos entender como essa rvore. Este um exemplo :

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 36

    Vejamos o algoritmo recursivo, de busca na rvore. Para a anlise do pior caso, imagine queele nunca entra no primeiro se, e ao contrrio, entra no ltimo. Assim, todas as comparaesconsomem tempo igual a 1, e que s precisamos determinar a quantidade de chamadasrecursivas que sero feitas.

    Note que, na linha 8 h uma chamada recursiva, e eu no sei quantas vezes isso vai se repetir,at que o algoritmo encontre o dado. Eu s sei que essa chamada recursiva ir reduzir otamanho do problema, de n para n/2, e portanto, o tempo requerido pelo computador paraexecutar essa chamada T(n/2). Temos a uma recorrncia :

    T(n) = 3 + T(n/2)

    Nesse caso, vou supor que para um certo k inteiro e positivo :n=2k

    Agora, vou tentar desenrolar a recorrncia :

    T(n) = T(2k) = 3 + T(2k/2) = 3 + T(2k-1)= 3 + [ 3 + T(2k-1/2) ] = 3*2 + T(2k-2)

    = 3*3 + T(2k-3)= 3*4 + T(2k-4) ...= 3*k + T(2k-k)

    T(n) = 3kMas eu no quero T(n) em funo de k, e sim em funo de n.Se n = 2k k = log2 n,

    Assim, substituindo k teremos T(n) = 3 log2 n, onde n a quantidade de ns da rvore.

    Exerccio 7 -

    Prove ou desprove que :a) T(n) calculado no Exerccio 6 O (n2)b) T(n) calculado no Exerccio 6 O (n).c) T(n) calculado no Exerccio 6 (n2)

    1 - BUSCA_ENDEREO (Raiz, Dado)2 - se (Raiz = NULO) 13 - ento devolva NULO4 - seno se (Dado = Raizitem) 15 - ento devolva Raiz6 - seno se (Dado > Raizitem) 17 - ento devolva PROCURA_ABB (Raizdir, Dado)8 - seno devolva PROCURA_ABB (Raizesq, Dado) T(n/2)

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 37

    Exerccio 8 -

    Faa o mesmo para :a) O algoritmo de Insero, dado em 1.1.1

    Dica :O tempo para de insero de um dado o mesmo tempo requerido para a buscamalsucedida (de um dado que no existe), mais uma comparao (com uma subrvoreesquerda ou direita que nula ), e algumas linhas comuns para inserir o dado.

    b) O algoritmo de Remoo, dado em 1.1.3

    Exerccio 9 -

    a) Desenhe uma rvore binria de busca com os dados abaixo. V colocando os dados na mesmaordem que aparecem na seqncia abaixo :

    33, 25, 14, 29, 46, 37, 78, 24, 26, 2, 98, 11, 18, 27, 32, 57, 85, 40, 52b) Mostre os dados dessa rvore, de acordo com a IN-ORDEM, dada em 1.3.2.Voc notou que

    os dados aparecem em ordem crescente ?c) Construa um algoritmo para ler uma seqncia aleatria de dados, ordenando-os, utilizando uma

    ABB.Dica: V lendo os dados um a um pelo teclado e inserindo na rvore. Depois de pronta, chamea funo que percorre a rvore de acordo com a IN-ORDEM, dada em 1.3.2. Essa rotina irexibir os dados em ordem crescente.

    d) Qual o tempo de execuo T(n) desse seu algoritmo ? No se esquea de contar o tempo deconstruo da rvore, mais o tempo para percorr-la.

    Exerccio 10 -

    Prove ou desprove as seguintes afirmaes :a) T(n) = (n)b) T(n) = (n log2n)c) T(n) = (n2)

    Exerccio 11 -

    Nesta lista de exerccios voc viu dois algoritmos de ordenao de dados : o algoritmo dado noExerccio 1 e analisado no Exerccio 3, e este ltimo dado e analisado no Exerccio 9.Considere que o seu computador realiza uma operao a cada microssegundo ( 1s = 10-3

    segundos), e compare a eficincia dos dois algoritmos, dizendo quanto tempo cada um leva paraordenar um conjunto de n dados.:

    Quantidade de dados para ordenar (n)Algoritmo T(n) 10 100 1.000 100.000 1 milho 10 milhesc/ listasc/ rvores

    Anote aqui o valor de T(n) quevoc achou para cada algoritmo, edepois complete a tabela

  • UNIVERSIDADE SO JUDAS TADEUENGENHARIA DE COMPUTAO / BACHARELADO EM

    CINCIA DA COMPUTAO

    H. Senger Escrita em: 02/10/1999 ltima atualizao 25/10/1999 38

    Exerccio 12 -

    Suponha que existam 5 algoritmos de busca, cada qual com seu tempo de execuo T(n). Suponhaque o meu computador realiza uma operao a cada microssegundo ( 1s = 10-3 segundos), ecalcule quanto tempo o algoritmo dever levar para encontrar um dado em meio a uma quantidade nde registros.

    Quantidade de dados (n)Algoritmo T(n) 10 100 1.000 100.000 1 milho 10 milhes

    rv. binria log2 nrv. ternria log3 n

    rvore-B (grau5)

    log5 n

    rvore-B (grau20)

    log20 n

    tabela deespalhamento

    hashing

    [1+1/(1-)]

    O smbolo representa algo parecido com o fator de carga de uma tabela hashing ..., e portanto, para nsno possui significado prtico nenhum. Apenas para concluir o exerccio, considere que vale 0,5 (meio).