Гарні практики написання алгоритмів


22

Мова йде про те, наскільки ефективно ми можемо виразити алгоритм. Мені це потрібно для моєї студентської викладання.

Я розумію, що немає такого поняття, як стандартний спосіб написання псевдокоду. Різні автори дотримуються різних умов.

Було б корисно, якби тут люди зазначили, спосіб, яким вони слідують і вважають найкращим.

Чи є якась книга, яка детально розглядає це?


9
"кращий" дуже суб'єктивний, я думаю, ви повинні змінити назву і замість того, щоб "найкраще" запитати, що люди роблять на практиці. Можливо, щось на кшталт "як представити алгоритми" або "хороші практики подання алгоритмів". Ви можете також бути більш конкретними, оскільки представляєте алгоритми: 1. для учнів нижчого класу 2. у підручнику 3. у конференційному документі дуже різні завдання.
Каве

1
Ви також можете перевірити відповідні розділи математичного письма Кнут, Ларрабі та Робертса.
Kaveh

Відповіді:


26

Написання псевдокоду схоже на написання коду: Це не особливо важливо, якого стандарту ви дотримуєтесь, якщо ви (і люди, з якими ви пишете) насправді дотримуєтесь певного стандарту.

Але для запису, ось ідіосинкратичний стандарт, який я використовую в своїх лекційних записках, науково-дослідних роботах та новій книзі.

  • Використовуйте стандартний синтаксис імперативу для контролю потоку та доступу до пам'яті - if, while, for, return, array [index], function (аргументи). Пропишіть "ще якщо".

    • Але використовуйте замість абоfield(record)record.fieldrecord->field
  • Використовуйте стандартні математичні позначення для математики - Запис замість того , в модах б замість , s т замість того , ¬ р замість , xyx*yamodba%bsts <= t¬p!p замість,πзамість,замістьі т.д.xsqrt(x)πPIMAX_INT

    • Але використовуйте для призначення, щоб уникнути проблеми.xy==

    • Але уникайте позначень (і псевдокоду!) Повністю, якщо англійська зрозуміліша.

      • Симетрично уникайте англійської мови, якщо позначення чіткіші!
  • Мінімізуйте синтаксичний цукор - Вкажіть структуру блоку за допомогою послідовного відступу (à la Python). Пропустіть цукристі ключові слова, такі як "початок / кінець" або "до / од" або "фі". Пропустіть номери рядків. Ви НЕ підкреслити ключові слова , як «за» або «а» або «якщо», встановивши їх в інший typefaceабо стилі . Колись. Просто ні.

    • Але імена та константи алгоритму набору в \ textc {Small Caps}, назви змінних курсивом та літеральні рядки в sans serif.

    • Але додайте невелику кількість вертикального "дихаючого" простору \\[0.5ex]між значущими фрагментами коду.

  • Не вказуйте неважливі деталі. Якщо не має значення, в якому порядку ви відвідуєте вершини, просто скажіть "для всіх вершин".

G/LGL

Алгоритм Борівки

Я використовую власне полегшене algorithmсередовище LaTeX для набору псевдокоду. (Це просто 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}

fj(v)jthv

@SureshVenkat: Це, як правило, це робиться на функціональних мовах, а також позначення в TAoCP. (Очевидно, я не можу знати, чому саме тому Jɛ ff E використовує це позначення.)
Radu GRIGо

5
Основна причина бути обережними з псевдо-кодом полягає в тому, що легко заплутатися в алгоритмі, тому важливо підкреслити деякі речі. Наведений вище приклад Джеффа для Борувки ілюструє це. У коді L трактується як набір. Край uv може бути найлегшим краєм, що трапляється до u, а також v, тому він додається двічі в циклі, але це не має значення, якщо ви вважаєте L як набір. Однак це не очевидно, і хтось із них, що реалізує це, може бути легко вимкнути, якщо вони реалізують L як список.
Чандра Чекурі

2
@ChandraChekuri: Так, неправильна реалізація наборів може спричинити проблеми в алгоритмах, що управляють наборами.
Jeffε

1
@SureshVenkat: О, це. Ні, я не витримую цього. Сміливі ключові слова змушують дитину Ісуса плакати. Дійкстра повинен втратити свою нагороду Тюрінга за впровадження цієї видатної типографічної конвенції.
Jeffε

11

Я схильний використовувати щось, що нагадує синтаксис Python. Python достатньо близький до псевдокоду, що в деяких випадках мій псевдокод може затінити фактичний робочий код.


Я також, але в Рубі. За допомогою github gists ви можете легко ділитися виконуваними фрагментами, з якими вони можуть грати. gist.github.com/chadbrewbaker/7202412
Чад Брюбекер

Однак Python не годиться представляти лінійну алгебру. Я думаю, що в цьому випадку Октава краще підходить (ближче до псевдокоду).
габоровий

3

Якщо ви хочете мати певний код (тобто мало-мало математики, близький до реального програмування), ви можете розглянути можливість наявності коду, який насправді компілюється. Це має ряд переваг:

  • Ви підсвічуєте синтаксис скрізь.
  • Компілятор перевіряє для вас синтаксис і застосовує послідовність.
  • Для покращення якості коду ви можете протестувати свої реалізації.
  • Можна запустити алгоритм і порівняти вимірювані тривалість виконання з аналізами (таким чином мотивуючи передові методи аналізу).

Професор мого університету робить це у своєму курсі алгоритмів. Мовою вибору є модуль. Я не думаю, що особливий вибір мови має значення. Просто дотримуйтесь однієї (за парадигмою), яка найкраще відповідає вашому рівню абстракції.


"Просто дотримуйтесь однієї (за парадигмою), яка найкраще відповідає вашому рівню абстракції." Я думаю, що це чудова порада знайти альтернативу псевдокоду. Є багато мов, і майже завжди є принаймні одна, яка орієнтується на простий синтаксис для певної парадигми: Ada для паралельного проектування, Octave для лінійної алгебри, Python для процедурного, NetLogo для багатоагентних систем, Prolog для логіки, CLIPS для програмування, засноване на правилах, тощо
робочий

@gaborous Якщо у вас є читабельний, абстрактний код - займіться цим. На жаль, я підозрюю, що це дозволить вам використовувати принаймні три мови в будь-якому великому обсязі роботи; це теж було б прикро.
Рафаель

Звичайно, я погоджуюсь, що для більшого коду немає мови, але для невеликих основних алгоритмів часто можна знайти мову, дуже близьку до псевдокоду.
габоровий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.