Basic-scientific-research-series-1-Pseudo-code-specifications

本文最后更新于:2023年6月19日 晚上

记录一下科研论文中的伪代码。
转自:https://shuzang.github.io/2021/pseudocode-specification/

伪代码规范

伪代码是一种接近自然语言的算法描述形式,其目的是在不涉及具体实现(各种编程语言)的情况下将算法的流程和含义清楚的表达出来,因此它没有一个统一的规范,有的仅仅是在长期的实践过程中形成的一些约定俗成的表达样式。下图是一个简单的例子1,但已经包含了大多数主要元素

首先需要一个标题来描述整个算法,一般还会有一个与之一起的编号。在上图中,算法的标题为「Acesscontrol algorithm flow」,编号为「Algorithm 1」。标题与编号一般位于算法顶部,但也有人放在底部,编号多按全文的算法总数进行索引,但也可以按章节分别进行索引。
其次,在正式的算法流之前需要声明输入和输出。通常使用关键字 Input 和 Output 来声明,但也有人使用关键字 Data 和 Result。
顺序、选择与循环结构是算法的主体。通常,不同的程序块使用缩进来保持结构清晰,但也有不少人使用垂直连接线进行进一步划分,如上图。另外,和编程语言类似,伪代码中的选择和循环使用 if-then-else、while-do 和 for-do 等关键字和结构来描述2,举例如下,其中,每个程序块结束的 end 关键字有人选择写,也有人选择不写。

算法流程结构
赋值操作一般使用左箭头「<—」表示。A[i] 用来表示数组 A 的第 i 个元素,A[1…j] 则表示下标从 1 到 j 的子数组;函数调用使用函数名+传入参数的形式;返回值使用 return 关键字,这些都和常规编程语言相同。需要注意的是,未声明而使用的变量都可以视为算法内的局部变量,如果是全局变量则需要进行解释,可以在上下文中,也可以使用注释;注释的形式也和传统语言相同,使用 // 或 /……/。
算法整体通常使用三线框包围,但也有少部分人使用一个完整的框。
伪代码的语句一般不需要在末尾使用分号,但行首通常会添加行号。

2. LaTeX 包

latex 书写伪代码主要有三种排版格式:algorithm+algorithmic、algorithm+algorithmicx 以及 algorithm2e3。我们使用algorithm2e,它提供了垂直连接线,可以去掉 end 关键字,而且写起来更像编程语言,用着非常舒服。
引入 algorithm2e 包使用如下语句

1
\usepackage[options]{algorithm2e}

几个重要的 options 如下

  1. ruled:让标题显示在上面,默认会显示到最下面;
  2. vlined:默认启用垂直连接线;
  3. linesnumbered:让算法显示行号,不包括 input 和 output 部分;
  4. noend:程序块结束不打印 end。

常用命令如下4

一个官方的例子如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
\begin{algorithm}
\SetKwData{Left}{left}\SetKwData{This}{this}\SetKwData{Up}{up}
\SetKwFunction{Union}{Union}\SetKwFunction{FindCompress}{FindCompress}
\SetKwInOut{Input}{input}\SetKwInOut{Output}{output}

\Input{A bitmap $Im$ of size $w\times l$}
\Output{A partition of the bitmap}
\BlankLine
\emph{special treatment of the first line}\;
\For{$i\leftarrow 2$ \KwTo $l$}{
\emph{special treatment of the first element of line $i$}\;
\For{$j\leftarrow 2$ \KwTo $w$}{\label{forins}
\Left$\leftarrow$ \FindCompress{$Im[i,j-1]$}\;
\Up$\leftarrow$ \FindCompress{$Im[i-1,]$}\;
\This$\leftarrow$ \FindCompress{$Im[i,j]$}\;
\If(\tcp*[h]{O(\Left,\This)==1}){\Left compatible with \This}{\label{lt}
\lIf{\Left $<$ \This}{\Union{\Left,\This}}
\lElse{\Union{\This,\Left}}
}
\If(\tcp*[f]{O(\Up,\This)==1}){\Up compatible with \This}{\label{ut}
\lIf{\Up $<$ \This}{\Union{\Up,\This}}
\tcp{\This is put under \Up to keep tree as flat as possible}\label{cmt}
\lElse{\Union{\This,\Up}}\tcp*[h]{\This linked to \Up}\label{lelse}
}
}
\lForEach{element $e$ of the line $i$}{\FindCompress{p}}
}
\caption{disjoint decomposition}\label{algo_disjdecomp}
\end{algorithm}

渲染后的样式如下

注:当前算法选然后条件语句会带有下划线,主要是因为同时使用了 \ulem 包,产生了冲突,去掉该包即可


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!