跳到主要内容

定义

串的运算

一个串 aa 的长度定义为它包含的字符个数,记为 a|a|

连接运算

给定一符号集 SS,我们可以定义 SS 上串的连接运算,运算符记为 ×\times:若 a,ba,bSS 上的串,那么 a×ba\times b 表示两个串顺次相连产生的新串。在不引起歧义时,连接运算的运算符也可以省略不写,如 abab。串的连接运算具有以下性质:

  1. 不满足乘法交换律,例如 abc×de=abcde\mathrm{abc\times de=abcde},而 de×abc=deabc\mathrm{de\times abc=deabc}
  2. 满足乘法结合律,例如 abc×(de×f)=abcdef\mathrm{abc\times(de\times f)=abcdef},而 (abc×de)×f=abcdef\mathrm{(abc\times de)\times f=abcdef}
  3. 对所有的串 aa,都满足 εa=aε=a\varepsilon a=a\varepsilon=a,其中 ε\varepsilon 是空字符串;

前缀和后缀

  • 我们称串 aa 是串 bb 的前缀,如果存在串 cc,使得 b=acb=ac。我们用 aba\sqsubset b 来表示串 aa 是串 bb 的前缀这一关系。例如,hel 是 hello 的一个前缀。
  • 我们称串 aa 是串 bb 的后缀,如果存在串 cc,使得 b=cab=ca。我们用 bab\sqsupset a 来表示串 aa 是串 bb 的后缀这一关系。例如,ello 是 hello 的一个后缀。

特别地,对于任一符号串 aaaaϵ\epsilon 都是 aa 的前缀,也都是 aa 的后缀。

唯一可译码

在一个非奇异码中,虽然我们规定消息集到语言的映射是单射,但还并不能保证计算机能对输入的符号进行正确的解码。这是因为,在一次输入会话中,我们将一个消息序列中的消息依次进行编码,然后将得到的符号串连接在一起作为一个整体输入,因而解码时对符号串的划分可能存在歧义。

对于一个非奇异码来说,如果其语言包含的串无论如何相互连接,得到的长串都仅能以一种方式分解为串的乘积,则称这个码为唯一可译码。形式化地,如果非奇异码 f:MLf:M\to LLL 满足

p1p2pn=q1q2qm,piL,qjL,i=1,,n;j=1,,mn=m,pi=qi,i=1,,n\begin{aligned} p_1p_2\cdots p_n=q_1q_2\cdots q_m, p_i\in L, q_j\in L, \forall i=1,\cdots, n; j=1,\cdots,m \\ \Rightarrow n=m,p_i=q_i,\forall i=1,\cdots,n \end{aligned}

唯一可译码的 Kraft–McMillan 不等式

定理 给定唯一可译码 f:MLf:M\to LLL 对应的符号集 SS 的大小为 rr,并且语言 LL 所包含的 nn 个符号串 l1,,lnl_1,\cdots,l_n 的长度分别为 w1,,wnw_1,\cdots,w_n,那么

i=1nrwi1\sum_{i=1}^nr^{-w_i}\le 1

证明参考附录。

Kraft-McMillan 不等式给出了唯一可译码的一个必要条件,但它并不是一个充分条件。下面我们探讨一类容易构造的唯一可译码。

前缀码

我们称一个码 f:MLf:M\to L 是前缀码,如果 LL 中任两个串 aabb 都满足 aa 不是 bb 的前缀、bb 也不是 aa 的前缀。形式上地,

a,bL¬(ab)¬(ba)a,b \in L \Rightarrow \neg (a\sqsubset b) \wedge \neg (b\sqsubset a)

所有前缀码都是唯一码。(需要说明)

然而,不是所有唯一可译码都是前缀码。假设消息集 MM 包含两个消息,符号集为 {0,1}\{0,1\},我们来看这个语言:

L={10,1}L=\{10,1\}

(一定的论证)所以,它也是唯一可译码。

顶功码

我们称所有不是前缀码的唯一可译码为顶功码。

唯一可译码在线验证

检验一个码是否为前缀码是容易的,但是检验是否为唯一可译码则不那么容易。在这里我们提供一个在线应用对其进行检测。

前缀码与顶功码的等价性

我们定义码 f:MLf:M\to L 和码 g:MLg:M\to L' 等价,如果它们的语言 L,LL,L' 共享了同一个符号集 SS,并且存在一个双射 σ:LL\sigma:L\to L',将 LL 中的每一个串 aa 映成 bbaabb 具有相同种类和数量的符号,也即 bbaa 的一个重新排列。

由于前缀码总是比顶功码更易于理解,我们总希望将顶功码通过等价关系转化为前缀码加以研究。虽然我们尚未进行证明,但是我们接下来默认这一事实的正确性:对于任意一个顶功码,可以找到一个前缀码与之等价。