Gute Praktiken zum Schreiben von Algorithmen

22

Hier geht es darum, wie effektiv wir einen Algorithmus zur Hand ausdrücken können. Ich brauche das für meine Grundausbildung.

Ich verstehe, dass es keine Standardmethode zum Schreiben eines Pseudocodes gibt. Unterschiedliche Autoren folgen unterschiedlichen Konventionen.

Es wäre hilfreich, wenn die Leute hier darauf hinweisen würden, wie sie vorgehen und das Beste denken.

Gibt es ein Buch, das sich ausführlich damit beschäftigt?

user3162
quelle
9
"best" ist sehr subjektiv, ich denke, Sie sollten den Titel ändern und statt "best" fragen, was die Leute in der Praxis tun. Vielleicht so etwas wie "wie man Algorithmen präsentiert" oder "gute Praktiken zum Präsentieren von Algorithmen". Möglicherweise möchten Sie auch präziser vorgehen, wenn Sie Algorithmen vorstellen: 1. Studenten in einer Grundschulklasse 2. in einem Lehrbuch 3. in einer Konferenzarbeit sind sehr unterschiedliche Aufgaben.
Kaveh
1
Vielleicht möchten Sie auch die relevanten Abschnitte des mathematischen Schreibens von Knuth, Larrabee und Roberts überprüfen .
Kaveh

Antworten:

26

Das Schreiben von Pseudocode ist wie das Schreiben von Code: Es ist nicht besonders wichtig, welchem ​​Standard Sie folgen, solange Sie (und die Leute, mit denen Sie schreiben) tatsächlich einem Standard folgen .

Um es festzuhalten, hier ist der eigenwillige Standard, den ich in meinen Vorlesungsskripten, Forschungsarbeiten und dem nächsten Buch verwende.

  • Verwenden Sie die standardmäßige imperative Syntax für den Kontrollfluss und den Speicherzugriff - if, while, for, return, array [index], function (Argumente). Formulieren Sie "else if".

    • Verwenden Sie statt oder aberfield(record)record.fieldrecord->field
  • Verwenden Sie die mathematische Standardnotation für Mathematik: Schreiben Sie anstelle von , anstelle von , anstelle von , anstelle von , anstelle von , anstelle von , anstelle von , etc.xyx*ys t ¬ p amodba%bsts <= t¬p!p πxsqrt(x)πPIMAX_INT

    • Verwenden Sie jedoch für die Zuweisung, um das Problem zu vermeiden .xy==

    • Vermeiden Sie jedoch die Notation (und den Pseudocode!), Wenn Englisch klarer ist.

      • Vermeiden Sie symmetrisch Englisch, wenn die Notation klarer ist!
  • Syntaktischen Zucker minimieren - Blockstruktur durch konsistente Einrückung angeben (à la Python). Lassen Sie zuckerhaltige Schlüsselwörter wie "Anfang / Ende" oder "Do / Od" oder "Fi" weg. Zeilennummern weglassen. Sie nicht betonen Schlüsselwörter wie „für“ oder „während“ oder „wenn“ , indem sie in einer anderen Einstellung typefaceoder Stil . Je. Tu es einfach nicht.

    • Sie können jedoch Algorithmusnamen und Konstanten in \ textsc {Small Caps}, Variablennamen in Kursivschrift und Literalzeichenfolgen in Sans Serif eingeben .

    • Fügen Sie jedoch \\[0.5ex]zwischen aussagekräftigen Codestücken eine kleine Menge vertikalen "Atempausen" ( ) ein.

  • Geben Sie keine unwichtigen Details an. Wenn es egal ist, in welcher Reihenfolge Sie die Scheitelpunkte besuchen, sagen Sie einfach "für alle Scheitelpunkte".

Hier ist zum Beispiel eine rekursive Formulierung des Minimum-Spanning-Tree-Algorithmus von Borůvka . Ich habe zuvor als den Graphen definiert, der aus indem alle Kanten in der Menge , und Flatten als eine Unterroutine, die Schleifen und parallele Kanten entfernt.G LG/LGL

Borůvkas Algorithmus

Ich benutze meine eigene algorithmLaTeX-Umgebung , um Pseudocode zu setzen. (Es ist nur eine tabbingUmgebung innerhalb einer \fbox.) Hier ist mein Quellcode für Borůvkas Algorithmus:

\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}
Jeffε
quelle
Interessanterweise verwenden Sie field (record) anstelle von record [field]. Ich stelle mir vor, dies ist die " ist die Koordinate von " Ansicht der Welt? j t h vfj(v)jthv
Suresh Venkat
@SureshVenkat: So macht man das normalerweise in funktionalen Sprachen und auch in der Notation in TAoCP. (Offensichtlich kann ich nicht wissen, warum Jɛ ff E diese Notation verwendet.)
Radu GRIGore
5
Der Hauptgrund, um mit Pseudo-Code vorsichtig zu sein, ist, dass es leicht zu Verwechslungen mit dem Algorithmus kommt, daher ist es wichtig, einige Dinge zu betonen. Jeffs Beispiel oben für Boruvka veranschaulicht dies. Im Code wird L als Set behandelt. Eine Kante uv kann sowohl für u als auch für v die leichteste Kante sein. Sie wird also zweimal in die Schleife eingefügt, aber es spielt keine Rolle, ob Sie sich L als Menge vorstellen. Dies ist jedoch nicht offensichtlich und jemand, der dies implementiert, kann leicht ausgelöst werden, wenn er L als Liste implementiert.
Chandra Chekuri
2
@ChandraChekuri: Ja, die fehlerhafte Implementierung von Mengen kann zu Problemen bei Algorithmen führen, die Mengen manipulieren.
Jeffs
1
@ SureshVenkat: Oh, das. Nein, ich kann es nicht ertragen. Mutige Stichwörter bringen das Jesuskind zum Weinen. Dijkstra sollte seinen Turing-Preis für die Einführung dieser abscheulichen typografischen Konvention verlieren.
Jeffs
11

Ich neige dazu, etwas zu verwenden, das der Python-Syntax ähnelt. Python ist dem Pseudocode bereits nahe genug, so dass mein Pseudocode in einigen Fällen in einen tatsächlichen Arbeitscode umgewandelt werden kann.

David Eppstein
quelle
Ich auch, aber in Ruby. Mit Github-Gists können Sie leicht ausführbare Snippets freigeben, mit denen sie spielen können. gist.github.com/chadbrewbaker/7202412
Chad Brewbaker
Python eignet sich jedoch nicht zur Darstellung der linearen Algebra. Ich denke, in diesem Fall passt Octave besser (näher am Pseudocode).
Gaborous
3

Wenn Sie einen bestimmten Code haben möchten (dh wenig bis gar keine Mathematik, in der Nähe der realen Programmierung), sollten Sie einen Code in Betracht ziehen, der tatsächlich kompiliert wird. Dies hat mehrere Vorteile:

  • Sie erhalten Syntax-Hervorhebungen überall.
  • Der Compiler überprüft die Syntax für Sie und erzwingt die Konsistenz.
  • Sie können Ihre Implementierungen einem Komponententest unterziehen, um die Codequalität zu verbessern.
  • Sie können den Algorithmus ausführen und gemessene Laufzeiten mit Analysen vergleichen (was erweiterte Analysetechniken motiviert).

Ein Professor an meiner Universität macht das in seinem Algorithmenkurs. Seine bevorzugte Sprache ist Modula. Ich denke jedoch nicht, dass es auf die Wahl der Sprache ankommt. Halten Sie sich einfach an eines (pro Paradigma), das am besten zu Ihrem Abstraktionsgrad passt.

Raphael
quelle
"Halten Sie sich einfach an eines (pro Paradigma), das am besten zu Ihrer Abstraktionsstufe passt." Ich denke, dies ist ein guter Rat, um eine Alternative zum Pseudocode zu finden. Es gibt viele Sprachen, und fast immer gibt es mindestens eine, die auf eine einfache Syntax für ein bestimmtes Paradigma abzielt: Ada für gleichzeitiges Design, Octave für lineare Algebra, Python für prozedurale, NetLogo für Systeme mit mehreren Agenten, Prolog für Logik, CLIPS für regelbasierte Programmierung usw.
mühsam
@gaborous Wenn du lesbaren, abstrakten Code haben kannst - mach mit. Leider gehe ich davon aus, dass Sie in einem größeren Werk mindestens drei Sprachen verwenden müssen. das wäre auch unglücklich.
Raphael
Natürlich bin ich damit einverstanden, dass es für größeren Code keine Sprache gibt, aber für kleine Kernalgorithmen ist es oft möglich, eine Sprache zu finden, die dem Pseudocode sehr nahe kommt.
Uhr