Baixe o app para aproveitar ainda mais
Prévia do material em texto
IO - ESTRUTURA DE DADOS //— Questão 1/10 - Estrutura de Dados Assuma um vetor de dimensão 10 com dados numéricos e inteiros colocados na seguinte ordem: | 05 | 07 | 08 | 14 | 24 | 29 | 56 | 77 | 78 | 88 | Suponha que você deseja implementar um algoritmo de busca para localizar algum dado neste vetor já ordenado de maneira crescente. Você resolve testar a busca sequencial e a busca binária. Acerca destes algoritmos e analisando o vetor acima, assinale a alternativa CORRETA: Nota: 10.0 A No algoritmo de busca sequencial, o valor 24 seria localizado na 6ª tentativa, se fizermos uma varredura da esquerda para a direita. Na 5ª tentativa. B No algoritmo de busca binária, o valor 24 seria localizado na 3ª tentativa. Na 1ª tentativa. C No algoritmo de busca sequencial, o valor 77 seria localizado mais rapidamente que se comparado com a busca binária. Binária se sairia mais rápida. D No algoritmo de busca sequencial, o valor 07 seria localizado mais rapidamente que se comparado com a busca binária. Você acertou! CORRETO. Levará menos iterações. E Em nenhum cenário de busca o algoritmo sequencial irá localizar o valor antes da busca binária. É possível que sim, a sequencial ache antes. Dependerá o valor buscado e onde ele se localizado no vetor. Questão 2/10 - Estrutura de Dados O algoritmo de ordenação rápida, também conhecido como quick sort, é um dos algoritmos estudados na AULA 2. Acerca deste algoritmo, assinale a alternativa CORRETA. Nota: 0.0 A A complexidade do quick sort é O(n²). Isso significa que ele sempre terá a mesma eficiência de um bubble sort. Somente o pior caso do bubble e do quick são iguais. Se considerarmos cenários melhores o quick sort se sai bem melhor que o bubble sort. Veja o experimento feito na AULA PRÁTICA 1 para mais detalhes. B O quick sort trabalha com o conceito de pivô, que é o elemento usado nas comparações, comparando sempre o seu valor com todos os valores do lado direito do pivô, enquanto que o lado esquerdo permanece já ordenado. Ambos os lados são comparados, esquerdo e direito. C O quick sort trabalha com o conceito de pivô, que é o elemento usado nas comparações, comparando sempre o seu valor com todos os valores do lado esquerdo do pivô, enquanto que o lado direito permanece já ordenado. Ambos os lados são comparados, esquerdo e direito. D O quick sort trabalha com uma troca de valores utilizando uma variável auxiliar, da mesma maneira feita no bubble sort. AULA 2 – TEMA 4 – CORRETO. E O quick sort só pode ser executado para um tamanho de conjunto de dados máximo igual a 1000, pois mais do que isso o uso de memória pelo algoritmo é muito grande. O limite máximo dependerá da memória disponível, não sendo limitado ao valor de 1000. Questão 3/10 - Estrutura de Dados A recursividade é um recurso de programação bastante empregado, e consiste no ato de uma função em um código realizar chamadas de si mesmo, abrindo diferentes instâncias de uma mesma função na memória do programa. Acerca de recursividade e algoritmos recursivos, assinale a alternativa INCORRETA: Nota: 10.0 A Diversos problemas computacionais que poderiam ser resolvidos utilizando algoritmos iterativos, ou seja, laços de repetição, podem também ser resolvidos usando recursividade. B Um algoritmo recursivo terá uma complexidade logarítmica, apresentando um desempenho inferior em tempo de execução superior a um algoritmo construído de forma iterativa. Você acertou! AULA 1 – TEMA 4. O desempenho em tempo de execução é superior. C Uma possível desvantagem de um algoritmo recursivo é o seu uso de memória mais elevado, uma vez que diversas instâncias de uma mesma função precisam ser alocadas na memória. D Um algoritmo que executa uma função denominada de soma, e que realiza a chamada de uma função denominada compara, não pode ser considerado um algoritmo recursivo, uma vez que não realizada chamadas de si mesma. E Um algoritmo recursivo comumente serve para resolver problemas do tipo “dividir para conquistar”, onde dividimos um problema em partes menores e mais fáceis de solucionar, para posteriormente agregar as pequenas soluções em uma maior. Questão 4/10 - Estrutura de Dados O algoritmo de ordenação por intercalação, também conhecido como merge sort, é um dos algoritmos estudados na AULA 2. Acerca deste algoritmo, assinale a alternativa CORRETA. Nota: 10.0 A A complexidade do merge sort é O(logn), pois o algoritmo trabalha com o princípio de dividir para conquistar. O(n.logn), pois temos duas funções. B O processo do merge sort consiste em dividir uma estrutura de dados de tamanho n (um vetor por exemplo) em 4 partes e ordenar estar partes, agregando-as posteriormente. O processo do merge sort consiste em dividir uma estrutura de dados de tamanho n (um vetor por exemplo) em n partes de tamanho unitário. C Ao dividir o conjunto de dado em duas partes menores, o merge sort sempre calcula a posição central da ruptura, que é dada pela média entre os valores posição inicial com a posição final, arredondando para cima. É feito um truncamento somente da parte inteira. D A intercalação é realizada utilizando um vetor auxiliar para ir armazenando os dados que vão sendo ordenados naquele momento. Você acertou! AULA 2 – TEMA 3. Figura 10. E A função merge sort pode ser implementada de forma recursiva, ou seja, realizando chamadas de si mesma até que o conjunto de dados seja indivisível. A ordenação só ocorre quando as partes menores forem agregadas novamente. A ordenação ocorre nas partes menores e indivisíveis. Questão 5/10 - Estrutura de Dados No primeiro assunto de nossa disciplina investigamos o que são estruturas de dados e como podemos classificá-las em tipos. Acerca deste assunto, assinale a alternativa INCORRETA: Nota: 10.0 A Um dado que pode ser decomposto em partes mais simples, é considerado um dado estruturado e, portanto, uma estrutura de dados. B Os tipos de dados manipulados por um algoritmo podem ser classificados em duas categorias distintas: os atômicos, que são dados indivisíveis, e os dados compostos, que podem ser divisíveis em mais partes menores. C Podemos classificar uma estrutura de dados como sendo do tipo homogênea (como registros) ou do tipo heterogênea (como vetores e matrizes). Você acertou! AULA 1 – TEMA 1. Podemos classificar uma estrutura de dados como sendo do tipo heterogênea (como registros) ou do tipo homogênea (como vetores e matrizes). D Uma estrutura homogênea é aquela cujo tipo dos dados nela armazenados são de um único tipo, como inteiro, real, caractere ou lógico E Uma estrutura contendo dados do tipo caractere e do tipo real pode ser considerada uma estrutura de dados heterogênea. Questão 6/10 - Estrutura de Dados No último tópico da AULA 2 vimos algoritmos de busca. Acerca de algoritmos de busca sequencial e binária, assinale a alternativa INCORRETA: Nota: 10.0 A Uma busca binária pode ser implementada utilizando o princípio de dividir para conquistar, e portanto, complexidade O(n²). Você acertou! O(logn) B A busca binária só funcionará com um vetor de dados já ordenado. Portanto, além de sua complexidade, existe a complexidade atrelada a uma possível ordenação prévia dos dados. C O algoritmo de busca sequencial pode ser implementado com um só laço de repetição, caracterizando O(n). D A busca sequencial poderá funcionar com um conjunto de dados ordenação ou não ordenado. E A busca binária realiza seu algoritmo de localização do dado dividindo o conjunto de dados ao meio, e comparando o valor central com o buscado. Questão 7/10 - Estrutura de Dados Uma função que implementa parte do algoritmo quick sort pode ser vista abaixo. Todo o resto do algoritmo foi omitido para que analisemos somente este método. O algoritmo completo pode ser visto no material PDF da Aula 2. No código, a função chamada de particao refere-se à função que localiza um pivô no vetor de dados e faz as respectivas trocas dos valores, ordenando seguindo algum critério. No código, vet é o vetor de dados, e troca é a função querealiza uma troca entre dois valores destoantes utilizando uma variável auxiliar. 1. int particao(int vet[], int p, int u) 2. { 3. int pivo, pivo_pos, i, j; 4. pivo_pos = (p + u) / 2; 5. pivo = vet[pivo_pos]; 6. 7. i = p - 1; 8. j = u + 1; 9. while (i < j) 10. { 11. do 12. { 13. j--; 14. } while (vet[j] > pivo); 15. 16. do 17. { 18. i++; 19. } while (vet[i] < pivo); 20. 21. if (i < j) 22. troca(vet, i, j); 23. } 24. return j; 25. } Acerca deste algoritmo, assinale a alternativa INCORRETA: Nota: 10.0 A A variável pivo_pos localiza a posição a qual conterá o valor de referência para comparações com todos os outros valores do vetor. B Na linha 11 até a linha 14 comparamos o pivô com todos os valores ao lado direito do mesmo. Caso um valor seja menor que o pivô, ele deve ser colocado para uma posição anterior a do pivô, ou no máximo, no local do pivô. C Na linha 16 até a linha 19 comparamos o pivô com todos os valores ao lado esquerdo do mesmo. Caso um valor seja maior que o pivô, ele deve ser colocado para uma posição posterior a do pivô, ou no máximo, no local do pivô. D A troca (linha 21 e 22) pode acontecer entre um valor do lado esquerdo e do lado direito, ou entre o próprio pivô e um dos valores destoantes de cada um dos lados. E Na linha 4 acessamos a posição do pivô no vetor e na linha 5 acessamos a posição correspondente do vetor conforme calculado na linha 4. Você acertou! Primeiro localizamos a posição (linha 4) e depois o valor daquela posição (linha 5). Questão 8/10 - Estrutura de Dados Uma função que implementa o algoritmo bubble sort pode ser vista abaixo. Todo o resto do algoritmo foi omitido para que analisemos somente o método de ordenação. No código, TAMANHOVETOR refere a um valor inteiro que corresponde a dimensão do vetor de dados. 1 - void BubbleSort(int vet[]) { 2 - int aux; 3 - for (int n = 1; n <= TAMANHOVETOR; n++) { 4 - for (int i = 0; i < (TAMANHOVETOR - 1); i++) { 5 - if (vet[i] < vet[i + 1]) { 6 - aux = vet[i]; 7 - vet[i] = vet[i + 1]; 8 - vet[i + 1] = aux; 9 - } } } } Acerca deste algoritmo, assinale a alternativa CORRETA: Nota: 10.0 A Na linha 5, o sinal de MENOR está incorreto. O algoritmo do bubble sort deve apresentar um sinal de MAIOR nesta linha. Tanto faz o sinal. Invertendo sinal inverte a forma como irá ordenar, o que não caracteriza um erro. B Não é possível substituir os laços de repetição do tipo PARA (FOR) por um laço do tipo REPITA (DO-WHILE). É possível implementar com qualquer laço de repetição. C Não é possível substituir os laços de repetição do tipo PARA (FOR) por um laço do tipo ENQUANTO (WHILE). É possível implementar com qualquer laço de repetição. D Na linha 3, seria possível fazer a variável n iniciar em zero e terminar em (TAMANHOVETOR-1) Você acertou! CORRETO. AULA 2 – TEMA 2 e conceitos básicos de programação e algoritmos. E A variável chamada de aux neste código tem como objetivo armazenar temporariamente o vetor de dados completo, para posteriormente ser ordenado. Ela serve para ajudar na troca individual de cada elemento. Questão 9/10 - Estrutura de Dados Chamamos de análise assintótica de algoritmos quando encontramos a complexidade de um algoritmo de maneira aproximada através de uma curva de tendência. Este tipo de análise e é a mais adotada para compararmos desempenho de algoritmos. Acerca da análise assintótica de um algoritmo, assinale a alternativa INCORRETA: Nota: 10.0 A Um algoritmo com três laços de repetição não encadeados contém uma complexidade assintótica, para o pior caso, O(n). B Na análise assintótica, fazemos o conjunto de dados de entrada da função custo tender ao infinito, mantendo na equação somente o termo de maior grau, ou seja, aquele que mais cresce na equação. C Um algoritmo com três laços de repetição aninhados contém uma complexidade assintótica, para o pior caso, O(n³). D A complexidade assintótica para o pior caso, também conhecida como BigO, representa o pior cenário para um algoritmo, ou seja, quando mais instruções precisam ser executadas, levando mais tempo para finalizar a execução. E A complexidade assintótica para o pior caso de um algoritmo contendo dois laços de repetição aninhados, sendo que o segundo laço só será executado caso uma condicional simples seja verdadeira, será O(n). Você acertou! AULA 1 – TEMA 3. O pior caso (BigO) nos diz que todas as linhas devem ser executadas, ou seja, a condicional será sempre verdadeira, e ambos laços de repetição serão sempre executados, sendo assim, complexidade O(n²). Questão 10/10 - Estrutura de Dados Uma função que implementa parte do algoritmo merge sort pode ser vista abaixo. Todo o resto do algoritmo foi omitido para que analisemos somente este método. O algoritmo completo pode ser visto no material PDF da Aula 2. No código, inicio e fim são variáveis inteiras que correspondem a posições no vetor de dados, parteinteira significa truncar em zero casas decimais o respectivo cálculo da linha 6 e intercala refere-se a uma função que realiza a ordenação neste método. 1. Função mergesort(X, inicio, fim) 2. Var 3. Meio: inteiro 4. Inicio 5. Se (inicio < fim) então 6. Meio <- parteinteira((inicio + fim) / 2) 7. mergesort(X, inicio, meio) 8. mergesort(X, meio + 1, fim) 9. Intercala(X, inicio, fim, meio) 10. Fimse 11. funfunção A assumindo que a dimensão do vetor de dados X é 10, e que a primeira chamada da função mergesort foi realizada com os seguintes parâmetros: Função mergesort(X, 0, 9). Acerca deste algoritmo, assinale a alternativa INCORRETA: Nota: 10.0 A Na segunda instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável meio vale 2. B Na primeira instância aberta da função mergesort na memória do programa, a variável meio corresponde ao valor 4. C Na segunda instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável fim vale 2. Você acertou! Fim vale 4. D Na terceira instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável fim vale 2. E Na primeira instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável fim vale 9. Questão 1/10 - Estrutura de Dados Na AULA 5 estudamos a árvore binária balanceada AVL. Observe um exemplo de árvore AVL abaixo: Suponha que você quer remover o nó folha de valor 99. Acerca do balanceamento e rotação desta árvore sem o 99. Assinale a alternativa CORRETA: Nota: 10.0 A A árvore ficará balanceada e não precisará de rotação nenhuma. B A árvore ficará com um desbalanceamento de valor 2 na raiz. C O nó filho de valor 80 está com balanceamento 0, resultando em uma rotação simples para a direta. Você acertou! Raiz -> Desbalanceada = -2. Filho da esquerda -> Balanceado = 0 Rotação simples para a direita D A árvore está com um desbalanceamento de valor -2 na raiz, resultando em uma rotação simples para a esquerda. E O nó filho de valor 80 está com balanceamento 1, resultando em uma dupla com filho para a esquerda e pai para a direita. Questão 2/10 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos. Abaixo temos uma imagem de um grafo. Acerca do grafo acima, assinale a alternativa CORRETA. Nota: 0.0 A O grau do vértice V1 é 3. O grau é 4. Pois é o número de arestas incidentes. B Todos os vértices deste grafo têm o mesmo grau, caracterizando um grafo trivial. Tem o mesmo grau, mas o grafo é chamado de ponderado. C Este grafo é do tipo completo. Sim. Todos os vértices estão conectados por uma e somente uma aresta. D Se removermos qualquer uma das arestas do grafo, estaríamos transformando o grafo em um do tipo completo. O grafo já é completo. Se remover uma aresta qualquer, ele deixa de ser completo. E A aresta que conecta V1 e V3 e V1 E v4 podem serchamadas de laços. Laço é uma aresta com um só vértice. Questão 3/10 - Estrutura de Dados Na AULA 5 estudamos grafos e seus algoritmos de busca. Acerca da busca em largura no grafo, assinale a alternativa INCORRETA. Nota: 10.0 A A busca em largura trabalha com o uma fila, a qual mantém todos os vértices que ainda serão visitados. B Um vértice conectado por uma aresta com o vértice de origem contém distância um. C A busca em largura trabalha com o conceito de distâncias, onde sempre acessamos um vizinho que está a um salto de distância do vértice atualmente visitado e que já tenha sido visitado. Você acertou! Que não tenha sido visitado ainda. D Quando percorremos a lista de vizinhos de um vértice, vamos colocando cada vizinho ainda não visitado na fila, pois eles serão os próximos a serem acessados. E O vértice de origem é aquele cuja distância é zero. Questão 4/10 - Estrutura de Dados Na AULA 4 estudamos a inserção em uma árvore binária. Abaixo temos um código em linguagem C com uma função de inserção na árvore binária, considerando ela como uma Binary Search Tree (BST). 1. void Inserir(ElementoDaArvoreBinaria ** ElementoVarredura, int num) { 2. 3. if (*ElementoVarredura == NULL) 4. { 5. ElementoDaArvoreBinaria *NovoElemento = NULL; 6. NovoElemento = (ElementoDaArvoreBinaria *)malloc(sizeof(ElementoDaArvoreBinaria)); 7. NovoElemento->esquerda = NULL; 8. NovoElemento->direita = NULL; 9. 10. NovoElemento->dado = num; 11. *ElementoVarredura = NovoElemento; 12. return; 13. } 14. 15. if (num < (*ElementoVarredura)->dado) 16. { 17. Inserir(&(*ElementoVarredura)->esquerda, num); 18. } 19. else 20. { 21. if (num >(*ElementoVarredura)->dado) 22. { 23. Inserir(&(*ElementoVarredura)->direita, num); 24. } 25. } 26. } Acerca de árvores binárias e do código acima, assinale a alternativa CORRETA. Nota: 10.0 A Nas linhas 15 a 25 a função testa para qual ramo da árvore irá seguir, direito ou esquerdo, chamando novamente a função de inserção de forma recursiva. Você acertou! Correto. B Na linha 3 temos um teste condicional simples que tem como objetivo verificar se a árvore binária está completamente vazia, ou não. Verifica se AQUELE ELEMENTO está vazio, não a arvore toda; C Todo o código colocado entre as linhas 15 e 25 poderiam estar dentro de um SENÃO que faz parte da condicional da linha 4. Não seria possível isso, pois as linhas 15 a 25 precisam ser executadas independentemente da condição da linha 3; D Na linha 2 temos a declaração da função, onde o primeiro parâmetro é uma variável que foi declarada com dois asteriscos (**). Deveria ser somente um, pois dois asteriscos não são permitidos na linguagem C. É permitido e está correto. Porque temos um ponteiro para outro ponteiro, caracterizando dois asteriscos; E O uso do um asterisco antes do nome da variável, como na linha 3 por exemplo, significa que queremos manipular o endereço daquela variável. O asterisco indica o conteúdo indireto para qual o ponteiro aponta. Questão 5/10 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos. Acerca de grafos e seus aspectos construtivos, assinale a alternativa INCORRETA. Nota: 10.0 A Um laço ocorre quando uma aresta está conectada em um só vértice. B Um grafo completo é aquele que contém uma, e somente, aresta para cada par distinto de vértices. C Um grafo ponderado é aquele no qual todas suas arestas contém um peso. D Um grafo trivial é aquele que apresente somente um vértice e uma aresta; Você acertou! Somente um vértice e nenhuma aresta. AULA 1 – TEMA 1. E Encontramos arestas múltiplas em um grafo quando duas arestas conectam os mesmos vértices; Questão 6/10 - Estrutura de Dados Na AULA 4 estudamos as diferentes consultas em árvores binárias. Observe o código de consulta em ordem na árvore, assumindo que os dados cadastrados são do tipo inteiro. 1. void Consultar_EmOrdem(ElementoDaArvoreBinaria * ElementoVarredura) 2. { 3. if (ElementoVarredura) 4. { 5. Consultar_EmOrdem(ElementoVarredura->esquerda); 6. printf("%d\t", ElementoVarredura->dado); 7. Consultar_EmOrdem(ElementoVarredura->direita); 8. } 9. } Acerca de consulta em árvore e do código acima, alternativa CORRETA. Nota: 0.0 A A linha 7 poderá nunca ser executada no código acima. Basta que não exista nenhum elemento para a direita. Existindo elemento para a direita, ou não, a linha 7 é executada, pois não temos nenhum teste condicional que impeça isso. B A linha 3 verifica se a variável ElementoVarredura é igual a zero. Ela verifica se a variável está NULA (vazia). Que é um conceito diferente de verificar se é igual a valor numérico zero. C A impressão dos dados em pré-ordem poderia ser feita se invertêssemos as linhas 6 e 7. O correto seria inverter as linhas 5 e 6. D A impressão dos dados em pós-ordem poderia ser feita se invertêssemos as linhas 5 e 7. O correto seria inverter as linhas 6 e 7. E Se quiséssemos imprimir os elementos da árvore de maneira decrescente, ou seja, do maior para o menor, poderíamos trocar as linhas 5 e 7. CORRETO. A consulta EM ORDEM, por padrão é crescente. Se invertermos a ordem fica decrescente. Questão 7/10 - Estrutura de Dados Na AULA 4 estudamos árvores binárias. Acerca de árvore binárias e a visualização dos dados em uma árvore construída para funcionar como uma Binary Search Tree, e considerando uma árvore binária onde os elementos menores ficam no ramo esquerdo e os maiores no ramo direito, assinale a alternativa CORRETA. Nota: 10.0 A Como a árvore binária não apresenta sequência/ordem fixas, podemos listar seus dados de diferentes maneiras: pré-ordem, ordem e pós-ordem. Você acertou! B Uma visualização da árvore em ordem significa lista os elementos em ordem decrescente. Ordenação crescente; C Se fizermos uma listagem iniciando na direita, depois a raiz e depois o ramo esquerdo estaremos listando os elementos de maneira crescente. Decrescente; D A impressão de valores em pré-ordem resultará em uma impressão inversa/oposto da em pós-ordem. Não existe a relação de oposição entre eles. E Só é possível visualizar os dados de uma árvore binária caso não exista nenhum nó com grau 0. Não existe a relação entre grau e a visualização da árvore. Questão 8/10 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos e suas representações matemáticas Acerca do grafo e suas representações matemáticas, assinale a alternativa INCORRETA. Nota: 10.0 A Na representação por lista de adjacências, temos um conjunto de listas encadeadas, onde cada lista conterá todos os vizinhos de um único vértice; B Uma representação por matriz de incidências representa um grafo na forma de uma matriz, onde as linhas são os vértices e as colunas as arestas; C Uma representação por matriz de adjacências representa um grafo na forma de uma matriz, onde as linhas e as colunas são os vértices; D Uma representação por lista de adjacências representa um grafo na forma de um conjunto de listas encadeadas.; E Na representação por lista de adjacências não podemos repetir um vértice em duas listas encadeadas distintas. Você acertou! Podemos repetir, pois cada lista conterá todos os vizinhos de cada vértice. Questão 9/10 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos. Abaixo temos uma imagem de um grafo. Acerca do grafo acima, assinale a alternativa CORRETA. Nota: 10.0 A O grafo contém arestas múltiplas, pois temos mais de um caminho para sair de V1 e chegar em V9, por exemplo. Arestas múltiplas são para arestas com os mesmos vértices de origem e destino. B O grau do vértice V9 é 3. O grau é 4. Pois é o número de arestas incidentes. C Todos os vértices deste grafo têm o mesmo grau. Temos graus diferentes: 2, 3 e 4. D Este grafo é do tipo completo. No grafo completo, todos os vértices precisam estar conectados entre si por somente uma aresta. Neste grafo faltam diversas conexões. E O grau do vértice V4 é 3. Você acertou!Correto. Pois é o número de arestas incidentes. Questão 10/10 - Estrutura de Dados Na AULA 4 estudamos conceitos de árvores binárias. Acerca de árvores, assinale a alternativa abaixo: 1. ElementoDaArvoreBinaria *NovoElemento = NULL; 2. NovoElemento = (ElementoDaArvoreBinaria *)malloc(sizeof(ElementoDaArvoreBinaria)); 3. NovoElemento->esquerda = NULL; 4. NovoElemento->direita = NULL; 5. 6. NovoElemento->dado = num; 7. *ElementoVarredura = NovoElemento; Acerca de árvores e seus aspectos construtivos, assinale a alternativa INCORRETA. Nota: 0.0 A O código refere a inicialização de um nó da árvore, onde alocamos a variável na memória e inicializamos os campos do registro. Linha 2 contém a alocação, linhas 3, 4 e 5 contém a inicialização. B Baseado no código acima, podemos afirmar com certeza que o registro que armazena cada elemento da árvore contém um dado do tipo inteiro e dois ponteiros. Não sabemos o tipo do dado pelo código acima. C Na linha 2 alocamos uma variável na memória destinada ao programa. O espaço alocado é igual a quantidade de Bytes usada pelo registro ElementoDaArvoreBinaria. Sim. A função malloc em C faz alocação e a função sizeof diz o tamanho a ser alocado. D Na linha 1, a variável NovoElemento é declarada como sendo um ponteiro para um tipo de variável chamado ElementoDaArvoreBinaria. Sim. O asterisco indicará o ponteiro; E Nas linhas 3, 4 e 6 estamos acessando os campos de um registro. Em linguagem C, um campo de uma variável ponteiro é acessado com uma flecha para a direta ‘->’, e não com um PONTO. Se usarmos PONTO neste caso, como por exemplo NovoElemento.esquerda, não irá funcionar. Exatamente; Questão 1/12 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos. Abaixo temos uma imagem de um grafo. Acerca do grafo acima, assinale a alternativa CORRETA. Nota: 10.0 A O grafo contém arestas múltiplas, pois temos mais de um caminho para sair de V1 e chegar em V9, por exemplo. Arestas múltiplas são para arestas com os mesmos vértices de origem e destino. B O grau do vértice V9 é 3. O grau é 4. Pois é o número de arestas incidentes. C Todos os vértices deste grafo têm o mesmo grau. Temos graus diferentes: 2, 3 e 4. D Este grafo é do tipo completo. No grafo completo, todos os vértices precisam estar conectados entre si por somente uma aresta. Neste grafo faltam diversas conexões. E O grau do vértice V4 é 3. Você acertou! Correto. Pois é o número de arestas incidentes. Questão 2/12 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos. Acerca de grafos e seus aspectos construtivos, assinale a alternativa INCORRETA. Nota: 10.0 A Um laço ocorre quando uma aresta está conectada em um só vértice. B Um grafo completo é aquele que contém uma, e somente, aresta para cada par distinto de vértices. C Um grafo ponderado é aquele no qual todas suas arestas contém um peso. D Um grafo trivial é aquele que apresente somente um vértice e uma aresta; Você acertou! Somente um vértice e nenhuma aresta. AULA 1 – TEMA 1. E Encontramos arestas múltiplas em um grafo quando duas arestas conectam os mesmos vértices; Questão 3/12 - Estrutura de Dados Uma implementação do algoritmo de ordenação do tipo bubble sort pode ser visto abaixo. As partes que envolvem impressão de dados na tela e leitura de dados foram omitidas para um melhor entendimento do que é necessário na questão. X[TAMANHOVETOR], i, j, aux: inteiro para i de 1 até TAMANHOVETOR faça para j de 0 até (TAMANHOVETOR - 2) faça se (X[j] > X[j + 1]) então aux <- X[j] X[j] <- X[j + 1] X[j + 1] <- aux fimse fimpara fimpara Acerca deste algoritmo, assinale a alternativa CORRETA: Nota: 10.0 A O algoritmo apresentado no exercício realizado a ordenação de dados numéricos, inteiros, em ordem decrescente. Ordenação é crescente. B As linhas de código que correspondem a troca dos valores usando uma variável auxiliar poderiam ser também escritas da seguinte maneira: aux <- X[j+1] X[j+1] <- X[j] X[j] <- aux Você acertou! AULA 2 – TEMA 2. CORRETO. C Se precisarmos ordenar dados não numéricos, como caracteres, precisaremos repensar em toda a lógica do bubble sort, não sendo possível adaptar o código facilmente. Basta adaptarmos a linha da condicional para funcionar com outro tipo de dado. D Não é possível implementar o bubble sort com laços de repetição do tipo enquanto. É possível implementar com qualquer tipo de laço, para, enquanto ou repita. E A complexidade deste algoritmo, para o pior caso, é O(logn). Complexidade O(n²). Questão 4/12 - Estrutura de Dados Uma função que implementa parte do algoritmo merge sort pode ser vista abaixo. Todo o resto do algoritmo foi omitido para que analisemos somente este método. O algoritmo completo pode ser visto no material PDF da Aula 2. No código, inicio e fim são variáveis inteiras que correspondem a posições no vetor de dados, parteinteira significa truncar em zero casas decimais o respectivo cálculo da linha 6 e intercala refere-se a uma função que realiza a ordenação neste método. 1. Função mergesort(X, inicio, fim) 2. Var 3. Meio: inteiro 4. Inicio 5. Se (inicio < fim) então 6. Meio <- parteinteira((inicio + fim) / 2) 7. mergesort(X, inicio, meio) 8. mergesort(X, meio + 1, fim) 9. Intercala(X, inicio, fim, meio) 10. Fimse 11. funfunção A assumindo que a dimensão do vetor de dados X é 10, e que a primeira chamada da função mergesort foi realizada com os seguintes parâmetros: Função mergesort(X, 0, 9). Acerca deste algoritmo, assinale a alternativa INCORRETA: Nota: 10.0 A Na segunda instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável meio vale 2. B Na primeira instância aberta da função mergesort na memória do programa, a variável meio corresponde ao valor 4. C Na segunda instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável fim vale 2. Você acertou! Fim vale 4. D Na terceira instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável fim vale 2. E Na primeira instância aberta da função mergesort na memória do programa, a variável inicio vale zero e a variável fim vale 9. Questão 5/12 - Estrutura de Dados Na AULA 5 estudamos conceitos de grafos. Abaixo temos uma imagem de um grafo. Acerca do grafo acima, assinale a alternativa CORRETA. Nota: 10.0 A O grau do vértice V1 é 3. O grau é 4. Pois é o número de arestas incidentes. B Todos os vértices deste grafo têm o mesmo grau, caracterizando um grafo trivial. Tem o mesmo grau, mas o grafo é chamado de ponderado. C Este grafo é do tipo completo. Você acertou! Sim. Todos os vértices estão conectados por uma e somente uma aresta. D Se removermos qualquer uma das arestas do grafo, estaríamos transformando o grafo em um do tipo completo. O grafo já é completo. Se remover uma aresta qualquer, ele deixa de ser completo. E A aresta que conecta V1 e V3 e V1 E v4 podem ser chamadas de laços. Laço é uma aresta com um só vértice. Questão 6/12 - Estrutura de Dados O algoritmo de ordenação rápida, também conhecido como quick sort, é um dos algoritmos estudados na AULA 2. Acerca deste algoritmo, assinale a alternativa CORRETA. Nota: 10.0 A A complexidade do quick sort é O(n²). Isso significa que ele sempre terá a mesma eficiência de um bubble sort. Somente o pior caso do bubble e do quick são iguais. Se considerarmos cenários melhores o quick sort se sai bem melhor que o bubble sort. Veja o experimento feito na AULA PRÁTICA 1 para mais detalhes. B O quick sort trabalha com o conceito de pivô, que é o elemento usado nas comparações, comparando sempre o seu valor com todos os valores do lado direito do pivô, enquanto que o lado esquerdo permanece já ordenado. Ambos os lados são comparados, esquerdo e direito. C O quick sort trabalha com o conceito de pivô, que é o elemento usado nas comparações, comparando sempre o seu valor com todos os valores do lado esquerdodo pivô, enquanto que o lado direito permanece já ordenado. Ambos os lados são comparados, esquerdo e direito. D O quick sort trabalha com uma troca de valores utilizando uma variável auxiliar, da mesma maneira feita no bubble sort. Você acertou! AULA 2 – TEMA 4 – CORRETO. E O quick sort só pode ser executado para um tamanho de conjunto de dados máximo igual a 1000, pois mais do que isso o uso de memória pelo algoritmo é muito grande. O limite máximo dependerá da memória disponível, não sendo limitado ao valor de 1000. Questão 7/12 - Estrutura de Dados O algoritmo abaixo foi desenvolvido empregando uma lógica iterativa: Função Calcula (n: inteiro, x: inteiro): inteiro y: inteiro para i de 0 até n faça se (x < 0) então para i de 0 até n faça y = y + 1 fimpara senão para i de 0 até x faça y = y + 1 fimpara fimse fimpara retorne y Fimfunção Acerca ao algoritmo acima, e trabalhando com os conceitos de complexidade assintótica e recursividade, assinale a alternativa CORRETA: Nota: 0.0 A A função contém três laços de repetição, sendo que todos os três laços podem acabar sendo executados cada vez que esta função por chamada. Como o valor de x recebido como parâmetro nunca muda dentro da mesma chamada da função, teremos somente 2 laços sendo executados por vez devido a condicional composta. B A complexidade da função, para o pior caso será O(n³). Como temos somente 2 laços aninhados, a complexidade será O(n²). C A função não realiza chamadas de si mesma, portanto pode ser considerada uma função recursiva. Uma função recursiva é a que realizada chamadas de si mesma. D Caso exista a possibilidade de implementação deste algoritmo usando uma função recursiva, e sem uso de laços de repetição, a complexidade em tempo de execução da implementação irá melhorar. AULA 1 – TEMA 3, 4 E 5. Sim, pois implementando com recursividade teremos uma complexidade atrelada a um crescimento logarítmico. E Caso substituíssemos todos os laços de repetição do tipo para, por laços do tipo enquanto, o desempenho do algoritmo em tempo de execução irá melhorar significativamente, uma vez que o laço enquanto tem um custo inferior ao do para. O custo de todos os três tipos de laços de repetição é o mesmo na análise de complexidade e, virtualmente não faz diferença qual você utiliza. Questão 8/12 - Estrutura de Dados O algoritmo de ordenação por intercalação, também conhecido como merge sort, é um dos algoritmos estudados na AULA 2. Acerca deste algoritmo, assinale a alternativa CORRETA. Nota: 10.0 A A complexidade do merge sort é O(logn), pois o algoritmo trabalha com o princípio de dividir para conquistar. O(n.logn), pois temos duas funções. B O processo do merge sort consiste em dividir uma estrutura de dados de tamanho n (um vetor por exemplo) em 4 partes e ordenar estar partes, agregando-as posteriormente. O processo do merge sort consiste em dividir uma estrutura de dados de tamanho n (um vetor por exemplo) em n partes de tamanho unitário. C Ao dividir o conjunto de dado em duas partes menores, o merge sort sempre calcula a posição central da ruptura, que é dada pela média entre os valores posição inicial com a posição final, arredondando para cima. É feito um truncamento somente da parte inteira. D A intercalação é realizada utilizando um vetor auxiliar para ir armazenando os dados que vão sendo ordenados naquele momento. Você acertou! AULA 2 – TEMA 3. Figura 10. E A função merge sort pode ser implementada de forma recursiva, ou seja, realizando chamadas de si mesma até que o conjunto de dados seja indivisível. A ordenação só ocorre quando as partes menores forem agregadas novamente. A ordenação ocorre nas partes menores e indivisíveis. Questão 9/12 - Estrutura de Dados No último tópico da AULA 2 vimos algoritmos de busca. Acerca de algoritmos de busca sequencial e binária, assinale a alternativa INCORRETA: Nota: 10.0 A Uma busca binária pode ser implementada utilizando o princípio de dividir para conquistar, e portanto, complexidade O(n²). Você acertou! O(logn) B A busca binária só funcionará com um vetor de dados já ordenado. Portanto, além de sua complexidade, existe a complexidade atrelada a uma possível ordenação prévia dos dados. C O algoritmo de busca sequencial pode ser implementado com um só laço de repetição, caracterizando O(n). D A busca sequencial poderá funcionar com um conjunto de dados ordenação ou não ordenado. E A busca binária realiza seu algoritmo de localização do dado dividindo o conjunto de dados ao meio, e comparando o valor central com o buscado. Questão 10/12 - Estrutura de Dados Na AULA 4 estudamos árvores binárias. Acerca de árvore binárias e a visualização dos dados em uma árvore construída para funcionar como uma Binary Search Tree, e considerando uma árvore binária onde os elementos menores ficam no ramo esquerdo e os maiores no ramo direito, assinale a alternativa CORRETA. Nota: 10.0 A Como a árvore binária não apresenta sequência/ordem fixas, podemos listar seus dados de diferentes maneiras: pré-ordem, ordem e pós-ordem. Você acertou! B Uma visualização da árvore em ordem significa lista os elementos em ordem decrescente. Ordenação crescente; C Se fizermos uma listagem iniciando na direita, depois a raiz e depois o ramo esquerdo estaremos listando os elementos de maneira crescente. Decrescente; D A impressão de valores em pré-ordem resultará em uma impressão inversa/oposto da em pós-ordem. Não existe a relação de oposição entre eles. E Só é possível visualizar os dados de uma árvore binária caso não exista nenhum nó com grau 0. Não existe a relação entre grau e a visualização da árvore. Questão 11/12 - Estrutura de Dados (questão opcional) Chamamos de análise assintótica de algoritmos quando encontramos a complexidade de um algoritmo de maneira aproximada através de uma curva de tendência. Este tipo de análise e é a mais adotada para compararmos desempenho de algoritmos. Acerca da análise assintótica de um algoritmo, assinale a alternativa INCORRETA: Nota: 0.0 A Um algoritmo com três laços de repetição não encadeados contém uma complexidade assintótica, para o pior caso, O(n). B Na análise assintótica, fazemos o conjunto de dados de entrada da função custo tender ao infinito, mantendo na equação somente o termo de maior grau, ou seja, aquele que mais cresce na equação. C Um algoritmo com três laços de repetição aninhados contém uma complexidade assintótica, para o pior caso, O(n³). D A complexidade assintótica para o pior caso, também conhecida como BigO, representa o pior cenário para um algoritmo, ou seja, quando mais instruções precisam ser executadas, levando mais tempo para finalizar a execução. E A complexidade assintótica para o pior caso de um algoritmo contendo dois laços de repetição aninhados, sendo que o segundo laço só será executado caso uma condicional simples seja verdadeira, será O(n). AULA 1 – TEMA 3. O pior caso (BigO) nos diz que todas as linhas devem ser executadas, ou seja, a condicional será sempre verdadeira, e ambos laços de repetição serão sempre executados, sendo assim, complexidade O(n²). Questão 12/12 - Estrutura de Dados (questão opcional) Na AULA 4 estudamos a inserção em uma árvore binária. Abaixo temos um código em linguagem C com uma função de inserção na árvore binária, considerando ela como uma Binary Search Tree (BST). 1. void Inserir(ElementoDaArvoreBinaria ** ElementoVarredura, int num) { 2. 3. if (*ElementoVarredura == NULL) 4. { 5. ElementoDaArvoreBinaria *NovoElemento = NULL; 6. NovoElemento = (ElementoDaArvoreBinaria *)malloc(sizeof(ElementoDaArvoreBinaria)); 7. NovoElemento->esquerda = NULL; 8. NovoElemento->direita = NULL; 9. 10. NovoElemento->dado = num; 11. *ElementoVarredura = NovoElemento; 12. return; 13. } 14. 15. if (num < (*ElementoVarredura)->dado) 16. { 17. Inserir(&(*ElementoVarredura)->esquerda, num); 18. } 19. else 20. { 21. if (num >(*ElementoVarredura)->dado) 22. { 23. Inserir(&(*ElementoVarredura)->direita,num); 24. } 25. } 26. } Acerca de árvores binárias e do código acima, assinale a alternativa CORRETA. Nota: 0.0 A Nas linhas 15 a 25 a função testa para qual ramo da árvore irá seguir, direito ou esquerdo, chamando novamente a função de inserção de forma recursiva. Correto. B Na linha 3 temos um teste condicional simples que tem como objetivo verificar se a árvore binária está completamente vazia, ou não. Verifica se AQUELE ELEMENTO está vazio, não a arvore toda; C Todo o código colocado entre as linhas 15 e 25 poderiam estar dentro de um SENÃO que faz parte da condicional da linha 4. Não seria possível isso, pois as linhas 15 a 25 precisam ser executadas independentemente da condição da linha 3; D Na linha 2 temos a declaração da função, onde o primeiro parâmetro é uma variável que foi declarada com dois asteriscos (**). Deveria ser somente um, pois dois asteriscos não são permitidos na linguagem C. É permitido e está correto. Porque temos um ponteiro para outro ponteiro, caracterizando dois asteriscos; E O uso do um asterisco antes do nome da variável, como na linha 3 por exemplo, significa que queremos manipular o endereço daquela variável. O asterisco indica o conteúdo indireto para qual o ponteiro aponta.
Compartilhar