Dicionários em pseudocódigo

8

Qual é uma maneira comum e boa de expressar dicionários (= mapas) no pseudocódigo? Ou seja, estruturas de dados que basicamente permitem armazenar valores para chaves, iterar sobre todos os pares chave / valor, testar a inclusão de uma determinada chave etc. Eu tenho algo parecido com o seguinte código Python (neste caso sem sentido) em mente:

D = {}
D[1] = 2
for key, value in D.items():
    # do something with key and value
if key in D:
    # do something

E quero expressá-lo como pseudocódigo em uma publicação. Pensando matematicamente, dicionários são funções, relações são conjuntos de pares, portanto, escrever algo como

D ← ∅
D[1] ← 2
for all (k, v) ∈ D

realmente faria sentido. Mas é compreensível? E para o teste, eu usaria

if k ∈ keys(D)

Ou é mais seguro ser mais literal, por exemplo

D ← empty dictionary
for all key-value pairs (k, v) in D

Existe uma boa prática existente / alguma referência sobre como escrever pseudocódigo comumente compreensível?

Jan Pöschko
fonte
Eu acho que isso deve ser movido para Stackoverflow.
David Ketcheson
Também pensei em Stack Overflow, mas estava em dúvida porque não se trata de programação real, mas apenas de como apresentá-la, o que certamente está relacionado à ciência da computação. No entanto, se você acha que deve ser movido, alguém pode fazer isso por mim? (Eu mesmo não posso, posso?)
Jan Pöschko
Eu só começou uma discussão sobre meta em meta.scicomp.stackexchange.com/questions/205/...
Jan Pöschko
@ DavidKetcheson: No futuro, se você achar que a questão deve ser migrada, sinalize-a para migração. Nesse caso, Jan está certo; não se trata de programação real; portanto, não é um tópico sobre o estouro de pilha. No entanto, pode estar no tópico para programadores ou história. Eu teria que conversar com os mods de história sobre as edições que eles querem, pois um deles mencionou que a pergunta precisaria ser aprimorada para o site.
Geoff Oxberry 27/02/2012
Enquanto isso, esse link para uma pergunta sobre a história no meta-thread (cortesia do mod da história Kaveh) pode ser de interesse para as pessoas interessadas nesta questão.
Geoff Oxberry 27/02/2012

Respostas:

7

Parece que você já está usando alguns dos conceitos de Corwin, Leiserson, Rivest e Stein , que eu sempre vi como o texto introdutório "padrão" para algoritmos, ao escrever seu pseudocódigo. Acho que não há mais nenhuma referência padrão para pseudocódigo.

No entanto, eu argumentaria que o que faz um bom pseudocódigo é dividir o problema em suas funções matemáticas e lógicas representativas. Quais condições devem ser verdadeiras para executar o código? Quais ramos existem? Quais dados são realmente essenciais para determinar o comportamento?

Além disso, o objetivo de um bom pseudocódigo é dizer ao programador o que precisa ser feito - e não necessariamente como implementá-lo. Você pode, por exemplo, achatar algo como loops aninhados em uma única instrução:

For all elements x in 2-D array A
    x ← max(0, x)

provavelmente seria melhor do que dizer

For all i in 1:m
   For all j in 1:n
       A(i,j) ← max(0, A(i,j)

já que o último já começa a fazer algumas suposições sobre o idioma que está sendo usado (linha maior versus coluna maior etc.).

aeismail
fonte
4

Eu acho que depende do contexto da publicação, do público-alvo e de quão "comum" você precisa "ser compreensível" para ser. Eu acho que sua última opção é provavelmente a mais segura, ou seja, seja o mais literal / explícita e o mais próximo possível do "inglês comum". Mas se o seu público-alvo tiver familiaridade com a teoria dos conjuntos, ou Python, ou Java, ou C #, ou JavaScript, etc., uma notação semelhante a uma delas pode ser melhor.

Faço essa sugestão como alguém que conduz entrevistas de emprego em que se espera que o candidato escreva código ou pseudocódigo. A maioria dos candidatos (bons e ruins) tende a mudar para o idioma com o qual estão mais familiarizados, a fim de tornar seu pseudocódigo o mais compreensível possível para eles e para mim. Pessoas familiarizadas com Java escrevem Map<K,V>. Pessoas familiarizadas com o Python escrevem tuplas ou um dicionário, como você fez no seu primeiro trecho de código. Pessoas familiarizadas com C escrevem matrizes. Pessoas com menos experiência em programação tendem a escrever pseudocódigo que se parece mais com o inglês comum - mas que geralmente acaba parecendo o Python. :-)

Infelizmente, não consigo responder à sua última pergunta - não estou familiarizado com nenhuma referência ou recomendação comum para escrever pseudocódigo.

Paul Karlin
fonte