알고리즘 작성을위한 우수 사례


22

이것은 알고리즘을 얼마나 효과적으로 표현할 수 있는지에 관한 것입니다. 학부 교육을 위해서는 이것이 필요합니다.

의사 코드를 작성하는 표준 방법과 같은 것은 없다는 것을 알고 있습니다. 다른 저자들은 다른 규칙을 따릅니다.

여기 사람들이 지적하고 따르고 최선의 방법을 생각하면 도움이 될 것입니다.

이것에 대해 자세히 다루는 책이 있습니까?


9
"최고"는 매우 주관적이며, 제목을 수정하고 "최고"를 요구하는 대신 사람들이 실제로 무엇을하는지 묻습니다. "알고리즘을 제시하는 방법"또는 "알고리즘을 제시하는 좋은 방법"과 같은 것이있을 수 있습니다. 다음과 같은 알고리즘을 제시하기 때문에 좀 더 구체적으로 설명하고 싶을 수도 있습니다. 1. 저학년 학생들에게 2. 교과서에서 3. 회의에서 3.
Kaveh

1
Knuth, Larrabee 및 Roberts의 Mathertical Writting 관련 섹션을 확인할 수도 있습니다 .
Kaveh

답변:


26

의사 코드를 작성하는 것은 코드를 작성하는 것과 같습니다. 사용자 (및 사용자가 작성하는 사람들)가 실제로 일부 표준을 따르는 한 어떤 표준 을 따르는지는 중요하지 않습니다 .

그러나 기록을 위해 강의 노트, 연구 논문 및 향후 책에 사용하는 특유의 표준이 있습니다.

  • 제어 흐름 및 메모리 액세스를 위해 표준 명령형 구문을 사용하십시오 (반환되는 경우 array [index], function (arguments)). "다른 경우"를 철자하십시오.

    • 그러나 또는 대신 사용하십시오.field(record)record.fieldrecord->field
  • 수학에 대한 표준 수학 표기법을 사용 - 쓰기 대신 , 대신에 , 대신 , 대신에 , 대신에 , 대신에 , 대신을 , 기타xyx*ys t ¬ p amodba%bsts <= t¬p!p πxsqrt(x)πPIMAX_INT

    • 그러나 문제 를 피하기 위해 할당에 를 사용 하십시오 .xy==

    • 그러나 영어가 더 명확하다면 표기법 (의사 코드)을 완전히 피하십시오.

      • 표기법이 명확하면 대칭 적으로 영어를 피하십시오!
  • 구문 설탕 최소화 — 일관된 들여 쓰기 (a Python)로 블록 구조를 나타냅니다. "시작 / 종료"또는 "do / od"또는 "fi"와 같은 단 키워드를 생략하십시오. 줄 번호를 생략하십시오. 마 하지 "에 대한"와 같은 키워드를 강조하거나 "동안"또는 "만약"다른 그들을 설정하여 typeface또는 스타일 . 이제까지. 하지마

    • 그러나 \ textsc {Small Caps}의 알고리즘 이름과 상수, 기울임 꼴의 변수 이름 및 sans serif의 리터럴 문자열을 입력하십시오.

    • 그러나 \\[0.5ex]의미있는 코드 청크 사이에 소량의 수직 "호흡"공간 ( )을 추가하십시오 .

  • 중요하지 않은 세부 사항을 지정하지 마십시오. 정점을 방문하는 순서가 중요하지 않으면 "모든 정점에 대해"라고 말하십시오.

예를 들어, 다음은 Borůvka의 최소 스패닝 트리 알고리즘의 재귀 공식입니다 . 이전에 을 세트 모든 모서리를 축소 하여 에서 얻은 그래프로 정의 했으며 루프 및 평행 모서리를 제거하는 서브 루틴으로 전개했습니다.G LG/LGL

보 루프 카 알고리즘

필자는 자체 경량 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의 시간 Vfj(v)jthv
Suresh Venkat

@SureshVenkat : 일반적으로 기능 언어로 수행하는 방법과 TAoCP 표기법입니다. (분명히, 그것이 Jɛ ff E가이 표기법을 사용하는 이유인지 알 수 없습니다.)
Radu GRIGore

5
의사 코드에주의해야하는 주된 이유는 알고리즘에 대해 혼동하기 쉬우므로 몇 가지 사항을 강조하는 것이 중요하기 때문입니다. Boruvka에 대한 위의 Jeff 예제가이를 보여줍니다. 코드에서 L은 세트로 취급됩니다. 모서리 uv는 v뿐만 아니라 u에 입사되는 가장 밝은 모서리가 될 수 있으므로 루프에 두 번 추가되지만 L을 세트로 생각하더라도 중요하지 않습니다. 그러나 이것은 분명하지 않으며 L을 목록으로 구현하면이를 구현하는 일부가 쉽게 넘어 질 수 있습니다.
찬드라 체 쿠리

2
@ChandraChekuri : 예, 세트를 잘못 구현하면 세트를 조작하는 알고리즘에 문제가 발생할 수 있습니다.
Jeffε

1
@SureshVenkat : 아. 아니요, 참을 수 없습니다. 대담한 키워드는 아기 예수를 울게합니다. Dijkstra는 그 뛰어난 인쇄 법을 소개하여 Turing 상을 잃어야합니다.
Jeffε

11

파이썬 구문과 비슷한 것을 사용하는 경향이 있습니다. 파이썬은 이미 의사 코드에 가깝기 때문에 일부 경우 내 의사 코드가 실제 작업 코드로 음영 처리 될 수 있습니다.


나도 루비에서. github gist를 사용하면 실행 가능한 스 니펫을 쉽게 공유 할 수 있습니다. gist.github.com/chadbrewbaker/7202412
Chad Brewbaker

그러나 파이썬은 선형 대수를 나타내는 것은 좋지 않습니다. Octave는이 경우 (의사 코드에 더 가깝습니다)에 더 적합합니다.
gaborous

3

명확한 코드를 원한다면 (예 : 수학이 거의 없거나 실제 프로그래밍에 가깝습니다) 실제로 컴파일하는 코드를 고려할 수 있습니다. 여기에는 몇 가지 장점이 있습니다.

  • 어디에서나 구문 강조를 얻을 수 있습니다.
  • 컴파일러는 구문을 검사하고 일관성을 유지합니다.
  • 구현을 단위 테스트하여 코드 품질을 향상시킬 수 있습니다.
  • 알고리즘을 실행하고 측정 된 런타임을 분석과 비교하여 고급 분석 기술에 동기를 부여 할 수 있습니다.

우리 대학의 교수는 자신의 알고리즘 과정에서이 작업을 수행합니다. 그의 선택 언어는 Modula입니다. 그래도 언어의 특정 선택은 중요하지 않다고 생각합니다. 추상화 수준에 가장 적합한 하나의 패러다임에 충실하십시오.


"당신의 추상화 수준에 가장 잘 맞는 하나의 패러다임에 충실하십시오." 나는 이것이 의사 코드의 대안을 찾는 훌륭한 조언이라고 생각합니다. 많은 언어가 있으며, 거의 항상 특정 패러다임에 대한 간단한 구문을 대상으로하는 하나 이상의 언어가 있습니다. 동시 설계를위한 Ada, 선형 대수를위한 Octave, 절차를위한 Python, 다중 에이전트 시스템을위한 NetLogo, 논리를위한 Prolog, CLIPS를위한 규칙 기반 프로그래밍 등
화려하다

@gaborous 읽을 수 있고 추상적 인 코드를 가질 수 있다면 가십시오. 불행히도, 나는 이것이 더 큰 규모의 작업에서 적어도 3 개의 언어를 사용해야한다고 생각한다. 불행히도.
Raphael

물론 큰 코드에는 언어가 없지만 작은 핵심 알고리즘의 경우 의사 코드에 매우 가까운 언어를 찾는 것이 가능하다는 데 동의합니다.
gaborous
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.