algoritmos e estrutura de dados Árvores

Upload: jonatasg3

Post on 08-Jan-2016

11 views

Category:

Documents


0 download

DESCRIPTION

Estrutura de Dados

TRANSCRIPT

  • AED Algoritmos e Estruturas de Dados

    LEEC - 2005/2006

    rvores

    AED (IST/DEEC) 2

    rvores - Introduo (1)

    As rvores so estruturas de dados usadas em diversas aplicaes na vida comum: Bases de dados de grande dimenso. Reconhecimento de frases geradas por linguagens (ex: programas,

    expresses aritmticas,...). Modelao de sistemas organizacionais (ex: famlias, directrios de um

    computador, hierarquia de comando de uma empresa,...). Determinao do caminho mais curto entre dois computadores de uma

    rede.

  • AED (IST/DEEC) 3

    rvores - Introduo (2) Def: Uma rvore um caso especial de um grafo, i.e., um par

    (V,E) de dois conjuntos no vazios V-ns (vertex) e E V2arestas (edges) que satisfazem duas condies: Entre dois ns existe um nico caminho (um caminho (path) uma

    sequncia de arestas entre dois ns),

    Um nico n, denominado raz (root), s existe como primeiro elemento nos pares de E: os restantes ns so um segundo elemento dos pares de E (podendo tambm ser primeiro elemento de alguns pares).

    Nota: a existncia de uma raz til em muitas aplicaes mas no essencial para a definio anterior. Este tipo de rvores tambm denominada rvores com raz (rooted tree).

    AED (IST/DEEC) 4

    rvores - Introduo (3) Def: se (v1,v2) E, v1 n ascendente (parent) e v2 n filho

    (child). A raz o nico n sem ascendente. Ns sem filhos so designados por folhas (leaves). Ns com filhos so designados no-terminais. Ns no-terminais, distintos da

    raiz, so designados intermdios. Def: A rvore de tipo K, sse todos os ns intermdios tiverem K

    filhos. Quando K=2, a rvore diz-se binria. Def: O nvel (level) de um n o nmero de arestas entre a raz e o

    n (a raz tem nvel 0). A altura (heigth) de uma rvore o mximo nmero de ns encontrados nos caminhos at s folhas (uma rvore s com a raiz tem altura 1).

  • AED (IST/DEEC) 5

    rvores - Introduo (4)

    Representao grfica das rvores adopta a conveno: raz no topo, ns representados por crculos, arestas representadas por linhas (ou setas no sentido da raz para a folha).

    Exemplo A1: directrios do sistema operativo Linux

    /

    bin dev etc home

    cfb lmv rgc

    usr var

    AED (IST/DEEC) 6

    rvores - Introduo (5)

    2+3*5

    V={n1,n2,n3,n4,n5}E={(n1, n2),(n1,n3),(n3,n4),(n3,n5)}

    (2+3)*5

    A rvore avaliada de forma ascendente (bottom-up): 2+3*5 = 2+15 = 17 Parntesis, usados nas expresses aritmticas para ultrapassar as prioridades dos operadores, so indicados na rvore atravs da posio dos ns.

    Exemplo A2: expresses aritmticas

    +

    2 *

    3 5

    n1

    n2 n3

    n4 n5

    *

    5+

    2 3

    raiz

    folha

  • AED (IST/DEEC) 7

    rvores - Introduo (6) Exemplo A3: rvore (ordenada) de pesquisa binria1

    Subrvore direita (esquerda) armazena nmeros maiores (menores) que o n. Se os dados forem cadeias de caracteres, usa-se a ordem lexicogrfica (cf>cb e cf>az ).

    Vantagens: pesquisa mais rpida-O(log N) Inconvenientes: pode degenerar lista com pesquisa-O(N), a resoluo deste problema torna insero mais complicada

    1 BST - Binary Search Tree

    n

    n2

    17

    31

    5

    12

    8

    AED (IST/DEEC) 8

    rvores - Introduo (7)Uma rvore de tipo K pode ser transformada numa rvore binria, com

    referncias esquerdas contm sucessivamente as sub-rvores da rvore K referncias direitas contm referncia para a parte restante da rvore K

    Exemplo A4: transformao de uma rvore ternria numa rvore binria

    a b c

    a

    b

    c

  • AED (IST/DEEC) 9

    rvores - Introduo (8)

    As rvores BB possuem, em cada n, uma tabela para as sub-rvores. So usadas em Bases de Dados.

    a b c

    A B C D

    A < a < B < b < C < c < DTodos os caminhos da raiz para as folhas possuem o mesmo comprimento

    AED (IST/DEEC) 10

    rvores - Introduo (9)

    Em AED/LEEC so estudadas apenas rvores BST(binary search tree): Representao de uma rvore binria em C Propriedades Operaes:

    Insero de um elemento numa rvore Directa Balanceada

    AVL RB

    Combinao de duas rvores Retirada de um elemento Percurso de uma rvore

  • AED (IST/DEEC) 11

    rvores - Representao em C

    Seja a definio em C de uma rvore binria, contendo cada n um dado de tipo Item.

    typedef data;typedef struct _s1 {

    Item data; /* dados */struct _s1 *left, *right; /* referncia filhos */} node;

    node *root = NULL; /* raz (rvore inicial vazia) */

    AED (IST/DEEC) 12

    rvores - Propriedades (1)Teorema A1: Uma rvore binria com N ns no-terminais possui N+1 folhas.

    Estratgia de prova: induo, com base na construo da rvore a partir de duas subrvores.

    Se N=0, a rvore possui um nico n (que raiz e folha em simultneo). Seja N>0 o nmero de ns no-terminais: a subrvore esquerdatem k ns, a subrvore direita tem N-k-1 ns (0

  • AED (IST/DEEC) 13

    rvores - Propriedades (2)Teorema A2: Uma rvore binria com N ns no-terminais possui 2N arestas (N-1 para

    os ns no-terminais e N+1 para as folhas).

    Estratgia de prova: contar o nmero de arestas para cada n. Exceptuando a raiz, cada n possui um nico ascendente, pelo que s h uma

    aresta entre um n e o seu ascendente. Pelo teorema A1 e observao anterior, h N+1 arestas para as folhas. Pelas duas

    observaes anteriores, h N-1 arestas para os ns intermdios. No total, a rvore com N ns no-terminais possui (N+1)+(N-1)=2N arestas.

    QED

    AED (IST/DEEC) 14

    rvores - Propriedades (3)Teorema A3: Numa rvore binria com N ns, o nvel das folhas hl varia entre log2N e

    N-1.

    Estratgia de prova: identificar nveis mximo e mnimo. O nvel mximo o da rvore degenerada numa lista.

    Neste caso, hl=N-1 arestas. O nvel mnimo o da rvore balanceada, cada nvel

    i com 2i ns. Por A1 h N+1 folhas, logo 2hl-1

  • AED (IST/DEEC) 15

    Introduo s rvores

    Representao em C

    Propriedades bsicas de rvores

    Sntese da Aula 1 de rvores

    AED (IST/DEEC) 16

    rvores - Insero (1)

    Sendo as rvores recursivas, as funes de manipulao podem ser recursivas: a instruo recursiva aplicada nos ns intermdios e a instruo terminal nas folhas.

    As rvores so, usualmente, construdas de forma descendente (top-down).

    Nos algoritmos de insero consideramos o item um inteiro (typedef int Item;) e uma rvore BST. Se a informao a armazenar for uma estrutura, um dos campos designado chave(key) tem de ser tipo ordenado. Ex: no bilhete de identidade, a chave o nmero do BI.

  • AED (IST/DEEC) 17

    rvores - Insero (2)Insero directa

    A insero efectuada em dois casos, conforme situao da rvore: vazia: insere directamente novo dado no vazia: procura, em primeiro lugar, o n onde inserir o novo dado

    node *insert(int i, node *tree) {node *upper = tree, *child = tree, *leaf;if (tree == NULL) { /* rvore vazia */tree = (node *) malloc(sizeof(node));tree->data = i; /* insere dado */tree->left = tree->right = NULL; /* sub-rvores vazias */return tree;

    }

    AED (IST/DEEC) 18

    rvores - Insero (3)while (child != NULL){/* procura n onde inserir dado */upper = child;if (child->data == i) return tree; /* j existe! */child = (child->data > i) ? child->left : child->right;}

    /* criada e inicializada nova folha */leaf = (node *) malloc(sizeof(node));leaf->data = i; leaf->left = leaf->right = NULL;/* upper passa a n intermdio e aponta para nova folha */if (upper->data > i) upper->left = leaf;

    else upper->right = leaf;return tree;

    }/* rotina insert retorna nova rvore (i.e. ponteiro para raz), porque a inicial foi alterada */

  • AED (IST/DEEC) 19

    rvores - Insero (4)Exemplo A5: insero de 7 na rvore do exemplo A3

    i) 7 < 12: insere na sub-rvore esquerda.ii) 7 > 5: insere na sub-rvore direita.iii) 8 folha:

    cria nova folha. 7 < 8: a nova folha sub-rvore

    esquerda.

    O algoritmo degenera numa lista, se os dados inseridos forem sucessivamente crescentes (ou sucessivamente decrescentes).

    5

    2

    17

    8

    12

    7

    i

    ii

    iii

    31

    AED (IST/DEEC) 20

    rvores - Insero (5)

    A complexidade da insero depende do tipo de rvore:

    rvore degenerada (lista): O(N)

    rvore perfeitamente balanceada: complexidade determinada pela pesquisa do local de insero log2N, ou seja, O(log N)

    rvore de insero aleatria: considerando que a altura de cada sub-rvore possui uma distribuio uniforme 1..N, tem-se que a pesquisa do local de insero custa ln N, ou seja, O(log N)

  • AED (IST/DEEC) 21

    rvores - Insero (6)Estratgia de prova: simplesmente, efectuar os clculos!O custo 1 (visita raiz) somado ao custo da visita sub-rvore: esta pode ter

    entre 0 e N-1 ns, com distribuio uniforme

    CN = 1 + 1/N * S Ck-1 1 k N, para N 2C1 = 1Para eliminar S, multiplica-se ambos os lados por N, e subtrai-se a frmula

    para N-1 (nota: k varia at N nos dois S)NCN - (N-1)CN-1 = N + SCk-1 (N-1 + SCk-2 ) = 1 + CN-1NCN = NCN-1 +1CN = CN-1 + 1/N

    AED (IST/DEEC) 22

    rvores - Insero (7)por substituio telescpicaCN = C1 + 1/N + 1/(N-1) + ... + 1/2Trata-se da srie harmnica, pelo queCN ln N + g + 1/12N

    QED

    Concluso: o custo da insero mnimo se a rvore for balanceada

    O problema reside na maior dificuldade em manter a rvore balanceada (como se vai ver nos acetatos seguintes)

  • AED (IST/DEEC) 23

    rvores balanceadas AVL (1)

    Def: Uma rvore diz-se balanceada AVL2, sse em todos os ns a diferena entre as alturas das subrvores for igual ou inferior a 1.

    Exemplo A6: rvore A3 balanceada, A4 j no (subrvore esquerda tem altura 2 e direita tem altura 4).

    Para manter a rvore balanceada, respeitando a ordem, depois da insero pode ser necessrio rodar a configurao de ns (rotao simples e rotao dupla)

    2Adelson-Velskii e Landis

    AED (IST/DEEC) 24

    Rotao direita

    Rotao esquerda

    rvores balanceadas AVL (2)Operaes de rotao so classificadas de acordo com o sentido (

    direita e esquerda).

    y

    x y

    x

    Quando a diferena de alturas for igual a 2, a operao de rotao diminui o nvel da folha mais afastada da raiz, mantendo a ordenao da rvore.

    a

    a

    b b

    g

    g

  • AED (IST/DEEC) 25

    rvores balanceadas AVL (3)A funo de rotao apenas actualiza ponteiros (b a nica subrvore a mudar de ascendente).

    Assim, a rotao tem complexidade O(1).

    node *rotate_right(node * tree) {node *x, *y, *beta;/* inalterada se rvore vazia, ou subrvore esquerda vazia */if (tree == NULL) return tree;else if (tree->left == NULL) return tree;

    /* salva ponteiros */y = tree; x = tree->left; beta = x->right;/* actualiza ligaes */x->right = y; y->left = beta;return x;

    }

    AED (IST/DEEC) 26

    rvores balanceadas AVL (4)H dois pares de casos em que se torna necessrio rodar subrvores:

    1: Rotao simples ( direita)

    h+1

    h

    x

    yh+1

    h

    x

    y

    A1 A2

    A3 A1

    A2 A3h

  • AED (IST/DEEC) 27

    rvores balanceadas AVL (5)2: Rotao dupla ( direita)

    h

    hy

    x

    z

    z

    h

    xy

    A2 ou A3 de altura h

    A1 A1

    A2

    A2

    A3

    A3

    A4

    A4

    AED (IST/DEEC) 28

    rvores balanceadas AVL (6)

    Cdigo de insero AVL

    int height(node *tree) {int hl, hr;

    if (tree == NULL) return 0;if (tree->left == NULL && tree->right == NULL)

    return 1;hl = height(tree->left); hr = height(tree->right);return ((hl>hr) ? 1+hl : 1+hr);

    }

  • AED (IST/DEEC) 29

    rvores balanceadas AVL (7)node *insert(int i, node *tree) {

    /* tree ponteiro para rvore: a alterao feita directamente narvore que dada como parmetro */

    int h1, h2, h3;

    if (tree == NULL) { /* rvore vazia */tree = (node*) malloc(sizeof(node));tree->data = i; tree->left = tree->right = NULL;return tree;

    }

    AED (IST/DEEC) 30

    rvores balanceadas AVL (8)if (i == tree->data) return tree; /* j instalado */if (i < tree->data){ /* insere na sub-rvore esquerda */tree->left = insert(i, tree->left);h1 = height(tree->left->left);h2 = height(tree->left->right);h3 = height(tree->right);if (h1 > h3) /* Caso 1, rotao simples direita */

    tree = rotate_right(tree);if (h2 > h3) { /* Caso 2, rotao dupla direita */

    tree->left = rotate_left(tree->left);tree = rotate_right(tree); } }

  • AED (IST/DEEC) 31

    rvores balanceadas AVL (9)else {/* insere na sub-rvore direita */tree->right = insert(i, tree->right); h1 = height(tree->right->right);h2 = height(tree->right->left);h3 = height(tree->left);if (h1 > h3) /* Caso 1, rotao simples esquerda */

    tree = rotate_left(tree);if (h2 > h3) {/* Caso 2, rotao dupla esquerda */

    tree->right = rotate_right(tree->right);tree = rotate_left(tree); } }

    retun tree;}

    AED (IST/DEEC) 32

    rvores balanceadas AVL (10)

    O algoritmo AVL no garante distribuio total pelos nveis intermdios (por exemplo, na srie S0+(-1)nn, a sub-rvore esquerda s deriva esquerda e a sub-rvore direita s deriva direita).

    O algoritmo de insero listado pesado devido determinao das alturas. Uma verso mais eficiente (embora mais complexa e ocupando mais memria), guarda em cada n o balanceamento das sub-rvores (maior esquerda, iguais ou maior direita).

  • AED (IST/DEEC) 33

    Insero de elementos

    rvores balanceadas AVL

    Sntese da Aula 2 de rvores

    AED (IST/DEEC) 34

    rvores balanceadas RB (1)

    Def: Uma rvore balanceada RB3 uma BST, em que: Todos os ns possuem uma cor: Vermelha , Negra. A raiz e todas as folhas so negras. Filhos dos ns vermelhos so negros. Todos os caminhos, da raiz s folhas, possuem o mesmo nmero de ns

    negros (diferenas do nmero de ns vermelhos inferior a 2)

    Nota: nos grafos, ponteiros nulosconsiderados como folhas negras

    3 Red Black

  • AED (IST/DEEC) 35

    rvores balanceadas RB (2)

    Cdigo de insero RB1 Inserir directamente, como n vermelho.2 H 3 alteraes possveis.

    Se a alterao quebrar as regras das rvores RB, ento rodar e recolorir em direco raiz.A insero custa O(log N).

    AED (IST/DEEC) 36

    rvores balanceadas RB (3)A Se inserir como raiz, passar n a negro. B Se o n ascendente for negro, terminar.

    novo n

  • AED (IST/DEEC) 37

    rvores balanceadas RB (4)C Se o n ascendente for vermelho, rodar duplamente e actualizar cores do

    pai/me, av/av e tio/tiax

    novo n

    y z

    w a b g

    novo n

    x

    y z

    w a b g

    y

    xw

    z

    b g

    a

    y

    xw

    z

    b g

    a

    Pode ter de recolorir em cima

    AED (IST/DEEC) 38

    rvores balanceadas RB (5)

    novo n

    y z

    a

    b g

    w

    y

    za b g

    wx

    x

    Codificao pode ser feita de 2 formas: Cada n possuir ponteiro para o n pai/me Recursivamente (muito complicado!)

  • AED (IST/DEEC) 39

    rvores - Combinao (1)Combinao permite juntar, numa nica rvore, duas rvores (cada

    uma com dados parciais) Se uma das rvores nula, a combinao apenas a outra rvore. Seno, insere-se os elementos da primeira na segunda.

    node *join(node *a, node *b) {if (a == NULL) return b;if (b == NULL) return a;

    b = insert(a->data, b);b = join(a->left, b); /* Sedgewick tem join(a->left,b->left); */b = join(a->right, b);/* Sedgewick tem join(a->right,b->right); */free(a);return b;}

    AED (IST/DEEC) 40

    rvores - Combinao (2)

    Soluo proposta por Sedgewick (Prog 12.16) incorrecta! Fazer join , logo nas sub-rvores esquerda e direita, impede verificar o

    mesmo dado em ns de alturas distintas!

    10

    0 20

    30

    -10

    0

    +

    10

    20

    30

    -10

    0

    +

    0

    0

    +

    10

    20

    30

    0

    10

    20

    30

    0

    -10

    Errado!!!

    0

    -10

  • AED (IST/DEEC) 41

    rvores - RetiradaUm dado eliminado da rvore, executando os passos

    Procurar o n de residncia Se existir, executar:

    Combinar sub-rvores esquerda e direita Substituir n pelo resultado da combinao

    node *delete(int i, node *tree) {node *aux = tree;if (tree == NULL) return NULL;

    if(i < tree->data) tree->left = delete(i, tree->left);if(i > tree->data) tree->right = delete(i, tree->right);if(i == tree->data ) {tree = join(tree->left, tree->right);free(aux); }

    return tree;}

    AED (IST/DEEC) 42

    rvores - Varrimento (1)Existem diversas estratgias de percurso/varrimento (transverse)

    de rvores:1 De acordo com o operador, existente em todos os ns que no sejam

    folhas (percurso tambm designado por dump) Pr-fixado: antes do varrimento das sub-rvores. In-fixado: varrer primeiro sub-rvore esquerda, imprimir operador e varrer

    depois a sub-rvore direita. Ps-fixado4: depois do varrimento das sub-rvores.

    2 De acordo com o nvel Profundidade (depth-first) Largura (breadth-first)

    4 tambm conhecido por notao polaca invertida

  • AED (IST/DEEC) 43

    rvores - Varrimento (2)

    1: De acordo com o operador

    As subrvores so varridas de forma ordenada e o operador listado de forma pr-determinada (pr-fixado, in-fixado ou ps-fixado)

    Exemplo A7: percurso ps-fixado da rvore aritmtica A2typedef struct {enum {nod, leaf} node_type;union {

    enum {plus, times} oper;int value; } info;

    } Item;

    AED (IST/DEEC) 44

    rvores - Varrimento (3)void postfix (node *tree){

    if (tree == NULL) return;

    switch(tree->data.node_type) { case leaf: /* imprime o valor */printf( %d, tree->data.info.value);break;

    case nod: /* imprime sub-rvores esquerda e direita */postfix(tree->left); postfix(tree->right);switch(tree->data.info.oper) { /* imprime oper */

    case plus: printf( +); break;case times: printf( *); break; }}}

  • AED (IST/DEEC) 45

    rvores - Varrimento (4)

    o resultado final : 2 3 5 * +

    n1n2 n3

    2 n43

    n55

    *+

    +

    2 *

    3 5

    n1

    n2 n3

    n4 n5

    AED (IST/DEEC) 46

    rvores - Varrimento (5)2: De acordo com o nvel

    Profundidade: idntico ao varrimento pr-fixadovoid depth_first (node *tree){if (tree ==NULL) return;printf( %d, tree->data);depth_first(tree->left);depth_first(tree->right); }

    2

    17

    31

    5

    12

    8

    Exemplo A8: O varrimento em profundidade da rvore A3 executa a seguinte sequncia de passos:

    (a) elemento da raiz: 12(b) visita em profundidade sub-rvore esquerda: 5 2 8(c) visita em profundidade sub-rvore direita: 17 31.O resultado 12 5 2 8 17 31

  • AED (IST/DEEC) 47

    rvores - Varrimento (6)

    Largura: O varrimento feito por nvel. As sub-rvores so colocadas no fim de uma lista.

    typedef struct _s2 {node *this;struct _s2 *next;

    } link;

    link *New(); /* cria lista vazia */ void InsertLast(link *, node *);/* insere no fim da lista */link *GetFirst(link *);/* obtm primeiro elemento da lista */

    AED (IST/DEEC) 48

    rvores - Varrimento (7)void breadht_first (link *list){if (list == NULL) return;else {link * aux = GetFirst(list);printf( %d, aux->this->data);InsertLast(list, aux->this->left);InsertLast(list, aux->this->right);breadht_first(list); }

    }

    Rotina deve ser chamada com a raiz inserida na lista.

    breadht_first(InsertLast(New(), root));

  • AED (IST/DEEC) 49

    rvores - Varrimento (8)

    Exemplo A9: varrimento em largura da rvore A3Lista Aco Sada

    [12] Recolhe 1 elementoImprime valor 12

    [5, 17] Insere subrvores esq e dir[17] Recolhe 1 elemento

    Imprime valor 5[17,2,8] Insere subrvores esq e dir[2,8] Recolhe 1 elemento

    Imprime valor 17[2,8,31] Insere subrvores esq e dir[8,31] Recolhe 1 elemento

    Imprime valor 2Insere subrvores esq e dir

    [31] Recolhe 1 elementoImprime valor 8Insere subrvores esq e dir

    [] Recolhe 1 elementoImprime valor 31Insere subrvores esq e dir

    2

    17

    31

    5

    12

    8

    AED (IST/DEEC) 50

    rvores balanceadas RB

    Combinao de rvores

    Retirada de elementos

    Varrimento de rvores

    Sntese da Aula 3 de rvores