Prova de Recuperação PMR3201/PMR2300 1o. semestre 2015 Prof. Thiago Martins

Documentos relacionados
Fabio G. Cozman, Thiago Martins 2017

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Revisão: Tipo Abstrato de Dados Recursividade

Sintaxe da linguagem Java

Palavras Reservadas da Linguagem Java

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Árvores & Árvores Binárias

Listas Lineares Ordenadas

Técnicas de projeto de algoritmos: Indução

Métodos Computacionais. Listas Encadeadas

Variáveis primitivas e Controle de fluxo

Listas Encadeadas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Estruturas de Dados Pilhas, Filas, Listas

DAINF - Departamento de Informática

Aula 3 Conceitos de memória, variáveis e constantes Cleverton Hentz

Pesquisa Linear. Adriano J. Holanda 15/3/2016

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Árvores Binárias de Busca

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

BCC202 - Estrutura de Dados I

JAVA. José de Siqueira UFMG - ICEx - DCC

Genéricos. Profa. Thienne Johnson EACH/USP

Tipos, Literais, Operadores

Tipos, Literais, Operadores

INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

S U M Á R I O. Definição de Estrutura de Dados. Vetores. Listas Ligadas. Pilhas. Filas

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Estruturas de Dados Filas

Recursividade. Objetivos do módulo. O que é recursividade

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

Paradigmas de Linguagens

Módulo 10 Listas Encadeadas

Árvore Binária de Busca. Prof. César Melo

double x; x = enigmab1(100);

Listas de Prioridade. Fonte de consulta: Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC.

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Bits e operações. Sistemas de Computação

Aula 08 Estruturas de Condição. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

FCUP 2010/11. Departamento de Ciência de Computadores Estruturas de Dados (CC114) 1 o Teste: 27/Abril/2011

Algoritmos e Estruturas de Dados I

Orientação a Objetos AULA 09

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Métodos de Ordenação Parte 3

Árvores Binárias de Busca (ABB) 18/11

Lista 1 - PMR3201. Fabio G. Cozman, Thiago Martins 2017

INF111 Programação II Aulas 11, 12, 13 Ordenação

Lista de Figuras Figura 1 1: Figura 1 2: Figura 1 3: Figura 1 4: Figura 1 5: Figura 1 6: Figura 1 7: Figura 2 1: Figura 2 2: Figura 2 3: Figura 2 4:

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Complexidade de algoritmos Notação Big-O

Teoria da Computação. Aula 4 Técnicas de Análise 5COP096. Aula 4 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

LISTA DE EXERCÍCIOS MÊS 04

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

INF 1620 P2-01/11/03 Questão 1 Nome:

Conceitos básicos de programação

ÁRVORE BINÁRIA DE BUSCA

Referências. Linguagem C. Tipos de variáveis em XC8. Tipos de variáveis. Tipos de variáveis em XC 8 Exemplo. Radicais numéricos em C

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Estrutura de Dados. Diego Silveira Costa Nascimento

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Array em Java. Figura 1 - Exemplo de um array de inteiros

Diagramas Sintáticos

Filas Exemplo de Aplicação

ESTRUTURA DE DADOS (TCC )

TÉCNICO DE INFORMÁTICA - SISTEMAS

Algoritmos de Ordenação: HeapSort

Árvores. Prof. César Melo DCC/ICE/UFAM

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

TCC 00308: Programação de Computadores I Introdução

Árvores. Prof. Byron Leite Prof. Tiago Massoni Prof. Fernando Buarque. Engenharia da Computação. Poli - UPE

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

Algoritmos e Estruturas de Dados

Árvores. Prof. César Melo DCC/ICE/UFAM

Estrutura de Dados II. Prof. Sérgio Portari

PROGRAMAÇÃO ORIENTADA A OBJETOS I. Prof. Me. Hélio Esperidião

Programação: Vetores

1. Listas sequenciais versus listas ligadas. Lista sequencial

Paradigmas de programação

1 Da aula teórica ao Java

(a) Indique, em português, o que realiza a seguinte função. [4 pontos]

EAD PILHA - DEFINIÇÃO

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Java 2 Standard Edition Tipos, literais, operadores e controle de fluxo

Representação de Dados

Instituto Superior de Engenharia de Lisboa

Transcrição:

Prova de Recuperação PMR21/PMR2 1o. semestre 2 Prof. Thiago Martins Instruções: screva o nome e o número USP na folha de papel almaço. 1. (2 pontos) Uma pilha é uma estrutura de dados na qual o elemento a ser retirado é o último a ser inserido. classe Pilhar implementa uma pilha empregando um arranjo como base. Os métodos públicos da classe são: push(object x): diciona o objeto x à pilha. pop(): Remove e retorna o objeto mais recente a ser inserido ou lança a exceção rropilhavazia se não há mais objetos empilhados. tamanho(): Retorna a quantidade de objetos empilhados. screva em java uma função que recupera o valor no topo de uma pilha sem alterar o seu conteúdo. Use a seguinte assinatura: static Object topo(pilhar p) Onde p é a pilha cujo topo deve ser recuperado. função deve lançar a exceção Pilhar.rroPilhaVazia caso p esteja vazia (lembre-se de usar apenas métodos públicos de Pilhar). Resposta: O único método públic que retorna uma referência ao objeto no topo da pilha é pop(). ste método no entanto modifica o estado da pilha removendo o objeto da mesma. solução naturalmente é adicionar o objeto de volta: static Object topo ( Pilhar p) { Object x = pilha. pop (); pilha. push (x); return x; O comportamento de lançar a exceção caso a pilha esteja vazia é naturalmente fornecido pelo método pop(). 2. (2 pontos) Os resultados das segundas provas das turmas de PMR2 e de PMR21 podem ser representados por conceitos com a distribuição como indicado nas tabelas abaixo: PMR2: onceito aixa ração 1 > 8 e < 1 % > 6 67 e < 8 % > 5 e < 6 67 % > e < 5 % > 1 67 e <. % > 1 67 Média: 645 PMR21: onceito aixa de Nota ração 1 4% > 8 e < 1 22% > 6 67 e < 8 18% > 5 e < 6 67 26% > e < 5 26% > 1 67 e <. 4% > 1 67 Média: 64

Normalmente seriam necessários bits para codificar um conceito entre os 7 definidos (teoricamente o limite inferior é log 2 7 2 87). Uma tabela de símbolos específica no entanto pode-se fazer melhor do que isso. (a) (15 pontos) rie um dicionário de codificação de Huffman ajustado para a distribuição de conceitos em PMR2. Quantos bits em média são necessários para codificar a lista de conceitos da turma de PMR2? ompare com o limite teórico log 2 7. Resposta: onstrução da árvore de código de Huffman: 59 59 14 1 14 14 partir desta árvore é possível construir o dicionário de Huffman para estes símbolos:

Símbolo odificação bits 6 4 1 1 2 1 1 5 6 Usando este dicionário a codificação das notas de PMR2 usaria em média 24 bits por símbolo uma melhoria de % sobre os bits e de 27% sobre log 2 7. (b) (5 pontos) om o dicionário produzido no item (a) quantos bits em média são necessários para codificar a lista de conceitos da turma de PMR21? ompare com o limite teórico log 2 7. Resposta: om o mesmo dicionário obtido no item (a) a codificação das notas de PMR21 usaria em média 28 bits. ste é praticamente o valor de log 2 7 o que mostra uma diferença expressiva entre as distribuições embora as médias sejam muito próximas.. (2 pontos) O código a seguir mostra uma implementação em java do ubblesort para ordenação em ordem crescente de vetores de inteiros: 1 static void bubblesort(int[] x) { 2 int ultimo_alterado; int ultimo = x.length-1; 4 do { 5 ultimo_alterado = ; 6 for(int j=1;j<=ultimo;j++) { 7 if(x[j]<x[j-1]) { 8 int temp = x[j]; 9 x[j] = x[j-1]; 1 x[j-1] = temp; ultimo_alterado = j; 12 1 14 ultimo = ultimo_alterado - 1; while(ultimo>); 16 O princípio do algoritmo é comparar a ordem relativa de elementos contíguos em um vetor e realizar a troca de posição sempre que necessário. Note que ao final do laço interno todos os elementos entre as posições apontadas por ultimo e ultimo alterado estão em ordem crescente e são maiores ou iguais a todos os elementos que os precedem. omo ultimo é inicializado com a última posição do vetor e a cada iteração do laço externo é modificado para a posição anterior a ultimo alterado o algoritmo termina em tempo finito e ordena efetivamente o vetor. (a) (1 pontos) alcule em notação ig Oh a ordem de complexidade do algoritmo ubblesort no seu pior caso. Resposta: Seja u i o valor da variável ultimo ao final da execução da linha 14 na i-gésima iteração do laço externo (iniciado na linha 6). O laçõ na linha 6 vai executar um total de

u i passos. Seja a i o valor da variável ultimo alterado ao final da execução da linha 14 na i-gésima iteração do laço interno. O valor máximo de a i é u i 1 quando o último elemento a ser inspecionado pelo laço interno é modificado (isso ocorre por exemplo com uma entrada em ordem inversa na qual o laço interno transporta o primeiro elemento até a posição u i e mantém a ordem relativa dos demais elementos inalterada). ssim o valor máximo que u i pode assumir é u i 1 1. Ou seja no pior caso u i segue uma sequência aritmética decrescente de razão -1. O número total de iterações do laço interno no pior caso para uma entrada com n elementos é dado por: 1 i = n2 + n = O ( n 2) 2 i=n (b) (1 pontos) alcule em notação ig Oh a ordem de complexidade do algoritmo ubblesort no seu melhor caso. Resposta: Quando o algoritmo recebe um vetor previamente ordenado a comparação na linha 7 é sempre negativa de modo que a alteração na variável ultimo alterado na linha nunca ocorre. Ora neste caso o valor de ultimo alterado na linha 14 permanece a variável ultimo recebe -1 e o laço externo sai após uma única iteração. ssim a complexidade é unicamente a de uma execução do laço interno que para uma entrada de n posições é O(n). 4. (2 pontos) onsidere o código abaixo para converter um inteiro maior do que zero em uma String com sua representação decimal: 1 public static String convert(int x) { 2 String r = ""; while(x!=) { 4 int d = x % 1; 5 // diciona o digito de d 6 // a esquerda de r 7 r = (char)( + d) + r; 8 x /= 1; 9 1 return r; (a) (1 pontos) Mostre que o algoritmo acima termina em tempo finito para x maior do que zero. Resposta: Seja x i o valor da variável x ao fina da execução da linha 8 ao final da i-gésima iteração do laço iniciado na linha. Pela linha 8 x i = x i 1 /1 e assim x i < x i 1. Por outro lado x i 1 > x i. ssim x i é inteiro estritamente decrescente e limitado inferiormente por. xiste portanto um valor finito n para o qual x n = condição de encerramento do laço. (b) (1 pontos) Mostre que o algoritmo acima está correto ou seja ele efetivamente retorna a representação decimal de x (sugestão: seja i o número da iteração do loop interno. onsidere ao final de cada iteração do loop os valores do número representado pela String armazenada em r e de x 1 i ).

Resposta: Seja r i o inteiro representado pela cadeia armazenada na variável r ao final da i-gésima iteração do laço (é trivial mostrar que r sempre contém uma representação válida de um inteiro). Seja d i o valor da variável d ao final da i-gésima iteração do laço. Vale 9 d i. Pela linha 7 r i = r i 1 + d i 1 i 1 i. Isso procede pois ao final da i-gésima iteração a representação decimal de r i tem exatos i dígitos. ssim o novo dígito entra na casa com valor 1 i 1. Por outro lado d i = 1x i x i 1. ecorre de ambas as relações que 1 i x i + r i = 1 i 1 x i 1 + r i 1 ou seja o valor 1 i x i + r i é invariante. ntes da entrada do laço 1 x + r é o valor inicial da variável x (a cadeia vazia representa ). o final do laço na n-ésima iteração quando x n = 1 n x n + r n é igual a r n o valor final representado pela cadeia. ssim r n = x e a cadeia contém efetivamente a representação decimal do valor da variável x. 5. (2 pontos) Uma árvore de busca binária é uma árvore binária na qual cada nó é estritamente maior que todos os elementos da sua sub-árvore esquerda e estritamente menor que todos os elementos da sua sub-árvore direita (vide exemplos a seguir). sta propriedade permite a rápida localização de elementos nela contidos. classe Noinarioloat contém nós de uma árvore binária que armazena números em ponto flutuante. O campo val contém o número armazenado no nó o campo esquerda contém uma referência para a raiz da sub-árvore esquerda e o campo direita contém uma referência para a raiz da sub-árvore direita. (a) (15 pontos) screva de forma não-recursiva um código em Java que adiciona um novo valor a uma árvore pré-existente. Use a seguinte assinatura: static void inserenovono(noinarioloat raiz double n) Onde raiz é o nó raiz da árvore à qual deve ser adicionado o novo valor (considere sempre não-nulo) e n é o novo valor a ser inserido. Resposta: O novo elemento deve ser sempre inserido como uma folha (mantendo os já existentes). O grande desafio deste problema para quem é familiar com a versão recursiva da inserção é que esta possui 5 comportamentos distintos: 1. Insere uma nova folha esquerda e termina. 2. Insere uma nova folha direita e termina.. Prossegue recursivamente na sub-árvore esquerda. 4. Prossegue recursivamente na sub-árvore direita. 5. Termina sem fazer nada. codificação da inserção na forma de um laço iterativo deve considerar estes 5 comportamentos distintos. sta é uma situação em que um laço perpétuo quebrado por instruções break leva a uma codificação mais compacta. No entanto um código com uma flag booleana que indica condição de continuidade para o laço é menos sujeito a erros: static void inserenovono(noinarioloat raiz double n) { boolean continua = true; while(continua) { // Itera até inserir o no if(n<raiz.val) { // Insere na sub-arvore esquerda if(raiz.esquerda!=null) raiz = raiz.esquerda; // ontinua na esquerda else { // rvore vazia cria novo no

raiz.esquerda = new Noinarioloat(n null null); continua = false; // ncerra laco else if(n>raiz.val) { // Insere na sub-arvore direita if(raiz.direita!=null) raiz = raiz.direita; // ontinua na direita else { // rvore vazia cria novo no raiz.direita = new Noinarioloat(n null null); continua = false; // ncerra laço else continua = false; // n n~ao é menor nem maior é igual // o elemento ja existe (b) (5 pontos) Qual a diferença em termos de consumo de recursos computacionais da versão recursiva para a não-recursiva? Resposta: versão recursiva usa memória de pilha em linguagens que não suportam tail call optimization (como é o caso da máquina virtual Java da Oracle). ormulário Somas de sequências: i = i= n(n 1) 2 i=(a 1) i 2 = n n2 i= a i = 1 an 1 a i=(a 1) quivalência de recursão por tail call a laço: 2 + n 6 i= i = n4 4 n 2 + n2 4 ia i = a nan + (n 1)a n+1 (1 a) 2. function (X) if (X) then return (X) else return (G (X)) end if end function Versão recursiva function (X) while NOT (X) do X G (X) end while return (X) end function Versão iterativa com laço ódigos-fonte de apoio

lasse Pilhar public class Pilhar { public class PilhaVazia extends java. lang. Runtimexception { private Object arranjo []; private int topo ; lasse Noinarioloat public class Noinarioloat { double val ; Noinarioloat esquerda ; Noinarioloat direita ; public Pilhar () { arranjo = new Object [16]; topo = -1; public void push ( Object x) { if (++ topo == arranjo. length ) dupliquerranjo (); arranjo [ topo ] = x; public Object pop () { if ( topo < ) throw new PilhaVazia (); return ( arranjo [topo - -]); public boolean pilhavazia () { return topo <; Noinarioloat ( double val Noinarioloat e Noinarioloat d) { this. val = val ; esquerda = e; direita = d; private void dupliquerranjo () { Object na [] = new Object [2 * arranjo. length ]; for ( int i =; i< arranjo. length ; i ++) na[i] = arranjo [i]; arranjo = na;