疑似コードの辞書


8

疑似コードで辞書(=マップ)を表現するための良い、一般的な方法は何ですか?つまり、基本的にキーの値を格納し、すべてのキーと値のペアを反復処理し、特定のキーが含まれているかどうかをテストできるデータ構造です。以下のような(この場合は無意味な)Pythonコードを念頭に置いています。

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

そして、それを出版物で疑似コードとして表現したいと思います。数学的に考えると、辞書は関数であり、関係はペアのセットなので、次のようなものを書く

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

実際に意味があります。しかし、それは理解できますか?そしてテストのために、私は使用します

if k ∈ keys(D)

それとも、よりリテラルになるほうがいいですか、例えば

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

一般的に理解できる疑似コードを記述する方法に関する既存の優れた実践/参考資料はありますか?


これはStackoverflowに移動する必要があると思います。
デビッドケチソン

スタックオーバーフローについても考えましたが、実際のプログラミングではなく、それをどのように提示するかについてのみ疑問視されていました。これは確かに計算科学に関連しています。ただし、移動する必要があると感じる場合は、誰かが私のためにそれを行うことができますか?(私自身、できませんか?)
JanPöschko12年


@DavidKetcheson:今後、質問を移行する必要があると思われる場合は、移行のためにフラグを付けてください。この場合、Janは正しいです。実際のプログラミングに関するものではないため、スタックオーバーフローのトピックではありません。しかし、それはプログラマーやcstheoryにとって話題になるかもしれません。彼らが望む編集についてcstheoryのmodと話をしなければなりません。彼らのmodの1つが、質問は自分のサイトに合わせて調整する必要があると述べたからです。
Geoff Oxberry

それまでの間、メタスレッド内のcstheoryに関する質問へのリンク(cstheory mod Kavehの好意による)は、この質問に興味がある人々にとって興味深いかもしれません。
Geoff Oxberry、2012

回答:


7

疑似コードを作成する際に、Corwin、Leiserson、Rivest、Steinの概念のいくつかを、アルゴリズムの「デフォルト」の導入テキストとして常に使用しているようです。疑似コードの標準的な参照はこれ以上ないと思います。

ただし、優れた疑似コードを作成するには、問題をその代表的な数学的および論理関数に分解する必要があると私は主張します。コードを実行するにはどのような条件が満たされなければなりませんか?どのような枝が存在しますか?行動を決定するために本当に必要なデータは何ですか?

それ以上に、優れた疑似コードの目標は、何をする必要があるかをプログラマに伝えることであり、必ずしもそれを実装する方法ではありません。たとえば、ネストされたループのようなものを1つのステートメントにフラット化したい場合があります。

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

おそらく言うよりも良いでしょう

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

後者は既に、使用されている言語についていくつかの仮定を開始しているため(行優先か列優先かなど)。


4

それは、出版物の文脈、対象読者、および「一般的に理解できる」ことがどの程度「一般的」である必要があるかに依存すると思います。私はあなたの最後の選択肢がおそらく最も安全だと思います。つまり、可能な限り「平易な英語」に近い、文字通り/明示的なものにします。ただし、対象読者が集合論、Python、Java、C#、JavaScriptなどに精通している場合は、これらのいずれかに類似した表記の方が適している可能性があります。

私は、候補者がコードまたは疑似コードを書くことが期待される就職の面接を行う人物としてこの提案をします。ほとんどの候補者(善と悪の両方)は、疑似コードを自分自身と私に可能な限り理解できるようにするために、彼らが最も精通している言語に向かっている傾向があります。Javaに詳しい人々は書いていMap<K,V>ます。Pythonに詳しい人は、最初のコードスニペットと同じようにタプルまたは辞書を作成します。Cに詳しい人は配列を書きます。プログラミングの知識があまりない人は、平易な英語のように見える疑似コードを書く傾向があります-とにかく、それはとにかくPythonのように見えることが多いです。:-)

残念ながら、最後の質問にはお答えできません。疑似コードを記述するためのリファレンスや一般的な推奨事項についてはよく知りません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.