繁体   English   中英

如何找到字符串的所有可能组合? 使用CUDA

[英]How can I find all possible combinations of a string? Using CUDA

我试图通过使用CUDA查找字符串的所有可能组合来加快算法的速度。 我能做到这一点的最好方法是什么?
例:

abc

给出:

a
b
c
ab
ac
bc

到目前为止我什么都没有。 我不要求代码。 我只是在寻求最好的方法吗? 算法? 伪代码? 也许是讨论?

使用CUDA的优点是大规模并行处理,潜在的成千上万个线程消耗很少的开销。 为此,您必须想出一种方法,可以将问题分成小块,而不必过多依赖线程之间的通信。 在此问题中,您有n字符,并且每个输出字符串中可以存在或不存在每个字符。 这将产生2^n总输出字符串。 (您已经从列表中删除了空字符串和原始字符串...如果这是所需的结果,那么您将有2^n - 2个输出字符串。)

无论如何,您可以划分创建字符串的工作的一种方法是为每个潜在的输出字符串分配一个数字,并让每个线程为一定范围的数字计算输出字符串。 如果查看每个数字的二进制表示形式,则从数字到输出字符串的映射很容易。 n位数字中的每个二进制数字对应于长度为n的字符串中的一个字符。 因此,例如,二进制中的数字5或101映射到字符串"ac" 您列出的字符串将通过如下计算从1到6的数字的映射来创建:

1      c
2      b
3      bc
4      a
5      ac
6      ab

如果需要,您可以计算7以获取abc0以获取空字符串。

除非您对超过十二个字符的单词进行此操作,否则我不确定这是否会更快。 如果对超过25个字符的单词执行此操作,则可能会遇到内存限制,因为您要处理数百兆字节。

如果CUDA是此问题的正确解决方案,我将感到非常惊讶。

但是,我将编写一个内核以查找长度为n的所有子字符串,并针对从0到字符串长度的n的每个值在循环中启动内核。 因此,内核中的每个线程将具有完全相同的指令(没有线程会在空闲时闲置,而其他线程不会结束)。

每个线程都会“查找”一个子字符串,因此您最好让线程i在该字符串的索引i处找到该子字符串。 请注意,每个子串长度需要不同数量的线程。

因此,对于n = 1:

thread 0: a
thread 1: b
thread 2: c

并且对于n = 2:

thread 0: ab
thread 1: bc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM