构造具有唯一n位的二进制序列

时间:2013-11-14 09:53:10

标签: algorithm

在求职面试中提出的问题(我几乎失败了)和 可悲的是,我仍然无法弄明白。

我们假设你给了一些正整数,n。 假设您构造一个仅包含1和0的序列,并且 你想构造一个长度为2 ^ n + n-1的序列,这样就可以了 由相邻数字组成的每个长度为n的序列都是唯一的。

例如

00110(00,01,11,10),n = 2

如何构建这样的序列?

我认为应该从0000..0(n个零)开始 做点什么。

如果有建设性的方式,也许 我可以将该方法扩展到构建 由0,1,...,k-1组成的序列 长度k ^ n + n-1这样 由相邻数字组成的每个长度为n的序列是唯一的 (或许不是......)

(对不起,我对n = 3的序列是错误的,所以我删除了它。 另外,我从未听说过De Bruijin的序列。我现在知道了! 感谢所有的答案和评论。)

1 个答案:

答案 0 :(得分:1)

这让我觉得这是一个非常雄心勃勃的面试问题;如果你不知道答案,你几分钟内就不可能得到它。

正如评论中所提到的,这只是de Bruijn sequence的推导,只是展开。您可以阅读上面链接的维基百科文章以获取更多信息,但它提出的算法虽然有效,但并不容易派生。有一种更简单(但存储密集程度更高)的算法我认为是民俗的;至少,我不知道附有它的名字。至少要简单描述一下:

  • n 0s

  • 开始
  • 尽可能:

    • 如果您可以添加1而不重复之前显示的n - 序列,请执行此操作。
    • 如果没有,但您可以添加0而不重复之前显示的n - 序列,请执行此操作。
    • 否则,完成。

这要求您在每次迭代时搜索整个字符串,需要指数时间,或者维护所有看到的序列的布尔数组(可能是编码为二进制数),需要指数空间。 “按词典顺序连接所有Lyndon单词”解决方案更有效率,但留下了按字典顺序生成所有Lyndon单词的问题。