首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用若干元素计算排列

使用若干元素计算排列
EN

Stack Overflow用户
提问于 2014-10-23 23:54:26
回答 2查看 98关注 0票数 2

我试图生成一组元素的所有可能的排列。顺序并不重要,元素可能多次出现。每个排列中的元素数等于元素的总数。

用于计算模式下排列的基本递归算法(正如我用C++编写的那样,代码看起来类似于它):

代码语言:javascript
复制
elems = [0, 1, .., n-1];    // n unique elements. numbers only exemplary.
current = [];               // array of size n
perms(elems, current, 0);   // initial call

perms(array elems, array current, int depth) {
    if(depth == elems.size) print current;
    else {
        for(elem : elems) {
            current[depth] = elem;
            perms(elems, current, depth+1);
        }
    }
}

将产生大量冗余序列,例如:

代码语言:javascript
复制
0, 0, .., 0, 0
0, 0, .., 0, 1    // this
0, 0, .., 0, 2
.  .  .   .  . 
.  .  .   .  .
0, 0, .., 0, n-1
0, 0, .., 1, 0    // is the same as this
.  .  .   .  .    // many more redundant ones to follow

我试图确定什么时候可以跳过生成值,但到目前为止还没有发现任何有用的东西。我相信我能找到一种方法来破解这个问题,但我也确信,这背后有一个规则,我只是没有看到。

编辑:可能的solution+

代码语言:javascript
复制
elems = [0, 1, .., n-1];       // n unique elements. numbers only exemplary.
current = [];                  // array of size n
perms(elems, current, 0, 0);   // initial call

perms(array elems, array current, int depth, int minimum) {
    if(depth == elems.size) print current;
    else {
        for(int i=minimum; i<elems.size; i++) {
            current[depth] = elems[i];
            perms(elems, current, depth+1, i);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-24 00:02:10

使你的第一个位置从0到n,然后把你的第二个位置设置为1,然后你的第一个位置从1到n,然后把第二个设置为2->第一个从2到n,以此类推。

票数 2
EN

Stack Overflow用户

发布于 2014-10-23 23:58:10

我相信这样的规则之一是,每个序列中的元素都是按非递减顺序排列的(或者,如果您愿意的话,则不增加)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26539424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档