算法竞赛中的命名方式

· · 算法·理论

原作:@hzwer 原文链接:link

初稿成于 2024 / 08 / 10

本文在原文基础上略有修改。

注:本文提到的命名方式只涉及最基础的语法运用,至于使用各种语法糖的选手应该也用不到本文。

众所周知,乱写变量名会降低代码可读性。

更重要的是个人经验。

随意命名、约定俗成

对于循环变量:\texttt{i}\texttt{j}\texttt{k}

对于 queuepriority_queuedeque\texttt{p}\texttt{q}

对于 struct\texttt{node}(有时根据用法写 \texttt{SMT}\texttt{Edge} 等等)

按作用命名

对于大部分变量,我们按照其作用、意义进行命名,但为防止与保留字冲突(主要是懒),通常不写完整单词,而是进行缩写 / 大小写转化,以下是一些常用缩写:(解释说明中的单词不一定不可用,且只保证板块内无重复)

算法关键变量

常用写法 解释说明
\texttt{dp} 动态规划(\texttt{DP}
\texttt{mst} 最小生成树(\texttt{MST}
\texttt{scc} 强连通分量(\texttt{SCC}
\texttt{Hash} 哈希表(\texttt{hash}

通用

常用写法 解释说明
\texttt{cmp / comp} 比较(\texttt{compare}
\texttt{cnt} 计数器(\texttt{count}
\texttt{cur} 当前量(\texttt{current}
\texttt{del} 删除(\texttt{delete}
\texttt{delta} 增量(\texttt{delta}
\texttt{update} 更新(\texttt{update}
\texttt{use / used} 使用(\texttt{use / used}
\texttt{val} 值(\texttt{value}
\texttt{ret} 返回值(\texttt{return}
\texttt{sum} 和(\texttt{sum}
\texttt{num} 数量(\texttt{number}
\texttt{tot} 总数(\texttt{total}
\texttt{t / tim} 时间(\texttt{time}
\texttt{tmp} 临时量(\texttt{temporary}
\texttt{ans} 答案(\texttt{answer}
\texttt{flag} 标志(\texttt{flag}
\texttt{from} 来自(\texttt{from}
\texttt{get} 得到(\texttt{get}
\texttt{vis} 访问(\texttt{visit}
\texttt{siz} 大小(\texttt{size}
\texttt{start} 开始(\texttt{start}
\texttt{pos} 位置(\texttt{position}
\texttt{query / ask} 询问(\texttt{query / ask}
\texttt{res} 结果(\texttt{result}
\texttt{bel} 属于(\texttt{belong}
\texttt{best} 最佳的(\texttt{best}
\texttt{block} 障碍(\texttt{bolck}
\texttt{chk / check} 判定(\texttt{check}
\texttt{col / color} 颜色(\texttt{color}
\texttt{diff} 差别(\texttt{dirrerence}
\texttt{div} 部分(\texttt{division}
\texttt{extra} 额外的(\texttt{extra}
\texttt{ind} 标号(\texttt{index}
\texttt{inf} 无穷大(\texttt{infinity}
\texttt{init} 初始化(\texttt{initialize}
\texttt{len} 长度(\texttt{length}
\texttt{low} 下边的(\texttt{lower}
\texttt{mid} 中间量(\texttt{matrix}
\texttt{res / rest} 剩余(\texttt{residual / rest}

序列 / 链表

常用写法 解释说明
\texttt{pre} 前驱(\texttt{precursor}
\texttt{suc} 后继(\texttt{succeed}
\texttt{pre} 前缀(\texttt{prefix}
\texttt{suf} 后缀(\texttt{suffix}
\texttt{nxt} 后继(\texttt{next}
\texttt{len} 长度(\texttt{length}
\texttt{to} 表目的(\texttt{to}
\texttt{ins / insert} 插入(\texttt{insert}
\texttt{inv / rev} 翻转(\texttt{inverse / reverse}
\texttt{las / last} 最后一个(\texttt{last}

图论

常用写法 解释说明
\texttt{ver} 顶点(\texttt{vertex}
\texttt{edge} 边(\texttt{edge}
\texttt{in} 入边 / 度(\texttt{in}
\texttt{out} 出边 / 度(\texttt{out}
\texttt{nxt} 后继(\texttt{next}
\texttt{to} 表目的(\texttt{to}
\texttt{deg} 度数(\texttt{degree}
\texttt{dep} 深度(\texttt{depth}
\texttt{dis / dist} 距离(\texttt{distance}
\texttt{siz} 大小(\texttt{size}
\texttt{g / gra} 图(\texttt{graph}
\texttt{t / tr} 树(\texttt{tree}
\texttt{flow} 流(\texttt{flow}
\texttt{anc} 祖先(\texttt{ancestor}
\texttt{fa} 父亲(\texttt{father}
\texttt{son} 儿子(\texttt{son}
\texttt{col / color} 颜色(\texttt{color}

数据结构 / \text{STL}

常用写法 解释说明
\texttt{stk / sta} 栈(\texttt{stack}
\texttt{heap} 堆(\texttt{heap}
\texttt{que} 队列(\texttt{queue}
\texttt{inq} 在队列里(\texttt{inq}
\texttt{instk} 在栈中(\texttt{instk}
\texttt{str} 字符串(\texttt{string}
\texttt{ch} 字符(\texttt{char}
\texttt{mp} 映射(\texttt{map}
\texttt{vec} 向量(\texttt{vector}
\texttt{build} 建立(\texttt{build}
\texttt{modify} 修改(\texttt{modify}
\texttt{ins / insert} 插入(\texttt{insert}
\texttt{merge} 合并(\texttt{merge}
\texttt{split} 分裂(\texttt{split}
\texttt{rnk / rank} 排名(\texttt{rank}

数学

常用写法 解释说明
\texttt{lim} 极限(\texttt{limit}
\texttt{rnk / rank} 秩(\texttt{rank}
\texttt{mat} 矩阵(\texttt{matrix}
\texttt{prod} 乘积(\texttt{product}
\texttt{fac / factor} 因子(\texttt{factor}
\texttt{delta} 增量、判别式(\texttt{delta}
\texttt{add} 加(\texttt{addition}
\texttt{sub} 减(\texttt{substraction}
\texttt{mul} 乘(\texttt{multiply}
\texttt{div} 除(\texttt{division}
\texttt{mod} 模(\texttt{modulo}
\texttt{pri / prime / ispri} 质数(\texttt{prime}
\texttt{vec} 向量(\texttt{vector}

1:事实上,随着 \texttt{C++} 体系的不断更新(主要是竞赛支持的语法换代),一些单词可能也会变成不可使用的。因此,更重要的是在不断地错误中积累经验。(不要在赛场积累就对了)

2:上表大部分内容源自原文,笔者也补充了一部分自己见过的、用过的,关键还是看个人习惯。部分内容比较突兀而未加解释,但笔者认为这并不重要。

3:请忽略一些看起来与使用无关的问题。