1
149
要描述n个元素的排列,您可以看到,对于第一个元素结束的位置,您有n个可能性,所以您可以用一个介于0和n-1之间的数字来描述它。对于下一个元素结束的位置,您还有n-1个可能,所以您可以用一个介于0和n-2之间的数字来描述它。
以n=5为例,考虑
所以我们有了索引序列 { 1, 2, 0,1, 0 } .
现在您知道了,例如在二进制数中,“xyz”表示z+2y+4x。对于十进制数,
这个 原因 为什么数字的权重遵循这种模式,是指可以用从0到k的数字表示的最高数字必须正好比只能用数字k+1表示的最低数字低1。在二进制中,0111必须小于1000。十进制中,099999必须小于100000。
编码到变量基
我们关于数字权重w[k]的规则要求h[i]*w[i]的和(其中i从i=0到i=k)等于1*w[k+1]。反复声明,w[k+1]=w[k]+h[k]*w[k]=w[k]*(h[k]+1)。第一个权重w[0]应始终为1。从这里开始,我们有以下值:
(一般关系w[k-1]=k!很容易通过归纳法证明。) 我们从转换序列中得到的数字将是s[k]*w[k]的和,k从0到n-1。这里s[k]是序列的k'th(最右边,从0开始)元素。以我们的1、2、0、1、0为例,去掉最右边的元素,如前所述: { 1, 2, 0,1 } . 我们的总数是1*1+0*2+2*6+1*24= 三十七 . 注意,如果我们取每个索引的最大位置,我们会得到4、3、2、1、0,然后转换为119。因为我们选择了数字编码中的权重,这样我们就不会跳过任何数字,所以所有数字0到119都是有效的。其中正好有120个,就是n!对于我们的例子中的n=5,精确地表示不同排列的数目。所以您可以看到我们的编码数字完全指定了所有可能的排列。
从可变基解码
对于我们的可变基数:
这正确地将我们的37解码回1、2、0、1(
使用索引序列排列列表
排列的共同表示法
以这种形式应用排列很容易:
倒置非常相似:
从我们的表象到共同表象的转换
为了得到非倒置的预变形,我们应用了我刚才展示的置换算法:
或者,您可以直接应用置换,使用逆置换算法:
注意,所有处理常用形式排列的算法都是O(n),而在我们的形式中应用排列的算法是O(n_2)。如果需要多次应用置换,请首先将其转换为公共表示。 |
2
14
我在O(n)中做了一个算法,你可以在这里得到我的函数: http://antoinecomeau.blogspot.ca/2014/07/mapping-between-permutations-and.html
|
3
7
复杂性可降至n*log(n),见第10.1.1节。 fxtbook的(“Lehmer代码(倒置表)”,第232ff页): http://www.jjj.de/fxt/#fxtbook 对于快速方法,请跳到第10.1.1.1节(“大数组计算”P.235)。 (GPUL,C++)代码在同一个网页上。 |
4
4
每个元素可以位于七个位置中的一个。要描述一个元素的位置,需要三位。这意味着您可以以32位值存储所有元素的位置。这远不是有效的,因为这种表示甚至允许所有元素处于相同的位置,但我相信位屏蔽应该相当快。 但是,有8个以上的职位,你需要更漂亮的东西。 |
5
4
这恰好是内置函数 J :
|
6
4
问题解决了。但是,我不确定这些年后你是否仍然需要这个解决方案。哈哈,我刚加入这个网站,所以… 检查我的Java置换类。您可以基于索引获取符号排列,或者给出符号排列,然后获取索引。 这是我的预备班
这是我的主要课程,展示如何使用这个课程。
玩得高兴。:) |
7
2
可以使用递归算法对排列进行编码。如果n-排列(数字0,..,n-1的某种顺序)是x,…的形式,那么将其编码为x+n*在数字0,n-1-x上用“…”表示的(n-1)-排列的编码。听起来像一口,下面是一些代码:
这个算法是O(n^2)。如果有人有O(N)算法,则可获得奖励积分。 |
8
1
多么有趣的问题! 如果所有元素都是数字,那么您可能需要考虑将它们从字符串转换为实际数字。然后,您将能够通过将排列排列顺序排列来对所有排列进行排序,并将它们放置在一个数组中。在那之后,您将可以使用任何一种不同的搜索算法。 |
9
1
我在先前的回答(删除)中很仓促,但我确实有实际的答案。它由类似的概念提供,即 factoradic 和排列有关(我的答案与组合有关,我为这种混淆道歉)。我不喜欢仅仅发布维基百科链接,但我写了一段时间前我做的事情,因为某些原因是不明白的。因此,如果有要求,我可以稍后对此进行扩展。 |
10
1
有一本关于这个的书。对不起,我不记得它的名字了(你很可能会在维基百科上找到它)。 但无论如何,我写了一个枚举系统的python实现: http://kks.cabal.fi/Kombinaattori 其中一些是芬兰语的,但只需复制代码和名称变量… |
11
0
一个相关的问题是计算逆排列,当只知道排列数组时,它将排列向量恢复到原来的顺序。以下是O(N)代码(PHP):
斯佩克特 Springtime软件 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |
Wadu Hek · 查找列表中唯一的重复项 2 年前 |
Crawford Patten · 如何获得整数列表的四分位数 2 年前 |
MoonGoose · 如何在python中围绕特殊字符创建空间? 2 年前 |
taha khamis · 在一个数字中组合元素的省道 2 年前 |
Soup · 比O(n)更快地找到阶乘n模m 2 年前 |
BigO · 单词积分游戏不断增加数字[关闭] 2 年前 |