C++ 给定长度的英语字母表的排列

C++ 给定长度的英语字母表的排列,c++,string,permutation,alphabet,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 (i

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

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);
    }
}}
void排列(std::vector和wordsVector,std::string前缀,int-length,std::string字母表){
如果(长度==0){
//结束递归
wordsVector.push_back(前缀);
}
否则{
对于(int i=0;i
在这里,我试图获得给定长度的英语字母表中所有字符的组合。我不确定目前的做法是否正确

字母表由A-Z组成,长度为26。WordsVector保存所有不同的单词组合。前缀意味着递归地传递,直到生成一个单词,并且长度是自解释的

例如,如果我将函数的长度设为7,则根据排列公式,如果我是正确的,我希望大小为
26 x 25 x 24 x 23 x 22 x 21 x 20=3315312000

我不认为程序应该运行这么长时间,所以要么我遇到了无限循环,要么我的方法出了问题。请告知。谢谢。

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


试着线性地重新表述它。我想我以前遇到过这样的问题。

堆栈肯定会溢出,但即使你编写一个迭代程序,它也会花费很长时间(不是无限循环,只是很长时间)


上面的列表是
1的可能性数量。您的问题暗示您认为有26x25x24x。。。排列

我看不到你的代码有任何东西可以避免“AAAAAAA”是一个排列,在这种情况下有26x26x26x


因此,除了以26为基数进行非常复杂的计数外,我认为它也给出了错误的答案?

我不会在这个问题上使用递归。由于涉及到函数调用的数量,我很惊讶您没有遇到堆栈溢出。只要选择n,程序就会花费很长时间(你有足够的内存来存储单词吗?3315312000*7加上分配开销大约是128GB的内存。你有128GB的内存吗?如果没有,你可能交换了很多。好吧,我明白你的意思。如果我不存储单词,而是用它们在二进制搜索树存储的字典中查找单词呢?那么内存复杂度就会降低d没问题,但时间复杂性仍然很糟糕,正如我所说的,即使一个接一个地打印所有可能性也需要时间。因此,对所有可能性进行一个接一个的计算肯定需要很长时间。我现在明白了。我总是从字母表的第一个字母开始,嗯。但是像abaaaa这样的组合也是存在的,对吗?如果你在做数字,你会得到0001,0002,0003,0004…你用字母来代替并不是很重要,你基本上是以26为基数计算,并将每个值存储为一个字符串…我想说的是,这似乎是一件奇怪的事情,也是一种奇怪的方式?这并不能回答这个问题。批评或要求au澄清thor,在他们的帖子下方留下评论-你可以随时在自己的帖子上发表评论,一旦你有足够的评论,你就可以发表评论了。谢谢你。你说得对,我需要一个声誉来发表评论。但是,我仍然认为,我已经给出了答案……假设@Kthieu的演算正确,他有3315312000个组合,(7个字母我得到3e+8个组合),你需要2GB来存储,我刚刚测试了普通C,我每秒可以做2000万次这样的操作
r=r*n/(n+1)+r/n;
。我的简历-如果在堆中做就没问题了。
[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]