枚举满足给定限制的所有字符串

时间:2009-06-23 15:56:30

标签: algorithm string enumeration combinatorics

我正在寻找以下类问题的名称,以便我可以谷歌获取有效的算法和更多信息。

我的字母表有三个字符{-1,0,1}。

我需要有效地生成长度为24的所有字符串,这些字符串大多数为{0},但在某些模式中分布有0到8个{1,-1}个字符。 (模式涉及{-1}的数量和配对的限制。符合我标准的字符串总数非常适中:大约128,000。

那么这类问题/算法的名称是什么?

3 个答案:

答案 0 :(得分:3)

我不确定这个有明确定义的“算法类”;这只是组合学中的一项练习。您可以分三步完成生成:

  1. 生成所有设置了8位或更少位的24位数字(如果预先计算一些查找表,您可以将其加速一点)。
  2. 对于设置了n位的每个24位数,迭代所有n位数
  3. 如果n位数的第k位为0,则24位数的第k个设置位打印为-1,否则打印为1
  4. 为了更好地解释步骤2-3,您的24位数字设置为4位,看起来像

    0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0
    

    然后,我们迭代从0 0 0 01 1 1 1的所有16个4位数字,例如:

    0 0 0 0 gives the string  0 0 0 -1 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1 0 0 0 0
    0 1 1 0 gives the string  0 0 0 -1 0 0 0 0 0 0 0 0  1  1 0 0 0 0 0 -1 0 0 0 0
    0 1 0 0 gives the string  0 0 0 -1 0 0 0 0 0 0 0 0  1 -1 0 0 0 0 0 -1 0 0 0 0
    1 1 1 1 gives the string  0 0 0  1 0 0 0 0 0 0 0 0  1  1 0 0 0 0 0  1 0 0 0 0
    

答案 1 :(得分:1)

如果您只需要解决一次,也许您可​​以强制它并将结果放在应用程序的查找表中。要检查的是少于一万亿的24位序列0,1,-1。

如果我的数学运算错误,或者您需要在运行时动态解决问题,我会将问题视为24个变量的系统,每个变量限制为-1,0,1并将其作为{{ {3}},假设您可以某种方式枚举约束。但是,我担心的是,由于您需要查看所有解决方案,而不仅仅是一个子集,您可能仍然无法全面搜索问题空间。

这篇论文似乎正好在你的小巷里:Constraint Satisfaction Problem。虽然我无法访问论文的全文,看看它是否有帮助。

我可能在一起咆哮错误的树,但也许这是一个起点

答案 2 :(得分:1)

我上次的一个完全独立的答案,因为工作代码往往胜过研究论文的链接,我在Physics Forum找到了这个代码,并且我自己不能把它归功于它,我只是把它固定好以便在g ++并更改为常量以在24中查找8位。它可以非常快速地枚举所有24位字符串,其中包含8位,并且只有大约735,000个字符串。这些“模板”显示非零字符的唯一有效模式。然后你必须采取这些735,000个答案中的每一个并抛出 - / +符号并确定每个符号是否符合你的标准,但这样你就可以从735k可能的解决方案开始,而不是200亿。

#include <stdio.h>

 int main()
 {
 int size = 24;
 int pop = 8;

 int n = ((1 << pop) - 1) << (size - pop);

 while(true) {
    printf( "%x\n",n);

    int lowest = n & -n;

     if(lowest > 1) {
        n = n ^ lowest ^ (lowest >> 1);
        continue;
     }

     int high = n & (n + lowest);
     if(high == 0) break;

     int low = n ^ high;

     low = (low << 2) + 3;

     while((low & high) == 0) low <<= 1;
     n = high ^ low;
  }
 }