Você está na página 1de 7

Lista de Exercícios - Tabelas Hash, Árvores e Heaps

1. Implemente um MaxHeap, com a seguinte estrutura:

class MaxHeap {
private:
Data* heap;
int capacidade;
int tamanho;
inline int pai(int i);
inline int esquerdo(int i);
inline int direito(int i);
void arruma();
void corrigeDescendo(int i); // heapify()
void corrigeSubindo(int i);
public:
MaxHeap(int cap);
MaxHeap(Data vet[], int tam, int cap=0);
~MaxHeap();
void imprime();
Data espiaRaiz();
Data retiraRaiz();
void insere(Data d);
};

2. Modifique o código do MaxHeap para implementar um MinHeap.

3. Utilizando código ou ideia dos heaps implementados, implemente o heapsort


(https://www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html).
4 - TAD - Torneio (Tournment Tree) Adaptado de [Langsam, Augenstein & Tenenbaum,
1996]. Um torneio é uma árvore estritamente binária na qual cada nó não folha (pai) ontém
uma cópia do maior elemento entre seus dois filhos. O conteúdo das folhas de um torneio
determina o conteúdo de todos os seus nós. Um torneio com n folhas representa um conjunto
de n elementos. Considere um vetor com n posições, preenchido com os nomes dos jogadores
que disputarão um torneio de biriba. Os jogos são disputados em duplas e, a cada jogo,
apenas o vencedor segue para a próxima rodada.

Neste representação temos a Tartaruga Touché como vencedora do torneio de biriba, e Hardy
como segundo colocado. A representação de um torneio através de um MaxHeap permite
identificar a classificação do do 1º e 2º lugares. Analogamente, podemos considerar um vetor
de inteiros e adotar o mesmo procedimento:
Implemente um torneio, utilizando por base um MaxHeap, possuindo um método
removeMaior(t, n) para remover o maior elemento de um torneio com n elementos
substituindo o valor da folha que contenha o maior elemento por um valor menor do que
qualquer outro elemento, por exemplo, substituindo o maior elemento por -1 em um torneio
que só contenha elementos positivos. Após a substituição o torneio deve ser reorganizado.

O conteúdo das folhas será fornecido pelo usuário e o conteúdo dos demais nós será
calculado através de um torneio.
5. Considere a seqüência de chaves P O K E M N A L P H S I R e a codificação
A = 0, B = 1, C = 2, etc.
a. Desenhe o conteúdo da tabela hash resultante da inserção dos registros com
essas chaves nessa ordem em uma tabela inicialmente vazia de tamanho 5
usando listas encadeadas. Use a função hash h(k) = k mod 5 onde k é a
codificação da letra.
b. Desenhe o conteúdo da tabela hash resultante da inserção dos registros com
essas chaves nessa ordem em uma tabela inicialmente vazia de tamanho 11
usando listas encadeadas. Use a função hash h(k) = k mod 11 onde k é a
codificação da letra.
c. Desenhe o conteúdo da tabela hash resultante da inserção dos registros com
essas chaves nessa ordem em uma tabela inicialmente vazia de tamanho 13
usando endereçamento aberto e hash linear para tratar colisões. Use a função
hash h(k) = k mod 13 onde k é a codificação da letra.
c. Desenhe o conteúdo da tabela hash resultante da inserção dos registros com
essas chaves nessa ordem em uma tabela inicialmente vazia de tamanho 17
usando endereçamento aberto e hash linear para tratar colisões. Use a função
hash h(k) = k mod 17 onde k é a codificação da letra.

6. Considere a implementação de uma tabela hash de tamanho M=13, com endereçamento


aberto utilizando a função k mod M. Responda às seguintes questões:
a. Mostre a configuração da tabela após a inserção dos registros com as chaves: 4, 17, 13, 35,
25, 11, 2, 10, 32.
b. Mostre a configuração da tabela após a remoção dos registros com as chaves: 25, 11.
c. Mostre a configuração da tabela após inserção de registros com as chaves: 40, 3.

6. Implemente uma tabela hash com 11 posições, com resolução de colisões por
encadeamento. Utilize hash h(k) = k mod 11, em que k é a chave do registro sendo
armazenado.

7. Implemente uma tabela hash com um número genérico n de posições, informado durante a
construção da tabela, com resolução de colisões por encadeamento. Utilize hash h(k) = k
mod n, em que k é a chave do registro sendo armazenado e n é o número de posições da
tabela.

8. Implemente uma tabela hash com um número genérico n de posições, informado durante a
construção da tabela, com resolução de colisões por encadeamento. Utilize a função hash a
seguir, em que M é um número primo informado durante a criação da tabela:

int funcaoHash(string s, int M) {


long h = 0;
for (unsigned i = 0; i < s.length(); i++) {
h = (UMPRIMO * h + s[i]) % M;
}
return h;
}

9. Implemente uma tabela hash com um número genérico n de posições, informado durante a
construção da tabela, com resolução de colisões por endereçamento aberto. Utilize hash h(k)
= k mod n, em que k é a chave do registro sendo armazenado e n é o número de posições da
tabela. Sugestão: utilize um marcador para indicar elementos “removidos” do hash (mantenha
o elemento lá, mas sem uso, até uma nova inserção precisar daquela posição).
10. Implemente, em C++, um código para representar uma árvore qualquer. Cada nó é
representado da seguinte forma:

class noh {
Dado valor;
noh** filhos;
};

Entre os métodos implementados, crie um que busca um dado valor na árvore, retornando o
caminho percorrido da raiz até o referido nó, caso seja encontrado um nó com esse valor.

11. Implemente um grafo não-direcionado utilizando uma lista de adjacência. A lista de


adjacência é uma lista que contém todos os nós adjacentes. Por exemplo, seja a lista:
0 1
0 3
1 2
2 3
Nesse caso, os nós 0 e 1 são adjacentes, bem como os nós 0 e 3, 1 e 2 e também os nós 2 e 3,
representando o grafo a seguir:

1 3
2

Implemente um método que recebe dois nós A e B e verifica se existe um caminho que
permite sair do nó A e ir até o nó B.
12. Implemente um grafo direcionado utilizando uma matriz de adjacência. A matriz de
adjacência é uma matriz que informa se existe uma aresta saindo de um dado nó a outro. Por
exemplo, seja a matriz:
0 1 0
0 0 1
1 1 0
indica que existe: uma aresta saindo do nó 0 para o nó 1, uma aresta saindo do nó 1 para o nó
2, e arestas saindo do nó 2 para o nó 0 e para o nó 1, representando o grafo a seguir:

1
2

Implemente um método que recebe dois nós A e B e verifica se existe um caminho que
permite sair do nó A e ir até o nó B.

Heap alterar prioridade

Você também pode gostar