









Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
resumo do conteúdo disponibilizado pela universidade no SIA
Tipologia: Esquemas
1 / 15
Esta página não é visível na pré-visualização
Não perca as partes importantes!










Definição de Algoritmo: Sequência finita de passos bem definidos para solucionar um problema. Complexidade: Relacionada à quantidade de situações diferentes a serem tratadas no algoritmo. Redução da Complexidade: Pode ser feita através da decomposição de problemas em sub-rotinas menores e mais simples.
Definição: Blocos de código que realizam tarefas específicas dentro de um programa. Vantagens: Simplificam o programa principal, diminuem a chance de erro e organizam o código. Estrutura: Sub-rotinas possuem um início, fim, e podem receber parâmetros e retornar valores.
Método Top-Down: Divisão de problemas em refinamentos sucessivos, criando módulos ou sub-algoritmos menores. Exemplo: Algoritmo para somar dois números usando uma sub-rotina.
Parâmetros: Valores que uma sub-rotina recebe para processar e gerar resultados. Passagem de Parâmetros: Pode ser por valor (não altera a variável original) ou por referência (altera a variável original).
Tipos Primitivos: Inteiro, real, caractere e lógico. Vetores: Arranjos unidimensionais que armazenam múltiplos valores do mesmo tipo. Registros: Estruturas que armazenam dados de diferentes tipos dentro de uma única variável, útil para representar entidades complexas como "Aluno" com nome e notas.
Vetores: Definidos por um tipo e tamanho, manipulados individualmente através de índices. Registros: Estruturas heterogêneas que podem conter diversos tipos de dados, organizados em campos, facilitando a manipulação de informações relacionadas.
Um algoritmo é um conjunto de passos usados para resolver um problema computacional. Ao criar um algoritmo, você deve considerar:
Um bom algoritmo deve ser:
Um algoritmo é correto se sempre dá a resposta certa. Porém, ele também deve ser eficiente – rápido e usar poucos recursos. Alguns problemas são tão complexos que levam muito tempo para serem resolvidos, mesmo com um algoritmo correto.
A complexidade de um algoritmo refere-se ao tempo e espaço que ele precisa para ser executado. Analisar a complexidade é importante para garantir que o algoritmo escolhido seja o mais eficiente possível, especialmente para problemas grandes.
A Notação O (Big-O) é usada para descrever a complexidade de um algoritmo, especialmente no pior caso. Ela ajuda a comparar diferentes algoritmos e escolher o melhor para um determinado problema.
Constante ((O(1))): Tempo fixo, independente do tamanho da entrada. Logarítmica ((O(\log n))): Usado em algoritmos que dividem o problema repetidamente. Linear ((O(n))): Cada elemento é processado uma vez. Quadrática ((O(n^2))): Processamento em pares, comum em laços aninhados. Cúbica ((O(n^3))): Usado em problemas complexos como multiplicação de matrizes. Exponencial e Fatorial: Crescem rapidamente e são usados em algoritmos de força bruta, mas são impraticáveis para grandes entradas. Esses conceitos ajudam a entender a eficiência dos algoritmos e escolher o mais adequado para resolver um problema específico, considerando sempre o pior caso possível. Recursividade é um método utilizado em matemática e programação para definir um problema ou calcular algo quebrando-o em subproblemas menores até chegar a um caso base, que é trivialmente resolvido. Existem dois componentes principais em uma definição recursiva:
Tipos de Recursividade:
1. O que é Ordenação? Ordenação é o processo de organizar um conjunto de dados em uma ordem específica, como numérica (1, 2, 3,...) ou alfabética (Ana, Bianca, ...). Essa organização facilita a recuperação de informações, como encontrar um nome em uma lista telefônica. 2. Chave de Ordenação A chave de ordenação é o critério usado para comparar e ordenar os dados. Por exemplo, em uma lista de nomes, a chave seria o nome em si. 3. Tipos de Ordenação Interna (in-place): Ocorre na memória principal, ideal para conjuntos de dados pequenos. Externa: Ocorre em armazenamento secundário (como discos), usada quando o conjunto de dados é muito grande para caber na memória principal. 4. Algoritmos de Ordenação Os algoritmos de ordenação organizam dados em uma sequência predefinida. Vamos discutir três tipos principais:
c Copiar código void selecao (int *v) { int i, j, aux, minimo, pos_minimo; for (i = 0 ; i < TAMANHO-1; i++) { minimo = v[i]; pos_minimo = i; for (j = i+ 1 ; j < TAMANHO; j++) { if (minimo > v[j]) { minimo = v[j]; pos_minimo = j; } } if (pos_minimo != i) { aux = v[pos_minimo]; v[pos_minimo] = v[i]; v[i] = aux; } } }
Bubble Sort: O(n²) para todos os casos. Insertion Sort: O(n) no melhor caso (já ordenado) e O(n²) no pior caso. Selection Sort: O(n²) para todos os casos, independentemente da ordem inicial. Esses algoritmos são fundamentais, especialmente para conjuntos de dados menores ou como base para entender métodos mais avançados.
Ideia principal: Divide o problema em partes menores, resolve essas partes, e depois combina as soluções. Isso é chamado de "dividir para conquistar". Passos básicos:
Se você tem o array [7, 2, 9, 4, 3, 8, 6, 1], o Merge Sort o dividiria assim:
Ideia principal: Também usa a técnica de "dividir para conquistar", mas de uma maneira diferente. Passos básicos:
Se você tem o array [23, 11, 66, 75, 6, 53, 21, 56], o Quick Sort escolheria um pivô, digamos 23 , e reorganizaria o array em [11, 6, 21, 23, 75, 66, 53, 56], depois repetiria o processo nas partes à esquerda e à direita de 23.
Merge Sort : Divide tudo em pequenas partes, ordena e depois junta. Sempre eficiente. Quick Sort : Escolhe um pivô, organiza e repete o processo. Geralmente rápido, mas pode ser lento em alguns casos. Esses dois algoritmos são fundamentais para a ordenação de dados em ciência da computação. Shell Sort Simplificado: O que é: O Shell Sort é um algoritmo de ordenação criado por Donald Shell. Ele é uma versão melhorada da ordenação por inserção, baseada no conceito de "diminuição dos incrementos". Como funciona:
o Pré-ordem : Visita-se o nó raiz, depois a subárvore esquerda, e por último a subárvore direita. o Em ordem simétrica : Visita-se primeiro a subárvore esquerda, depois o nó raiz, e por último a subárvore direita. o Pós-ordem : Visita-se primeiro a subárvore esquerda, depois a direita, e por último o nó raiz.
Dada uma árvore onde o nó raiz tem valor 10 e tem dois filhos (8 à esquerda e 4 à direita), o percurso em pré-ordem seria: 10, 8, 2, 6, 4.
Complexidade : O tempo de execução para percorrer n nós em uma árvore é O(n) , pois cada nó é acessado três vezes (para cada subárvore e o nó em si).
Os percursos em pré-ordem, em ordem simétrica e pós-ordem podem ser implementados de forma recursiva, visitando os nós de acordo com as regras de cada tipo de percurso. Este resumo simplifica os conceitos principais e a lógica dos percursos em árvores binárias, sem entrar em detalhes técnicos complexos.
Pré-ordem, Ordem Simétrica, e Pós-ordem : São três tipos de percursos que você pode realizar em uma árvore binária. Complexidade : O tempo que o algoritmo leva para percorrer a árvore é proporcional ao número de nós, ou seja, O(n), onde n é o número de nós.
Objetivo : Percorrer uma árvore binária sem usar recursão (ou seja, sem chamar a função dentro dela mesma). Pilha : Usamos uma pilha para manter o controle de quais nós visitamos e em qual "momento" (1, 2 ou 3) estamos durante a visita. o Momento 1 : Visitamos o nó pela primeira vez. o Momento 2 : Terminamos de explorar o lado esquerdo do nó. o Momento 3 : Terminamos de explorar o lado direito do nó.
Passo a Passo : Inserimos o nó raiz na pilha e seguimos removendo e inserindo nós na pilha conforme o momento. Dependendo do percurso (pré-ordem, ordem simétrica ou pós-ordem), a visita ao nó acontece em um momento específico. Pré-ordem : Visitamos o nó no momento 1.
Ordem Simétrica : Visitamos o nó no momento 2. Pós-ordem : Visitamos o nó no momento 3.
A pilha vai sendo manipulada para seguir a ordem correta de visitação dos nós, conforme o percurso desejado. A impressão da árvore em pré-ordem vai seguir a sequência dos nós visitados.
Inserções na Pilha : Cada nó é inserido na pilha até três vezes, mas isso não altera a complexidade total, que permanece sendo O(n).
Para converter o algoritmo para ordem simétrica ou pós-ordem , basta mudar o momento em que a função de visita é chamada.
Eficiência na Busca : Para tornar a busca mais eficiente e alcançar uma complexidade de O(log n), usamos árvores binárias de busca, onde os elementos estão organizados de maneira que facilita a busca rápida.
Definição: Uma árvore binária de busca (BST) é uma estrutura de dados onde cada nó tem no máximo dois filhos: um à esquerda e outro à direita. Regra Principal: o Para cada nó, todos os valores na subárvore à esquerda são menores que o valor do nó. o Todos os valores na subárvore à direita são maiores que o valor do nó.
Objetivo: Encontrar um valor específico na árvore. Funcionamento:
automaticamente ajustada por rotações (simples ou duplas) para restaurar o balanceamento. Rotações: São as operações que corrigem o balanceamento. Existem rotações simples (para a esquerda ou direita) e rotações duplas (esquerda-direita ou direita-esquerda), dependendo de como a árvore se desbalanceia após uma inserção ou remoção. Altura das Árvores AVL: A altura de uma árvore AVL é proporcional ao logaritmo do número de nós, garantindo que o tempo para buscar, inserir ou remover um nó permaneça eficiente. Mesmo nos piores casos, a altura das árvores AVL está dentro de limites que asseguram o balanceamento. Operações: Busca: Funciona como em qualquer árvore binária de busca, com complexidade O(log n) devido ao balanceamento. Inserção: Após inserir um novo nó, a árvore pode precisar de rotações para restaurar o balanceamento. Remoção: Similar à inserção, mas o foco é garantir que a remoção não desbalanceie a árvore, usando rotações se necessário. Árvores de Fibonacci: Representam os piores cenários em termos de altura máxima, mas mesmo assim, a altura dessas árvores ainda é proporcional a O(log n), o que mantém a eficiência. Esses conceitos garantem que as árvores AVL sejam balanceadas e eficientes, melhorando significativamente o desempenho em relação às árvores binárias desbalanceadas.
Teoria dos Grafos : Originada no século XVII, a teoria dos grafos começou com o problema das "Pontes de Königsberg" de Euler, que questionava se era possível atravessar todas as pontes da cidade sem repetir nenhuma. Essa situação introduz o conceito de Caminho Euleriano. Definição de Grafo : Um grafo é composto por vértices (nós) e arestas (conexões entre os vértices). As arestas podem ser direcionadas (chamado de dígrafo ) e podem ter pesos ou direções associadas. Exemplo: Imagine um mapa onde os vértices são cidades e as arestas são as estradas que as conectam. Elementos e Propriedades dos Grafos :