在Python中,查找排列元素所需的期望洗牌次数的程序
假设我们有一组元素 nums。我们需要按非递减顺序排序它们。但是排序技术是随机的。我们将检查数组是否已排序,如果没有,则随机洗牌并再次检查。在所有元素排序之前继续此过程。在这种情况下,我们必须找到期望洗牌次数,以便将它们排序。以6个小数位的精度显示答案。
因此,如果输入为 nums = [5,2,7],则输出将为6,因为有3个排列可能性,所以概率是1/3。
- 如果我们在第i = 1次迭代中获得排序数组,则需要1/3次
- 如果我们在第i = 2次迭代中获得排序数组,则需要(2/3)*(1/3)次
如果我们在第i次迭代中获得排序数组,则需要(2/3)^(i-1) * (1/3)次
为了解决这个问题,我们将遵循以下步骤-
- 如果 nums 已排序,则
- 返回0
- 否则,
- m:一个新字典,最初为空
- 对于nums中的每个i,
- 如果i存在于m中,则
- m[i]:= m[i]+1
- 否则,
- m[i]: = 1
- num:=1
- 对于m中的每个键值i,
- num: = num * 阶乘(m[i])
- den:= 阶乘(nums的大小)
- 返回(den/num)并舍入到6个小数位
例子
让我们看以下实现以更好地理解-
from math import factorial
def solve(nums):
if nums == sorted(nums):
return 0
else:
m={}
for i in nums:
if i in m:
m[i]+=1
else:
m[i]=1
num=1
for i in m:
num *= factorial(m[i])
den=factorial(len(nums))
return round((den/num),6)
nums = [5,2,7]
print(solve(nums))
输入
[5,2,7]
输出
6.0