Criação de Algoritmos


  • Um algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída. Portanto, um algoritmo é uma sequência de passos computacionais que transformam a entrada na saída [1]. Podemos enxergar o algoritmo como a solução específica para um problema bem definido. Se precisamos descobrir o maior número em uma lista, podemos criar o seguinte enunciado: Dada uma relação de números de entrada, queremos um único número que seja o maior de todos como resultado.
  • Algoritmo, como solução, é o procedimento exato, passo a passo (ex.: comece pelo primeiro número, compare-o com o próximo, guarde o maior, e repita até o final) que garante que a Entrada seja transformada na Saída desejada. Dessa forma, podemos concluir que um algoritmo é uma sequência de passos computacionais que a partir de uma Entrada e, de maneira totalmente previsível, o transforma em outra em uma Saída, resolvendo assim um problema específico.


> Fernando

  • Informalmente, algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída em um período de tempo finito. Portanto, um algoritmo é uma sequência de etapas computacionais que transformam a entrada em saída. [2]
  • Também podemos considerar algoritmo um instrumento para resolver um problema computacional bem especificado. O enunciado do problema especifica em termos gerais a relação desejada entre entrada e saída para instâncias do problema, geralmente com tamanho arbitrariamente grande. O algoritmo descreve um procedimento computacional específico para se conseguir essa relação entre entrada e saída em todas as instâncias do problema. [2]
  • Diz-se que um algoritmo para um problema computacional é correto se, para toda instância do problema de entrada, ele parar — terminar sua computação em um tempo finito — e gerar a solução correta para a instância do problema. Dizemos que um algoritmo correto resolve o problema computacional dado. Um algoritmo incorreto poderia não parar em algumas instâncias de entrada ou poderia parar com uma resposta incorreta. Ao contrário do que se poderia esperar, eventualmente, os algoritmos incorretos podem ser úteis, se pudermos controlar sua taxa de erros. Um algoritmo pode ser especificado em linguagem comum, como um programa de computador ou mesmo como um projeto de hardware. O único requisito é que a especificação deve fornecer uma descrição precisa do procedimento computacional a ser seguido. [2]
  • Para um processo representar um algoritmo, ele deve ser:
- Finito: O algoritmo deve, em algum momento, solucionar o problema.
- Bem definido: As séries de passos devem ser precisas e apresentar sequências compreensíveis. Especialmente por computadores estarem envolvidos no uso de algoritmos, eles devem ser capazes de entender os passos para criar um algoritmo utilizável.
- Eficaz: Um algoritmo deve solucionar todos os casos do problema para o qual foi definido. Deve sempre solucionar o problema ao qual se destina. [3]
  • O escopo dos algoritmos é incrivelmente grande. É possível encontrar algoritmos que resolvem problemas em Ciência, Medicina, Finanças, Produção Industrial e de Abastecimento e Comunicação. Algoritmos fornecem suporte para todas as partes do cotidiano de uma pessoa. Sempre que uma sequência de ações que resolva algo em nossa vida for finita, bem definida e efetiva, você pode enxergá-la como um algoritmo. [3]
  • Quando se trata de Ciência da Computação, o mesmo algoritmo pode ter várias apresentações. Em resumo, os algoritmos apresentam um método de resolver fórmulas, mas seria um erro dizer que há apenas um algoritmo aceitável para determinada fórmula, ou que existe apenas uma apresentação aceitável de um algoritmo. No entanto, aqui estão alguns usos interessantes para considerar: busca, classificação, transformação, programação, análise de grafos, criptografia, e geração de números pseudoaleatória. [3]
  • Toda tarefa executada em um computador envolve algoritmos. Alguns algoritmos aparecem como parte do hardware do computador (eles são embarcados, daí os microprocessadores embarcados). O próprio ato de inicializar um computador envolve o uso de um algoritmo. Você também encontra algoritmos em sistemas operacionais, aplicativos e em todos os outros softwares. Até mesmo os usuários dependem de algoritmos. Scripts ajudam a direcionar usuários a executar tarefas de uma maneira específica, mas esses mesmos passos podem aparecer como instruções escritas ou como parte de uma declaração de política organizacional. [3]


  • Existem três elementos para todos os algoritmos:
1. Descrever o problema.
2. Criar uma série de passos para solucionar o problema (bem definido).
3. Executar os passos para obter o resultado desejado (finito e efetivo). [3]
  • De um lado, você tem as questões, que são problemas a serem resolvidos. Uma questão pode descrever o resultado desejado de um algoritmo ou pode descrever um obstáculo que deve ser superado para obter o resultado desejado. Soluções são os métodos, os passos, utilizados para tratar as questões. Uma solução pode relacionar apenas um ou vários passos dentro do algoritmo. Na verdade, o resultado de um algoritmo, a resposta ao último passo, é a solução. [3]
  • Os algoritmos devem obedecer a algumas premissas básicas quando são desenvolvidos:
• As ações não devem ser ambíguas.
• As ações devem ser organizadas de maneira ordenada.
• A sequência de passos deve ser finita. [6]
  • Os algoritmos também possuem diversas formas de representação e, dependendo do problema a ser resolvido, podemos escolher aquela que mais se adapta. As representações mais conhecidas de algoritmos são:
• Descrição narrativa.
• Fluxograma.
• Pseudocódigo. [6]
  • Descrição narrativa: Os algoritmos construídos com descrição narrativa usam a linguagem natural para expressar aquilo que se deseja fazer. Não existem regras rígidas de como escrever algoritmos nesse formato. Usando a descrição narrativa, você precisará ter muito cuidado para não empregar expressões que possam deixar em dúvida o que se quer realmente fazer. Essa representação é bastante simples de entender, mas na prática é pouco utilizada para resolver problemas computacionais. [6]
  • Fluxograma: Outro tipo de representação de algoritmos é o fluxograma. Muitos alunos gostam de fluxogramas, pois eles são uma representação gráfica que utiliza figuras geométricas para definir ações que serão feitas pelo algoritmo. Para entendermos o funcionamento de um fluxograma, temos que definir o ponto de partida e qual fluxo deverá ser seguido para resolver o problema proposto. Partindo do ponto inicial, não deve existir dúvida sobre qual será o próximo passo a ser dado. Vamos lembrar que na descrição narrativa as ações e a ordem de execução estão bem definidas. O mesmo raciocínio vale para os fluxogramas. Não podemos ter indefinição sobre (a) de onde vem o fluxo, (b) que ação vamos fazer e (c) para onde vamos depois. [6]

O fluxograma é uma excelente ferramenta para construção de algoritmos simples. Ele nos permite visualizar graficamente como o algoritmo vai se comportar e essa ajuda é inestimável. Entretanto, algoritmos maiores, com elevada quantidade de passos, precisam de fluxogramas com muitas figuras. Em várias situações, a solução não cabe em uma folha de papel, tornando o fluxograma menos legível. [6]

  • Pseudocódigo: também conhecido na literatura como linguagem estruturada, é a forma de representar algoritmos que mais se aproxima das linguagens de programação. Devido a essa característica, o pseudocódigo é amplamente aceito na comunidade acadêmica para o ensino de algoritmos. De fato, muitos cursos superiores e técnicos adotam o pseudocódigo nas suas grades curriculares para o ensino de algoritmos. [6]
  • Definição e Distinção Conceitual: No estudo da teoria da computação, é essencial distinguir o conceito abstrato de um algoritmo de sua documentação física. O termo "especificação de algoritmo" refere-se ao artefato que incorpora o algoritmo, sendo distinto tanto do termo "especificação" usado na engenharia de sistemas (para requisitos) quanto do conceito abstrato de um algoritmo nomeado, como o Quicksort ou a Busca Binária [7].
  • A premissa fundamental de uma especificação é a clareza. Espera-se que uma especificação de algoritmo, seja em linguagem natural ou pseudocódigo, seja suficientemente explícita para permitir uma execução mecânica [7]. A execução deve ser viável para um agente — humano ou máquina — sem a necessidade de aplicar engenhosidade ou invenção durante o processo [7].
  • Formatos e Tipologia das Especificações: Embora formalismos rígidos como Máquinas de Turing ou códigos-fonte de programas garantam precisão explícita pela própria definição, as especificações de algoritmos no mundo real apresentam-se em diversos formatos [7].
  • Pseudocódigo e Linguagem Natural: Formas tradicionais que variam em clareza dependendo do domínio e do agente executor [7].
  • Especificações Baseadas em Regras: Diferente de instruções procedurais sequenciais, este estilo apresenta uma coleção de regras autônomas. O agente deve aplicar estas regras constantemente, como no formato "Sempre que a condição X ocorrer, faça a ação Y" [7].
  • Instruções Artesanais e Visuais: Em certos domínios, as especificações podem detalhar instruções de ofícios, como a fabricação de violinos, dependendo de desenhos e conhecimento tácito [7].
  • Artigos Científicos: Um algoritmo pode ser especificado através de um artigo inteiro descrevendo a solução para um problema técnico, combinando texto e equações [7].
  • O Papel do "Realm" na Execução Marron e Harel argumentam que o que torna uma especificação clara permanece muitas vezes tácito [7]. Para que a execução ocorra sem engenhosidade, o agente deve possuir um conhecimento prévio definido como o Realm (Reino) da especificação. Este documento conteria a sintaxe e semântica da linguagem, conhecimento de domínio restrito às entidades referenciadas, regras de causalidade e instruções para operações específicas [7].
  • A formalização deste conhecimento é vital para a implementação metodológica: "Documentar o reino finito de uma especificação de algoritmo pode ajudar a guiar sua implementação em diversos sistemas e simplificar a análise de sua complexidade" [7].
  • Exemplos de Especificações: A literatura apresenta diversos exemplos práticos que ilustram essa variedade [7]:
1. Algoritmos de Ordenação e Busca: Como o Bubble Sort e a Busca Binária, tipicamente especificados em pseudocódigo [7].
2. Resolução de Labirintos: Especificada através de regras em linguagem natural, instruindo o agente a manter contato contínuo com a parede (regra da mão direita) [7].
3. Detecção de Veículos (YOLOv5n-L): Especificada em um artigo científico que utiliza uma mistura de linguagem natural e equações matemáticas para descrever modificações em um algoritmo pré-existente [7].
4. Desenho Técnico: A construção do corpo de um violino, especificada através de desenhos geométricos e instruções de procedimento [7].

> Julio

  • O refinamento de um algoritmo é um processo fundamental para a engenharia de um software, por meio deste é possível mapear e definir a forma ótima para o funcionamento de um processo, inicialmente abstrato para um funcional. Por meio do refinamento é que se garante o pleno funcionamento de um programa. O objetivo é transformar sistematicamente o que foi especificado em instruções de máquina, assegurando que o comportamento do software seja fiel às regras estabelecidas. [4]
  • No contexto da programação, o refinamento é a parte crucial para a construção de softwares, garantindo que o programa final não apenas funcione como o planejado originalmente, mas que seja matematicamente correto em relação ao que foi inicialmente proposto. O objetivo é de preservar a ideia do "contrato" inicial, enquanto é elaborado o código que irá instruir a forma de operação da máquina, eliminando ambiguidades e processos falhos do software final. [4]
  • Do ponto de vista técnico, o processo de refinamento se subdivide em duas categorias principais:
  • Refinamento algorítmico: Foca na conversão de lógicas abstratas em estruturas de controle de fluxo concretas, como laços, condicionais e atribuições(ex: forma de incrementar uma variável).
  • Refinamento de dados: Busca a representação mais eficiente para as informações (ex: trocar uma lista completa por uma variável de soma), justificando a escolha de estruturas que otimizam o desempenho sem violar a lógica original. [4]
  • Olhando sob a óptica do software, o refinamento tem suma importância no estabelecimento de métodos para que seja possível o funcionamento seguro e eficiente, garantido que o planejado para o programa, tenha sempre o mesmo comportamento, e que seja o mais eficiente em uso de recursos de hardware.
  • No texto de Yamassaki e Pureza (2003) é abordado o tema de refinamento de algoritmo sob a óptica de melhorar a localização de uma solução, no texto em questão é demonstrado uma solução refinada para resolver o "problema de carregamento de paletes do produtor", dado os parâmetros iniciais propostos, organizando a estrutura com o fim de melhorar o processo. Além da correção formal, o refinamento possui como finalidade a orquestração para a otimização de desempenho. Em problemas complexos, a estrutura inicial elaborada por métodos básicos muitas vezes não são as mais otimizadas para a solução desejada. É através de técnicas de refinamento que o algoritmo explora soluções que não violem as regras propostas, buscando de forma mais eficiente, encontrar soluções globais que métodos sem refinamentos tendem a não encontrar. [5]
  • O refinamento proposto no estudo atua de forma cíclica e iterativa para lidar com restrições inicialmente propostas e garantir a robustez da solução. No contexto do problema de carregamento de paletes, em cenários onde uma solução inicial viola regras (como sobreposição física de itens), o refinamento proposto no estudo aplica procedimentos de ajustes e factibilização, transformando respostas inválidas em soluções ótimas, aperfeiçoando o algoritmo a encontrar soluções matematicamente corretas com base nas regras inicialmente propostas. [5]

Referências bibliográficas


[1]

@article{castro2022algoritmos,
 title={Algoritmos e Pensamento Computacional como Ferramenta no Processo de Ensino-Aprendizagem},
 author={Castro, S{\'e}rgio Augusto Dias},
 year={2022}
}

[2]

@book{cormen2024algoritmos,
 author       = {Cormen, Thomas H. and Leiserson, Charles E. and Rivest, Ronald L. and Stein, Clifford},
 title        = {Algoritmos},
 edition      = {4},
 year         = {2024},
 publisher    = {GEN LTC},
 address      = {Rio de Janeiro},
 isbn         = {9788595159914},
 note         = {E-book},
 url          = {https://integrada.minhabiblioteca.com.br/reader/books/9788595159914/}
}

[3]

@book{mueller2018algoritmos,
 author       = {Mueller, John and Massaron, Luca},
 title        = {Algoritmos Para Leigos},
 year         = {2018},
 publisher    = {Editora Alta Books},
 address      = {Rio de Janeiro},
 note         = {E-book},
 pages        = {10},
 isbn         = {9788550809298},
 url          = {https://integrada.minhabiblioteca.com.br/reader/books/9788550809298/}
}

[4]

@article{cavalcanti2003refinamento,
title={Refinamento: a essência da engenharia de software},
author={Cavalcanti, Ana},
journal={Ciência e Cultura},
volume={55},
number={2},
pages={33-38},
year={2003},
publisher={Sociedade Brasileira para o Progresso da Ciência},
url={http://cienciaecultura.bvs.br/scielo.php?script=sci_arttext&pid=S0009-67252003000200022}
}

[5]

@article{yamassaki2003refinamento,
title={Um refinamento do algoritmo tabu de Dowsland para o problema de carregamento de paletes   do produtor},
author={Yamassaki, Cintia A. & Pureza, Vitória},
journal={Revista Produção},
pages={6-17},
year={2003},
publisher={Associação Brasileira de Engenharia de Produção}
}

[6]

@book{menendez2023simplificando,
 author       = {Menéndez, Andrés},
 title        = {Simplificando Algoritmos},
 year         = {2023},
 publisher    = {LTC},
 address      = {Rio de Janeiro},
 note         = {E-book},
 pages        = {17},
 isbn         = {9788521638339},
 url          = {https://integrada.minhabiblioteca.com.br/reader/books/9788521638339/}

}

[7]

@article{marron2025specificationrealm,
 title={A Specification’s Realm: Characterizing the Knowledge Required for Executing a Given Algorithm Specification},
 author={Marron, Assaf and Harel, David},
 journal={arXiv preprint arXiv:2510.19853},
 year={2025},
 url={https://arxiv.org/abs/2510.19853v1}

}