Árvores binárias de busca são estruturas fundamentais que podem ser usadas em situações nas quais se pretende organizar os dados. Além disso, quando as inserções e remoções são bastante frequentes, estas são estruturas melhores do que arranjos ordenados.Com base no texto apresentado, escolha as afirmativas que complementam corretamente as informações já apresentadas:
Árvores binárias de busca são úteis para organizar dados utilizando uma chave de busca. 2. Arranjos ordenados são preferíveis às árvores binárias de busca. 3. Árvores binárias de busca são usadas para construir outras estruturas. 4. Árvores binárias de busca são menos eficientes que arranjos ordenados quando a ordenação dos dados é necessária. 5. Árvores binárias de busca são apropriadas para situações em que a organização dos dados é feita por meio de uma chave de busca.
Em estruturas de dados, uma árvore é um conjunto de nós onde existe um nó raiz r que pode conter subárvores ligadas diretamente a este nó. Uma subárvore é também uma árvore. Ressalta-se que não há um sucessor e um predecessor para cada nó de uma árvore e, por isto, estruturas lineares não são adequadas para representar este tipo de hierarquia nos dados.Assinale a alternativa que identifica corretamente uma das características de uma árvore de estrutura de dados.
Considere a implementação da classe BinarySearchTree em C++ e os métodos para imprimir o conteúdo de uma árvore binária de busca em pré-ordem (pre-order), in-ordem (in-order) e pós-ordem (post-order):void preOrderPrint() const {preOrderPrint(root);}void preOrderPrint(TreeNode* node) const {if (node == nullptr) {return;}node->aluno.display();preOrderPrint(node->left);preOrderPrint(node->right);}void inOrderPrint() const {inOrderPrint(root);}void inOrderPrint(TreeNode* node) const {if (node == nullptr) {return;}inOrderPrint(node->left);node->aluno.display();inOrderPrint(node->right);}void postOrderPrint() const {postOrderPrint(root);}void postOrderPrint(TreeNode* node) const {if (node == nullptr) {return;}postOrderPrint(node->left);postOrderPrint(node->right);node->aluno.display(); }I. O método preOrderPrint percorre a árvore binária de busca imprimindo primeiro o nó raiz, seguido pela subárvore esquerda e, por último, a subárvore direita.PORQUEII. O método postOrderPrint realiza o percurso da árvore binária de busca imprimindo os nós na seguinte ordem: subárvore esquerda, subárvore direita e, finalmente, o nó raiz.
Considere a implementação da classe BinarySearchTree em C++ e o método insert utilizado para incluir um novo aluno na árvore binária de busca:void insert(const Aluno& aluno) {root = insert(root, aluno);}TreeNode* insert(TreeNode* node, const Aluno& aluno) {if (node == nullptr) {return new TreeNode(aluno);}if (aluno.getRA() < node->aluno.getRA()) {node->left = insert(node->left, aluno);} else if (aluno.getRA() > node->aluno.getRA()) {node->right = insert(node->right, aluno);}return node; }I. O método insert insere um novo aluno na árvore binária de busca comparando o RA do aluno a ser inserido com o RA dos nós existentes na árvore.**PORQUE,**II.se o RA do aluno a ser inserido é menor que o RA do nó atual, o método insere o aluno na subárvore direita; caso contrário, insere na subárvore esquerda.A respeito dessas asserções, assinale a alternativa correta.
Considere as seguintes definições sobre árvores em estruturas de dados: A altura de um nó é o comprimento do caminho mais longo entre o nó até uma [preencher 1]. A profundidade de um nó é a [preencher 2] percorrida da raiz até o nó. Uma árvore binária é aquela em que abaixo de cada nó existem no máximo [preencher 3] subárvores.Os termos [preencher 1], [preencher 2] e [preencher 3] são corretamente substituídos por:
Considere o seguinte trecho de código que define um método destroyTree para destruir uma árvore binária utilizando caminhamento pós-ordem:void destroyTree(Node* node) {if (node == nullptr) {return;}destroyTree(node->left);destroyTree(node->right);std::cout << "Deletando nó com valor: " << node->data << std::endl;delete node;}Com base no código acima, qual das alternativas a seguir apresenta a ordem nas quais os nós são deletados:
Considere a implementação da função destroyTree em uma árvore binária de busca para destruir todos os nós da árvore utilizando o caminhamento pós-ordem. O código a seguir mostra a definição da classe BinarySearchTree com o método destroyTree:class BinarySearchTree {private:struct TreeNode {Aluno aluno;TreeNode* left;TreeNode* right;TreeNode(const Aluno& aluno) : aluno(aluno), left(nullptr), right(nullptr) {}};TreeNode* root;void destroyTree(TreeNode* node) {if (node == nullptr) {return;}destroyTree(node->left);destroyTree(node->right);std::cout << "Deletando nó com RA: " << node->aluno.getRA() << std::endl;delete node;}public:BinarySearchTree() : root(nullptr) {}~BinarySearchTree() {destroyTree(root);}};Com relação ao funcionamento do método destroyTree, observe as afirmativas a seguir:
O método destroyTree utiliza o caminhamento pré-ordem para deletar os nós da árvore. 2. O método destroyTree é chamado recursivamente para deletar todos os nós da árvore. 3. O método destroyTree deleta primeiro os nós das subárvores esquerda e direita antes de deletar o nó atual. 4. O método destroyTree é invocado automaticamente pelo destrutor da classe BinarySearchTree. 5. O método destroyTree não imprime nenhuma mensagem durante a destruição dos nós.
Considere a classe Aluno definida em C++ e sua utilização em uma árvore binária de busca. O código a seguir mostra a definição do nó da árvore binária de busca:struct TreeNode {Aluno aluno;TreeNode* left;TreeNode* right;TreeNode(const Aluno& aluno) : aluno(aluno), left(nullptr), right(nullptr) {}};Com relação à definição e utilização de um nó do tipo Aluno em uma árvore binária de busca, observe as afirmativas a seguir:
O struct TreeNode contém um objeto Aluno e dois ponteiros para outros nós. 2. O construtor do struct TreeNode inicializa o objeto Aluno e define os ponteiros left e right como nullptr. 3. A estrutura TreeNode permite criar uma árvore binária de busca que armazena objetos do tipo Aluno. 4. O método insert na árvore binária de busca deve comparar os atributos nome dos objetos Aluno para inserir um novo nó corretamente. 5. Para buscar um nó na árvore, é necessário comparar o atributo ra dos objetos Aluno.
As tabelas hash são estruturas de dados utilizadas para armazenar e buscar informações de maneira eficiente. Um exemplo prático da aplicação de tabelas hash é a organização de registros acadêmicos em uma universidade, onde o registro acadêmico (RA) do aluno é utilizado como chave de busca para encontrar o nome do aluno.Com base no exemplo da aplicação de tabelas hash em uma universidade para organizar registros acadêmicos, leia as alternativas abaixo e escolha a correta.
Os métodos de dispersão desempenham um papel fundamental na eficiência das tabelas de dispersão. Dois métodos amplamente utilizados são o método da divisão e o método da dobra. Cada método possui características distintas que influenciam sua aplicabilidade e eficiência.Sobre os métodos de dispersão utilizados em tabelas de dispersão, observe as afirmativas a seguir:I. No método da divisão, escolher 𝑚 como uma potência de 2 é ideal para garantir uma distribuição uniforme das chaves. II. No método da dobra, os dígitos da chave são somados sem levar em consideração o "vai um". III. O método da divisão utiliza o resto da divisão da chave 𝑥 por 𝑚 como endereço-base. IV. No método da dobra, a operação de "ou exclusivo" (ou ex) entre pedaços da chave pode ser utilizada para melhorar a distribuição das chaves.Está correto o que se afirma em:
No contexto de tabelas de dispersão, uma função de dispersão é utilizada para transformar uma chave em um índice da tabela. Este índice determina o compartimento onde a chave será armazenada. Uma técnica simples, porém eficaz, é utilizar o valor da chave como índice diretamente na tabela. No entanto, para evitar problemas de espaço, utiliza-se uma função de dispersão, que pode causar um fenômeno onde duas ou mais chaves são mapeadas para o mesmo índice.Leia o trecho a seguir:Uma técnica simples de mapeamento de chaves para índices é o [preencher 1], enquanto a função de dispersão ajuda a distribuir chaves entre os compartimentos. O fenômeno onde várias chaves são mapeadas para o mesmo índice é conhecido como [preencher 2], e o método de resolução deste problema é chamado de [preencher 3].Os termos [preencher 1], [preencher 2] e [preencher 3] são corretamente substituídos por:
Suponha que existam 𝑛 chaves a serem armazenadas em uma tabela 𝑇, sequencial e de dimensão 𝑚. As posições da tabela se situam no intervalo [0,m−1][0, m-1]. Em um caso simples, onde o número de chaves nn n é igual ao número de compartimentos 𝑚, os valores das chaves são 0, 1, ..., m−1m-1 Utiliza-se diretamente o valor de cada chave como seu índice na tabela, técnica conhecida como acesso direto. No entanto, para resolver a questão de armazenamento eficiente quando n<mn e m−nm-n é grande, emprega-se a função de dispersão h(x)h(x), que transforma cada chave 𝑥 em um valor no intervalo [0,m−1][0, m-1]. Se o compartimento h(x)h(x) estiver ocupado, ocorre uma colisão, é um procedimento especial é usado para o armazenamento de 𝑥.Dada a função de dispersão h=xmod5h = x \bmod 5 e as chaves 78 e 13, qual é o compartimento da tabela que causará a colisão?
Em uma tabela de dispersão, a eficiência da função de dispersão é fundamental para garantir uma boa performance. Uma função de dispersão eficiente deve cumprir certas condições ideais, cada uma com sua própria descrição. Essas condições incluem minimizar colisões, ser fácil de calcular e garantir que todos os compartimentos da tabela tenham a mesma probabilidade de serem escolhidos.Associe corretamente cada condição com a sua descrição correspondente, considerando as características essenciais para o bom funcionamento da tabela de dispersão.| | | | --- | --- | | Condições: | Descrições: | | 1 - Produzir um número baixo de colisões | A. Significa que todos os compartimentos têm a mesma probabilidade de serem escolhidos. | | 2 - Ser facilmente computável | B. Importante para evitar padrões conhecidos nas chaves. | | 3 - Ser uniforme | C. Essencial para minimizar o tempo de cálculo em tabelas armazenadas em memória. |Assinale a alternativa correta:
No estudo de tabelas hash, um problema comum é a ocorrência de colisões, que ocorrem quando duas chaves diferentes geram o mesmo valor de hash e apontam para a mesma posição na tabela. Para tratar essas colisões, podem ser utilizadas várias técnicas, como o encadeamento separado e o teste linear. O encadeamento separado utiliza uma estrutura de dados adicional, geralmente uma lista encadeada, para armazenar todos os elementos que colidem em uma mesma posição.Qual das alternativas a seguir descreve corretamente o funcionamento do encadeamento separado em uma tabela hash?
Na implementação de tabelas hash, é importante compreender a criação de métodos construtores e de acesso para manipulação dos dados. Suponhamos que a classe Aluno está sendo implementada com dois construtores, um sem parâmetros e outro com parâmetros, além de métodos de acesso (getters) para o RA e o nome.Considere a implementação da classe Aluno na tabela hash, leia as seguintes alternativas e assinale qual delas descreve corretamente a aplicação do método construtor sem parâmetros.
A eficiência de uma função de dispersão é determinada por várias condições essenciais para o bom funcionamento de uma tabela de dispersão. Essas condições garantem que as chaves sejam distribuídas de maneira uniforme e que o número de colisões seja minimizado.Com relação às características e desafios na implementação de funções de dispersão, analise as asserções a seguir e a relação proposta entre elas:I. Uma boa função de dispersão deve ser uniforme, ou seja, deve garantir que todos os compartimentos da tabela tenham a mesma probabilidade de serem escolhidos.PORQUEII. A uniformidade de uma função de dispersão é difícil de ser testada na prática devido à distribuição desconhecida das chaves.A respeito dessas asserções, assinale a alternativa correta:
Em uma tabela hash, as colisões ocorrem quando duas chaves diferentes são mapeadas para o mesmo índice do array. Diversas técnicas podem ser utilizadas para resolver essas colisões. Entre essas técnicas, o endereçamento aberto é amplamente utilizado.Assinale a alternativa que responde corretamente como o endereçamento aberto resolve colisões em uma tabela hash.
A função de hash desempenha um papel crucial na determinação da posição de armazenamento dos dados em uma tabela hash. Esta que é eficiente é essencial para minimizar colisões, que acontecem quando duas chaves distintas produzem o mesmo índice. Compreender o propósito e o funcionamento da função de hash é fundamental para o uso eficaz das tabelas hash.Com base no contexto apresentado, assinale a alternativa que identifica corretamente o propósito da função de hash em uma tabela hash.
A auditoria de configuração no desenvolvimento de software é um processo fundamental para garantir a integridade e consistência do sistema ao longo do ciclo de vida do projeto. Esse processo assegura que o software atenda aos critérios definidos, conferindo se os componentes estão de acordo com os parâmetros estabelecidos.Selecione a alternativa que descreve corretamente a auditoria de configuração:
O Robot Framework é uma ferramenta amplamente utilizada para a automação de testes, destacando-se pela flexibilidade e capacidade de ser executado em diversas plataformas e sistemas operacionais. Utilizando uma abordagem baseada em dados de teste, ele permite a criação e execução de testes automatizados de forma eficiente.Considerando as informações acima, identifique e selecione a alternativa correta sobre o Robot Framework:
A gestão de dependências no desenvolvimento de software é fundamental para garantir que as alterações feitas em um sistema sejam controladas e que seu impacto seja minimizado. A gestão de impacto envolve práticas que visam reduzir os efeitos que as mudanças de um desenvolvedor podem causar no trabalho dos outros, garantindo um processo de desenvolvimento mais eficiente.Assinale a alternativa que descreve uma prática importante na gestão de dependências e alterações.
No desenvolvimento de software, uma prática cada vez mais adotada é a automação dos testes. Essa abordagem visa garantir que os testes sejam executados de maneira eficiente e consistente, reduzindo a dependência de testes manuais que podem ser demorados e sujeitos a erro humano. Com a automação, é possível realizar um grande número de testes em um curto espaço de tempo, o que é particularmente útil em processos de entrega contínua. Além disso, a automação dos testes permite uma detecção mais rápida e frequente de defeitos, contribuindo para a melhoria contínua da qualidade do software.Qual é um dos principais benefícios dos testes automatizados?
Os testes de sistema envolvem uma série de verificações realizadas para assegurar que todos os componentes do software funcionam corretamente quando integrados. Esses testes têm como objetivo principal a execução completa do sistema, verificando se ele atende aos requisitos de desempenho, segurança e recuperação de falhas.Com base no texto sobre testes de sistema, assinale a afirmação correta sobre o processo de testes de sistema:
A gestão de configuração de software é um processo crítico que assegura que todas as partes de um projeto de software sejam organizadas e controladas de maneira eficaz. Essa prática envolve o rastreamento de várias versões de todos os artefatos produzidos durante o desenvolvimento, garantindo que mudanças possam ser feitas de maneira controlada e que todas as dependências sejam gerenciadas adequadamente.Selecione a alternativa que apresenta um dos objetivos da gestão de versão dentro da gestão de configuração de software.
A validação de software envolve um conjunto de atividades destinadas a garantir que o produto final atenda aos requisitos e expectativas dos usuários. Essas atividades podem ocorrer em várias fases do desenvolvimento e podem incluir a participação de diferentes stakeholders.Assinale a alternativa que demonstra corretamente um aspecto de testes de validação.
Ao desenvolver software, a criação de testes automatizados para cada unidade de código é uma prática comum. À medida que o software cresce, esses testes permitem validar tanto as novas funcionalidades quanto garantir que as antigas ainda funcionem corretamente, mesmo após novas implementações. Testes de regressão são particularmente importantes nesse contexto, pois verificam se as funcionalidades previamente desenvolvidas não foram prejudicadas.Assinale a alternativa que analisa corretamente qual dos benefícios abaixo está diretamente associado ao uso de testes de regressão automatizados no desenvolvimento de software.
A análise de desempenho é uma prática essencial em sistemas de informação para assegurar que os sistemas operem de forma eficiente e que atendam às expectativas dos usuários. Esta prática envolve a avaliação contínua dos sistemas para identificar gargalos e implementar melhorias. Sistemas de informação com desempenho insatisfatório podem causar perda de produtividade e insatisfação dos usuários. Avaliar periodicamente o desempenho é fundamental para manter a qualidade e a eficácia dos serviços prestados.Diante disso, assinale a alternativa CORRETA, que reconhece a importância da análise de desempenho em sistemas de informação.
Existem diversas motivações para tentativas de invasão a sistemas de informação. Essas motivações podem variar desde questões pessoais até objetivos financeiros. Compreender essas motivações é essencial para desenvolver estratégias eficazes de segurança.Com base nisso, é correto pontuar que algumas das principais motivações para tentativas de invasão a sistemas de informação é a:
No contexto do Desenvolvimento Dirigido por Testes (TDD), a escrita de testes automatizados é uma prática comum utilizada para verificar o comportamento do software durante o processo de desenvolvimento.Com relação a esse contexto e sobre o conteúdo estudado, analise as asserções a seguir e a relação proposta entre elas:I. O TDD melhora a qualidade do código ao exigir a criação de testes automatizados para todas as funcionalidades, garantindo que novas implementações não quebrem o sistema existente.PORQUEII. A prática de TDD permite que todos os testes antigos passem automaticamente em cada novo incremento, sem a necessidade de revisão manual dos testes anteriores.A respeito dessas asserções, assinale a alternativa correta.
No contexto da engenharia de software, o Desenvolvimento Dirigido por Testes (TDD) é uma prática que envolve a escrita de testes antes da implementação do código funcional. Essa abordagem tem se mostrado eficaz em diversas áreas, proporcionando uma série de benefícios que contribuem para a melhoria contínua do código e a qualidade do software.Com relação a este contexto e sobre o conteúdo estudado, analise as asserções a seguir e a relação proposta entre elas:I. O TDD facilita a depuração ao associar falhas a partes específicas do código.PORQUEII. O TDD elimina a necessidade de testes automatizados, dependendo apenas de testes manuais.A respeito dessas asserções assinale a alternativa correta: