Buone pratiche per la scrittura di algoritmi


22

Si tratta di quanto efficacemente possiamo esprimere un algoritmo a portata di mano. Ho bisogno di questo per il mio insegnamento universitario.

Capisco che non esiste un modo standard per scrivere uno pseudo codice. Autori diversi seguono convenzioni diverse.

Sarebbe utile se le persone qui sottolineano, il modo in cui seguono e pensano il migliore.

C'è qualche libro che si occupa di questo in dettaglio?


9
"best" è molto soggettivo, penso che dovresti modificare il titolo e al posto di chiedere "best" chiedi cosa fanno le persone in pratica. Forse qualcosa come "come presentare algoritmi" o "buone pratiche per presentare algoritmi". Potresti anche voler essere più specifico dalla presentazione degli algoritmi: 1. agli studenti di una classe universitaria 2. in un libro di testo 3. in un documento di conferenza sono compiti molto diversi.
Kaveh,

1
Puoi anche controllare le sezioni pertinenti di Mathematical Writting di Knuth, Larrabee e Roberts.
Kaveh,

Risposte:


26

Scrivere lo pseudocodice è come scrivere il codice: non è particolarmente importante quale standard segua, purché tu (e le persone con cui scrivi) segua effettivamente qualche standard.

Ma per la cronaca, ecco lo standard idiosincratico che uso nei miei appunti di lezione, articoli di ricerca e libro in uscita.

  • Utilizzare la sintassi imperativa standard per il flusso di controllo e l'accesso alla memoria - se, mentre, per, return, array [indice], funzione (argomenti). Scrivi "else if".

    • Ma usa field(record) invece di record.fieldorecord->field
  • xyx*ys t ¬ p amodba%bsts <= t¬p!p πxsqrt(x)πPIMAX_INT

    • Ma usa per l'assegnazione, per evitare il problema.xy==

    • Ma evita la notazione (e lo pseudocodice!) Se l'inglese è più chiaro.

      • Simmetricamente, evita l'inglese se la notazione è più chiara!
  • Ridurre al minimo lo zucchero sintattico - Indicare la struttura a blocchi mediante rientro coerente (à la Python). Ometti parole chiave zuccherate come "inizio / fine" o "do / od" o "fi". Ometti i numeri di riga. Non non sottolineare parole chiave come "per" o "mentre" o "se" impostandole in un diverso typefaceo di stile . Mai. Non farlo.

    • Ma comporre i nomi degli algoritmi e le costanti in \ textc {Small Caps}, i nomi delle variabili in corsivo e le stringhe letterali in sans serif.

    • Ma aggiungi una piccola quantità di spazio "respiratorio" verticale ( \\[0.5ex]) tra blocchi di codice significativi.

  • Non specificare dettagli non importanti. Se non importa quale ordine visiti i vertici, dì "per tutti i vertici".

Ad esempio, ecco una formulazione ricorsiva dell'algoritmo di spanning tree minimo di Borůvka . In precedenza ho definito come il grafico ottenuto da contraendo tutti i bordi nell'insieme e Flatten come una subroutine che rimuove anelli e bordi paralleli.G LG/LGL

L'algoritmo di Borůvka

Uso il mio algorithmambiente LaTeX leggero per comporre pseudocodice. (È solo un tabbingambiente all'interno di un \fbox.) Ecco il mio codice sorgente per l'algoritmo di Borůvka:

\begin{algorithm}
	\textul{$\textsc{Borůvka}(G)$:}\+
\\	if $G$ has no edges\+
\\		return $\varnothing$\-
\\[0.5ex]
	$L \gets \varnothing$
\\	for each vertex $v$ of $G$\+
\\		add the lightest edge incident to $v$ to $L$\-
\\[0.5ex]
	return $L \cup \textsc{Borůvka}(\textsc{Flatten}(G / L))$
\end{algorithm}

interessante che tu usi field (record) invece di record [field]. Immagino che questa sia la vista " è la coordinata di " del mondo? j t h vfj(v)jthv
Suresh Venkat,

@SureshVenkat: è il modo in cui lo fai normalmente in linguaggi funzionali, e anche la notazione in TAoCP. (Ovviamente, non posso sapere se è per questo che Jɛ ff E usa questa notazione.)
Radu GRIGore

5
Il motivo principale per fare attenzione con lo pseudo-codice è che è facile confondersi con l'algoritmo, quindi è importante sottolineare alcune cose. L'esempio sopra di Jeff per Boruvka lo illustra. Nel codice L viene trattato come un set. Un bordo uv può essere l'incidente con il bordo più leggero a te così come a v, quindi viene aggiunto due volte nel ciclo, ma non importa se pensi a L come un insieme. Tuttavia, questo non è ovvio e qualcuno che lo implementa può essere facilmente attivato se implementano L come elenco.
Chandra Chekuri,

2
@ChandraChekuri: Sì, l'implementazione errata dei set può causare problemi negli algoritmi che manipolano i set.
Jeffε

1
@SureshVenkat: Oh, quello. No, non lo sopporto. Parole in grassetto fanno piangere Gesù bambino. Dijkstra dovrebbe perdere il premio Turing per aver introdotto quella convenzione tipografica eseguibile.
Jeffε

11

Tendo ad usare qualcosa che assomiglia alla sintassi di Python. Python è già abbastanza vicino allo pseudocodice che in alcuni casi il mio pseudocodice può diventare un vero codice funzionante.


Anche io, ma in Ruby. Con github gistsub puoi facilmente condividere frammenti eseguibili con cui giocare. gist.github.com/chadbrewbaker/7202412
Chad Brewbaker

Python non è tuttavia buono per rappresentare l'algebra lineare. Octave è una soluzione migliore, credo in questo caso (più vicino allo pseudocodice).
Gaborous,

3

Se vuoi avere un codice definito (cioè poco o niente matematica, vicino alla vera programmazione) potresti prendere in considerazione l'idea di avere un codice che effettivamente viene compilato. Questo ha diversi vantaggi:

  • Ottieni l'evidenziazione della sintassi ovunque.
  • Il compilatore controlla la sintassi per te e applica la coerenza.
  • Puoi testare le tue implementazioni per migliorare la qualità del codice.
  • È possibile eseguire l'algoritmo e confrontare i runtime misurati con le analisi (motivando in tal modo tecniche di analisi avanzate).

Un professore della mia università fa questo nel suo corso di algoritmi. La sua lingua preferita è Modula. Non credo che la scelta particolare della lingua sia importante. Basta attenersi a uno (per paradigma) che si adatta meglio al tuo livello di astrazione.


"Basta attenersi a uno (per paradigma) che si adatta meglio al tuo livello di astrazione." Penso che questo sia un ottimo consiglio per trovare un'alternativa allo pseudocodice. Esistono molti linguaggi e quasi sempre ce n'è almeno uno che ha come obiettivo una sintassi semplice per paradigmi specifici: Ada per la progettazione simultanea, Octave per l'algebra lineare, Python per procedurale, NetLogo per sistemi multi-agente, Prolog per logica, CLIPS per programmazione basata su regole, ecc.
Gaborous,

@gaborous Se puoi avere un codice astratto e leggibile, provalo. Sfortunatamente, sospetto che questo ti farà usare almeno tre lingue in qualsiasi corpus di lavoro più ampio; sarebbe anche sfortunato.
Raffaello,

ovviamente sono d'accordo che per un codice più grande non c'è linguaggio, ma per piccoli algoritmi core, è spesso possibile trovare un linguaggio molto vicino allo pseudocodice.
Gaborous,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.