Você está na página 1de 3

/*

1- Escreva um algoritmo para encontrar o menor elemento de uma heap, assumindo que o
maior está no topo da heap. Faça o número de comparações ser o mínimo possível.

*/

minHeap_Max(A){

min = NULL;

for(i = piso(A.size); i > A.size; i++){

if(min == NULL){

min = A[i]

}else{

if(A[i]< min){

min = A[i];

return min;

/*

2- O algoritmo de Prim, o algoritmo de Kruskal para o problema da árvore

geradora mínima assumem que o grafo não dirigido com peso nas arestas é fixo, e então
determinam a árvore geradora mínima para este grafo. O que acontece se nós temos uma
situação mais dinâmica onde novas arestas podem ser adicionadas ao grafo. Este tipo de
situação conduz ao seguinte problema:

Árvore Geradora Mínima Dinâmica

<continuação no pdf>

Sob quais condições T é uma árvore geradora para G0? Justifique suas condições.

3- A operação Heap-Delete(A,i) elimina o item do nó i da heap A. Escreva o pseudo-código do


algoritmo Heap-Delete que executa em tempo O(lg n) para uma max heap de n elementos.

4- Qual é número máximo e mínimo de elementos de uma heap de altura h?


5. Qual é o efeito de chamar a função Heapify(A,i) quando o elemento A[i] é maior que seus
golhos?

6. O código Heapify(A,i) é bastante eficiente em termos de fatores constante, exceto,


possivelmente, pela chamada recursiva, que pode fazer com que

alguns compiladores produzam um código bastante ineficiente. Escreva o pseudo-código da


operção Heapifyque utilize uma estrutura de controle

interativa (um laço) ao invés de recursão.

7. Qual é o tempo de execução do HeapSort sobre um. vetor A de n elementos já ordenado em


ordem crescente? E se o vetor estiver em ordem

decrescente?

8. Descreva como o HeapSort pode ser adaptado para retornar, ordem crescente, os k maiores
inteiros de um vetor A, desordenado, de tamanho n.

Assuma que k é muito menor que n e muito maior que 1.

9. Descreva um algoritmo que funda k listas ordenadas em uma única lista

ordenada, onde n é o número total de elementos em todas as listas de

entrada. (Observação: Utilize uma heap para realizar a fusão.)

10. Você fundou uma companhia de segurança cibernética. A companhia necessita obter
licenças para n diferentes partes de um software de criptografia. Devido a legislação, você
pode somente obter estas licenças na

razão de no máximo uma por mês.

Cada licença está atualmente sendo vendida por R$ 1000. No entanto,

elas tornam-se mais caras de acordo com uma curva de crescimento exponencial: em
particular, o custo da licença j cresce por fator de rj > 1 cada

mês, onde rj é um parâmetro fornecido. Isto significa que se a licença j

é comprada daqui a t meses, esta custará 1000 rjt. Nós assumiremos que

todas as razões de crescimento dos preços são distintas; isto é ri 6= rj para

licenças i 6= j (apesar de todas possuírem o mesmo valor inicial de R$

1000).
Descreva um algoritmo que recebe como argumento n razões de crescimento dos preços r1;
r2; : : : ; rn, e compute a ordem pela qual a companhia

deve comprar as licenças de modo a minimizar o dinheiro gasto. O tempo

de execução do seu algoritmo deve ser polinomial em n.

11. Escreva uma versão não recursiva de Encontrar_Conjunto com compressão

de caminho.

12. Forneça uma sequência de m operações Inicializar, União e Encontrar_Conjunto,

n das quais são operações Inicializar, que demore tempo Ω(m lg n) quando usarmos somente a
heurística de ponderação.*/