我正在寻找以下类问题的名称,以便我可以谷歌获取有效的算法和更多信息。
我的字母表有三个字符{-1,0,1}。
我需要有效地生成长度为24的所有字符串,这些字符串大多数为{0},但在某些模式中分布有0到8个{1,-1}个字符。 (模式涉及{-1}的数量和配对的限制。符合我标准的字符串总数非常适中:大约128,000。
那么这类问题/算法的名称是什么?
答案 0 :(得分:3)
我不确定这个有明确定义的“算法类”;这只是组合学中的一项练习。您可以分三步完成生成:
为了更好地解释步骤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 0
到1 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;
}
}