给定长度的英文字母的排列

时间:2015-03-13 12:35:04

标签: c++ string permutation alphabet

所以我有这个代码。不确定它是否有效,因为程序的运行时仍在继续。

void permute(std::vector<std::string>& wordsVector, std::string prefix, int     length, std::string alphabet) {
if (length == 0) {
    //end the recursion
    wordsVector.push_back(prefix);
}
else {
    for (int i = 0; i < alphabet.length(); ++i) {
        permute(wordsVector, prefix + alphabet.at(i), length - 1, alphabet);
    }
}}

我试图获得给定长度的英文字母中的所有字符组合。我不确定此刻的方法是否正确。

Alphabet由长度为26的字符串中的A-Z组成.WordsVectors包含所有不同的单词组合。前缀意味着递归地传递,直到产生一个单词并且长度是自我解释的。

例如,如果我给函数赋予7的长度,如果我是正确的话,我期望大小为26 x 25 x 24 x 23 x 22 x 21 x 20 = 3315312000,遵循排列的公式。 我认为程序不应该运行这么久,所以我要么无限循环,要么我的方法有问题。请指教。感谢。

3 个答案:

答案 0 :(得分:1)

我认为在堆栈上执行此操作可能存在相当大的问题。递归计算的很大一部分,这意味着每次为函数分配空间。

尝试线性地重新配制它。我想我之前遇到过这样的问题。

答案 1 :(得分:1)

当然堆栈会溢出但是专注于你的问题,即使你编写一个迭代程序也需要很长时间(不是一个非常长的无限循环)

[26L, 650L, 15600L, 358800L, 7893600L, 165765600L, 3315312000L, 62990928000L, 1133836704000L, 19275223968000L, 308403583488000L, 4626053752320000L, 64764752532480000L, 841941782922240000L, 10103301395066880000L, 111136315345735680000L, 1111363153457356800000L, 10002268381116211200000L, 80018147048929689600000L, 560127029342507827200000L, 3360762176055046963200000L, 16803810880275234816000000L, 67215243521100939264000000L, 201645730563302817792000000L, 403291461126605635584000000L, 403291461126605635584000000L]

以上列表是1<=n<=26的可能性数量。你可以看到n增加了可能性的数量。假设您拥有1GHz处理器,每秒执行10 ^ 9次操作。假设考虑n=26其403291461126605635584000000L的可能性数量。很明显,如果你坐下来列出所有可能性那么长(那么多年)那么 你会觉得它已经达到了无限循环。最后,我没有仔细查看你的代码,但简而言之,即使你正确地编写它,迭代地并且不存储(再也不能拥有这么多内存)并且只是打印所有可能性它需要花费很长时间才能更大值n

修改

正如jaromax和其他人所说,如果你只是想把它写成n的较小值, 比如说不到10-12你可以编写一个迭代程序来列出/打印它们。对于小值,它会运行得非常快。但是如果你还想把它们存储起来,那么n将不得不说少于5个。 (真的取决于可用的RAM数量,或者你可以找到一些排列将它们写入磁盘,然后取决于你可以节省多少磁盘内存,再次参考我上面发布的可能性列表数量。它给出了两个时间的粗略概念和空间复杂性。)

答案 2 :(得分:1)

你的问题暗示你认为有26x25x24x ......排列

你的代码没有我能看到的任何东西可以避免&#34; AAAAAAA&#34;作为一种排列,在这种情况下有26x26x26x ......

所以除了在26号基础上计算一个非常复杂的方法之外,我认为它也给出了错误的答案?