- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种迭代生成 de Bruijn 序列的方法,而不是使用递归。我的目标是逐个字符地生成它。
我找到了 some example code in Python用于生成 de Bruijn 序列并将其翻译成 Rust。我还不能很好地理解这项技术来创建我自己的方法。
翻译成 Rust:
fn gen(sequence: &mut Vec<usize>, a: &mut [usize], t: usize, p: usize, k: usize, n: usize) {
if t > n {
if n % p == 0 {
for x in 1..(p + 1) {
sequence.push(a[x])
}
}
} else {
a[t] = a[t - p];
gen(sequence, a, t + 1, p, k, n);
for x in (a[t - p] + 1)..k {
a[t] = x;
gen(sequence, a, t + 1, t, k, n);
}
}
}
fn de_bruijn<T: Clone>(alphabet: &[T], n: usize) -> Vec<T> {
let k = alphabet.len();
let mut a = vec![0; n + 1];
let vecsize = k.checked_pow(n as u32).unwrap();
let mut sequence = Vec::with_capacity(vecsize);
gen(&mut sequence, &mut a, 1, 1, k, n);
sequence.into_iter().map(|x| alphabet[x].clone()).collect()
}
然而,这无法迭代生成 - 它会经历一团乱七八糟的递归和迭代,不可能解开成一个单一的状态。
最佳答案
考虑这种方法:
从每个项链类别中选择第一个(按字典顺序)代表
Here is Python code用于生成包含 d 的 (binary) 项链的代表(可以对所有 d 值重复)。 Sawada article link
按字典顺序对代表进行排序
对每个代表进行周期性归约(如果可能):如果字符串是周期性的s = p^m
,如010101
,选择01
要查找期间,可以使用 string doubling或 z-algorithm (我希望编译语言更快)
串联归约
n=3,k=2 的例子:
排序代表:000, 001, 011, 111
减少:0、001、011、1
结果:00010111
Jörg Arndt 的书 "Matters Computational" 中描述了相同的基本方法(使用 C 代码) , 第 18 章
wiki 中提到了类似的方法
An alternative construction involves concatenating together, in lexicographic order, all the Lyndon words whose length divides n
您可能会寻找有效的方法来生成合适的 Lyndon 词
关于algorithm - 如何迭代生成 de Bruijn 序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56874920/
我正在寻找一种迭代生成 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
我是一名优秀的程序员,十分优秀!