• Nenhum resultado encontrado

Árvores Binárias de Pesquisa

N/A
N/A
Protected

Academic year: 2022

Share "Árvores Binárias de Pesquisa"

Copied!
60
0
0

Texto

(1)

Arvores Bin´ ´ arias de Pesquisa

Estruturas de Dados e Algoritmos – Ciˆ encia da Computa¸ c˜ ao

Prof. Daniel Saad Nogueira Nunes

IFB – Instituto Federal de Bras´ılia,

Campus Taguatinga

(2)

Sum´ ario

1 Introdu¸ c˜ ao

2 BST

3 Considera¸ c˜ oes

(3)

Sum´ ario

1 Introdu¸ c˜ ao

(4)

Arvores Bin´ ´ arias de Pesquisa

Uma ´ arvore bin´ aria de pesquisa (BST ou Binary Search Tree) organiza os n´ os pela sua chave.

Facilita a busca de uma determinada n´ o atrav´ es da chave.

(5)

Arvores Bin´ ´ arias de Pesquisa

Defini¸c˜ ao (´ Arvore Bin´ aria de Pesquisa)

Uma ´ arvore bin´ aria de pesquisa (BST) possui:

Uma potencial raiz com valor de chave y.

Caso a raiz exista, uma sub´ arvore da esquerda com n´ os que possuem chaves menores que y.

Caso a raiz exista, uma sub´ arvore da direita com n´ os que possuem

chaves maiores que y.

(6)

Arvores Bin´ ´ arias de Pesquisa

Figura: Arvores Bin´ ´ arias de Pesquisas

(7)

Sum´ ario

2 BST

(8)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

An´ alise

(9)

Defini¸c˜ ao

6

typedef void* (*bst_element_constructor_fn) (void*);

7

typedef void (*bst_element_destructor_fn)(void *);

8

typedef int (*bst_tree_element_compare_fn)(const void*,const void*);

(10)

Defini¸c˜ ao

11

typedef struct bst_node_t{

12

void* data;

13

struct bst_node_t* left;

14

struct bst_node_t* right;

15

}bst_node_t;

(11)

Defini¸c˜ ao

18

typedef struct bst_t{

19

bst_node_t* root;

20

bst_element_constructor_fn constructor;

21

bst_element_destructor_fn destructor;

22

bst_tree_element_compare_fn comparator;

23

size_t size;

24

}bst_t;

(12)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

An´ alise

(13)

Inicializa¸c˜ ao

35

void bst_initialize(bst_t **t, bst_element_constructor_fn constructor,

36

bst_element_destructor_fn destructor,

37

bst_tree_element_compare_fn comparator) {

38

(*t) = mallocx(sizeof(bst_t));

39

(*t)->root = NULL;

40

(*t)->size = 0;

41

(*t)->comparator = comparator;

42

(*t)->constructor = constructor;

43

(*t)->destructor = destructor;

(14)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

An´ alise

(15)

Fun¸c˜ oes Auxiliares

138

size_t bst_size(bst_t *t) {

139

return t->size;

140

}

(16)

Fun¸c˜ oes Auxiliares

26

static bst_node_t *bst_new_node(void *data,

27

bst_element_constructor_fn constructor) {

28

bst_node_t *ptr = mallocx(sizeof(bst_node_t));

29

ptr->left = NULL;

30

ptr->right = NULL;

31

ptr->data = constructor(data);

32

return ptr;

33

}

(17)

Fun¸c˜ oes Auxiliares

20

static void bst_delete_node(bst_node_t *node,

21

bst_element_destructor_fn destructor) {

22

destructor(node->data);

23

free(node);

24

}

(18)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

An´ alise

(19)

Busca

Durante uma busca por um n´ o com chave x em uma BST, temos os seguintes casos:

▶ A ´ arvore ´ e vazia: o n´ o n˜ ao encontra-se na ´ arvore.

▶ A raiz possui a chave buscada: o n´ o buscado foi encontrado.

▶ A chave buscada ´ e menor que a chave da raiz: procede-se recursivamente para a sub´ arvore da esquerda.

▶ Caso contr´ ario, procede-se recursivamente para a sub´ arvore da direita.

(20)

Busca

Figura: Busca Pelo 19.

(21)

Busca

(22)

Busca

Figura: Busca Pelo 18.

(23)

Busca

BST Applet

(24)

Busca

122

int bst_find(bst_t *t, void *data) {

123

return bst_find_helper(t, t->root, data);

124

}

(25)

Busca

126

static int bst_find_helper(bst_t *t, bst_node_t *v, void *data) {

127

if (v == NULL) {

128

return 0;

129

}

130

if (t->comparator(data, v->data) < 0) {

131

return bst_find_helper(t, v->left, data);

132

} else if (t->comparator(data, v->data) > 0) {

133

return bst_find_helper(t, v->right, data);

134

}

135

return 1;

(26)

Introdu¸c˜ao BST Considera¸c˜oes

Arvores Bin´ ´ arias de Pesquisa

A forma como uma BST ´ e organizada lembra alguma t´ ecnica?

sem precisar ordenar todo o vetor, no caso da busca bin´ aria.

(27)

Introdu¸c˜ao BST Considera¸c˜oes

Arvores Bin´ ´ arias de Pesquisa

A forma como uma BST ´ e organizada lembra alguma t´ ecnica?

Busca bin´ aria.

(28)

Arvores Bin´ ´ arias de Pesquisa

A forma como uma BST ´ e organizada lembra alguma t´ ecnica?

Busca bin´ aria.

A diferen¸ ca agora ´ e que a BST permite inserir e remover elementos

sem precisar ordenar todo o vetor, no caso da busca bin´ aria.

(29)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

(30)

Inser¸c˜ ao em BSTs

BSTs s˜ ao estruturas de dados dinˆ amicas, permitem inser¸ c˜ oes e remo¸c˜ oes.

Todas as inser¸c˜ oes s˜ ao feitas nas folhas.

(31)

Arvores Bin´ ´ arias de Pesquisa

Inser¸c˜ ao em uma BST

Durante a inser¸ c˜ ao de um n´ o com chave x em uma BST, temos os seguintes casos:

A ´ arvore ´ e vazia: o n´ o ´ e inserido e passa a ser a raiz daquela ´ arvore.

O n´ o a ser inserido possui a chave menor que a da raiz: procede-se recursivamente para a sub´ arvore da esquerda.

Caso contr´ ario, procede-se recursivamente para a sub´ arvore da

(32)

Arvores Bin´ ´ arias de Pesquisa

BST Applet

(33)

Inser¸c˜ ao

68

void bst_insert(bst_t *t, void *data) {

69

t->root = bst_insert_helper(t, t->root, data);

70

}

(34)

Inser¸c˜ ao

72

static bst_node_t *bst_insert_helper(bst_t *t, bst_node_t *v, void *data) {

73

if (v == NULL) {

74

t->size++;

75

v = bst_new_node(data, t->constructor);

76

} else if (t->comparator(data, v->data) < 0) {

77

v->left = bst_insert_helper(t, v->left, data);

78

} else {

79

v->right = bst_insert_helper(t, v->right, data);

80

}

81

return v;

82

}

(35)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

(36)

Remo¸c˜ ao

Remo¸c˜ ao em uma BST

Como visto, as inser¸ c˜ oes s˜ ao simples, pois s˜ ao sempre feitas nas folhas.

No entanto, a remo¸ c˜ ao de um n´ o pode ocorrer em um n´ o interno.

Como proceder?

(37)

Remo¸c˜ ao

Remo¸c˜ ao em uma BST

Caso 1: o n´ o a ser removido ´ e uma folha.

Este ´ e o caso mais simples.

O n´ o ´ e removido sem complica¸ c˜ oes.

(38)

Remo¸c˜ ao

BST Applet

(39)

Remo¸c˜ ao

Remo¸c˜ ao em uma BST

Caso 2: o n´ o a ser removido possui apenas um filho.

Tamb´ em pode ser lidado facilmente.

O filho ´ e transplantado no lugar do pai.

▶ O avˆ o do filho passa a apontar diretamente para o filho.

(40)

Remo¸c˜ ao

BST Applet

(41)

Remo¸c˜ ao

Remo¸c˜ ao em uma BST

Caso 3: o n´ o a ser removido possui dois filhos.

Este ´ e o caso mais dif´ıcil.

Solu¸c˜ ao: transformar em um caso f´ acil.

Obrigatoriamente o n´ o possui sub´ arvores n˜ ao vazias.

Trocamos o n´ o pelo seu antecessor.

▶ O antecessor encontra-se no n´ o mais ` a direita da sub´ arvore da

esquerda.

(42)

Remo¸c˜ ao

BST Applet

(43)

Remo¸c˜ ao

84

void bst_remove(bst_t *t, void *data) {

85

t->root = bst_remove_helper(t, t->root, data);

86

}

(44)

Remo¸c˜ ao

88

static bst_node_t *bst_remove_helper(bst_t *t, bst_node_t *v, void *data) {

89

if (v == NULL) {

90

return v;

91

} else if (t->comparator(data, v->data) < 0) {

92

v->left = bst_remove_helper(t, v->left, data);

93

} else if (t->comparator(data, v->data) > 0) {

94

v->right = bst_remove_helper(t, v->right, data);

95

} else { /*remo¸ c~ ao do n´ o*/

96

/*caso 1 e caso 2, o n´ o ´ e uma folha ou s´ o tem um filho. Solu¸ c~ ao:

97

* transplantar*/

98

if (v->left == NULL) {

99

bst_node_t *tmp = v->right;

100

bst_delete_node(v, t->destructor);

101

t->size--;

(45)

Remo¸c˜ ao

103

} else if (v->right == NULL) {

104

bst_node_t *tmp = v->left;

105

bst_delete_node(v, t->destructor);

106

t->size--;

107

return tmp;

(46)

Remo¸c˜ ao

108

} else {

109

/*caso 3, o n´ o tem dois filhos: devemos o n´ o antecessor do

110

que queremos deletar e realizar o swap.

111

Obrigatoriamente este n´ o cai no caso 1 ou caso 2.*/

112

bst_node_t *tmp = bst_find_rightmost(v->left);

113

void *swap = v->data;

114

v->data = tmp->data;

115

tmp->data = swap;

116

v->left = bst_remove_helper(t, v->left, tmp->data);

117

}

118

}

119

return v;

120

}

(47)

Remo¸c˜ ao

60

static bst_node_t *bst_find_rightmost(bst_node_t *v) {

61

if (v == NULL || v->right == NULL) {

62

return v;

63

} else {

64

return bst_find_rightmost(v->right);

65

}

66

}

(48)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

An´ alise

(49)

Limpeza

Para remover a estrutura de mem´ oria ´ e simples.

Primeiro, recursivamente, removemos a sub´ arvore da esquerda.

Depois, recursivamente, removemos a sub´ arvore da direita.

Por fim, removemos a raiz.

(50)

Limpeza

46

void bst_delete(bst_t **t) {

47

bst_delete_helper((*t), (*t)->root);

48

free(*t);

49

(*t) = NULL;

50

}

(51)

Limpeza

52

static void bst_delete_helper(bst_t *t, bst_node_t *v) {

53

if (v != NULL) {

54

bst_delete_helper(t, v->left);

55

bst_delete_helper(t, v->right);

56

bst_delete_node(v, t->destructor);

57

}

}

(52)

Sum´ ario

2 BST

Defini¸c˜ ao Inicializa¸ c˜ ao Fun¸c˜ oes Auxiliares Busca

Inser¸c˜ ao

Remo¸ c˜ ao

Limpeza

An´ alise

(53)

An´ alise

Todas as opera¸ c˜ oes b´ asicas de inser¸c˜ ao, remo¸ c˜ ao e busca, fazem um esfor¸ co proporcional ` a altura da ´ arvore bin´ aria de pesquisa.

Tudo vai depender da maior altura da ´ arvore.

Quanto mais equilibrada, melhor.

Idealmente, temos: Θ(lg n) por opera¸ c˜ ao b´ asica.

No pior caso, a BST pode estar degenerada, causando um custo de

pior caso de Θ(n).

(54)

An´ alise

Figura: BST equilibrada.

(55)

An´ alise

(56)

An´ alise

Busca Inser¸ c˜ ao Remo¸ c˜ ao Melhor caso Θ(lg n) Θ(lg n) Θ(lg n)

Pior caso Θ(n) Θ(n) Θ(n)

(57)

Sum´ ario

3 Considera¸c˜ oes

(58)

Considera¸c˜ oes

BSTs conseguem representar elementos em um cen´ ario dinˆ amico.

A busca ´ e muito eficiente quando a ´ arvore est´ a “equilibrada”.

(59)

Considera¸c˜ oes

Problemas com BSTs

Problema: dependendo da ordem de inser¸ c˜ oes/remo¸ c˜ oes, a BST subjacente pode tornar-se degenerada.

Opera¸ c˜ oes come¸ cam a levar tanto tempo quanto em listas. . .

(60)

Considera¸c˜ oes

Solu¸c˜ ao

Arvores Bin´ ´ arias de Pesquisa Balanceadas;

Continuam sendo BSTs, mas utilizam opera¸c˜ oes que tentam espalhar os itens da ´ arvore de modo a deix´ a-la balanceada de acordo com algum crit´ erio, como altura, peso , etc . . . Em nosso curso de Estruturas de Dados, veremos duas delas:

▶ Arvore AVL; ´

▶ Treap.

Referências

Documentos relacionados

Em cada item abaixo, dar um exemplo de opera¸c˜ao bin´aria ∗ em S satisfazendo as condi¸c˜oes pedidas no item.. ∗ ´e associativa e comutativa mas n˜ao admite elemento neutro

Figure 1 - Serum levels of luteinizing hormone A, follicle stimulating hormone B, testosterone C and estradiol D in rats experimentally infected with Trypanosoma evansi on days 5 and

Cada comportamento tem a capacidade de reagir a estímulos em tempo real e tal como nas arquitecturas reactivas, ligam directamente sensores e actuadores.. Os comportamentos têm

Grande Dourados, no uso das atribuições que lhe foram conferidas pela Portaria nº 779, de 26/08/2014, considerando a Portaria nº 1.369/10, de 07/12/2010, que

Diante do exposto, este trabalhou visou o desenvolvimento de sistemas microemulsionados contendo o extrato de casca de bacaba, bem como, a sua potencial

demais campi estão sem um Regimento Interno ainda constituído; que no caso de Oriximiná, 98. que é um campus mais antigo, já haviam formulado um processo democrático de construção

O hormônio da gravidez pode ter uma con- formação espacial (formato) muito semelhante ao da insulina. Dessa forma, o hormônio da gra- videz liga-se a receptores para insulina. Ocorre

Partição - operação de divisão do disco rígido necessária para a instalação do Linux e implica a perda de todos os dados do mesmo. Existem 2 formas de criar partições durante