アルゴリズムを書くためのグッドプラクティス


22

これは、手元のアルゴリズムをどれだけ効果的に表現できるかについてです。これは学部で教えるために必要です。

擬似コードを記述する標準的な方法などはないことを理解しています。異なる著者は異なる規則に従います。

ここの人々が、彼らが従い、最良のものを考える方法を指摘してくれれば、それは助けになるでしょう。

これを詳細に扱っている本はありますか?


9
「ベスト」は非常に主観的です。タイトルを変更し、「ベスト」を求める代わりに、人々が実際に何をするかを尋ねるべきだと思います。「アルゴリズムを表示する方法」や「アルゴリズムを表示するためのグッドプラクティス」のようなものかもしれません。また、アルゴリズムを提示するために、より具体的にしたい場合があります。1。学部クラスの生徒に2.教科書に3.会議論文に非常に異なるタスク。
カヴェー

1
また、Knuth、Larrabee、RobertsによるMathematical Writtingの関連セクションを確認することもできます。
カヴェー

回答:


26

擬似コードを書くことはコードを書くことに似ています:あなた(そしてあなたが書いた人々)が実際に何らかの標準に従う限り、どの標準に従うかは特に重要ではありません。

しかし、記録のために、講義ノート、研究論文、および今後の本で使用する特異な標準を以下に示します。

  • 制御フローとメモリアクセスに標準の必須構文を使用します— if、while、for、return、array [index]、function(arguments)。「else if」と綴ります。

    • ただし、またはの代わりにfield(record)record.field使用しますrecord->field
  • xyx*yamodba%b¬ P sts <= t¬p!p πxsqrt(x)πPIMAX_INT

    • ただし、問題を回避するには、割り当てにを使用します。xy==

    • ただし、英語がより明確な場合は、表記法(および擬似コード!)を完全に避けてください。

      • 対称的に、表記が明確な場合は英語を避けてください!
  • 構文糖の最小化—一貫したインデント(Python)によってブロック構造を示します。「begin / end」、「do / od」、「fi」などの甘いキーワードを省略します。行番号を省略します。「for」、「while」、「if」などのキーワードを異なるスタイルまたはスタイルに設定して強調しないでください。今まで。しないでください。typeface

    • しかし、\ textsc {Small Caps}のアルゴリズム名と定数、斜体の変数名、およびサンセリフのリテラル文字列のタイプセット。

    • ただし\\[0.5ex]、意味のあるコードチャンク間に少量の垂直の「呼吸」スペース()を追加します。

  • 重要でない詳細を指定しないでください。頂点にアクセスする順序が重要でない場合は、「すべての頂点に対して」と言うだけです。

たとえば、次はBorůvkaの最小スパニングツリーアルゴリズムの再帰的な定式化です。は、セット内のすべてのエッジを縮小することでから取得したグラフとして定義し、ループと平行エッジを削除するサブルーチンとしてFlattenを定義しました。G LG/LGL

Borůvkaのアルゴリズム

独自の軽量algorithmLaTeX環境を使用して、擬似コードをタイプセットします。(これtabbing\fbox。内の単なる環境です。)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}

面白いのは、record [field]の代わりにfield(record)を使用することです。私はこれが「想像であるの座標世界観」?j t h vfj(v)jthv
スレシュヴェンカト

@SureshVenkat:関数型言語で通常どのように行うか、またTAoCPの表記法です。(明らかに、それがJɛff Eがこの表記法を使用する理由かどうかわかりません。)
ラドゥグリゴール

5
擬似コードに注意する主な理由は、アルゴリズムについて混乱しやすいため、いくつかのことを強調することが重要だからです。上記のジェフのBoruvkaの例はこれを示しています。コードでは、Lはセットとして扱われています。エッジuvは、vだけでなくuにも入射する最も明るいエッジになる可能性があるため、ループに2回追加されますが、Lをセットと見なしても問題ありません。ただし、これは明らかではなく、Lをリストとして実装する場合、これを実装する人は簡単にトリップする可能性があります。
チャンドラチェクリ

2
@ChandraChekuri:はい、セットを誤って実装すると、セットを操作するアルゴリズムで問題が発生する可能性があります。
ジェフ

1
@SureshVenkat:ああ、あれ。いいえ、我慢できません。大胆なキーワードは、赤ちゃんイエスを泣かせます。ダイクストラは、その実行可能な活版印刷の慣習を紹介したことで、チューリング賞を失うはずです。
ジェフ

11

Python構文に似たものを使用する傾向があります。Pythonはすでに擬似コードに十分に近いため、場合によっては、擬似コードが実際の作業コードになることがあります。


私も、しかしRubyで。githubの要点を使用すると、実行可能なスニペットを簡単に共有して、それらを操作できます。gist.github.com/chadbrewbaker/7202412
チャドブリューベーカー

しかし、Pythonは線形代数を表現するのには適していません。この場合は、Octaveの方が適しています(擬似コードにより近い)。
貪欲な

3

明確なコード(つまり、数学がほとんどない、実際のプログラミングに近い)が必要な場合は、実際にコンパイルするコードを検討することをお勧めします。これにはいくつかの利点があります。

  • どこでも構文の強調表示を取得できます。
  • コンパイラは構文をチェックし、一貫性を強化します。
  • 実装を単体テストして、コード品質を改善できます。
  • アルゴリズムを実行し、測定されたランタイムを分析と比較できます(したがって、高度な分析手法の動機付けとなります)。

私の大学の教授は、彼のアルゴリズムコースでこれを行います。彼の選択言語はModulaです。ただし、言語の特定の選択は重要ではないと思います。抽象化のレベルに最適なもの(パラダイムごと)に固執するだけです。


「あなたの抽象化のレベルに最適なもの(パラダイムごとに)に固執するだけです。」これは、擬似コードの代替を見つけるための素晴らしいアドバイスだと思います。多くの言語があり、ほとんどの場合、特定のパラダイムの単純な構文を対象とする少なくとも1つがあります:並行設計のAda、線形代数のOctave、手続き型のPython、マルチエージェントシステムのNetLogo、ロジックのProlog、CLIPSのCLIPSルールベースのプログラミングなど
15年

@gaborous読み取り可能な抽象コードを作成できる場合は、どうぞ。残念ながら、これにより、より大きな一連の作業で少なくとも3つの言語を使用することになります。それも残念です。
ラファエル

もちろん、大きなコードには言語がないことに同意しますが、小さなコアアルゴリズムの場合、疑似コードに非常に近い言語を見つけることがしばしば可能です。
貪欲な
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.