所以我有这个代码。不确定它是否有效,因为程序的运行时仍在继续。
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
,遵循排列的公式。
我认为程序不应该运行这么久,所以我要么无限循环,要么我的方法有问题。请指教。感谢。
答案 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号基础上计算一个非常复杂的方法之外,我认为它也给出了错误的答案?