📜  SymPy | Python中的 Permutation.rank_nonlex()(1)

📅  最后修改于: 2023-12-03 14:47:49.265000             🧑  作者: Mango

SymPy | Python中的 Permutation.rank_nonlex()

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()方法的参数如下:

  • key (可选):用于指定排序的关键字函数,在计算排名时按照指定的关键字进行排序。默认为None。
返回值

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()方法计算它们在排序前、按照最后一个元素、第一个元素排序后的排名。输出结果如上所述。