Diccionarios en pseudocódigo

8

¿Cuál es una buena forma común de expresar diccionarios (= mapas) en pseudocódigo? Es decir, las estructuras de datos que básicamente permiten almacenar valores para las claves, iterar sobre todos los pares clave / valor, probar la inclusión de una clave determinada, etc. Tengo algo como lo siguiente (en este caso sin sentido) código Python en mente:

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

Y quiero expresarlo como pseudocódigo en una publicación. Pensando matemáticamente, los diccionarios son funciones, las relaciones son conjuntos de pares, por lo que escribir algo como

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

en realidad tendría sentido. ¿Pero es comprensible? Y para la prueba, usaría

if k ∈ keys(D)

¿O es más seguro ser más literal, por ejemplo

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

¿Existe alguna buena práctica / alguna referencia sobre cómo escribir un pseudocódigo comúnmente comprensible?

Jan Pöschko
fuente
Creo que esto debería trasladarse a Stackoverflow.
David Ketcheson
También pensé en Stack Overflow, pero tenía dudas porque no se trata de la programación real sino solo de cómo presentarlo, lo que ciertamente está relacionado con la ciencia computacional. Sin embargo, si siente que debería ser movido, ¿alguien puede hacer eso por mí? (Yo mismo no puedo, ¿puedo?)
Jan Pöschko
Acabo de comenzar una discusión sobre meta en meta.scicomp.stackexchange.com/questions/205/…
Jan Pöschko
@DavidKetcheson: en el futuro, si cree que la pregunta debe migrarse, márquela para la migración. En este caso, Jan tiene razón; no se trata de la programación real, por lo que no está en el tema de Stack Overflow. Sin embargo, puede ser un tema para programadores o teoría. Tendría que hablar con los mods de teoría sobre las ediciones que desean, ya que uno de sus mods mencionó que la pregunta necesitaría ser ajustada para su sitio.
Geoff Oxberry
Mientras tanto, este enlace a una pregunta sobre teoría en el metahilo (cortesía de cstheory mod Kaveh) puede ser de interés para las personas interesadas en esta pregunta.
Geoff Oxberry

Respuestas:

7

Parece que ya está utilizando algunos de los conceptos de Corwin, Leiserson, Rivest y Stein , que siempre he visto como el texto introductorio "predeterminado" para los algoritmos, al escribir su pseudocódigo. No creo que haya más referencia estándar para el pseudocódigo.

Sin embargo, diría que lo que hace un buen pseudocódigo es dividir el problema en sus funciones matemáticas y lógicas representativas. ¿Qué condiciones tienen que ser ciertas para ejecutar el código? ¿Qué ramas existen? ¿Qué datos son realmente esenciales para determinar el comportamiento?

Más allá de eso, el objetivo del buen pseudocódigo es decirle al programador lo que hay que hacer, y no necesariamente cómo implementarlo. Es posible que desee, por ejemplo, aplanar algo como bucles anidados en una sola declaración:

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

probablemente sería mejor que decir

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

ya que este último ya comienza a hacer algunas suposiciones sobre el lenguaje que se está utilizando (mayor-fila versus mayor-columna, etc.).

aeismail
fuente
4

Creo que depende del contexto de la publicación, el público al que va dirigido y cuán "común" necesita ser "comúnmente comprensible". Creo que su última opción es probablemente la más segura, es decir, sea lo más literal / explícito y lo más cercano posible al "inglés simple". Pero si su público objetivo está familiarizado con la teoría de conjuntos, o Python, o Java, o C #, o JavaScript, etc., entonces una notación similar a una de esas podría ser mejor.

Hago esta sugerencia como alguien que realiza entrevistas de trabajo donde se espera que el candidato escriba código o seudocódigo. La mayoría de los candidatos (tanto buenos como malos) tienden a derivar hacia el lenguaje con el que están más familiarizados para que su pseudocódigo sea lo más comprensible posible para ellos y para mí. Las personas familiarizadas con Java escriben Map<K,V>. Las personas familiarizadas con Python escriben tuplas o un diccionario como lo hizo en su primer fragmento de código. Las personas familiarizadas con C escriben matrices. Las personas con menos experiencia en programación tienden a escribir pseudocódigo que se parece más a un inglés simple, pero que a menudo termina pareciéndose a Python. :-)

Lamentablemente, no puedo responder a su última pregunta: no estoy familiarizado con ninguna referencia o recomendación común para escribir pseudocódigo.

Paul Karlin
fuente