我正在努力优化时间复杂度为O(N ^ 7)的程序。我有一个字符串数组,表示为32位整数,其中每个位对应于输入字符串中的特定字符。工作是找到输入字符串的所有组合,其中每个字符只出现一次,并且存在所有字符。天真的解决方案需要7层递归,每层迭代整个列表。这很快变得非常缓慢。
所以我想知道我是否可以使用cuda来加速这个过程,为GPU提供一系列可能的字符串,以及一个不应该匹配的位掩码,并获得一个过滤后的列表,所以我可以加快递归步骤一点。
所以问题是:这种过滤是否适合并行处理?
我现在在C中做的事情如下所述。
void recursive_search (unsigned int used, unsigned int *list, int listlen,
int start,unsigned int * stack, int reclevel) {
int index, newindex;
newindex = 0;
for (index=0; index< listlen; index++) {
if (!list[index] & used) {
newlist[newindex++] = list[index];
}
}
if ((newindex == 1 && (used | newlist[0])) == 0xffffffff) {
/* Hooray! We have a match */
stack[reclevel] = newlist[0];
report_match(stack);
return;
}
for (index = 0;index < newindex; index++) {
recursive_search (used | newlist[index], newlist, newindex,
index, stack, reclevel + 1);
}
}
我希望这会让我的问题更清晰。
答案 0 :(得分:1)
以下代码部分可能会转换为copy_if语句。
for (index=0; index< listlen; index++) {
if (!list[index] & used) {
newlist[newindex++] = list[index];
}
}
声明就像
thrust::copy_if(list.begin(), list.end(), newlist.begin(), predicate());
因此,您将轻松实现新列表。
您可以在GPU上生成可能的字符串数组吗?
关于递归: