栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何计算非2的幂的字母表的de Bruijn序列?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何计算非2的幂的字母表的de Bruijn序列?

这是我在Sawada和Ruskey的论文中对图1中算法的C
++实现:

void debruijn(unsigned int t,   unsigned int p,   const unsigned int k,   const unsigned int n,   unsigned int* a,   boost::function<void (unsigned int*,unsigned int*)> callback){  if (t > n) {    // we want only necklaces, not pre-necklaces or Lyndon words    if (n % p == 0) {      callback(a+1, a+p+1);    }  }  else {    a[t] = a[t-p];    debruijn(t+1, p, k, n, a, callback);    for (unsigned int j = a[t-p]+1; j < k; ++j) {      a[t] = j;      debruijn(t+1, t, k, n, a, callback);    }  }}struct seq_printer {  const std::vector<char>& _alpha;  seq_printer(const std::vector<char>& alpha) : _alpha(alpha) {}  void operator() (unsigned int* a, unsigned int* a_end) const {    for (unsigned int* i = a; i < a_end; ++i) {      std::cout << _alpha[*i];    }  }};...std::vector<char> alpha;alpha.push_back('a');alpha.push_back('b');alpha.push_back('c');unsigned int* a = new unsigned int[N+1];a[0] = 0;debruijn(1, 1, alpha.size(), N, a, seq_printer(alpha));if (N > 1) std::cout << alpha[0];std::cout << std::endl;delete[] a;

The full reference for the paper is: Joe Sawada and Frank Ruskey, “An
Efficient Algorithm for Generating Necklaces with Fixed Density”, SIAM Journal
of Computing 29 :671-684, 1999.



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/406933.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号