在Python中,查找排列元素所需的期望洗牌次数的程序

在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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程