Escolar Documentos
Profissional Documentos
Cultura Documentos
GREGORIO SEMEDO
Departamento de Engenharia e Novas Tecnologias
Lubango
2022
INDICE DE ILUSTRAÇÕES
FIGURAS
Figura 1 ABB...............................................................................................................................5
Figura 2 AVL...............................................................................................................................7
Figura 3 Grafo com 3 vértices {0, 1, 2} e 3 arestas {a, b, c}......................................................13
Figura 4 Grafo com 6 vértices....................................................................................................13
TABELAS
2
Sumário
1. Apresentação.......................................................................................................................4
2. Árvore binária de busca............................................................................................................5
2.1. Definição...........................................................................................................................5
2.1.1. Elementos......................................................................................................................5
2.1.2. Complexidade.................................................................................................................6
2.1.3. Árvore binária de busca balanciada....................................................................................6
2.1.4. Definição........................................................................................................................7
2.2. Uma árvore AVL................................................................................................................7
2.2.1. Complexidade.....................................................................................................................8
2.2.2. Aplicações.......................................................................................................................8
2.2.3. Dicionários......................................................................................................................9
2.2.4 Geometria Computacional..............................................................................................9
2.2.5. Conjuntos.......................................................................................................................9
2.3. Organização Hash.............................................................................................................9
2.3.1. Tabela de Hashing........................................................................................................10
2.3.2. Função de Hashing:......................................................................................................10
2.3.3. Hash e Espalhamento...................................................................................................10
2.3.4. Vantagens.....................................................................................................................11
2.3.5. Desvantagens...............................................................................................................11
2.4. Grafos e sua utilização.........................................................................................................12
2.4.1. Representação.............................................................................................................12
2.4.2. Terminologia................................................................................................................13
2.4.3. Vértice isolado..............................................................................................................13
2.4.4 Grafo trivial (ou ponto).................................................................................................13
2.4.5. Laço (ou loop/self-loop)...............................................................................................13
2.4.6. Grafo simples................................................................................................................14
2.4.7. Vértices adjacentes......................................................................................................14
2.4.8. Grafo pesado (ou grafo de arcos pesados)...................................................................14
2.4.9. Grau de um vértice(ou valência)..................................................................................14
2.4.10. Grafo direccionado.....................................................................................................14
2.4.11. Matriz de adjacência..................................................................................................14
2.4.12. Listas de adjacência....................................................................................................15
2.4.13. Aplicações dos grafos.................................................................................................16
2.5. Representação de listas em memória externa....................................................................17
3
3. Referências.........................................................................................................................19
1. Apresentação
O presente trabalho tem como objectivo a elaboração de um trabalho de investigação
cientifica, este a ser apresentado na cadeira de Algoritmo e estrutura de dados no curso
de Engenharia Informática, sob orientação científica do Msc. Daniel Moises.
4
2. Árvore binária de busca
Em Ciência da computação, uma árvore binária de busca (ou árvore binária de
pesquisa) é uma estrutura de dados de árvore binária baseada em nós, onde todos os
nós da subárvore esquerda possuem um valor numérico inferior ao nó raiz e todos os
nós da subárvore direita possuem um valor superior ao nó raiz (esta é a forma padrão,
podendo as subárvores serem invertidas, dependendo da aplicação).
2.1. Definição
Seja S = {s1, s2, ..., sn} um conjunto de chaves tais que s1 < s2 ... sn. Seja k um valor
dados. Deseja-se verificar se k ϵ S e identificar o índice i tal que k = si.
A Árvore Binária de Busca (ABB) resolve os problemas propostos. A figura ilustra uma
ABB.
Figura 1 ABB
1. T possui n nós. Cada nó u armazena uma chave distinta sj S e tem como rótulo o
valor r(u) = sj.
2. Para cada nó v de T r(v1) < r(v) e r(v2) > r(v), onde v1 pertence à subárvore
esquerda de v e v2 pertence à subárvore direita de v.
2.1.1. Elementos
5
Filhos - são os nós que vem depois dos outros nós (no caso da figura acima,
o nó 6 é filho do 3)
Pais - são os nós que vem antes dos outros nós (no caso da figura acima, o
nó 10 é pai do 14)
Folhas - são os nós que não têm filhos; são os últimos nós da árvore (no
caso da figura acima, as folhas são 2, 5, 11, 4).
2.1.2. Complexidade
A complexidade das operações sobre ABB depende diretamente da altura da árvore.
Uma árvore binária de busca com chaves aleatórias uniformemente distribuídas tem
altura O(log n).
No pior caso, uma ABB poderá ter altura O(n). Neste caso a árvore é chamada de árvore
zig-zag e corresponde a uma degeneração da árvore em lista encadeada.
A busca começa examinando o nó raiz. Se a árvore está vazia, o valor procurado não
pode existir na árvore. Caso contrário, se o valor é igual a raiz, a busca foi bem
sucedida. Se o valor é menor do que a raiz, a busca segue pela subárvore esquerda.
Similarmente, se o valor é maior do que a raiz, a busca segue pela subárvore direita.
Esse processo é repetido até o valor ser encontrado ou a subárvore ser nula (vazia). Se o
valor não for encontrado até a busca chegar na subárvore nula, então o valor não deve
estar presente na árvore.
6
para ser alcançado um custo de algoritmo com o tempo de pesquisa tendendo a O(log
n).
Nessa estrutura de dados cada elemento é chamado de nó. Cada nó armazena uma chave
e dois ponteiros, uma para a subárvore esquerda e outro para a subárvore direita.
2.1.4. Definição
Uma árvore binária T é denominada AVL quando, para qualquer nó de T, as alturas de
suas duas subárvores, esquerda e direita, diferem em módulo de até uma unidade.
7
Figura 2 AVL
2.2.1. Complexidade
A árvore AVL tem complexidade O(log n) para todas operações e ocupa espaço n,
onde n é o número de nós da árvore.
Seja pt_u um ponteiro para o nó u sendo verificado. Caso o pt_u seja nulo então a busca
não foi bem sucedida (K não está na árvore ou árvore vazia). Verificar se a chave K
igual pt_u->chave (valor chave armazenado no nó u), então a busca foi bem sucedida.
8
Caso contrário, se K < pt_u->chave então a busca segue pela subárvore esquerda; caso
contrário, a busca segue pela subárvore direita.
2.2.2. Aplicações
A árvore AVL é muito útil, pois executa as operações de inserção, busca e remoção em
tempo O(log n). Comparado-a com a árvore rubro-negra, a AVL é mais rápido nas
aplicações que fazem uma quantidade excessiva de buscas, porém esta estrutura é um
pouco mais lenta para inserção e remoção. Isso se deve ao fato de as árvores
AVL serem mais rigidamente balanceadas.
2.2.3. Dicionários
Árvore AVL pode ser usada para formar um dicionário de uma linguagem ou de
programas, como os opcodes de um assembler ou um interpretador.
2.2.5. Conjuntos
Árvore AVL podem ser empregadas na implementação de conjuntos, principalmente
aqueles cujas chave não são números inteiros.
9
para diversos cenários, pois nos fornece acesso, inserção e remoção em tempo O(1). Isto
é, se soubermos o índice em que um elemento está, o tempo de acesso a esse elemento é
extremamente eficiente.
Exemplo: Construir uma tabela com os elementos 34, 45, 67, 78, 89. Vamos usar uma
tabela com 10 elementos e a função de hash x%10 (resto da divisão por 10). A tabela
ficaria.
10
i 0 1 2 3 4 5 6 7 8 9
a[i] -1 -1 -1 -1 34 45 -1 67 78 89
2.3.3. Hash e Espalhamento, a idéia central das técnicas de hash é sempre espalhar os
elementos de forma que os mesmos sejam rapidamente encontrados. Haverão elementos
vazios na tabela, mas isso não é um problema. Estamos gastando mais memória, mas
aumentando a eficiência dos algoritmos de busca.
Colisões, No caso geral, não temos informações sobre os elementos e seus valores. É
comum sabermos somente a quantidade máxima de elementos que a tabela conterá.
Assim, ainda existe um problema a ser resolvido. Como tratar os elementos cujo valor
da função de hash é o mesmo? Chamamos tal situação de colisões. Existe uma forma
simples de tratar o problema das colisões. Basta colocar o elemento na primeira posição
livre seguinte e considerar a tabela circular (o elemento seguinte ao último a[n-1] é o
primeiro a[0]). Isso se aplica tanto na inserção de novos elementos quanto na busca.
Considere os elementos acima e a função x%10. A tabela ficaria:
i 0 1 2 3 4 5 6 7 8 9
a[i] -1 -1 42 23 33 52 12 -1 58 -1
2.3.4. Vantagens
Simplicidade
o É muito fácil de imaginar um algoritmo para implementar hashing.
Escalabilidade
o Podemos adequar o tamanho da tabela de hashing ao n esperado em
nossa aplicação.
Eficiência para n grandes
o Para trabalharmos com problemas envolvendo n = 1.000.000 de dados,
podemos imaginar uma tabela de hashing com 2.000 entradas, onde
temos uma divisão do espaço de busca da ordem de n/2.000 de imediato.
Aplicação imediata a arquivos
11
o Os métodos de hashing, tanto de endereçamento aberto como fechado,
podem ser utilizados praticamente sem nenhuma alteração em um
ambiente de dados persistentes utilizando arquivos em disco.
2.3.5. Desvantagens
12
2.4.1. Representação
Graficamente, um grafo é normalmente representado da seguinte forma:
Figura 3 Grafo com 3 vértices {0, 1, 2} e 3 arestas {a, b, c}
Usando o primeiro exemplo, V = {1, 2, 3, 4, 5, 6} e E = {(1,3), (1,6), (2,5), (3,4), (3,6)}.
Cada vértice (também chamado “nó“) é um membro do conjunto V. Cada arco é um
membro do conjunto E.
2.4.2. Terminologia
Como é de esperar, tendo aplicações tão variadas, o grafo adapta-se às nossas
necessidades. Assim, existem vários tipos de grafos. Aliados a isso, existem termos
comummente usados para descrever um grafo, ou parte dele. Vou listar alguns (entre
eles os mais comuns):
13
2.4.4 Grafo trivial (ou ponto)
Grafo sem arestas e um único nó.
Fácil de programar.
Pode representar um grafo pesado sem comprometer a complexidade.
Caso o grafo não seja pesado e seja possível existir mais do que uma ligação entre
dois vértices, (i,j) pode representar o número de ligações entre eles.
14
Verificar se dois vértices são adjacentes é muito rápido, tal como adicionar ou
remover ligações.
Desvantagens:
V1 V1 V2 V3 V4 V5 V6
V1 0 0 1 0 0 1
V2 0 0 0 0 1 0
V3 1 0 0 1 0 1
V4 0 0 1 0 0 0
V5 0 1 0 0 0 0
V6 1 0 1 0 0 0
Vantagens:
Listar todas as arestas incidentes num dado vértice é fácil (a operação mais frequente na
maioria dos algoritmos).
15
Baixo desperdício de memória.
Desvantagens:
Mais uma vez, o primeiro grafo fornecido poderia ser representado desta forma:
1 3, 6
2 5
3 1, 4, 6
4 3
5 2
6 1, 3
Redes de Transporte:
Representação de Rodovias.
Representação de Rodovias.
Mapa de Vôos
Redes de Computadores:
16
Redes Locais.
Internet.
Bancos de Dados:
Diagrama Entidade-Relacionamento.
Lista linear é uma estrutura de dados na qual elementos de um mesmo tipo de dado
estão organizados de maneira sequencial. Não necessariamente, estes elementos estão
fisicamente em sequência, mas a idéia é que exista uma ordem lógica entre eles. Um
exemplo disto seria um consultório médico: as pessoas na sala de espera estão sentadas
em qualquer lugar, porém sabe-se quem é o próximo a ser atendido, e o seguinte, e
assim por diante. Assim, é importante ressaltar que uma lista linear permite representar
um conjunto de dados afins (de um mesmo tipo) de forma a preservar a relação de
ordem entre seus elementos. Cada elemento da lista é chamado de nó, ou nodo
Quanto a forma de alocar memória para armazenamento de seu elementos, uma lista
pode ser:
Sequencial ou Contígua
Numa lista linear contígua, os nós além de estarem em uma sequência lógica, estão
também fisicamente em sequência. A maneira mais simples de acomodar uma lista
linear em um computador é através da utilização de um vetor.
17
Figura 5 Ilustração da lista na memória
Encadeada
Repare que temos um vetor de inteiros, certo? E esse vetor possui 10 posições.
Cada uma das posições é ocupada por um int, e sabemos que o tipo primitivo int tem
um tamanho que equivale a 4 bytes, conforme vemos na tabela abaixo:
1 byte = 8 bits
18
32/8 = 4 bytes
Assim, na figura, se cada valor de tipo int ocupar 4 bytes de memória, teremos 40 bytes
consecutivos reservados na memória do computador para armazenar todos os valores do
vetor.
3. Referências
Árvore binária de busca. (11 de Março de de 2021). Obtido de Árvore binária de busca:
https://pt.wikipedia.org/wiki/%C3%81rvore_bin%C3%A1ria_de_busca
Baranauskas, J. A. (2007). Árvores Binárias de Busca. Obtido de Árvores Binárias de
Busca: extension://bfdogplmndidlpjfhoijckpakkdjkkil/pdf/viewer.html?
file=https%3A%2F%2Fdcm.ffclrp.usp.br%2F~augusto%2Fteaching%2Faedi
%2FAED-I-Arvores-Binarias-Busca.pdf
Ribeiro, P. (06 de Maio de 2012). CASA DAS CIÊNCIAS. Obtido de CASA DAS
CIÊNCIAS: https://wikiciencias.casadasciencias.org/wiki/index.php/Grafo
Rodrigues, G. C. (18 de Junho de 2021). alura. Obtido de Referência do vetor na
memória: https://cursos.alura.com.br/forum/topico-referencia-do-vetor-na-
memoria-157028
Vale, S. (27 de Junho de 2020). Voitto. Obtido de Artigos salvos:
https://www.voitto.com.br/blog/artigo/o-que-e-hash-e-como-funciona
19