• Nenhum resultado encontrado

Árvores Binárias de Busca

N/A
N/A
Protected

Academic year: 2022

Share "Árvores Binárias de Busca"

Copied!
188
0
0

Texto

(1)

Algoritmos e Estruturas de Dados I

Árvores Binárias de Busca

Prof. Tiago Eugenio de Melo tmelo@uea.edu.br

(2)

Observações

O conteúdo dessa aula é parcialmente

proveniente do Capítulo 14 do livro “Data Structure and Algorithms Using Python”.

As palavras com a fonte Courier indicam uma palavra-reservada da linguagem de

programação.

2 / 50

(3)

Árvores Binárias de Busca

(4)

Introdução

4 / 50

(5)

Introdução

Busca (pesquisa) de dados em texto é uma

operação bastante comum e, por isso, bastante estudada.

(6)

Introdução

Busca (pesquisa) de dados em texto é uma

operação bastante comum e, por isso, bastante estudada.

Uma pesquisa linear de um array ou uma lista de Python é bastante lenta.

4 / 50

(7)

Introdução

Busca (pesquisa) de dados em texto é uma

operação bastante comum e, por isso, bastante estudada.

Uma pesquisa linear de um array ou uma lista de Python é bastante lenta.

Essa pesquisa pode ser melhorada com uma busca binária.

(8)

Introdução

Busca (pesquisa) de dados em texto é uma

operação bastante comum e, por isso, bastante estudada.

Uma pesquisa linear de um array ou uma lista de Python é bastante lenta.

Essa pesquisa pode ser melhorada com uma busca binária.

Porém, arrays e listas de Python ainda têm

dificuldade de realizar as operação de inserção e remoção de chaves.

4 / 50

(9)

Introdução

Busca (pesquisa) de dados em texto é uma operação bastante comum e, por isso, bastante estudada.

Uma pesquisa linear de um array ou uma lista de Python é bastante lenta.

Essa pesquisa pode ser melhorada com uma busca binária.

Porém, arrays e listas de Python ainda têm dificuldade de realizar as operação de inserção e remoção de chaves.

Exemplo: a remoção de uma chave obriga a reorganização

(10)

Introdução

Busca (pesquisa) de dados em texto é uma operação bastante comum e, por isso, bastante estudada.

Uma pesquisa linear de um array ou uma lista de Python é bastante lenta.

Essa pesquisa pode ser melhorada com uma busca binária.

Porém, arrays e listas de Python ainda têm dificuldade de realizar as operação de inserção e remoção de chaves.

Exemplo: a remoção de uma chave obriga a reorganização da lista, pois a busca binária somente funciona em listas (arrays) ordenados.

O objetivo primário de uma árvore de busca é fornecer uma eficiente operação de busca para rapidamente localizar um específico item na árvore.

4 / 50

(11)

Árvore Binária de Busca (ABB)

(12)

Árvore Binária de Busca (ABB)

Uma árvore binária de busca (ABB) – binary search tree (BST) – é uma árvore binária em que cada nó contém um campo chave e a

árvore é estruturada de tal maneira que para cada nó interior V:

5 / 50

(13)

Árvore Binária de Busca (ABB)

Uma árvore binária de busca (ABB) – binary search tree (BST) – é uma árvore binária em que cada nó contém um campo chave e a

árvore é estruturada de tal maneira que para cada nó interior V:

Todas as chaves menores que a chave do nó V devem ser armazenadas à esquerda de V.

(14)

Árvore Binária de Busca (ABB)

Uma árvore binária de busca (ABB) – binary search tree (BST) – é uma árvore binária em que cada nó contém um campo chave e a

árvore é estruturada de tal maneira que para cada nó interior V:

Todas as chaves menores que a chave do nó V devem ser armazenadas à esquerda de V.

Todas as chaves maiores que a chave do nó V devem ser armazenadas à direita de V.

5 / 50

(15)

Árvore Binária de Busca (ABB)

Exemplo de ABB:

(16)

Árvore Binária de Busca (ABB)

Exemplo de ABB:

6 / 50

(17)

Árvore Binária de Busca (ABB)

Exemplo de ABB:

(18)

Árvore Binária de Busca (ABB)

7 / 50

(19)

Árvore Binária de Busca (ABB)

Observações:

(20)

Árvore Binária de Busca (ABB)

Observações:

A nossa definição de ABB impede o

armazenamento de chaves duplicadas.

7 / 50

(21)

Árvore Binária de Busca (ABB)

Observações:

A nossa definição de ABB impede o

armazenamento de chaves duplicadas.

É uma suposição realista para vários problemas.

(22)

Árvore Binária de Busca (ABB)

Observações:

A nossa definição de ABB impede o

armazenamento de chaves duplicadas.

É uma suposição realista para vários problemas.

Isto torna a implementação mais simples.

7 / 50

(23)

Árvore Binária de Busca (ABB)

Observações:

A nossa definição de ABB impede o

armazenamento de chaves duplicadas.

É uma suposição realista para vários problemas.

Isto torna a implementação mais simples.

Essa restrição poderia ser alterada para permitir o armazenamento de chaves duplicadas.

(24)

Árvore Binária de Busca (ABB)

Observações:

A nossa definição de ABB impede o

armazenamento de chaves duplicadas.

É uma suposição realista para vários problemas.

Isto torna a implementação mais simples.

Essa restrição poderia ser alterada para permitir o armazenamento de chaves duplicadas.

Por questões didáticas, nós estamos apresentando apenas uma versão que considera chaves únicas..

7 / 50

(25)

TAD de ABB

(26)

TAD de ABB

8 / 50

(27)

TAD de ABB

(28)

TAD de ABB

8 / 50

(29)

TAD de ABB

(30)

TAD de ABB

O que é um iterador?

8 / 50

(31)

TAD de ABB

(32)

TAD de ABB

9 / 50

(33)

TAD de ABB

(34)

Operação de Busca

10 / 50

(35)

Operação de Busca

Dada uma árvore binária, alguém sempre vai querer buscar na árvore para determinar se ela contém uma determinada chave (ou localizar um elemento específico).

(36)

Operação de Busca

Dada uma árvore binária, alguém sempre vai querer buscar na árvore para determinar se ela contém uma determinada chave (ou localizar um elemento específico).

Lembre-se:

10 / 50

(37)

Operação de Busca

Dada uma árvore binária, alguém sempre vai querer buscar na árvore para determinar se ela contém uma determinada chave (ou localizar um elemento específico).

Lembre-se:

Existe um único caminho da raiz até algum dos nós da árvore.

(38)

Operação de Busca

Dada uma árvore binária, alguém sempre vai querer buscar na árvore para determinar se ela contém uma determinada chave (ou localizar um elemento específico).

Lembre-se:

Existe um único caminho da raiz até algum dos nós da árvore.

A questão é:

10 / 50

(39)

Operação de Busca

Dada uma árvore binária, alguém sempre vai querer buscar na árvore para determinar se ela contém uma determinada chave (ou localizar um elemento específico).

Lembre-se:

Existe um único caminho da raiz até algum dos nós da árvore.

(40)

Operação de Busca

11 / 50

(41)

Operação de Busca

O início da busca sempre se iniciará pela raiz.

(42)

Operação de Busca

O início da busca sempre se iniciará pela raiz.

11 / 50

(43)

Operação de Busca

(44)

Operação de Busca

O elemento procurado é comparado com o nó da raiz.

12 / 50

(45)

Operação de Busca

O elemento procurado é comparado com o nó da raiz.

(46)

Operação de Busca

O elemento procurado é comparado com o nó da raiz.

Se ele for igual, então encontramos.

12 / 50

(47)

Operação de Busca

O elemento procurado é comparado com o nó da raiz.

Se ele for igual, então encontramos.

Se ele for maior, então estará à direita da raiz.

(48)

Operação de Busca

O elemento procurado é comparado com o nó da raiz.

Se ele for igual, então encontramos.

Se ele for maior, então estará à direita da raiz.

Se ele for menor, então estará à esquerda da raiz.

12 / 50

(49)

Operação de Busca

O elemento procurado é comparado com o nó da raiz.

Se ele for igual, então encontramos.

Se ele for maior, então estará à direita da raiz.

Se ele for menor, então estará à esquerda da raiz.

Processo é repetido até localizarmos o alvo ou encontrarmos um nó filho nulo.

(50)

Operação de Busca

13 / 50

(51)

Operação de Busca

Suponha que vamos buscar o elemento 29:

(52)

Operação de Busca

Suponha que vamos buscar o elemento 29:

13 / 50

(53)

Operação de Busca

Suponha que vamos buscar o elemento 29:

(54)

Operação de Busca

Suponha que vamos buscar o elemento 29:

13 / 50

(55)

Operação de Busca

Suponha que vamos buscar o elemento 29:

(56)

Operação de Busca

Suponha que vamos buscar o elemento 29:

13 / 50

(57)

Operação de Busca

Suponha que vamos buscar o elemento 29:

(58)

Operação de Busca

Suponha que vamos buscar o elemento 29:

13 / 50

(59)

Operação de Busca

(60)

Operação de Busca

Suponha que vamos buscar o elemento 68:

14 / 50

(61)

Operação de Busca

Suponha que vamos buscar o elemento 68:

(62)

Operação de Busca

Suponha que vamos buscar o elemento 68:

14 / 50

(63)

Operação de Busca

Suponha que vamos buscar o elemento 68:

(64)

Operação de Busca

Suponha que vamos buscar o elemento 68:

14 / 50

(65)

Operação de Busca

Suponha que vamos buscar o elemento 68:

(66)

Operação de Busca

Suponha que vamos buscar o elemento 68:

14 / 50

(67)

Operação de Busca

Suponha que vamos buscar o elemento 68:

(68)

Operação de Busca

15 / 50

(69)

Operação de Busca

As operações de busca na árvore binária

podem ser implementadas iterativamente ou com recursão.

(70)

Operação de Busca

As operações de busca na árvore binária

podem ser implementadas iterativamente ou com recursão.

Vamos ver um exemplo de implementação com recursão.

15 / 50

(71)

Operação de Busca

As operações de busca na árvore binária

podem ser implementadas iterativamente ou com recursão.

Vamos ver um exemplo de implementação com recursão.

O modo iterativo ficará como exercício!!!

(72)

Operação de Busca

16 / 50

(73)

Operação de Busca

A função tem dois casos base:

(74)

Operação de Busca

A função tem dois casos base:

O elemento alvo está no nó atual da busca ou

16 / 50

(75)

Operação de Busca

A função tem dois casos base:

O elemento alvo está no nó atual da busca ou

Um nó filho NULL é encontrado.

(76)

Operação de Busca

A função tem dois casos base:

O elemento alvo está no nó atual da busca ou

Um nó filho NULL é encontrado.

Portanto, a função retornará:

16 / 50

(77)

Operação de Busca

A função tem dois casos base:

O elemento alvo está no nó atual da busca ou

Um nó filho NULL é encontrado.

Portanto, a função retornará:

A referência ao nó que contém o elemento procurado ou

(78)

Operação de Busca

A função tem dois casos base:

O elemento alvo está no nó atual da busca ou

Um nó filho NULL é encontrado.

Portanto, a função retornará:

A referência ao nó que contém o elemento procurado ou

None.

16 / 50

(79)

Operação de Busca

(80)

Operação de Busca

17 / 50

(81)

Operação de Busca

(82)

Operação de Busca

17 / 50

(83)

Busca por valores Max e Min

(84)

Busca por valores Max e Min

Uma outra operação de busca comumente

executada em uma árvore binária de busca é encontrar os maiores e menores valores

(chaves).

18 / 50

(85)

Busca por valores Max e Min

Uma outra operação de busca comumente

executada em uma árvore binária de busca é encontrar os maiores e menores valores

(chaves).

De acordo com a definição de ABB, nós

sabemos que o valor mínimo está na raiz ou em algum nó a sua esquerda.

(86)

Busca por valores Max e Min

Uma outra operação de busca comumente executada em uma árvore binária de busca é

encontrar os maiores e menores valores (chaves).

De acordo com a definição de ABB, nós sabemos que o valor mínimo está na raiz ou em algum nó a sua esquerda.

Existe alguma maneira de fazer a busca pelo

menor elemento se ter a necessidade de fazer a comparação individual?

18 / 50

(87)

Busca por valores Max e Min

Como achar o menor valor na ABB abaixo?

(88)

Busca por valores Max e Min

Como achar o menor valor na ABB abaixo?

19 / 50

(89)

Busca por valores Max e Min

(90)

Busca por valores Max e Min

A ideia é que se o nó raiz contém um elemento a sua esquerda, então esse nó não pode ser o menor.

20 / 50

(91)

Busca por valores Max e Min

A ideia é que se o nó raiz contém um elemento a sua esquerda, então esse nó não pode ser o menor.

(92)

Busca por valores Max e Min

A mesma ideia da busca pelo menor valor se aplica à busca do maior valor.

21 / 50

(93)

Busca por valores Max e Min

Código:

(94)

Inserção

23 / 50

(95)

Inserção

Na construção de uma ABB, as chaves (elementos) são adicionados um por vez.

(96)

Inserção

Na construção de uma ABB, as chaves (elementos) são adicionados um por vez.

Suponha que vamos inserir a seguinte relação de elementos [60, 25, 100, 35, 17, 80].

23 / 50

(97)

Inserção

(98)

Inserção

Inserir 60

24 / 50

(99)

Inserção

Inserir 60

(100)

Inserção

Inserir 60 Inserir 25

24 / 50

(101)

Inserção

Inserir 60 Inserir 25

(102)

Inserção

Inserir 60 Inserir 25 Inserir 100

24 / 50

(103)

Inserção

Inserir 60 Inserir 25 Inserir 100

(104)

Inserção

Inserir 60 Inserir 25 Inserir 100

Inserir 35

24 / 50

(105)

Inserção

Inserir 60 Inserir 25 Inserir 100

Inserir 35

(106)

Inserção

Inserir 60 Inserir 25 Inserir 100

Inserir 35 Inserir 17

24 / 50

(107)

Inserção

Inserir 60 Inserir 25 Inserir 100

Inserir 35 Inserir 17

(108)

Inserção

Inserir 60 Inserir 25 Inserir 100

Inserir 35 Inserir 17 Inserir 80

24 / 50

(109)

Inserção

Inserir 60 Inserir 25 Inserir 100

Inserir 35 Inserir 17 Inserir 80

(110)

Inserção

25 / 50

(111)

Inserção

Suponha que vamos inserir a chave 30 na árvore anterior.

(112)

Inserção

Suponha que vamos inserir a chave 30 na árvore anterior.

O que aconteceria se nós usarmos o função _bstSearch( ) e pesquisarmos pelo nó 30?

25 / 50

(113)

Inserção

Suponha que vamos inserir a chave 30 na árvore anterior.

O que aconteceria se nós usarmos o função _bstSearch( ) e pesquisarmos pelo nó 30?

(114)

Inserção

Suponha que vamos inserir a chave 30 na árvore anterior.

O que aconteceria se nós usarmos o função _bstSearch( ) e pesquisarmos pelo nó 30?

A busca não localizará o nó 30.

25 / 50

(115)

Inserção

Suponha que vamos inserir a chave 30 na árvore anterior.

O que aconteceria se nós usarmos o função _bstSearch( ) e pesquisarmos pelo nó 30?

A busca não localizará o nó 30.

Porém, este será o lugar

(116)

Inserção

Código para inserir um nó na ABB:

26 / 50

(117)

Inserção

Código para inserir um nó na ABB:

(118)

Inserção

28 / 50

(119)

Inserção

O método deve pesquisar a localização do novo nó.

(120)

Inserção

O método deve pesquisar a localização do novo nó.

28 / 50

(121)

Inserção

O método deve pesquisar a localização do novo nó.

(122)

Inserção

O método deve pesquisar a localização do novo nó.

28 / 50

(123)

Inserção

(124)

Inserção

O caso base é alcançado quando uma subárvore vazia é encontrada.

29 / 50

(125)

Inserção

O caso base é alcançado quando uma subárvore vazia é encontrada.

(126)

Inserção

30 / 50

(127)

Inserção

Neste momento, um novo nó da árvore é criado e seus valores são atualizados.

(128)

Inserção

Neste momento, um novo nó da árvore é criado e seus valores são atualizados.

30 / 50

(129)

Inserção

(130)

Inserção

A recursão continua...

31 / 50

(131)

Inserção

A recursão continua...

(132)

Inserção

A recursão continua...

31 / 50

(133)

Inserção

Até alcançar o nó raiz.

(134)

Remoção

33 / 50

(135)

Remoção

A operação de remoção é um pouco mais

complicada do que as operações de busca ou inserção.

(136)

Remoção

A operação de remoção é um pouco mais

complicada do que as operações de busca ou inserção.

Operações envolvidas na remoção:

33 / 50

(137)

Remoção

A operação de remoção é um pouco mais

complicada do que as operações de busca ou inserção.

Operações envolvidas na remoção:

Localizar o elemento.

(138)

Remoção

A operação de remoção é um pouco mais

complicada do que as operações de busca ou inserção.

Operações envolvidas na remoção:

Localizar o elemento.

Remover o nó da árvore.

33 / 50

(139)

Remoção

A operação de remoção é um pouco mais

complicada do que as operações de busca ou inserção.

Operações envolvidas na remoção:

Localizar o elemento.

Remover o nó da árvore.

Os nós restantes devem preservar a propriedade

(140)

Remoção

Existem três casos a serem considerados antes de remover um nó:

O nó é uma folha.

O nó tem um único filho.

O nó tem dois filhos.

34 / 50

(141)

Remoção

(142)

Remoção

Remoção de nó folha

35 / 50

(143)

Remoção

Remoção de nó folha

É o caso mais simples.

(144)

Remoção

Remoção de nó folha

É o caso mais simples.

Depois de encontrar o nó, basta removê-lo da ABB.

35 / 50

(145)

Remoção

Remoção de nó folha

É o caso mais simples.

Depois de encontrar o nó, basta removê-lo da ABB.

(146)

Remoção

Remoção de nó folha

É o caso mais simples.

Depois de encontrar o nó, basta removê-lo da ABB.

35 / 50

(147)

Remoção

(148)

Remoção

Remover nó interior com 1 filho

36 / 50

(149)

Remoção

Remover nó interior com 1 filho

(150)

Remoção

Remover nó interior com 1 filho

Como seria remover o nó 41?

36 / 50

(151)

Remoção

(152)

Remoção

37 / 50

(153)

Remoção

Bastaria que o nó anterior (12) apontasse para NULL?

(154)

Remoção

Bastaria que o nó anterior (12) apontasse para NULL?

37 / 50

(155)

Remoção

(156)

Remoção

Como o nó 41 tem apenas 1 único filho, então todos os seus descendentes têm chaves

maiores do que o nó 12.

38 / 50

(157)

Remoção

Como o nó 41 tem apenas 1 único filho, então todos os seus descendentes têm chaves

maiores do que o nó 12.

(158)

Remoção

Como o nó 41 tem apenas 1 único filho, então todos os seus descendentes têm chaves

maiores do que o nó 12.

Assim, basta ligar o nó 12 ao filho do nó 41.

38 / 50

(159)

Remoção

Como o nó 41 tem apenas 1 único filho, então todos os seus descendentes têm chaves

maiores do que o nó 12.

Assim, basta ligar o nó 12 ao filho do nó 41.

(160)

Remoção

39 / 50

(161)

Remoção

Remover nó interior com 2 filhos

(162)

Remoção

Remover nó interior com 2 filhos

Essa é a sua situação mais difícil.

39 / 50

(163)

Remoção

Remover nó interior com 2 filhos

Essa é a sua situação mais difícil.

O que aconteceria na árvore para remover o nó 12?

(164)

Remoção

Remover nó interior com 2 filhos

Essa é a sua situação mais difícil.

O que aconteceria na árvore para remover o nó 12?

39 / 50

(165)

Remoção

Remover nó interior com 2 filhos

Essa é a sua situação mais difícil.

O que aconteceria na árvore para remover o nó 12?

(166)

Remoção

40 / 50

(167)

Remoção

O resultado da remoção anterior seria a árvore abaixo.

(168)

Remoção

O resultado da remoção anterior seria a árvore abaixo.

40 / 50

(169)

Remoção

O resultado da remoção anterior seria a árvore abaixo.

O nó 41 teria dois filhos à esquerda.

(170)

Remoção

41 / 50

(171)

Remoção

Remover o nó interior com dois filhos:

(172)

Remoção

Remover o nó interior com dois filhos:

Encontrar o sucessor lógico, S, do nó que será removido N.

41 / 50

(173)

Remoção

Remover o nó interior com dois filhos:

Encontrar o sucessor lógico, S, do nó que será removido N.

Copiar a chave do nó S para N.

(174)

Remoção

Remover o nó interior com dois filhos:

Encontrar o sucessor lógico, S, do nó que será removido N.

Copiar a chave do nó S para N.

Remover o nó S da árvore.

41 / 50

(175)

Remoção

Remover o nó interior com dois filhos:

Encontrar o sucessor lógico, S, do nó que será removido N.

Copiar a chave do nó S para N.

Remover o nó S da árvore.

(176)

Remoção

42 / 50

(177)

Remoção

A dúvida que surge é:

(178)

Remoção

A dúvida que surge é:

Como encontrar o sucessor de um nó e onde ele estará localizado na árvore?

42 / 50

(179)

Remoção

A dúvida que surge é:

Como encontrar o sucessor de um nó e onde ele estará localizado na árvore?

O sucessor é o menor elemento dos elementos que sejam maiores que o nó que será removido.

(180)

Remoção

A dúvida que surge é:

Como encontrar o sucessor de um nó e onde ele estará localizado na árvore?

O sucessor é o menor elemento dos elementos que sejam maiores que o nó que será removido.

De acordo com as propriedades de uma ABB, o sucessor de um nó é o seu pai ou algum nó que esteja a sua direita.

42 / 50

(181)

Remoção

Passo 1

Achar o nó N e o seu sucessor S.

(182)

Remoção

Passo 2

Copiar o nó S para N.

44 / 50

(183)

Remoção

Passo 3

Remova o sucessor S que estava à direita.

(184)

Remoção

Passo 4

Remova o sucessor S que estava à direita.

46 / 50

(185)

Eficiência das ABB

(186)

Exercícios

Considere a árvore binária de busca abaixo e mostre o resultado após deletar cada uma das seguintes chaves: 14, 52 e 39.

48 / 50

(187)

Exercícios

Discuta a avaliação entre uma implementação de

uma lista ordenada e a implementação de uma árvore binária de busca.

Considere que as chaves 50, 30, 70, 20, 40, 60, 80, 15, 25, 35, 45 e 36 são inseridas, nesta ordem, numa árvore de busca inicialmente vazia. Desenha a árvore resultante.

O que aconteceria se o nó 30 fosse removido da

(188)

Exercícios

Escreva uma função em Python para verificar se uma árvore é uma ABB.

Escreva uma função em Python para verificar se duas ABBs são iguais.

50 / 50

Referências

Documentos relacionados

• Como o nome sugere, trata-se de uma árvore binária otimizada para buscar seus elementos. • As chaves são sempre armazenadas segundo a

Visto que no Brasil esta aplicação em grande escala é praticamente nula, torna-se um atrativo acadêmico o estudo dos impactos da inserção de unidades

Desta forma, a identificação de um conjunto de indicadores úteis ao conhecimento do comportamento da instituição e sua modelagem multidimensional enquanto metadados de um

Gerir uma vila alentejana no século XV: as finanças municipais de Elvas em 1432-1433 FRAGMENTA

Um técnico em informática deverá executar as seguintes tarefas de apoio à comissão avaliadora, antes do início da prova: checagem prévia do funcionamento das

Professores do 3º Ciclo e do Ensino Secundário da Esc.. Ação e formador Área Destinatários Modalidade e nº horas Calendarização. APRENDIZAGEM ATIVA COM RECURSO ÀS TIC

HISTÓRIA DE VIDA DE Euseius concordis Chant, 1959 TENDO COMO PRESA Oligonychus ilicis McGregor, 1917 Acari: Phytoseiidae, Tetranychidae... ERIKA CARLA

Trabalho de Conclusão de Curso apresentado ao curso de Agronomia, no Centro de Ciências Agrárias, da Universidade Federal de Santa Catarina, como requisito para