A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

INF 1010 Estruturas de Dados Avançadas

Apresentações semelhantes


Apresentação em tema: "INF 1010 Estruturas de Dados Avançadas"— Transcrição da apresentação:

1 INF 1010 Estruturas de Dados Avançadas
17/10/2011 INF 1010 Estruturas de Dados Avançadas Árvores B 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

2 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
árvores B 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

3 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Motivação Tornar a busca mais eficiente considerando também os dispositivos de armazenamento de memória Limitação da árvore binária de busca cada nó é lido individualmente (e o acesso a memória secundária é lento) 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

4 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore B - definição cada acesso à memória secundária traz um grupo de elementos sub-árvores são divididas em páginas 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

5 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore B – idéia básica Árvore n-ária com chaves de busca nos nós k1 k2 k3 k4 p1 p2 p3 p4 p5 k<k1 k>k4 k1<k<k2 k3<k<k4 k2<k<k3 Número mínimo de chaves por nó: n/2 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

6 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore B – idéia básica Árvore n-ária com chaves de busca nos nós k1 k2 k3 k4 k<k1 k>k4 k1<k<k2 k3<k<k4 k2<k<k3 Número mínimo de chaves por nó: n/2 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

7 Árvore B - definição (Bayer & McCreight, 1972; Comer, 1979)
Árvore B de ordem p todo nó tem no máximo 2p+1 filhos cada nó (exceto a raiz e as folhas) possui no mínimo p+1 filhos todas as folhas aparecem no mesmo nível k1 k2 k3 k4 k1 k2 k3 p1 p2 p3 p4 p5 p1 p2 p3 p4 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

8 Árvore B – definição (Knuth, 1997)
Os slides a seguir levam em consideração esta definição. árvore B de ordem m todo nó (página) tem no máximo m filhos cada nó (exceto a raiz e as folhas) possui no mínimo m/2 filhos a raiz possui ao menos 2 filhos (a menos que seja folha) um nó não terminal de k filhos possui k-1 chaves todas as folhas aparecem no mesmo nível exemplo: árvore B de ordem 4 (árvore 2-3-4) 25 10 20 30 40 2 5 7 13 14 15 22 24 26 27 28 35 38 41 42 45 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

9 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore B – busca busca entre as chaves de uma página k1 ... km-1 (se m for grande: busca binária) se não for encontrada na página: x < k1  busca deve continuar na página p0 ki < x < ki+1 para 1 ≤ i < m-1  busca deve continuar na página pi km-1 < x  busca deve continuar na página pm-1 se não houver páginas abaixo da atual, a chave não existe k1 ki km-1 p0 ... pi pm-1 2 1 3 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

10 Árvore B de ordem m - inserção
seja pi a página onde x deverá ser inserido se pi tiver menos de m-1 elementos insere em pi, na posição adequada se página pi já estiver lotada: aloca uma nova página pk distribui as m chaves da seguinte maneira: m/2-1 menores chaves em pi m-m/2 maiores chaves em pk insere a chave mediana (em m/2 ) na página superior (se página pi for raiz: cria nova raiz com a mediana) 25 23 46 10 20 30 40 45 23 45 46 2 5 7 8 13 14 15 18 22 24 24 23 24 23 24 26 27 28 35 38 41 42 41 42 45 47 46 47 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

11 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
insere 10, 30, 50, 70, 90 (ordem 5) 10 10 30 10 30 50 10 30 50 70 10 30 50 70 90 overflow: split 10 30 70 90 50 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

12 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
insere 20, 40 (ordem 5) 10 30 70 90 50 10 20 30 70 90 50 10 20 30 40 70 90 50 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

13 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
insere 60, 80 (ordem 5) 10 20 30 40 70 90 50 10 20 30 40 60 70 90 50 10 20 30 40 60 70 80 90 50 10 20 30 40 60 70 80 90 50 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

14 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
insere 100 (ordem 5) 10 20 30 40 60 70 80 90 50 10 20 30 40 60 70 80 90 100 50 overflow: split 10 20 30 40 60 70 90 100 50 80 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

15 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore B – Estruturas BTree root order BTPage* struct _btree { BTPage* root; int order; }; typedef struct _btree BTree; BTNode key info void* struct _btreeNode { int key; void* info; }; typedef struct _btreeNode BTNode; struct _btreePage { BTPage* parent; int numkeys; BTPage* lchild; BTNode** node; BTPage** rchild; }; typedef struct _btreePage BTPage; BTPage node numkeys parent ... BTPage* rchild lchild BTPage * 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

16 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
btree.h typedef struct _btree BTree; BTree* btree_create(int order); void btree_destroy(BTree* bt, void(*cb_destroy)(void*)); void btree_insert(BTree* bt, int key, void* info); void btree_remove(BTree* bt, int key); void btree_print_indent(BTree* bt, void (*cb_print)(const void*)); void* btree_find(BTree* bt, int key); 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

17 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
static BTPage* btree_page_create_empty(BTree* bt, BTPage* pgParent) { int i; /* allocate memory for page structure */ BTPage* pgCurrent = (BTPage*)malloc(sizeof(BTreePage)); /* initialize empty page (with 0 elements) */ pgCurrent->numkeys = 0; /* set page parent */ pgCurrent->parent = pgParent; /* allocate memory for nodes (key + info) and children (allocate additional node and pointer to rchild to hold temporary overflow) */ pgCurrent->node = (BTNode**) malloc(bt->order * sizeof(BTNode*)); pgCurrent->rchild = (BTPage**) malloc((bt->order) * sizeof(BTPage*)); /* initialize nodes and children pointers */ pgCurrent->lchild = NULL; for (i=0; i < bt->order; ++i) pgCurrent->node[i] = NULL; pgCurrent->rchild[i] = NULL; } return pgCurrent; Para facilitar, alocamos espaço a mais para usar a mesma página quando houver overflow. 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

18 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
bt->root 10 20 ->lchild ->rchild[0] ->rchild[1] 2 7 8 5 13 14 15 22 24 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

19 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
ordem = 5 insere 20 10 20 30 40 50 10 30 40 50 overflow: num_keys == bt->order split 30 10 20 40 50 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

20 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
static BTPage* btree_insert_aux(BTree* bt, BTPage* pgCurrent, BTNode* btNode) { int i; if (pgCurrent == NULL) { /* create new page */ BTPage* pgNew = btree_page_create(bt, NULL, btNode); return pgNew; } /* find out where info should be inserted (if order is large, a binary search should be used) */ for (i=0; i < pgCurrent->numkeys; ++i) if (btNode->key == pgCurrent->node[i]->key) /* if key exists, update info */ { pgCurrent->node[i]->info = btNode->info; /* memory leak */ return pgCurrent; else if (btNode->key < pgCurrent->node[i]->key) break; if (pgCurrent->lchild == NULL) /* if leaf, insert here */ btree_page_insert_node_at(pgCurrent, btNode, NULL, i); else if (i == 0) pgCurrent = btree_insert_aux(bt, pgCurrent->lchild, btNode); else pgCurrent = btree_insert_aux(bt, pgCurrent->rchild[i-1], btNode); if (btree_page_overflowed(bt, pgCurrent)) { pgCurrent = btree_page_split(bt, pgCurrent); void btree_insert(BTree* bt, int key, void* info) BTNode* btNode = btree_node_create(key, info); BTPage* pgCurrent = btree_insert_aux(bt, bt->root, btNode); if (bt->root != pgCurrent) bt->root = pgCurrent; 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

21 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
static BTPage* btree_page_split(BTree* bt, BTPage* pgCurrent) { BTPage* pgParent = pgCurrent->parent; BTPage* pgNew = btree_page_create_empty(bt, pgParent); int i, j; int idxMedian = (bt->order+1)/2 - 1; BTNode* nodeMedian = pgCurrent->node[median]; pgNew->lchild = pgCurrent->rchild[median]; pgNew->parent = pgParent; if (pgNew->lchild) pgNew->lchild->parent = pgNew; if (pgParent == NULL) { /* create new root */ pgParent = btree_page_create(bt, NULL, nodeMedian); pgParent->lchild = pgCurrent; pgParent->rchild[0] = pgNew; pgCurrent->parent = pgParent; bt->root = pgParent; } else { /* insert median node into parent */ btree_page_insert_node_at(pgParent, nodeMedian, pgNew, btree_page_find_insertion_point(pgParent, nodeMedian)); /* move nodes right of median to new page */ for (j=0, i = idxMedian + 1; i < pgCurrent->numkeys; ++i, ++j) { pgNew->node[j] = pgCurrent->node[i]; pgNew->rchild[j] = pgCurrent->rchild[i]; if (pgNew->rchild[j]) pgNew->rchild[j]->parent = pgNew; ++(pgNew->numkeys); pgCurrent->node[i] = NULL; pgCurrent->rchild[i] = NULL; /* remove median node and insert it in parent page */ pgCurrent->node[median] = NULL; pgCurrent->rchild[median] = NULL; pgCurrent->numkeys = idxMedian; return pgParent; 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

22 Árvore B de ordem m - remoção
deve ser realizada em um nó folha se o item a ser removido não estiver em um nó folha, substitua-o pelo maior item da sua sub-árvore à esquerda, ou pelo menor da sua sub-árvore à direita. 10 20 2 7 8 5 13 14 15 22 24 10 20 2 8 7 13 14 15 22 24 10 20 2 7 8 5 13 14 15 22 24 20 13 2 7 8 5 14 15 22 24 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

23 Remoção de chave em uma folha
Quando a chave é uma folha, ela será removida e deverá verificar se a folha ficará com menos de m/2 chaves. Se isso acontecer, deverá ser feita uma concatenação ou uma redistribuição. 10 20 2 5 13 14 22 24 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

24 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Concatenação Acontece quando, após a remoção, a página onde a chave foi removida e uma página adjacente possuem em conjunto menos de m chaves. Concatene essa página com uma adjacente. A chave do pai que estava entre elas fica na página que foi concatenada. Se esse procedimento resultar em uma página com menos de m/2 chaves, faça novamente o mesmo procedimento, podendo chegar até a raiz. 10 20 2 5 13 14 22 24 10 20 2 13 14 22 24 20 2 13 14 10 22 24 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

25 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Redistribuição Acontece quando, após a remoção, a página onde a chave foi removida e uma página adjacente possuem em conjunto m chaves ou mais. Mova a chave da página pai (“entre” as páginas adjacentes) para a página deficiente, e a chave da página adjacente* para a página pai. Não é propagável, pois o número de chaves do pai não muda. * Se a página adjacente estiver à esquerda da página deficiente, a chave movida é a maior daquela página (borrow from left). Se a página adjacente estiver à direita da página deficiente, a chave movida é a menor daquela página (borrow from right). 20 2 13 14 10 22 24 20 2 13 14 10 24 14 2 13 10 20 24 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

26 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
remove 70 (ordem 5) 10 20 30 60 90 100 70 50 80 10 20 30 90 100 60 50 80 concatena (núm. chaves < ordem) 10 20 30 60 80 90 100 50 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

27 Estruturas de Dados Avançadas • 2011.2
17/10/2011 remove 20 (ordem 5) 10 20 60 80 90 100 50 10 60 80 90 100 50 redistribui (núm. chaves dir > ordem/2) 10 50 80 90 100 60 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

28 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
árvores B+ 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

29 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvores B+ Definição número n de filhos de um nó de ordem m nós internos possuem apenas chaves nós-folha possuem chaves + dados formam uma lista (duplamente) encadeada 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •

30 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvores B+ Exemplo 5 3 8 7 1 3 5 6 7 8 9 12 info info info info info info info info 17/10/2011 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas •


Carregar ppt "INF 1010 Estruturas de Dados Avançadas"

Apresentações semelhantes


Anúncios Google