📅  最后修改于: 2023-12-03 14:47:49.265000             🧑  作者: Mango
SymPy是一种基于Python的计算机代数系统和符号数学库,可用于解决各种数学问题。其中的Permutation模块包含了对排列的操作方法和特性,其中rank_nonlex()方法是用于计算排列在lexicographically排序后,排列集合中的排名。
from sympy.combinatorics import Permutation
p = Permutation([1,2,3])
print(p.rank_nonlex()) # output: 4
上述代码中,我们创建了一个由1、2、3组成的排列,并使用rank_nonlex()方法计算其在排列集合中的排名。输出结果为4。
在Permutation中,排列集合默认按照lexicographically(词典序)递增的顺序进行排序,对于任意排列,其排名就是该排列对应的位置序号。而Permutation.rank_nonlex()方法则在不按照lexicographically排序的情况下,计算排列的排名。
例如,对于由1、2、3组成的排列,其有6种不同的排列方式:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
在lexicographically排序的情况下,排列集合为:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
而在非lexicographically排序的情况下,使用rank_nonlex()计算排列的排名,例如将上述排列按照第三个元素(即3)递减的方式排列,则排列集合为:
3 1 2
3 2 1
2 1 3
2 3 1
1 2 3
1 3 2
此时,对于由1、2、3组成的排列,其排名为4。
rank_nonlex()方法的参数如下:
rank_nonlex()方法返回一个整数,表示该排列在按照指定关键字排序后的排列集合中的排名。
rank_nonlex()方法只能用于计算非lexicographically排序下的排名,如果需要计算lexicographically排序下的排名,应该使用rank()方法。
在rank_nonlex()方法中指定的排序方式应该是可逆的,也就是说,对于两个不同的排列,使用指定排序方式计算出的排名是不同的,反之使用相反的排序方式计算出的排名也应该是不同的。
下面是一些使用rank_nonlex()方法的例子:
from sympy.combinatorics import Permutation
arr = [[2,3,1], [1,3,2], [3,1,2], [2,1,3]]
key_fun_1 = lambda p: p[-1]
key_fun_2 = lambda p: p[0]
for a in arr:
p = Permutation(a)
print(p.rank_nonlex(), end=" ")
print(p.rank_nonlex(key=key_fun_1), end=" ")
print(p.rank_nonlex(key=key_fun_2))
# output: 2 2 2
# 1 1 1
# 3 3 1
# 4 4 3
上述代码中,我们创建了四个排列,分别使用rank_nonlex()方法计算它们在排序前、按照最后一个元素、第一个元素排序后的排名。输出结果如上所述。