Buscar

prova_2_coletanea_respostas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 6 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 6 páginas

Prévia do material em texto

UNIVERSIDADE FEDERAL DA PARAÍBA
CENTRO DE INFORMÁTICA
Disciplina: [1107186] Estrutura de Dados
Prof. Christian Azambuja Pagot.
Prova II
Questão 1
A Red-Black Tree é uma árvore binária de pesquisa, autobalanceada, e em que cada nó possui uma cor:
vermelho (red) ou preto (black). As Red Black Trees mantém o balanceamento através da manutenção de cinco
invariantes. Uma destas invariantes determina que o filho de um nó vermelho deve ser sempre preto. 
Escreva uma função, em C/C++, que percorra uma árvore binária e determine se a invariante
mencionada anteriormente é mantida. A estrutura de cada nó desta árvore é definida como:
struct Node { 
int color;  // 0 = black, 1 = red
struct Node left;  
struct Node right; }
Abaixo segue o protótipo da função a ser escrita. Esta função receberá como parâmetro um ponteiro para
o no raís (root) da árvore:
bool TestColors(struct Node* root) 
Se a árvore respeitar a invariante, a função deve retornar true. Caso contrário, a função deve retornar 
false.
Resposta
bool RecTestColors(struct Node* node, int parent_color)
{
  if (node)
    if ((parent_color != ­1) && (node­>color == 1) && (parent_color == 1))
      return false;
    else
      return RecTestColors(node­>left, node­>color) && RecTestColors(node­>right, node­>color);
  else
    return true;
}
bool TestColors(struct Node* root)
{
  return RecTestColors(root, ­1);
}
Questão 2
O array abaixo representa um binary heap? Explique sua resposta.
0 1 2 3 4 5 6 7 8 9
7 12 18 25 13 17 19 40 30 31
Resposta
Não. Aparentemente seria um min heap, pois o menor valor é o primeiro elemento do array. Porém, 17 é “filho” 
de 18, que é um valor maior. Assim, a estrutura não respeita a invariante do min nem do max heap, não 
representando, portando, uma binary heap.
Questão 3
Dada uma tabela hash com 11 buckets e a seguinte função de hash h:
h(k) = k mod 11
Insira as chaves [22, 1, 13, 11, 24, 33, 18, 42, 31] na ordem dada (da esquerda para a direita) em uma
tabela hash:
1. Assumindo que a tabela hash resolve as colisões por meio de encadeamento (chainning). 
2. Assumindo que a tabela hash resolve as colisões por meio de endereçamento aberto (linear probing). 
Respostas
Questão 4
Um grafo bicolorido, ou bipartido, é um grafo cujos nós podem ser separados em dois grupos, U e V,
disjuntos, de tal forma que cada aresta conecta um nó de U com um nó de V. Estes dois conjuntos, U e V, podem
ser vistos como um grafo com duas cores: se todos os nós de U têm a cor branca, e todos os nós de V têm a cor
preta, cada aresta do grafo conecta dois vértices de cores diferentes.
Adapte o algoritmo de BFS (Breadth First Search), apresentado abaixo, para determinar se um grafo é
bipartido ou não.
BFS (G, s)
 for each vertex u in G.V – {s}
     u.state = UNDISCOVERED
 s.state = DISCOVERED
 Q = {}
 Enqueue(Q, s)
 while not (Q == {})
     u = Dequeue(Q)
     for each v in G.Adj[u]
         if v.state == UNDISCOVERED
             v.state = DISCOVERED
 Enqueue(Q, v)
Resposta
bool BFS (G, s) 
 for each vertex u in G.V – {s} 
     u.state = UNDISCOVERED 
     s.color = ­1
 s.state = DISCOVERED
 s.color = 0 
 Q = {} 
 Enqueue(Q, s) 
 while not (Q == {}) 
     u = Dequeue(Q) 
     for each v in G.Adj[u] 
         if (v.state == UNDISCOVERED)
             if (u.color == 0)
                 v.color = 1
             else
                 v.color = 0
             v.state = DISCOVERED 
      Enqueue(Q, v) 
         else 
             if (u.color == v.color)
                 return false 
 return true
Questão 5
Calcule o overhead (razão entre o espaço ocupado pelos dados e o espaço total ocupado) para cada uma
das implementações de árvore binária abaixo:
1. Todos os nós armazenam dados, possuem dois ponteiros para os filhos e um ponteiro para o pai. O
campo de dados requer 4 bytes e cada ponteiro requer 8 bytes.
Supondo uma árvore completa com n nós folha:
O espaço ocupado pelos dados das folhas é 4n bytes.
O espaço ocupado pelos dados dos nós internos é 4n-4 bytes.
O espaço total ocupado pelos dados é 8n-4 bytes.
O espaço ocupado pelos ponteiros das folhas é 24n bytes.
O espaço ocupado pelos ponteiros dos nós internos é 24n-24 bytes.
O espaço total ocupado pelos ponteiros é 48n-24 bytes.
O espaço total total ocupado pela árvore é de 56n-28 bytes.
A razão entre o espaço ocupado pelos ponteiros e o espaço total é 48n-24 / 56n-28, ou 12n-6 /
14n-7.
Para n grande demais, o termo constante perde importância e a equação se aproxima de 12n/
14n, ou 6n/7n.
Assim, para uma árvore completa, a quantidade de espaço desperdiçada com os ponteiros
é de aproximadamente 85%.
2. Somente os nós folha armazenam dados; nós internos possuem dois ponteiros para os filhos. O campos
de dados requer 4 bytes e cada ponteiro requer 8 bytes.
Supondo uma árvore completa com n nós folha:
As folhas dessa árvore precisãrão de 4n bytes de espaço (dados). 
Os nós internos dessa árvore precisarão de 16(n-1), ou 16n-16 bytes de espaço (ponteiros). 
Assim, o espaço total ocupado pela árvore é de 4n+16n-16, ou 20n-16 bytes.
A razão entre o espaço ocupado pelos ponteiros e o espaço total é 16n-16 / 20n-16, ou 4n-4 /
5n-4.
Para n grande demais, o termo constante perde importância e a equação se aproxima de 4n/ 5n.
Assim, para uma árvore completa, a quantidade de espaço desperdiçada com os ponteiros
é de aproximadamente 80%.
Questão 6
Duas árvores são idênticas quando as suas estruturas e os valores de seus nós correspondentes são iguais.
Com base nesta informação, escreva uma função em linguagem C que verifique se duas árvores binárias são
idênticas. A função deve retornar true (verdadeiro) se as duas árvores forem idênticas ou false (falso) caso
contrário. O protótipo desta função deve ser: 
bool CompareTrees(Node* t1, Node* t2)
onde t1 é o ponteiro para a raíz da primeira árvore e t2 é o ponteiro para a raíz da segunda árvore. Node é um 
struct que define a estrutura dos nós das árvores, e é definido da seguinte forma:
struct Node
{
     int value;
     Node* left;
     Node* right;
}
Resposta
int CompareTree(struct Node *t1, struct Node *t2)
{
  if ((t1 == NULL) && (t2 == NULL))
    return 1;
  else
    if (((t1 == NULL) && (t2 != NULL)) || ((t1 != NULL) && (t2 == NULL)))
      return 0;
    else
      if (t1­>value == t2­>value)
        return CompareTree(t1­>left, t2­>left) && 
               CompareTree(t1­>right, t2­>right);
      else
        return 0;
}
Questão 7
Com base no grafo representado pela lista de adjacência abaixo, 
Responda: 
3.1 - Desenhe o grafo representado por esta lista de adjacência.
3.2 - Escreva a matriz de adjacência que representa o mesmo grafo.
Questão 8
Dado um grafo não direcionado, descrito por uma matriz ou lista de adjacência, desenvolva um 
algoritmo que determine se este grafo é uma árvore. Uma árvore é um grafo não-direcionado, 
conectado e acíclico!
Exemplifique o funcionamento do algoritmo desenvolvido, mostrando como ele verifica cada 
um dos requisitos que definem uma árvore.
1
2
3
4
5
6
3
6 4
1 4
3 1
1 4
	Questão 1
	Questão 2
	Questão 3
	Questão 4
	Questão 5
	Questão 6
	Questão 7
	Questão 8

Outros materiais