基于python的线性代数关于逆序列计算
啥叫逆序列?
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。
也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。
举例:
求排列32514的逆序数是多少?
解题过程(对32514依次分析):
1、3后面比它小的数有2个。
2、2后面比它小的数有1个。
3、5 后面比它小的数有有2个。
4、1 后面比它小的数没有。
5、4 后面比它小的数没有。
最后将这些个数加起来就是2+1+2=5,所以逆序数是5。
记得导包
import numpy as np
import random
import sympy
from sympy import *
1、 基于python的生成随机逆序列
def setReverNum(num=8, *args, **kwargs) -> str:
"""
随机生成一串长度为num的逆序列(逆序列的每个数字都不一样)
:param num: 逆序数列的最大值
:param args:
:param kwargs:
:return: 逆序序列
例如:
# 测试获取逆序数
>>> test=setReverNum() #(生成一串逆序列)
>>> test=setReverNum(9) #(生成一串9位的逆序列)
>>> test=setReverNum(num=9) #(生成一串9位的逆序列)
"""
# 返回一个num位(默认8位)的不相同数
numlist = [str(i) for i in range(1, num + 1)]
random.shuffle(numlist) # 随机打乱列表的顺序,不生成新的列表
rannum = "".join(numlist) # 将列表组合成str
return rannum # 返回一个str的随机数
2、基于python的随机计算逆序数
def getReverNum(Num, *args, **kwargs) -> int:
"""
传入一串逆序列,返回它的逆序列
:param Num: 传入一个逆序数列
:param args:
:param kwargs:
:return: 返回逆序数列的逆序数
例:
>>> print("57426813的逆序数为",getReverNum('57426813'))
>>> test=setReverNum()
>>> print(test)
>>> print(getReverNum(test))
>>> print(getReverNum('1537624'))
"""
Numlist = np.array(list(map(int, Num))) # 把列表里的str转换成int
ReverNum = [np.sum(Numlist[:numKey] > numValue) for numKey, numValue in
enumerate(Numlist)] # 利用enumerate通过循环迭代自动生成的索引变量。
return int(np.sum(ReverNum)) # 返回逆序数