我有这段代码来查找形成合法词汇的一组字母的所有排列。
>>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个排列,并导致它们吐出这些警告。
我的理解是否正确?如何防止这些警告?
答案 0 :(得分: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]]
祝你好运!