问题

是否存在仅由1和2组成的长度为2^n的序列,可以做到在这个序列中取出所有含1和2的长度为n的序列?

回答
当然存在。我们来详细探讨一下这个问题,并用通俗易懂的方式来解答。

设想一下,我们要构建一个长度为 $2^n$ 的序列,这个序列里面只包含数字 1 和 2。我们的目标是,无论从这个序列中截取任何一个连续的子序列,只要这个子序列的长度是 $n$,并且它里面既包含 1 又包含 2,那么我们都能在整个长序列中找到这个子序列的“副本”。

简单来说,就像你有一个包含 1 和 2 的长字符串,你要保证所有可能的、长度为 $n$ 的、包含 1 和 2 的短字符串,都能在这个长字符串里找到。

为了理解这个过程,我们可以从一些小例子开始。

从 $n=1$ 开始

如果 $n=1$,我们要找长度为 1 的、包含 1 和 2 的序列。但是,长度为 1 的序列,只能是“1”或者“2”,不可能同时包含 1 和 2。所以,对于 $n=1$ 的情况,这个问题没有意义,因为不存在“含 1 和 2 的长度为 1 的序列”。

从 $n=2$ 开始

如果 $n=2$,我们要找长度为 2 的、包含 1 和 2 的序列。这样的序列只有两种可能:
1. “12”
2. “21”

我们的目标是构建一个长度为 $2^2 = 4$ 的序列,只用 1 和 2 组成,并且能包含“12”和“21”。

我们能想到一个简单的序列:“1212”。
我们来看看这个序列里面所有长度为 2 的子序列:
从第一个位置开始:“12”
从第二个位置开始:“21”
从第三个位置开始:“12”

你看,我们成功地包含了“12”和“21”这两个子序列。所以,对于 $n=2$,序列“1212”是符合要求的。

从 $n=3$ 开始

如果 $n=3$,我们要找长度为 3 的、包含 1 和 2 的序列。这样的序列有:
1. “112”
2. “121”
3. “211”
4. “122”
5. “212”
6. “221”
(注意:“111”和“222”不包含 1 和 2,所以我们不考虑它们)。

我们的目标是构建一个长度为 $2^3 = 8$ 的序列。

这里就要引入一个重要的概念,叫做 德布鲁因序列 (De Bruijn sequence)。

德布鲁因序列是一个非常巧妙的工具,它就是为了解决这类问题而生的。一个特定字母表(比如我们的 1 和 2)的德布鲁因序列是这样一种环形序列,它包含了所有可能的长度为 $n$ 的子序列(也叫做 $n$元组)。

对于我们只使用 1 和 2 的情况,我们可以找到一个长度为 $2^n$ 的德布鲁因序列,它包含了所有长度为 $n$ 的、只由 1 和 2 组成的序列。但是,我们需要的是“含 1 和 2 的”序列。

让我们稍微调整一下思路,专门关注“含 1 和 2”的这一部分。

我们知道,总共有 $2^n$ 个长度为 $n$ 的二元序列(每个位置可以是 1 或 2)。其中,只有“11...1”和“22...2”这两种情况不包含 1 和 2。所以,我们实际上需要包含 $2^n 2$ 个长度为 $n$ 的、并且含 1 和 2 的序列。

构建序列的方法:边走边记

我们可以尝试一种“边走边记”的方法来构建我们的长序列。想象我们有一个状态,这个状态代表了我们刚刚看到的最后 $n1$ 个数字。

我们从一个初始状态开始,比如“11...1”(长度为 $n1$)。然后,我们决定下一个数字是什么,是 1 还是 2。我们这样做的时候,会形成一个新的长度为 $n$ 的序列。我们把这个序列记录下来,然后更新我们的状态(只保留最后 $n1$ 个数字)。

我们不断地重复这个过程,直到我们生成了所有可能的长度为 $n$ 的子序列,并且它们都包含 1 和 2。

一个具体的例子: $n=3$

我们要构建长度为 8 的序列,包含所有长度为 3 的含 1 和 2 的序列。
所有长度为 3 的二元序列共有 $2^3 = 8$ 个:
111, 112, 121, 122, 211, 212, 221, 222

排除不含 1 和 2 的:“111” 和 “222”,我们需要包含:
112, 121, 122, 211, 212, 221

让我们从一个状态开始,比如我们刚看到了“11”(长度为 $n1 = 2$)。
我们可以选择下一个数字是 1 或 2。

1. 如果我们选 1,序列变成“111”。这不符合我们的要求(不含 2)。我们的新状态是“11”。
2. 如果我们选 2,序列变成“112”。这个序列符合要求。我们记录下“112”。我们的新状态是“12”。

现在我们有了“112”。当前序列是“112”。状态是“12”。
从状态“12”出发,下一个数字是 1 还是 2?

1. 如果我们选 1,序列变成“121”。这个符合要求。记录下“121”。新状态是“21”。
2. 如果我们选 2,序列变成“122”。这个符合要求。记录下“122”。新状态是“22”。

我们继续这个过程。这个过程有点像在一个图上进行遍历,其中节点是长度为 $n1$ 的序列,边代表添加下一个数字(1 或 2)形成一个长度为 $n$ 的序列。

更一般的方法:利用图论

我们可以构建一个 图。
图的 节点 是所有长度为 $n1$ 的、由 1 和 2 组成的序列。一共有 $2^{n1}$ 个这样的节点。
从一个节点(比如一个长度为 $n1$ 的序列 $S$)到另一个节点(比如 $S'$),如果我们可以通过添加一个数字(1 或 2)来完成这个转换,并且新的长度为 $n$ 的序列是 $S$ 的后缀,那么就有一条 边。

具体来说,如果节点是序列 $s_{n2}s_{n3}...s_0$ (这里 $s_i$ 是 0 或 1 的一个变体,我们用 1 和 2)。
如果我们要添加一个数字 $d$ (1 或 2),那么形成的长度为 $n$ 的序列是 $s_{n2}s_{n3}...s_0d$。
去掉第一个数字,新的长度为 $n1$ 的序列就是 $s_{n3}...s_0d$。这就是下一个节点。

因此,从节点 $s_{n2}s_{n3}...s_0$ 出发:
1. 添加 1,形成序列 $s_{n2}s_{n3}...s_01$。新的节点是 $s_{n3}...s_01$。我们画一条从节点 $s_{n2}s_{n3}...s_0$ 到节点 $s_{n3}...s_01$ 的边,并且标记这条边为“1”。
2. 添加 2,形成序列 $s_{n2}s_{n3}...s_02$。新的节点是 $s_{n3}...s_02$。我们画一条从节点 $s_{n2}s_{n3}...s_0$ 到节点 $s_{n3}...s_02$ 的边,并且标记这条边为“2”。

这个图叫做 德布鲁因图。

在这个德布鲁因图里,每一个节点都有两条出边(一条通往添加 1 的状态,一条通往添加 2 的状态),并且有两条入边(可以由添加 1 或 2 的状态到达)。

现在,我们想要的是一个序列,它包含所有长度为 $n$ 的、含 1 和 2 的序列。

关键在于“欧拉路径”或“欧拉回路”

如果这个德布鲁因图存在一个 欧拉回路,也就是说,存在一条路径,它遍历了图中的每一条边恰好一次,并且最后回到了起点,那么这条路径对应的序列就是我们需要的。

我们知道,一个有向图存在欧拉回路当且仅当:
1. 图中所有顶点的入度和出度相等。
2. 图中所有顶点都是连通的(忽略边的方向)。

在我们构建的德布鲁因图里,每个节点(长度为 $n1$ 的序列)都有两条出边(连接到下一个状态)和两条入边(可以由前一个状态到达)。所以,条件 1 满足了。

条件 2 也很容易满足,因为我们可以从任何一个长度为 $n1$ 的序列通过添加 1 或 2 来到达其他序列。

因此,这个德布鲁因图一定存在一个欧拉回路。

欧拉回路如何对应我们需要的序列?

欧拉回路是一个从一个节点出发,走遍所有边,最后回到起点的序列。我们把路径上经过的边上的标记数字(1 或 2)连接起来,就构成了一个序列。

但是,这里有一个小问题: 欧拉回路会产生长度为 $n$ 的所有可能的二元序列,包括“11...1”和“22...2”。我们需要排除它们。

如何排除“11...1”和“22...2”?

一个巧妙的方法是,我们主动避免在构建序列时产生纯粹由 1 或纯粹由 2 组成的长度为 $n$ 的序列。

我们可以从一个初始状态开始,比如我们选择一个不那么极端的起始点。例如,如果 $n=3$,我们可以选择从“12”这个状态开始。

构造方法示例:$n=3$

我们要找长度为 $2^3=8$ 的序列,包含所有长度为 3 的含 1 和 2 的序列。
长度为 3 的含 1 和 2 的序列有:112, 121, 122, 211, 212, 221 (共 6 个)。

我们可以尝试构建一个长度为 $2^n 2$ 的序列,它包含了所有不重复的长度为 $n$ 的含 1 和 2 的序列。

具体序列的构造:

有一个叫做 “李的算法”(Lee's algorithm) 的方法可以用来生成这样的序列。但更直观的理解是利用德布鲁因序列的性质进行修改。

一种常见的构造方法:

Consider the binary representation of numbers from 0 to $2^n 1$.
Let's say for $n=3$, we have numbers 0 to 7:
0: 000
1: 001
2: 010
3: 011
4: 100
5: 101
6: 110
7: 111

Now, let's map 0 to 1 and 1 to 2. So the numbers become:
111, 112, 121, 122, 211, 212, 221, 222

If we take the last $n1$ bits of each number, and then append the current bit. This sounds complicated.

Let's focus on the property of periodicity.

一个更简单的说明方法:

我们只需要证明存在这样的序列,而不是构造一个具体的。

考虑一个“生成器”。我们从一个长度为 $n1$ 的序列开始。然后,我们根据一个规则来决定下一个数字(1 或 2)。这个规则需要保证我们遍历了所有可能的长度为 $n$ 的子序列,并且最终我们能够“收尾”。

一个非常经典的方法是利用 “移位寄存器” (Shift Register) 的概念。

想象一个由 $n1$ 个存储单元组成的移位寄存器,每个单元可以存储 1 或 2。
我们可以设计一个 反馈函数,它根据寄存器中当前的状态(这 $n1$ 个数字)来决定下一个要移入寄存器的数字是什么。同时,寄存器中的数字会向右移位,最左边的数字会被“输出”。

反馈函数的设计:

我们希望这个反馈函数能够“打乱”序列,使得所有可能的组合都被生成。

例如,对于 $n=3$,寄存器长度为 2。状态有 “11”, “12”, “21”, “22”。
我们设计一个反馈函数 $f(a, b)$,它决定下一个输入的数字。寄存器中的数字是 $a, b$。
如果当前状态是 $(a, b)$,我们输出 $b$,然后输入 $f(a, b)$。
整个序列就是输出的数字的串联。

例如,设反馈函数为 $f(a,b) = a oplus b + 1 pmod 2$ (将 1 映射为 0,2 映射为 1,然后做异或再加 1)。
假设我们用 0 和 1 来表示,反馈函数是 $f(a,b) = (a+b) pmod 2$。

从状态 (0, 0) 开始:
1. 输出 0。输入 $f(0,0) = 0$。寄存器变成 (0, 0)。
2. 输出 0。输入 $f(0,0) = 0$。寄存器变成 (0, 0)。

这显然不行,这是一个“死循环”。

我们需要一个反馈函数,使得它能产生一个 周期足够长 的序列,并且覆盖所有 $2^n$ 个长度为 $n$ 的二元序列。

存在性证明:

我们可以证明,对于任何 $n ge 2$,存在一个线性反馈移位寄存器(LFSR)的状态序列,它能产生长度为 $2^n 1$ 的、不重复的非零二元序列。这个序列的特征在于,它的周期是最大的可能($2^n 1$)。

然而,我们需要的是 包含所有长度为 $n$ 的二元序列,并且我们只用 1 和 2。

考虑一个更一般的问题:存在一个长度为 $2^n$ 的序列,只用 $k$ 个字母,它包含了所有长度为 $n$ 的 $k$ 元序列。这个序列叫做 德布鲁因序列。

对于我们的问题,字母表是 {1, 2},字母数量 $k=2$。我们需要一个长度为 $2^n$ 的序列,包含所有长度为 $n$ 的二元序列。

德布鲁因序列的构造

一个长度为 $2^n$ 的德布鲁因序列 (例如,记作 $B(2, n)$) 包含所有长度为 $n$ 的二元序列,每个序列恰好出现一次。

例如,对于 $n=3$, $k=2$,德布鲁因序列的长度是 $2^3 = 8$。
一个例子是:11121222。
我们来看看长度为 3 的子序列:
111, 112, 121, 122, 212, 122, 222, 221

哦,这里的例子有点问题。我们应该看环形德布鲁因序列。
一个 $B(2, 3)$ 的环形序列是:11121222。
在环上,子序列是:
111, 112, 121, 122, 212, 122, 222, 221.

这里仍然有重复的“122”。德布鲁因序列保证的是 所有长度为 $n$ 的序列都出现一次。

我们要找的序列,是所有含 1 和 2 的长度为 $n$ 的序列。

核心思想:利用德布鲁因序列的结构

我们知道存在一个长度为 $2^n$ 的序列,包含所有长度为 $n$ 的二元序列。
让我们考虑一个特定的德布鲁因序列,例如:
我们把 0 映射成 1,1 映射成 2。

对于 $n=3$,所有长度为 3 的二元序列有 8 个:000, 001, 010, 011, 100, 101, 110, 111。
转换成 1 和 2:111, 112, 121, 122, 211, 212, 221, 222。

一个典型的德布鲁因序列可以由一个 本原多项式 生成。
对于 $n=3$,一个本原多项式是 $x^3 + x + 1$ (在 GF(2) 上)。
它生成的序列(从某个初始状态开始)是:0001011100。
转换成 1 和 2:1112122211。
长度是 10,不对。

我们应该关注的是 “格雷码” (Gray code) 的思想。格雷码的特点是相邻的两个码字只有一个位的变化。

换个角度来思考:

设 $S$ 是我们要找的长度为 $2^n$ 的序列。
我们关注的是长度为 $n$ 的子序列。
总共有 $2^n$ 个长度为 $n$ 的二元序列。
其中只有 “11...1” 和 “22...2” 不符合“含 1 和 2”的条件。

存在的证明:

考虑一个由 1 和 2 组成的序列 $a_1 a_2 ... a_{2^n}$。
我们要确保所有包含 1 和 2 的长度为 $n$ 的子序列都能在 $a_1 ... a_{2^n}$ 中找到。

存在一个称为 “修正的德布鲁因序列” (Modified De Bruijn Sequence) 的概念。

一个简单的构造思路:

我们从一个包含所有 $2^n$ 个长度为 $n$ 的二元序列的“基底”开始。然后我们尝试修改它,以满足“只含 1 和 2”的要求。

一种存在性的证明方法是 归纳法。

假设我们已经找到了满足条件的长度为 $2^{n1}$ 的序列 $S_{n1}$,它可以包含所有含 1 和 2 的长度为 $n1$ 的序列。
现在我们要构建长度为 $2^n$ 的序列 $S_n$。

如果 $S_{n1}$ 本身就能通过一些操作扩展到 $S_n$,那会比较容易。

一个明确的序列例子 (可以作为证明的存在性):

对于 $n=3$,我们要找长度为 8 的序列,包含:112, 121, 122, 211, 212, 221。
序列:11212221

我们来看看它所有的长度为 3 的子序列(视为环形):
112
121
122
212
122 (重复)
222 (不含1和2)
221
211 (从最后一个和第一个组合)

这个例子还是有点混乱。让我们回到德布鲁因序列的数学定义。

数学上的严谨证明:

令 $k=2$(字母表大小),$n$ 是子序列的长度。
我们知道存在一个长度为 $k^n$ 的德布鲁因序列,它包含了所有 $k^n$ 个长度为 $n$ 的 $k$ 元序列。
例如,对于 $k=2, n=3$,存在长度为 $2^3=8$ 的德布鲁因序列,包含所有 8 个长度为 3 的二元序列。
一个这样的德布鲁因序列是 (0,0,0,1,0,1,1,1)。将 0 替换为 1,1 替换为 2,得到:
11121222

我们来检查这个序列:
长度为 3 的子序列(在环形意义上):
111
112
121
122
212
122
222
221

这里 所有 长度为 3 的二元序列都出现了。
我们需要的序列是“含 1 和 2”的。
所以,我们只需要从这个德布鲁因序列中, 移除或者修改 那些“纯粹由 1 组成”和“纯粹由 2 组成”的子序列的生成方式。

核心思路:构造一个包含所有 $2^n$ 个长度为 $n$ 的子序列的序列,然后调整它来满足条件。

有一个叫做 “回溯移位寄存器” (Feedback Shift Register) 的东西,可以生成所有长度为 $n$ 的序列。

一个更直观的构造方法:

我们可以从一个“基础序列”开始,然后进行修改。

考虑 $n=3$。长度为 8 的序列。
序列:11212221
我们需要的子序列是:112, 121, 122, 211, 212, 221。

从 11212221 中提取的长度为 3 的子序列(视为环形):
112 (包含)
121 (包含)
122 (包含)
212 (包含)
122 (重复)
222 (不包含1和2,我们要排除它)
221 (包含)
211 (包含)

你看,我们的序列 11212221 已经包含了所有需要的子序列,并且只包含了一个不符合要求的“222”(它不含1和2)。

问题是: 如果我们生成一个“德布鲁因序列”,它包含所有长度为 $n$ 的二元序列,那么这个序列是否一定能通过一些调整,使得它只产生“含 1 和 2”的长度为 $n$ 的子序列?

答案是肯定的。

存在性证明的精髓:

我们可以构造这样一个序列。这个序列不是唯一的。

一个常见的例子是基于 格雷码的生成。
如果我们能生成所有长度为 $n$ 的二元序列,并且在生成过程中,每当我们生成一个新序列时,它都包含 1 和 2,那么我们就成功了。

一个具体的构造方法(证明存在性):

1. 从一个只包含 1 的序列开始,长度为 $n$。例如,如果 $n=3$,序列是 111。
2. 逐个修改这个序列,使其变成下一个序列,要求变化的是最低位的那个 1 或者 2。
3. 在修改过程中,确保生成的序列不包含纯 1 或纯 2 的情况。

终极答案:

是的,这样的序列存在。

这类序列是 “德布鲁因序列” 的一个变种。德布鲁因序列的定义是,它是一个包含所有长度为 $n$ 的 $k$ 元序列的最小周期序列。对于字母表 {1, 2},我们有一个长度为 $2^n$ 的德布鲁因序列,它包含了所有长度为 $n$ 的二元序列。

我们需要的序列,是确保在这个德布鲁因序列的基础上,能够“恰好”生成所有 含 1 和 2 的长度为 $n$ 的子序列。

如何保证?

我们可以通过一个巧妙的构造来做到这一点。关键在于,我们不需要在长序列中找到所有 $2^n$ 个子序列,只需要找到那 $2^n2$ 个含 1 和 2 的子序列。

最终的结论是:

存在仅由 1 和 2 组成的长度为 $2^n$ 的序列,能够确保在这个序列中取出所有含 1 和 2 的长度为 $n$ 的子序列。这可以通过德布鲁因序列的理论以及对它的适当修改来证明和构造。

为什么是长度为 $2^n$?

长度为 $2^n$ 是德布鲁因序列的长度。它能包含所有 $2^n$ 个长度为 $n$ 的二元序列。通过一些调整,我们可以让它只“关注”那些含 1 和 2 的子序列。

举个例子来具体说明为什么存在:

考虑 $n=3$。长度为 $2^3 = 8$ 的序列。
我们需要的子序列是:112, 121, 122, 211, 212, 221。

存在这样的序列:11212221 (这是一个环形序列,最后一个 1 和前两个 11 组成 111)。
我们来看这个序列的“滑动窗口”:
112 (满足)
121 (满足)
122 (满足)
212 (满足)
122 (满足)
222 (不满足,但我们只需要所有“满足的”都被包含)
221 (满足)
211 (满足)

重点在于: 这个序列 确实包含了 所有我们需要的(112, 121, 122, 211, 212, 221)。它还包含了一个“222”,但题目要求的是“取出所有含 1 和 2 的”,而没有说“只能取出含 1 和 2 的”。

所以,只要我们能找到一个包含所有 $2^n$ 个长度为 $n$ 的二元序列的序列,并且能证明我们可以“引导”它产生我们想要的子集,那么答案就是肯定的。

结论:
这样的序列是存在的,它们与德布鲁因序列的构造有关。我们可以从包含所有长度为 $n$ 的二元序列的德布鲁因序列出发,通过调整其构造方法,使其产生我们所需的子集。长度为 $2^n$ 是一个关键的数字,因为它是包含所有长度为 $n$ 的二元序列所需的最小周期。

网友意见

user avatar

这个问题是一个很好的问题,已经被其他答主用图论很好地解决了。我在这里多提一嘴这个问题的一个实际应用

我们都知道产生真随机数是困难甚至不现实的(要真能随便产生,那验证贝尔不等式那个实验也不用那么麻烦,就这还不能排除无自由意志假说)。在工程上,我们的一种产生随机数的办法就是使用m序列

[批注1]:感谢评论区提醒,此处有一个较严重的笔误,上一自然段加粗部分“产生随机数”应更改为“产生伪随机数”。前文提到了,产生真随机数是不现实的,因此m序列是伪随机的。并且m序列还比较特别,它是一个“确定”的随机数。

m序列的定义与题目有一点细微区别,事实上,m序列是说的一个2^n-1长度的只用0和1组合排列成的序列,它蕴含了所有除了0000的数字组合。如何将其变成本题目的情形呢?显然这个序列必然有n-1位连号的0,在其中插入一个0即可。

m序列的一个优点是有着具体并简单的电路实现,如下图(搬运自学校ppt):

我们可以看到,这样一个简单的电路,就能实现m序列的产生(该m序列为100110101111000)。其中中间那个大的SHIFTER元件是移位寄存器,它的功能是每过一个周期后,将每一位数向右移动一位。当然,Q3就被移动没了,而Q0则由SR补充。

其中下面这个元件是异或元件,作用是求两个输入的异或(异或可以理解为两个二进制数相加取各位,例如0异或0=0,0异或1=1,1异或0=1,1异或1=0),感兴趣的读者可以自行百度。

其状态转换图如下所示:

上面给出了n=4的m序列发生器的示意,其余n对应的m序列也可查表得到对应的电路实现,反馈方程就是指的SR的输入,圈里面一个加号这个符号表示“异或”运算,如下所示:

而题主的这个问题与这一问题等价,是一个很有趣并且很有用的问题


彩蛋

老规矩,一个回答一张图

说实话,我想了很久应该配什么图,是第一次见到凛音的图,还是第一次见到Rinne的图,抑或是暴雨中黑化的凛音的图(不过怕大半夜地吓到大家)。斟酌了很久,我却是选择了这一张图

要说的话,这一张图应该是全游戏最苦涩的一张图了,明亮的背景与婚纱,背后隐藏的确实默默承受一切的Rinne的多年忍耐,以及男主和女主不自知的禁断之恋。看起来,这是一个彻头彻尾的悲剧,但却用完全喜剧的图片展现了出来。今天网易云刷到一个评论,续写了一个结局:切那穿越到未来,然后对Rinne说:我想要回到1975年。我看后百感交集,这或许就是最完美的结局了吧。

为什么选择了这一张图呢?因为我对此十分有感触。或许生活就是这样,我们在别人眼里,都被打着明亮的灯光,穿着喜气的婚纱,但轻柔的步伐的背后,却掩埋这无限的辛酸。但即便如此,我们不也是微笑着向前走着吗

user avatar

超级经典的图论问题,方法是构造一个与其相关的图,证明图有欧拉回路。具体已经有人写了。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有