Objetivos dos algoritmos e níveis de abstração

\(\newcommand\Id[1]{\mbox{\textit{#1}}}\)

Os algoritmos podem ser escritos de formas diferentes, dependendo dos objetivos que leveram a sua elaboração. Assim, o objetivo de um algoritmo pode ser prover uma solução para que seja implementada em uma linguagem de programação e o de outro, apresentar uma estratégia que deve ser seguida para obter-se um resultado de interesse.

Objetivos do pseudocódigo

O pseudocódigo pode ser visto como uma mistura de aspectos mais formais, como computação ou notação matemática, com linguagem natural.

Como um primeiro exemplo é apresentado o Algoritmo 1, que considera uma forma de se obter indiretamente a altura de um prédio dados os comprimentos das sombras do prédio de de uma pessoa, juntamente com a altura dessa pessoa. Este tipo de algoritmo pode ser facilmente implementado em C.

Algoritmo 1: Estimativa da altura de um prédio em função de sobras projetadas.

Algoritmo 1: Estimativa da altura de um prédio em função de sobras projetadas.

Este é um típico problema e programa solicitado em listas de exercícios de cursos de programação. O algoritmo apresenta uma solução praticamente pronta para a implementação do programa, incluindo sugestões para os nomes das variáveis e até induzindo os comandos que serão usados. A escrita do Algoritmo 1 foi feita considerando que o algoritmo seria lido por um programador com, minimamente, as capacidades básicas de codificação.

Como um segundo exemplo de pseudocódigo, o Algoritmo 2 pode ser considerado.

Algoritmo 2: PNN based LPP, adaptado de Levada (2022)

Algoritmo 2: PNN based LPP, adaptado de @levada

Este algoritmo é uma adaptação do apresentado no artigo de Levada (2022) e, para entendê-lo por completo, tanto o texto do artigo deve ser lido quanto o leitor deve ter conhecimento sobre o tema abordado. O objetivo do algoritmo não é o entendimento do procedimento que ele realiza em detalhes, mas observar a sequência de passos para produzir o resultado desejado. Ele ainda envolve a integração da linguagem natural com notação matemática para representar as expressões e matrizes utilizadas. No algoritmo original não há a documentação com a descrição nem as pré e pós-condições, uma vez que ele está inserido na discussão apresentada pelo artigo como um todo.

O Algoritmo 2 não foi escrito para pronta implementação. Ele deixa muitos pontos em aberto, mesmo sendo claro quanto a todos os cálculos que devem ser feitos e em que sequência. Esse é um algoritmo de nível alto de abstração, ou seja, muitos detalhes são omitidos propositalmente em função do público-alvo, que são os leitores do artigo científico. Apresentar todos os detalhes, como o passo a passo da criação dos vetores de distâncias \(\vec{d}_i\) ou a própria fórmula usada para a distância somente tornaria o código desnecessariamente complexo, prejudicando a compreensão da estratégia da solução.

Nível de abstração e o público alvo

Quando um algoritmo vai ser escrito, é preciso ter claro qual é o público-alvo que ele pretende atingir. As instruções, portanto, assumem uma forma baseada no conhecimento prévio de quem vai interpretá-las. Essa decisão implica na escolha do nível de abstração que será empregado.

Um algoritmo escrito com nível de abstração baixo é aquele mais próximo do programa que será implementado. Ele costuma apresentar as variáveis e comandos de forma mais explícita. Quando o nível de abstração sobe, os detalhes de implementação são substituídos por descrições mais genéricas.

Supondo que o problema a ser resolvido seja a soma de duas matrizes de mesma dimensão, são apresentados algoritmos em níveis de abstração diferentes, todos corretos e abordando exatamente a mesma solução. O Algoritmo 3 possui um nível de abstração bastante alto, seguido pelo Algoritmo 4, o qual apresenta mais detalhes e pode ser considerado de nível médio; por sua vez, o Algoritmo 5 e o Algoritmo 6 já possuem nível baixo e se aproximam mais de uma possível implementação em um programa.

Algoritmo 3: Soma de duas matrizes de mesma dimensão (nível alto).

Algoritmo 3: Soma de duas matrizes de mesma dimensão (nível alto).

Algoritmo 4: Soma de duas matrizes de mesma dimensão (nível médio).

Algoritmo 4: Soma de duas matrizes de mesma dimensão (nível médio).

Algoritmo 5: Soma de duas matrizes de mesma dimensão (nível mais baixo).

Algoritmo 5: Soma de duas matrizes de mesma dimensão (nível mais baixo).

Algoritmo 6: Soma de duas matrizes de mesma dimensão (nível baixo).

Algoritmo 6: Soma de duas matrizes de mesma dimensão (nível baixo).

Os algoritmos são apresentados em quatro níveis de abstração diferentes. A Tabela 1 sumariza uma comparação desses algoritmos.

Tabela 1: Comparação da soma de matrizes com algoritmos em diferentes níveis de abstração.
Algoritmo Nível Comentário
Algoritmo 3 Alto Pressupõe o conhecimento de matrizes e suas operações; detalhes como as dimensões são omitidos.
Algoritmo 4 Médio Ainda considera o conhecimento sobre matrizes; há mais detalhes de como os dados são obtidos e como o cálculo da soma é feito.
Algoritmo 5 Mais baixo A necessidade de conhecer matrizes é mínima, bastando assumir cada elemento como uma variável separada; introduz a necessidade das dimensões para controle da somas; mantém uma linguagem mais natural.
Algoritmo 6 Baixo Não há praticamente necessidade de entender o que é uma matriz; uma estruturação de pseudocódigo é adicionada; cada ação é hiperdetalhada; a linguagem natural é mínima.

Da mesma forma que o nível de abstração depende do público-alvo, também inexiste a necessidade de que um mesmo algoritmo mantenha o nível de abstração constante para todas suas partes. Desse modo, pontos menos importantes, ou seja, que não são o foco do algoritmo, podem ter nível mais alto enquanto outras partes podem ser mais detalhadas, deixando o nível mais baixo para explicitar pontos relevantes da solução.

Referências

Levada, Alexandre. 2022. “A probabilistic nearest neighbors based locality preserving projections”. SSRN 4267754. https://ssrn.com/abstract=4267754.