Glossário do Curso de Lógica de Programação Avançado

Todos os termos do curso em um só lugar, com definições simples. Use a busca para achar rápido.

Acesso direto por índice
A capacidade do vetor de chegar a qualquer posição num único passo, calculando onde ela está a partir do índice. Chegar ao item 0 ou ao item 900 custa o mesmo. A lista ligada não tem isso: chega a uma posição percorrendo a corrente.
Ver na aula →
Acesso sequencial
O jeito da lista ligada de alcançar um valor: seguindo as ligações desde a cabeça, nó por nó. Chegar ao décimo nó custa dez passos. É o oposto do acesso direto do vetor, e a principal desvantagem da lista.
Ver na aula →
Acoplamento
O grau de dependência entre módulos. Alto acoplamento é ruim: uma peça conhece detalhes demais da outra, e mudar uma quebra a outra. Baixo acoplamento é o alvo: as peças conversam por interfaces enxutas e sabem o mínimo umas das outras, então podem mudar de forma independente.
Ver na aula →
Algoritmo
Uma sequência clara e finita de passos que resolve um problema ou realiza uma tarefa. Enquanto a estrutura de dados guarda a informação, o algoritmo é o método que age sobre ela: buscar, ordenar, percorrer, transformar. Busca em largura e ordenação são exemplos de algoritmos.
Ver na aula →
Altura da árvore
O comprimento do caminho mais longo da raiz até uma folha, contado em ligações. Uma árvore com só a raiz tem altura 0. Uma árvore baixa e larga é rasa; uma árvore alta e fina se aproxima de uma lista. A altura influencia a rapidez das buscas.
Ver na aula →
Aresta
A ligação entre dois vértices de um grafo. Representa uma relação: uma amizade, uma estrada, um link, uma transição. Se dois vértices têm uma aresta entre eles, dizemos que são vizinhos ou adjacentes.
Ver na aula →
Árvore binária
Uma árvore em que todo nó tem no máximo dois filhos: um filho à esquerda e um filho à direita. Um nó pode ter zero, um ou dois filhos, mas nunca três ou mais. É a árvore mais estudada porque a limitação a dois lados simplifica algoritmos e cria estruturas eficientes.
Ver na aula →
Árvore de busca binária (BST)
Uma árvore binária com uma regra de ordem: para cada nó, todos os valores da subárvore esquerda são menores que ele e todos os da direita são maiores. Essa organização permite buscar, inserir e remover valores descendo por comparações, cortando o conjunto pela metade a cada passo quando a árvore está equilibrada.
Ver na aula →
Árvore de recursão
Desenho que representa todas as chamadas de uma função recursiva: a chamada inicial é a raiz, e cada chamada que ela faz é um filho. Ler a árvore revela quantas chamadas acontecem e quão fundo elas vão, o que estima o custo total do algoritmo.
Ver na aula →
Autômato de estados
Uma máquina de estado usada para reconhecer se uma sequência de símbolos (as letras de um texto, por exemplo) segue um padrão. Cada símbolo lido dispara uma transição. A palavra autômato acentua esse uso de leitura passo a passo, muito comum na validação de formatos e na busca de padrões.
Ver na aula →
Backtrack (voltar)
O ato de recuar para o vértice anterior quando o caminho atual não tem mais para onde ir. É o movimento que dá à busca em profundidade a chance de tentar as saídas que ainda não foram exploradas, sem perder o rastro de onde já esteve.
Ver na aula →
Backtracking
Técnica de resolver problemas experimentando caminhos: escolhe uma opção, avança, e se chega a um beco sem saída, desfaz a última escolha e tenta a próxima. Explora as possibilidades como quem anda num labirinto, voltando sempre que a rota não leva ao objetivo.
Ver na aula →
Balanceamento com pilha
Técnica que usa uma pilha para verificar se uma expressão está balanceada: cada abre é empilhado e cada fecha desempilha o abre correspondente. Se sobra ou falta algo no fim, ou se um fecha não casa com o topo, a expressão está desbalanceada.
Ver na aula →
Balde (slot)
Cada posição do vetor interno de uma tabela hash. A função de dispersão manda cada chave para um balde. Guardar é colocar o par chave-valor no balde calculado; buscar é ir ao balde calculado e conferir. O nome balde ajuda a imaginar que, se precisar, mais de uma coisa pode cair ali.
Ver na aula →
Beco sem saída (poda)
Ponto em que a tentativa atual não pode dar certo, seja porque viola uma regra, seja porque não há para onde ir. Reconhecê-lo cedo e voltar (podar) evita explorar um ramo inútil, o que faz o backtracking ser muito mais rápido do que testar todas as combinações às cegas.
Ver na aula →
Busca em largura
Algoritmo que explora um grafo por camadas: primeiro visita a origem, depois todos os vizinhos dela, depois os vizinhos dos vizinhos, e assim por diante. Por avançar de camada em camada, a primeira vez que ela alcança o destino é pelo caminho mais curto em número de passos.
Ver na aula →
Busca em largura (BFS)
Forma de percorrer um grafo em ondas a partir de um vértice inicial: primeiro os vizinhos diretos, depois os vizinhos deles, e assim por diante. Usa uma fila para guardar a ordem de visita. A sigla vem do inglês Breadth-First Search.
Ver na aula →
Busca em profundidade (DFS)
Forma de percorrer um grafo que segue um caminho até o fundo antes de tentar outro. Ao chegar num vértice sem vizinhos novos, ela volta ao anterior e tenta outra saída. Usa uma pilha, muitas vezes a própria pilha de chamadas da recursão. A sigla vem de Depth-First Search.
Ver na aula →
Busca por comparação
Achar um valor na BST comparando-o com o nó atual: se for igual, encontrou; se for menor, desce à esquerda; se for maior, desce à direita. Cada comparação elimina um ramo inteiro, o que torna a busca muito mais rápida que percorrer tudo, desde que a árvore esteja bem distribuída.
Ver na aula →
Cabeça da lista
A referência para o primeiro nó da lista ligada. É o único ponto de entrada: a partir da cabeça você alcança todos os outros nós seguindo as ligações. Perder a cabeça é perder a lista inteira, porque não há como voltar ao começo.
Ver na aula →
Cache
Uma memória rápida onde se guardam resultados já obtidos para reusar depois. Na memoização, o cache costuma ser uma tabela em que a chave é a entrada (por exemplo n) e o valor é a resposta já calculada para aquela entrada.
Ver na aula →
Caminho mais curto em passos
A rota entre dois vértices com o menor número de arestas, sem considerar pesos ou distâncias. Cada passo conta igual. Num labirinto sem atalhos ponderados, é o menor número de casas a atravessar; numa rede social, o menor número de intermediários.
Ver na aula →
Ciclo
Um caminho num grafo que sai de um vértice e volta a ele passando por arestas distintas. Onde há ciclo, é possível dar uma volta e retornar ao ponto de partida. Um grafo sem nenhum ciclo é chamado de acíclico, e a árvore é o exemplo clássico.
Ver na aula →
Ciclo de estados
Uma sequência de estados que volta ao início, como verde, amarelo, vermelho e de novo verde no semáforo. O ciclo se repete indefinidamente, cada volta disparada pelos eventos na ordem certa. Nem toda máquina é cíclica, mas a do semáforo é um exemplo limpo de ciclo.
Ver na aula →
Coesão
O grau de foco de um módulo num único assunto. Alta coesão é bom: tudo dentro do módulo trabalha para o mesmo objetivo. Baixa coesão é ruim: o módulo é uma gaveta de bagunça com funções que nada têm a ver umas com as outras, difícil de nomear e de entender.
Ver na aula →
Colisão
O caso em que duas chaves diferentes recebem o mesmo índice da função hash e, portanto, disputam o mesmo balde. Não é um defeito da função, é uma consequência de haver mais chaves possíveis do que posições no vetor. Toda tabela hash precisa de uma regra para resolver colisões.
Ver na aula →
Concorrência
Situação em que várias tarefas avançam ao mesmo tempo, ou intercaladas, dentro do mesmo programa. Aproveita máquinas com vários núcleos para fazer mais em menos tempo, mas cria o risco de tarefas disputarem o mesmo dado.
Ver na aula →
Condição de corrida
Bug que surge quando o resultado depende da ordem, imprevisível, em que tarefas concorrentes leem e escrevem um dado compartilhado. Como duas mãos mexendo no mesmo caderno ao mesmo tempo, o valor final vira uma loteria difícil de reproduzir.
Ver na aula →
Conjunto de visitados
Uma coleção que anota quais vértices já foram vistos durante a busca. Antes de entrar num vértice, o algoritmo consulta esse conjunto: se o vértice já está lá, ele é ignorado. É o que impede a busca de voltar em círculos.
Ver na aula →
Dado imutável
Dado que não muda depois de criado. Para alterar, você não mexe no original: cria uma cópia nova com a diferença desejada. O valor antigo continua exatamente como estava, o que evita mudanças por acidente à distância.
Ver na aula →
Dado mutável
Dado que pode ser alterado no próprio lugar depois de criado. Acrescentar, remover ou trocar um valor muda o objeto original, e todos os trechos que apontam para ele passam a ver a mudança. Listas costumam ser mutáveis na maioria das linguagens.
Ver na aula →
De baixo para cima
Estratégia de começar pelos casos base, já conhecidos, e ir preenchendo uma tabela em direção ao caso maior. O oposto da recursão memoizada, que parte do caso grande e desce. Os dois chegam à mesma resposta por caminhos invertidos.
Ver na aula →
Desenfileirar (dequeue)
A operação que remove e devolve o elemento da frente da fila, o mais antigo dos que esperam. Equivale a ser chamado no guichê. Em inglês é chamada de dequeue. Sempre remove pela frente, nunca do meio ou do fim.
Ver na aula →
Distribuição uniforme
A propriedade de espalhar as chaves de forma equilibrada pelo vetor, sem concentrar muitas na mesma posição. Quando a distribuição é uniforme, cada escaninho recebe mais ou menos a mesma quantidade de chaves, e a tabela mantém a busca rápida. Distribuição ruim amontoa chaves e derruba o desempenho.
Ver na aula →
Dividir para conquistar
Estratégia de resolver um problema grande partindo-o em subproblemas menores do mesmo tipo, resolvendo cada um (em geral por recursão) e combinando as respostas parciais numa resposta final. Aparece na busca binária, no merge sort e no quick sort.
Ver na aula →
Efeito colateral
Qualquer coisa que uma função faz além de devolver um resultado a partir dos argumentos: escrever na tela, salvar um arquivo, alterar um dado compartilhado, chamar a rede, ler o relógio. Efeitos são necessários, mas quando espalhados tornam o programa imprevisível.
Ver na aula →
Em-ordem, pré-ordem e pós-ordem
Os três percursos por profundidade de uma árvore binária. Em-ordem visita o filho esquerdo, depois a raiz, depois o direito. Pré-ordem visita a raiz primeiro, depois esquerdo e direito. Pós-ordem visita esquerdo e direito primeiro e a raiz por último. Muda só a posição da raiz na visita.
Ver na aula →
Empilhar (push) e desempilhar (pop)
As duas operações centrais da pilha. Empilhar (push, em inglês) coloca um novo item no topo. Desempilhar (pop) retira o item do topo e o devolve. Ambas mexem exclusivamente no topo, mantendo a regra LIFO.
Ver na aula →
Encadeamento
Estratégia de tratar colisões guardando, em cada balde, uma lista com todos os pares que caíram ali. Quando duas chaves colidem, ambas ficam na mesma lista do balde. Buscar é ir ao balde e percorrer sua lista curta. Também chamado de encadeamento separado.
Ver na aula →
Enfileirar (enqueue)
A operação que adiciona um elemento no fim da fila. Equivale a chegar e ir para o final da fila do banco. Em inglês é chamada de enqueue. Nunca insere no meio nem na frente: sempre no fim.
Ver na aula →
Escolher a estrutura
A decisão de projeto que casa o comportamento de uma estrutura com o que o problema pede. Entre pilha e fila, a pergunta central é: o problema quer atender o último que chegou (pilha) ou o primeiro que chegou (fila)?
Ver na aula →
Espiar o topo (peek)
Operação que mostra qual é o item do topo sem removê-lo da pilha. Serve para consultar quem está por cima antes de decidir o que fazer. Ao contrário do desempilhar, o espiar não altera a pilha.
Ver na aula →
Estado
A situação atual em que um sistema se encontra, escolhida de um conjunto pequeno e bem definido de situações possíveis. Numa catraca, os estados são travada e liberada. O sistema está sempre em exatamente um estado por vez, e é esse estado que decide como ele reage ao que acontece.
Ver na aula →
Estado de aceitação
O estado (ou estados) em que o autômato deve terminar para considerar a entrada válida. Ao acabar de ler o texto, se a máquina parou num estado de aceitação, a entrada casa com o padrão; se parou em outro estado, a entrada é rejeitada. Também chamado de estado final.
Ver na aula →
Estado de tela
Cada tela ou modo distinto de um aplicativo ou jogo, visto como um estado da máquina: menu, jogando, pausa, fim. O sistema mostra e reage segundo o estado de tela atual, e só troca de tela quando um evento dispara a transição correspondente.
Ver na aula →
Estouro de pilha (stack overflow)
Erro que acontece quando a pilha de chamadas cresce além do limite disponível, em geral por chamadas que nunca param, como uma recursão sem caso base. A pilha enche até estourar, e o programa é interrompido.
Ver na aula →
Estrutura de dados
A forma como a informação fica organizada na memória para ser guardada e acessada. Lista, pilha, fila, árvore, tabela hash e grafo são estruturas diferentes, cada uma boa para um tipo de acesso. Escolher a estrutura certa costuma resolver metade do problema.
Ver na aula →
Estruturas vs algoritmos
A divisão que organiza o curso. As estruturas de dados (pilha, fila, lista, árvore, hash, grafo) respondem à pergunta onde e como os dados ficam guardados. Os algoritmos (busca, ordenação, percurso) respondem à pergunta como agir sobre esses dados. As duas famílias se combinam.
Ver na aula →
Evento de interface
Uma ação que pode disparar uma transição entre telas: tocar num botão, apertar pausa, o personagem perder toda a vida, o tempo acabar. É o gatilho; o estado atual decide se aquele evento tem efeito e para qual tela ele leva.
Ver na aula →
Expressão balanceada
Expressão em que todo símbolo de abertura tem um fechamento correspondente, na ordem correta e do tipo certo. Por exemplo, ([]) é balanceada, mas ([)] e (( não são. É requisito básico de fórmulas matemáticas e de código-fonte.
Ver na aula →
Fase de combinação
O passo em que as respostas dos pedaços menores são reunidas na resposta do problema todo. Em algoritmos como o merge sort é onde mora o trabalho de verdade: intercalar duas metades já ordenadas numa única lista ordenada.
Ver na aula →
Fator de carga
A razão entre a quantidade de itens guardados e o número de posições do vetor. Um fator de carga baixo (vetor com folga) mantém poucos itens por balde e a busca rápida; um fator alto (vetor lotado) aumenta as colisões e derruba o desempenho. Muitas tabelas crescem o vetor quando esse fator passa de um limite.
Ver na aula →
Fibonacci
Sequência clássica em que cada número é a soma dos dois anteriores: 0, 1, 1, 2, 3, 5, 8, 13 e assim por diante. Os dois primeiros (0 e 1) são o caso base; do terceiro em diante, fib de n é fib de n menos 1 mais fib de n menos 2.
Ver na aula →
Fila (FIFO)
Estrutura de dados em que o primeiro elemento a entrar é o primeiro a sair. FIFO vem do inglês First In, First Out. É o modelo da fila do banco: quem chegou antes é atendido antes. O oposto da pilha, que é LIFO.
Ver na aula →
Fila de prioridade
Variação da fila em que cada elemento carrega uma prioridade, e o próximo a sair é o de maior prioridade, não o que chegou primeiro. Quando dois têm a mesma prioridade, o critério de desempate costuma ser a ordem de chegada.
Ver na aula →
Filho esquerdo e filho direito
Os dois possíveis filhos de um nó numa árvore binária, identificados pela posição. A esquerda e a direita não são intercambiáveis: numa árvore de busca, o lado esquerdo guarda valores menores e o direito, maiores. Trocar os lados muda o significado da árvore.
Ver na aula →
Frente e fim da fila
As duas pontas de uma fila. O fim é onde novos elementos entram (o final da fila do banco). A frente é onde os elementos saem (o guichê). Diferente da pilha, que mexe só numa ponta, a fila trabalha com as duas.
Ver na aula →
Função hash
A regra que transforma uma chave num índice do vetor. Recebe uma chave qualquer e devolve sempre um número inteiro dentro da faixa de posições. Uma boa função hash é rápida de calcular, sempre gera o mesmo índice para a mesma chave e distribui chaves diferentes por posições variadas.
Ver na aula →
Função pura
Função que satisfaz duas condições: o resultado depende apenas dos argumentos recebidos, e ela não causa nenhum efeito no mundo externo. Consequência prática: as mesmas entradas produzem sempre a mesma saída, sem surpresas.
Ver na aula →
Garantia do código
O que um módulo assegura a quem o usa: uma propriedade em que se pode confiar sem verificar toda vez. A invariante é a garantia por dentro; ela permite que quem usa o módulo assuma certas coisas como certas, o que simplifica o programa inteiro que depende dele.
Ver na aula →
Grafo acíclico
Um grafo que não tem nenhum ciclo: não existe volta que retorne ao ponto de partida. Toda árvore é acíclica. Muitos problemas ficam mais simples nesses grafos, porque a busca nunca corre o risco de reencontrar um vértice por outro caminho.
Ver na aula →
Grafo dirigido
Grafo em que cada aresta tem um sentido, representado por uma seta. A ligação vale só na direção da seta: de A para B não implica de B para A. Serve para relações de mão única, como seguir alguém numa rede ou uma rua de sentido único.
Ver na aula →
Grau de separação
Numa rede modelada como grafo, a distância entre duas pessoas medida em número de arestas (amizades) no menor caminho entre elas. A ideia dos seis graus de separação diz que quase todos estão a poucos passos de qualquer outro na rede.
Ver na aula →
Implementação
O como interno: o código que faz a interface funcionar por baixo. Estruturas de dados, algoritmos e detalhes que ficam escondidos. Enquanto a interface continua a mesma, a implementação pode mudar (ficar mais rápida, corrigir um erro) sem afetar quem usa o módulo por fora.
Ver na aula →
In-place
Algoritmo que ordena reorganizando os elementos dentro da própria lista, usando pouca ou nenhuma memória extra além da entrada. O quick sort é in-place; o merge sort clássico não é, porque cria listas novas para intercalar.
Ver na aula →
Intercalar (merge)
Juntar duas listas já ordenadas numa única lista ordenada, comparando os elementos da frente de cada uma e escolhendo sempre o menor para colocar no resultado. Como é preciso olhar cada elemento só uma vez, intercalar duas listas de tamanho total n custa apenas n passos.
Ver na aula →
Interface e implementação
A interface é o conjunto de operações que uma estrutura oferece a quem a usa, o contrato público. A implementação é o código concreto que cumpre esse contrato por dentro. A mesma interface pode ter várias implementações diferentes, todas válidas se respeitarem o contrato.
Ver na aula →
Interface pública
O conjunto de funções e comportamentos que um módulo oferece para o mundo de fora usar. É o contrato: os nomes, o que cada um recebe e o que devolve. Quem usa o módulo depende só disso. Uma boa interface é pequena, clara e estável, porque quebrar a interface quebra todos os que dependem dela.
Ver na aula →
Invariante
Uma condição que uma estrutura ou função mantém sempre verdadeira, antes e depois de cada operação da interface. Na árvore de busca binária, a invariante é que os menores ficam à esquerda e os maiores à direita. É a promessa que o módulo faz e nunca quebra enquanto usado pela interface.
Ver na aula →
Iteração
Repetir um bloco de código com um laço (enquanto, para), mantendo o estado em variáveis que você atualiza a cada volta. É a alternativa à recursão para repetição; não usa a pilha de chamadas, então não corre o risco de estourá-la por profundidade.
Ver na aula →
LIFO
Sigla de Last In, First Out, ou último a entrar, primeiro a sair. É a regra que define a pilha: quem chegou por último fica no topo e sai antes de todos os que chegaram antes. O oposto é FIFO, a regra da fila, que você verá no próximo módulo.
Ver na aula →
LIFO x FIFO
Os dois comportamentos opostos de ordem. LIFO (pilha) atende o último a entrar; inverte a ordem de chegada, útil para desfazer e voltar. FIFO (fila) atende o primeiro a entrar; preserva a ordem, útil para justiça e cronologia.
Ver na aula →
Lista circular
Variação em que o último nó, em vez de apontar para o nada, aponta de volta para o primeiro, formando um anel. Não tem fim natural, então quem percorre precisa de outra condição de parada, como voltar ao ponto de partida.
Ver na aula →
Lista de adjacência
Forma de guardar um grafo em que cada vértice tem uma lista com os seus vizinhos. Ocupa espaço proporcional ao número de arestas e é eficiente para grafos esparsos, aqueles com poucas ligações por vértice.
Ver na aula →
Lista duplamente ligada
Variação em que cada nó guarda duas ligações: uma para o próximo e outra para o anterior. Permite percorrer a corrente nos dois sentidos e facilita remover um nó tendo só ele em mãos, já que dá para alcançar o anterior direto.
Ver na aula →
Mapa de pais
Tabela que guarda, para cada vértice visitado, de quem ele foi descoberto na busca. Se Parque foi alcançado a partir de Norte, o mapa de pais diz que o pai de Parque é Norte. Seguindo os pais do destino para trás, chega-se à origem e se reconstrói o caminho.
Ver na aula →
Matriz de adjacência
Grade quadrada em que a célula da linha A com a coluna B guarda se existe (1) ou não (0) uma aresta de A para B. Consulta se dois vértices são vizinhos em um passo, mas ocupa espaço proporcional ao número de vértices ao quadrado.
Ver na aula →
Memoização
Técnica de guardar o resultado de um cálculo numa tabela na primeira vez que ele é feito e, nas próximas, devolver o valor guardado em vez de recalcular. O nome vem de memorando, uma nota; a função passa a anotar o que já descobriu.
Ver na aula →
Merge sort
Algoritmo de ordenação que divide a lista pela metade de forma recursiva até sobrarem pedaços de um elemento (já ordenados por definição) e depois intercala esses pedaços de volta, sempre juntando duas partes ordenadas numa parte maior ordenada. Custo O(n log n) garantido, no melhor e no pior caso.
Ver na aula →
Modelagem
O ato de traduzir um problema do mundo real para uma estrutura que o programa entende. No Mapa de Rotas, modelar é decidir que cada ponto da rede vira um vértice e cada ligação direta entre dois pontos vira uma aresta. Uma boa modelagem torna o algoritmo quase óbvio; uma ruim complica tudo.
Ver na aula →
Modelar com grafo
Transformar um problema real num grafo, decidindo o que cada vértice representa e o que cada aresta representa. É a etapa criativa que antecede o algoritmo: escolher bem vértice e aresta faz o problema virar caminhada num grafo.
Ver na aula →
Módulo
Uma parte do programa que agrupa funções e dados ligados a uma mesma tarefa, com um limite claro em volta. Pode ser um arquivo, uma pasta ou um conjunto de funções relacionadas. A ideia é que cada módulo cuide de um assunto e seja usado pelos outros por fora, sem que ninguém precise conhecer suas entranhas.
Ver na aula →
A peça básica de uma lista ligada. Guarda duas coisas: um valor (o dado que interessa) e uma ligação, que é a referência para o próximo nó da corrente. O último nó aponta para o nada, sinalizando o fim da lista.
Ver na aula →
Nó (raiz, pai, filho, folha)
Cada elemento de uma árvore é um nó. A raiz é o nó do topo, o único sem pai. Um nó que aponta para outros é o pai deles, e eles são seus filhos. Um nó sem filhos, na ponta de um ramo, é uma folha. Todo nó, menos a raiz, tem exatamente um pai.
Ver na aula →
Nó anterior
Numa lista ligada simples, o nó que aponta para o nó que você quer inserir depois dele ou remover. Como as ligações só vão para frente, para mexer num nó você precisa ter em mãos o anterior, pois é a ligação dele que será religada.
Ver na aula →
Núcleo puro e borda impura
Padrão de organização em que a lógica que decide fica em funções puras (o núcleo) e os efeitos ficam numa camada fina em volta (a borda). O núcleo calcula o que fazer; a borda apenas executa. Também chamado de núcleo funcional com casca imperativa.
Ver na aula →
O(n ao quadrado)
Custo que cresce com o quadrado do tamanho da entrada. Se a lista dobra, o trabalho fica quatro vezes maior; se multiplica por dez, o trabalho cresce cem vezes. É a marca dos métodos simples de ordenação, como bolha, seleção e inserção, que comparam quase cada par de elementos.
Ver na aula →
O(n log n)
Custo de um pouco mais que linear. O fator log n cresce muito devagar: dobrar a lista soma só uma unidade a esse fator. É a faixa dos métodos eficientes de ordenação por comparação, como merge sort e quick sort, e é o melhor que se consegue ordenando por comparações.
Ver na aula →
Ordenação estável
Ordenação que preserva a ordem original entre elementos de mesmo valor. Se dois itens têm a mesma chave, o que vinha antes continua antes depois de ordenar. Importa quando se ordena por uma chave sem querer bagunçar uma ordenação anterior, como ordenar por sobrenome mantendo a ordem por nome.
Ver na aula →
Partição
Passo do quick sort que reorganiza a lista em torno do pivô: todos os elementos menores ficam à esquerda dele, os maiores à direita. Ao terminar, o pivô está exatamente na posição que teria na lista ordenada, e nunca mais precisa ser movido.
Ver na aula →
Percurso de árvore
Visitar todos os nós de uma árvore numa ordem definida. Numa lista, há uma ordem óbvia; numa árvore ramificada, não. Os percursos mais usados numa árvore binária são três: em-ordem, pré-ordem e pós-ordem, que diferem no momento em que o nó atual é visitado em relação a seus filhos.
Ver na aula →
Peso da aresta
Um número associado a uma aresta que mede o custo daquela ligação: distância, tempo, preço, força da relação. Um grafo com peso permite perguntar não só se há caminho, mas qual o caminho mais barato ou mais curto.
Ver na aula →
Pilha (stack)
Estrutura de dados que guarda itens uns sobre os outros e obedece à regra LIFO: o último item colocado é o primeiro a ser retirado. Só o item do topo pode ser lido ou removido. É como uma pilha de pratos ou uma pilha de livros na mesa.
Ver na aula →
Pilha de chamadas (call stack)
A pilha que o computador usa para controlar as chamadas de funções. Quando uma função chama outra, a atual é empilhada com o ponto de retorno; quando a chamada termina, ela é desempilhada e a execução volta de onde parou. É o que permite funções chamarem funções e sempre voltarem ao lugar certo.
Ver na aula →
Prioridade
O valor de importância ou urgência associado a um elemento na fila de prioridade. Pode ser um número (quanto maior, mais urgente) ou um nível (alta, média, baixa). É a prioridade, não a chegada, que decide a ordem de atendimento.
Ver na aula →
Profundidade da recursão
O número de chamadas empilhadas ao mesmo tempo, ou seja, a altura da árvore de recursão. Cada nível fica esperando o de baixo terminar. Profundidade demais pode estourar a pilha de chamadas do programa (o erro de estouro de pilha).
Ver na aula →
Programação dinâmica
Técnica para resolver problemas com subproblemas sobrepostos montando a resposta a partir dos casos menores, guardados numa tabela. Na forma de baixo para cima, resolve primeiro os pequenos e combina até chegar ao grande, sem recursão.
Ver na aula →
Projetar uma solução
Ir além de fazer o programa funcionar: decidir como os dados são guardados e como são processados, pensando em desempenho, clareza e mudança futura. É a diferença entre um código que roda hoje com dez itens e um que continua rápido e legível com dez milhões.
Ver na aula →
Quick sort
Algoritmo de ordenação que escolhe um elemento como pivô, particiona a lista em menores e maiores que o pivô e aplica o mesmo processo em cada parte. Costuma ser o mais rápido na prática (custo médio O(n log n)), mas pode degradar para O(n ao quadrado) se o pivô cair sempre mal.
Ver na aula →
Recálculo redundante
Refazer um cálculo cujo resultado já foi obtido antes, sem necessidade. Na recursão ingênua do Fibonacci, o mesmo valor (como fib de 3) é calculado do zero muitas vezes, uma em cada galho da árvore de chamadas que precisa dele.
Ver na aula →
Recursão em cauda
Caso especial em que a chamada recursiva é a última coisa que a função faz, sem cálculo pendente depois dela. Algumas linguagens transformam essa forma num laço automaticamente (otimização de chamada em cauda), eliminando o custo de pilha. Quando existe, aproxima a recursão da eficiência do laço.
Ver na aula →
Religar ponteiros
Mudar para onde as ligações apontam, sem tocar nos valores. Inserir ou remover na lista ligada é essencialmente isso: reapontar uma ou duas ligações para encaixar ou tirar um nó da corrente. O trabalho é fixo, não depende do tamanho da lista.
Ver na aula →
Responsabilidade única
O princípio de que cada módulo (ou função) deve ter um motivo só para mudar, porque cuida de uma coisa só. Se calcular imposto e desenhar o boleto vivem juntos, uma mudança na aparência arrisca quebrar a conta. Separar dá a cada parte um trabalho e uma fronteira.
Ver na aula →
Sintaxe
O conjunto de regras de escrita de uma linguagem: quais palavras usar, como pontuar, como abrir e fechar blocos. Duas linguagens podem expressar a mesma lógica com sintaxes bem diferentes. A sintaxe muda de linguagem para linguagem; a lógica por baixo é a mesma.
Ver na aula →
Subestrutura ótima
Propriedade de um problema cuja melhor solução pode ser montada a partir das melhores soluções dos seus pedaços menores. Se a resposta do todo depende das respostas das partes, resolver as partes e combiná-las resolve o todo.
Ver na aula →
Subproblemas sobrepostos
Característica de um problema em que, ao ser quebrado em partes, as mesmas partes menores reaparecem muitas vezes. É a marca que faz a memoização valer a pena: guardar essas partes evita recalculá-las. O Fibonacci é o exemplo canônico.
Ver na aula →
Tabela de transições
A lista completa das regras de uma máquina de estado, no formato estado atual mais evento leva ao próximo estado. Ela é a fonte de verdade da máquina: se uma combinação de estado e evento não está na tabela, nada acontece. É o mesmo diagrama de setas escrito em forma de tabela.
Ver na aula →
Tabela hash
Estrutura que associa chaves a valores usando um vetor e uma função de dispersão. Em vez de procurar a chave percorrendo a coleção, a função calcula em qual posição do vetor a chave mora, e a estrutura vai direto lá. É a implementação mais comum do dicionário (também chamado de mapa ou tabela de associação).
Ver na aula →
Tempo constante (O(1))
Custo que quase não cresce com o tamanho da coleção: seja com dez ou dez milhões de itens, a operação leva mais ou menos o mesmo número de passos. Na tabela hash, buscar pela chave é O(1) em média porque o cálculo do índice leva direto ao balde, sem varrer os dados.
Ver na aula →
Teste de mesa
Executar o programa na mão, em papel ou de cabeça, anotando o valor de cada variável a cada passo. Serve para conferir a lógica antes de rodar no computador. Num algoritmo de grafo, o teste de mesa acompanha a fila, o conjunto de visitados e o mapa de pais mudando a cada iteração.
Ver na aula →
Tipo abstrato de dados (TAD)
A descrição de uma estrutura pelo que ela faz, e não pelo como faz por dentro. Define as operações disponíveis e como elas se comportam, deixando de fora os detalhes internos. Pilha, fila e lista são exemplos de tipos abstratos: cada um é um contrato de operações.
Ver na aula →
Traduzir código
Reescrever uma lógica já pensada, como um pseudocódigo, na sintaxe de uma linguagem de programação. Não é reinventar a solução, é transcrever passo a passo cada construção (decisão, laço, estrutura) para a forma que aquela linguagem exige.
Ver na aula →
Transição
A regra que leva o sistema de um estado para outro quando algo acontece. Uma transição diz: estando no estado A, se acontecer o evento X, vá para o estado B. Sem um evento correspondente, o sistema fica parado no estado em que está.
Ver na aula →
Transparência referencial
Propriedade de uma expressão que pode ser trocada pelo seu resultado sem mudar o comportamento do programa. Funções puras têm essa propriedade: chamar somar(2, 3) é o mesmo que escrever 5, porque nada mais acontece além de devolver o valor.
Ver na aula →
Vértice
Cada ponto de um grafo, também chamado de nó. Representa uma coisa da rede: uma pessoa, uma cidade, uma página, um estado. Um grafo é, antes de tudo, um conjunto de vértices que podem ou não estar ligados entre si.
Ver na aula →
Vértice de origem (predecessor)
Para cada vértice descoberto na busca, é o vértice a partir do qual ele foi alcançado. Guardar esse predecessor forma uma trilha de migalhas: seguindo de origem em origem, do destino até o início, você reconstrói o caminho inteiro.
Ver na aula →