0

我有这个代码来查找形成合法单词的一组字母的所有排列。

>>Combinatorica`
Module[{str = "abc", chars, len, r, check},
 chars = Characters[str];
 len = StringLength[str];
 r = Range[len];
 check[n_Integer] := 
  DictionaryLookup[{"BritishEnglish", 
    StringJoin[chars[[UnrankPermutation[n, r]]]]}, 1];
 DistributeDefinitions[check, chars, r];
 ParallelTable[check[i], {i, 1, len!}]]

我已经验证,如果我用 Table 替换 ParallelTable,我会得到:

{{}, {}, {}, {"cab"}, {}, {}}

但是,使用 ParallelTable,除了该结果之外,我还会收到如下警告:

Part::pspec: Part specification Combinatorica`UnrankPermutation[1,{1,2,3}] is neither a machine-sized integer nor a list of machine-sized integers.

Part::pspec: Part specification Combinatorica`UnrankPermutation[2,{1,2,3}] is neither a machine-sized integer nor a list of machine-sized integers.

StringJoin::string: String expected at position 1 in StringJoin[{a,b,c}[[Combinatorica`UnrankPermutation[1,{1,2,3}]]]].

StringJoin::string: String expected at position 1 in StringJoin[{a,b,c}[[Combinatorica`UnrankPermutation[2,{1,2,3}]]]].

这些警告似乎来自内核 7 及更高版本。我的猜测是计算到达那些内核并且没有任何数据留下,因为只有 6 个排列,并导致它们吐出这些警告。

我的理解正确吗?如何防止这些警告?

4

1 回答 1

1

我不认为是这样 - 如果是这样的话,这个简单的测试也会失败:

ParallelTable[k^2,{k,3}] (* Assuming more than 3 kernels *)

...运行得很好。

相反,在我看来,函数 UnrankPermutations[] 在 ParallelTable 下表现不佳,正如您从运行简化版本中看到的那样(这也失败了):

ParallelTable[Part[chars, UnrankPermutation[n, r]], {n, len!}]

我不确定您采用的蛮力方法是否是一个好的方法(考虑当单词长度超过 10 个字符时会发生什么),但遵循该想法的解决方法是:

list = LexicographicPermutations[chars]
ParallelMap[DictionaryLookup[{"BritishEnglish", #}] &, 
 Map[StringJoin[#] &, list]]

祝你好运!

于 2013-03-19T03:35:27.347 回答