- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在计算 cyclic de Bruijn sequences使用以下代码:
import sys
if len(sys.argv) > 1:
n = int(sys.argv[1]) # get n from the command line
else:
n = 4
N = 2**n
count = 0
def debruijn(x):
if x.find(x[-n:]) < len(x)-n: # check if last n chars occur earlier in the string
return
if len(x) == N+n-1:
print(x[:N], x[N:])
return
debruijn(x+"0")
debruijn(x+"1")
x = "0"*n
debruijn(x)
print("sequences")
这给出:
0000100110101111 000
0000100111101011 000
0000101001101111 000
0000101001111011 000
[...]
作为输出。为什么 x[N:]
总是等于 000?代码中似乎没有任何内容可以保证这一点。
发布到 https://math.stackexchange.com/questions/3339778/why-does-searching-for-a-non-cyclic-de-bruijn-sequence-always-give-you-a-cyclic根据@Prune 的要求
最佳答案
这是一个循环序列:根据定义,最后 (n-1) 位与前 (n-1) 位匹配。 x[:(n-1)] == x[-(n-1):]
由于您将第一个数字强制设置为 0000
,因此“最后”三个数字为 000
。尝试更改您的初始顺序并查看:
debruijn("0110")
输出:
0110000100111101 011
0110000101001111 011
0110000101111010 011
0110000111101001 011
0110010000111101 011
0110010100001111 011
0110010111101000 011
0110011110100001 011
0110100001011110 011
0110100001111001 011
0110100101111000 011
0110100111100001 011
0110101111000010 011
0110101111001000 011
0110111100001010 011
0110111100101000 011
为什么有效?
您在代码中唯一的检查是查看当前的 last-4 序列是否已被使用。为什么这足以保证环绕式成功?
它本身并没有:您可以轻松地从 00001000
开始,在尾部使用您想要的 1000
序列。但是,如果您确实提前用完了该序列,那么您将无法将部分序列扩展到 16 位。四个匹配位很简单:7 位序列 0001000
现在是死胡同。需要更多的工作来证明其他开始,但它是相同的一般原则:唯一达到完整 16 位的是 强制保存了所需的环绕序列。
查看 0110
案例以了解可能性的范围:各种解决方案均采用两个 1 位末端、所有四个 2 位末端和八个 3 位末端中的六个(100
及其补码 011
将不起作用,因为它们与 0110
的组合重叠。
关于python - 为什么这个 de Bruijn 代码的最后几位总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57731516/
我正在寻找一种迭代生成 de Bruijn 序列的方法,而不是使用递归。我的目标是逐个字符地生成它。 我找到了 some example code in Python用于生成 de Bruijn 序列
我不是该主题的专家,所以请在回答时考虑到这一点。 我正在阅读两篇论文 Succinct de Bruijn Graphs 和 Compacting de Bruijn graphs from sequ
我需要证明/反对是否在每个二进制 De-Bruijn 序列中都存在等量的 0 和 1。从我用 n=3 和 n=2 做的几个例子中,我看到序列中有相同数量的 0 和 1,但我真的不知道为什么……我不知道
我正在尝试计算 de Bruijn sequences对于具有多个不是二的幂的字符的字母表。 对于具有 2^k 个字符的字母表,计算 de Bruijn 序列很容易:有几个简单的规则,例如 "Pref
我很难说服编译器相信两个 De Bruijn 索引变量是相同的。我有以下深度嵌入的 DSL,De Bruijn 索引代码基于 Manuel Chakravarty 的 Converting a HOA
在“类型和编程语言”的 6.1.2 节中,他们讨论了用于为 lambda 表达式中的自由变量编号的命名上下文。使用他们提供的示例方案,λx.xb和 λx.xx将他们的 de Bruijn 表示为 λ.
我正在计算 cyclic de Bruijn sequences使用以下代码: import sys if len(sys.argv) > 1: n = int(sys.argv[1]) # g
我正在使用“De Bruijn”算法来发现大数(最多 64 位)的二进制位数。 例如: 1022在二进制中有10位。 130在二进制中有8位。 我发现使用基于 De Bruijn 的表查找让我能够以比
我正在尝试使用 Data.Reify 为简单的 AST 恢复共享(在 Type-Safe Observable Sharing in Haskell 意义上) : {-# LANGUAGE Deriv
我正在查看条目 Find the log base 2 of an N-bit integer in O(lg(N)) operations with multiply and lookup来自 Bi
我是一名优秀的程序员,十分优秀!