Julio Uyehara (discussão | contribs)
Sem resumo de edição
Sem resumo de edição
Linha 31: Linha 31:
  3. Executar os passos para obter o resultado desejado (finito e efetivo). [3]
  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. As seções seguintes ajudam a entender alguns dos aspectos importantes das questões e soluções. [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
> Julio
Linha 107: Linha 148:
  publisher={Associação Brasileira de Engenharia de Produção}
  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}
}

Edição das 10h16min de 27 de novembro de 2025

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 é a etapa fundamental que conecta a especificação abstrata à sua implementação concreta, servindo como a ponte entre a definição do problema e a solução executável. 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]
  • Na programação, o refinamento é a essência da construção de sistemas, garantindo que o programa final não apenas funcione, mas seja matematicamente correto em relação aos documentos que o definiram. Trata-se de preservar a semântica do "contrato" inicial enquanto se introduzem os detalhes de como a máquina deve operar, eliminando ambiguidades da programação intuitiva. [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.
  • 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]
  • Além da correção formal, o refinamento possui uma dimensão prática voltada à otimização de desempenho. Em problemas complexos, soluções iniciais geradas por métodos básicos (heurísticas) muitas vezes são subótimas. É através de técnicas de refinamento que o algoritmo explora o espaço de busca de forma mais agressiva para encontrar resultados globais que métodos simples não alcançam. [5]
  • O processo atua de forma cíclica e iterativa para lidar com restrições e garantir a robustez da solução. Em cenários onde uma solução inicial viola regras (como sobreposição física de itens), o refinamento aplica procedimentos de ajustes e factibilização, transformando respostas inválidas em soluções ótimas e reduzindo a sensibilidade do algoritmo aos parâmetros iniciais. [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}

}