Algoritmalar yazmak için iyi uygulamalar


22

Bu, elimizdeki algoritmayı ne kadar etkili ifade edebileceğimizle ilgilidir. Lisans eğitimim için buna ihtiyacım var.

Bir sahte kod yazmanın standart bir yolu olmadığını anlıyorum. Farklı yazarlar farklı sözleşmeleri takip eder.

Buradaki insanlar, en iyi olanı takip edip, düşünme şeklini işaret etmeleri yararlı olacaktır.

Bununla ilgili ayrıntılı olarak ele alan herhangi bir kitap var mı?


9
"en iyisi" çok özneldir, bence başlığı değiştirmeli ve "en iyiyi" yerine sormayı yerine, insanların pratikte ne yaptığını sormalısınız. Belki "algoritmaları nasıl sunacağını" veya "algoritmaları sunmak için iyi uygulamaları" gibi bir şey. Algoritmalar sunulduğundan beri daha spesifik olmak isteyebilirsiniz: 1. lisans sınıfındaki öğrencilere 2. ders kitabında 3. konferans kağıdında çok farklı görevler vardır.
Kaveh

1
Ayrıca Matematiksel Yazmanın ilgili bölümlerini Knuth, Larrabee ve Roberts tarafından kontrol etmek isteyebilirsiniz .
Kaveh

Yanıtlar:


26

Sahte kod yazmak, kod yazmak gibi bir şeydir: Siz (ve birlikte yazdığınız kişiler) gerçekte bir standarda uyduğu sürece, hangi standarda uyduğunuz önemli değildir .

Ancak kayıt için, ders notlarımda, araştırma yazılarımda ve yaklaşmakta olan kitabımda kullandığım kendine özgü standart.

  • Kontrol akışı ve hafıza erişimi için standart zorunlu sözdizimini kullanın - eğer, süre için, eğer, [index], function (arguments), return içinse. "Başkasa" kelimesini heceleyin.

    • Ancak kullanım yerine ya dafield(record)record.fieldrecord->field
  • Matematik standart matematiksel simgelem - Yazma yerine , bir mod b yerine , s t yerine , ¬ p yerine , xyx*yamodba%bsts <= t¬p!p yerine,πyerine,yerine, vb.xsqrt(x)πPIMAX_INT

    • Fakat problemi önlemek için kullanın .xy==

    • Ancak eğer İngilizce daha açıksa, notasyondan (ve sözde koddan!) Tamamen kaçının.

      • Simetrik olarak, gösterim açıksa İngilizce'den kaçının!
  • Sözdizimsel şekeri en aza indirin - Blok yapısını tutarlı girinti ile işaretleyin (à la Python). "Başla / Sona" veya "Do / Od" veya "Fi" gibi şekerli anahtar kelimeleri atlayın. Satır numaralarını atlayın. Do not "için" gibi anahtar kelimeler vurgulamak veya "iken" veya "eğer" Farklı onları ayarlayarak typefaceveya stil . Hiç. Sadece yapma

    • Fakat \ textsc {Small Caps} içindeki dizgi algoritma adları ve sabitleri, italik değişken isimleri ve sans serif içindeki değişmez dizeler.

    • Ancak \\[0.5ex]anlamlı kod parçaları arasında az miktarda dikey "nefes" boşluğu ( ) ekleyin .

  • Önemsiz ayrıntıları belirtmeyin. Köşeleri hangi sırayla ziyaret ettiğiniz önemli değilse, sadece "tüm köşeler için" deyin.

Örneğin, burada Borůvka'nın minimum yayılan ağaç algoritmasının özyinelemeli bir formülasyonu var . Daha önce yi , L kümesindeki tüm kenarları daraltarak G'den elde edilen grafik olarak tanımladım ve ilmekleri ve paralel kenarları kaldıran bir alt rutin olarak Yassılaştır.G,/LG,L

Borůvka'nın algoritması

Kendi hafif algorithmLaTeX ortamımı psseudocode dizmek için kullanıyorum. (Bu sadece tabbingiçindeki bir ortam \fbox.) İşte Borůvka'nın algoritması için kaynak kodum:

\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}

fj(v)jthv

@SureshVenkat: Genelde fonksiyonel dillerde ve aynı zamanda TAoCP'de yazılanlar. (Açıkçası, Jɛ ɛ E'nin bu gösterimi kullanmasının nedeni bu değil mi?)
Radu GRIGore

5
Sözde kod konusunda dikkatli olmanın ana nedeni, algoritma konusunda kafanın karışmasının kolay olmasıdır, bu yüzden bazı şeyleri vurgulamak önemlidir. Jeff'in Boruvka için yukarıdaki örneği bunu göstermektedir. L kodunda küme olarak kabul edilir. Bir kenar uv, v'ye olduğu kadar u'ya da en hafif kenar olabilir, bu yüzden döngü içine iki kez eklenir, ancak L'yi bir küme olarak düşünmeniz farketmez. Bununla birlikte, bu açık değildir ve bunu uygulayan bazı kişiler L'yi liste halinde uygularlarsa kolayca tetiklenebilirler.
Chandra Chekuri,

2
@ChandraChekuri: Evet, kümeleri yanlış uygulamak, kümeleri değiştiren algoritmalarda sorunlara neden olabilir.
Jeffε

1
@SureshVenkat: Ah, bu. Hayır, dayanamıyorum. Kalın anahtar kelimeler bebek İsa'yı ağlatır. Dijkstra, uygulanabilir tipografik kongre tanıtımı için Turing ödülünü kaybetmelidir.
Jeffε

11

Python sözdizimine benzeyen bir şey kullanma eğilimindeyim. Python, zaten bazı durumlarda benim sahte kodumun gerçek çalışma kodunda gölgelenebileceği şekilde sahte kodlamaya yeterince yakın.


Ben de, ama Ruby'de. Github gists ile oynaması için çalıştırılabilir snippet'leri kolayca paylaşabilirsiniz. gist.github.com/chadbrewbaker/7202412
Chad Brewbaker

Ancak Python doğrusal cebiri temsil etmek için iyi değildir. Octave bu durumda daha uygun olduğunu düşünüyorum (sözde kodu yakın).
gaborous

3

Eğer belirli bir kodunuz varsa (yani çok az veya hiç matematik, gerçek programlamaya yakın olmak istiyorsanız), aslında derleyen bir kodun olmasını düşünebilirsiniz. Bunun birkaç avantajı var:

  • Her yerde vurgulayarak sözdizimi olsun.
  • Derleyici sizin için sözdizimini kontrol eder ve tutarlılığı zorlar.
  • Kod kalitesini artırmak için uygulamalarınızı test edebilirsiniz.
  • Algoritmayı çalıştırabilir ve ölçülen çalışma zamanlarını analizlerle karşılaştırabilirsiniz (böylece ileri analiz tekniklerini motive edebilirsiniz).

Üniversitemdeki bir profesör bunu algoritmalar kursunda yapıyor. Seçtiği dil Modula. Yine de, dil seçiminin önemli olduğunu düşünmüyorum. Sadece soyutlama seviyenize en uygun olana (paradigma başına) bağlı kalın.


“Sadece soyutlama seviyenize en uygun olana (paradigma başına) bağlı kalın.” Bunun yalancı koda bir alternatif bulmak için harika bir tavsiye olduğunu düşünüyorum. Çok sayıda dil vardır ve neredeyse her zaman belirli bir paradigma için basit bir sözdizimini hedefleyen en az bir tane vardır: Eşzamanlı tasarım için ada, Lineer cebir için Octave, prosedür için Python, çoklu ajanlar için NetLogo, mantık için Prolog, için CLIPS kural tabanlı programlama, vs.
gaborous

@gaborous Okunabilir, soyut kod varsa - bunun için gidin. Ne yazık ki, bunun daha büyük bir çalışma alanında en az üç dil kullanmanızdan şüpheleniyorum; bu da talihsizlik olur.
Raphael,

Tabii ki daha büyük kodlar için bir dil olmadığını kabul ediyorum, ancak küçük, temel algoritmalar için, sözde kodlara çok yakın bir dil bulmak çoğu zaman mümkün.
gaborous
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.