Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 按字典顺序生成排列与排序?_Algorithm_Sorting_Permutation_Lexicographic - Fatal编程技术网

Algorithm 按字典顺序生成排列与排序?

Algorithm 按字典顺序生成排列与排序?,algorithm,sorting,permutation,lexicographic,Algorithm,Sorting,Permutation,Lexicographic,我有点困惑。按字典顺序生成排列的问题与排序的问题有何不同?有人能给我举个例子解释一下吗?谢谢排序问题中没有处理排列 它们之间的一种关联方式是,如果生成的排列不是按字典顺序排列的,那么就按字典顺序排序。然而,这需要有阶乘空间。生成通常一次输出一个元素,因此不必将所有元素都存储在内存中。这是两件不同的事情。有N排列,但只有一个排序顺序(排序的排列在词典中是最小的) 以下是排序排列的示例: brown fox quick 以下是按字典顺序排列的列表: brown fox quick brown qu

我有点困惑。按字典顺序生成排列的问题与排序的问题有何不同?有人能给我举个例子解释一下吗?谢谢

排序问题中没有处理排列


它们之间的一种关联方式是,如果生成的排列不是按字典顺序排列的,那么就按字典顺序排序。然而,这需要有阶乘空间。生成通常一次输出一个元素,因此不必将所有元素都存储在内存中。

这是两件不同的事情。有
N排列,但只有一个排序顺序(排序的排列在词典中是最小的)

以下是排序排列的示例:

brown fox quick
以下是按字典顺序排列的列表:

brown fox quick
brown quick fox
fox brown quick
fox quick brown
quick brown fox
quick fox brown
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

int main() {
    vector<string> s;
    s.push_back("quick");
    s.push_back("brown");
    s.push_back("fox");
    sort(s.begin(), s.end());
    do {
        for(int i = 0 ; i != s.size() ; i++) {
            cout << s[i] << " ";
        }
        cout << endl;
    } while (next_permutation(s.begin(), s.end()));
    return 0;
}

是C++中的一种程序生成字典顺序排列:

brown fox quick
brown quick fox
fox brown quick
fox quick brown
quick brown fox
quick fox brown
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

int main() {
    vector<string> s;
    s.push_back("quick");
    s.push_back("brown");
    s.push_back("fox");
    sort(s.begin(), s.end());
    do {
        for(int i = 0 ; i != s.size() ; i++) {
            cout << s[i] << " ";
        }
        cout << endl;
    } while (next_permutation(s.begin(), s.end()));
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
向量s;
s、 推回(“快速”);
s、 推回(“棕色”);
s、 推回(“狐狸”);
排序(s.begin(),s.end());
做{
对于(int i=0;i!=s.size();i++){

有一种相当简单的方法可以按字典顺序生成第N个排列。在选择排列元素时所做的一组选择是:选择N中的1,然后选择N-1中的1,然后选择N-2中的1,…然后选择2中的1,最后只剩下一个。这些选择,作为索引值输入到正在运行的“剩余内容”中列表,可以看作是一个可变的基数

您可以将数字从右向左展开为d[1]=n%2,d[2]=(n/2)%3,d[3]=(n/6)%4,…d[k]=(n/k!)%(k+1)。结果是第一个(n-1)为d[n-1]==0!排列,下一个(n-1)为d[n-1]==1!等等。您可以看到这些索引值将按lex.顺序排列。然后从排序集中选择符号(如果syms[0]、syms[1]、…的顺序符合您的要求,则任何随机访问集合都可以。)

这是我为处理Project Euler问题而编写的一些代码。它只生成索引值,并允许从n中选择k个符号的排列。头文件的默认值为-1,参数检查代码将其转换为n并生成全长排列。这里还有一个符号的变化:“index”是排列的数量(“上面的n”)和“n”是设置的大小(“上面的n”)

向量pe_置换::getperm(长-长索引,int n,int k) {
如果(n)很多…这是有道理的…我不必要地感到困惑。