使用多线程生成字符串的所有组合

Posted

技术标签:

【中文标题】使用多线程生成字符串的所有组合【英文标题】:Generating all combinations of a String with multithreading 【发布时间】:2014-03-24 09:27:07 【问题描述】:

我需要生成字符串的所有可能组合,使用多线程在 N 个线程之间平均分配工作。所以字符串cat 会输出:

c, a, t, ca, ct, ac, at, ta, tc, cat, cta, tac, tca, act, atc

每个线程都包含一个startIndexendIndex,并对字符串进行不同的处理。现在我可以生成一个字符串的所有排列,但我完全不知道我需要做什么来修改它以获得所有组合。任何帮助将不胜感激。

这就是我现在拥有的:

public void run() 
    for(int i = startIndex; (i < endIndex); i++) 
        swap(word, 0, i); // Swap character to zero location.
        permuteAndCheck(word, 1); // Recursively check permutations
        swap(word, 0, i); // Undo swap
    


private void permuteAndCheck(char[] word, int start) 
    if (start < word.length) 
        // Not yet at the deepest recursion level to compare permutations.
        for(int i = start; (i < word.length); i++) 
            swap(word, start, i);
            permuteAndCheck(word, start + 1);
            swap(word, start, i); // Restore entry back from previous swap
        
        return;
    

    System.out.print(word + ", ");


private static final void swap(char[] word, int index1, int index2) 
    char temp  = word[index1];
    word[index1] = word[index2];
    word[index2] = temp;

【问题讨论】:

不要忘记 tca、atc 和 cta。 .. 除非顺序无关紧要,在这种情况下你应该忘记那些。 但是既然 ac 和 ca 都被列出来了…… 我没有列出其中的 3 个。对不起。 是的,OP 的意思是“排列”,而不是“组合”。 我的意思是组合(子集) 【参考方案1】:

如果您正在寻找所有组合(即字符的幂集),那么您已经知道有 2^k 种可能性,k 是字符数。

然后第一个线程处理第一个到第 (2^k)/N 个组合,第二个线程处理第 1+ (2^k)/N 个到 2*(2^k)/N 个组合,等等。

要获得第 j 个字符串,请查看 j 的二进制表示,并获取对应数字为“1”的字符。即“猫”的第 5(二进制:101)组合是 c_t。

【讨论】:

以上是关于使用多线程生成字符串的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

C中字母排序组合的多线程计算

C++中对队列的多线程访问

为字符串列表生成所有组合

生成字符数组的所有排列

生成所有槽数未知的组合

生成字符串的所有组合的算法