猴子排序的期望复杂度推导(雾)

简介:   众所周知,猴子排序打破了排序算法$O(n\log{n})$的桎梏(雾),具体的话,显然最好情况一次成功就是$O(n)$,最坏情况那就$O(+\infty)$了。期望是多少呢?让我来推导一番(逃)。   首先,设序列长度为$n$,每次打乱序列和检测是否有序为$O(n)$,每次成功的概率为$\frac{1}{n!}$(全排列共$n!$种),失败的概率为$1-\frac{1}{n!}$。

  众所周知,猴子排序打破了排序算法$O(n\log{n})$的桎梏(雾),具体的话,显然最好情况一次成功就是$O(n)$,最坏情况那就$O(+\infty)$了。期望是多少呢?让我来推导一番(逃)。

  首先,设序列长度为$n$,每次打乱序列和检测是否有序为$O(n)$,每次成功的概率为$\frac{1}{n!}$(全排列共$n!$种),失败的概率为$1-\frac{1}{n!}$。我们令$X$为排序成功所需的打乱次数,则$P(X=k)=P_{成功}^{1}×P_{失败}^{k-1}$(乘法原理)。那么猴子排序的期望复杂度就是$O(E(X)*n)$

  X分布列如下表所示——

$X$ $1$ $2$ $3$ $\cdots$ $k$ $\cdots$ $+\infty$
$P(X=k)$ $\frac{1}{n!}$ $\left(1-\frac{1}{n!}\right)^{2-1}×\frac{1}{n!}$ $\left(1-\frac{1}{n!}\right)^{3-1}×\frac{1}{n!}$ $\cdots$ $\left(1-\frac{1}{n!}\right)^{k-1}×\frac{1}{n!}$ $\cdots$ $+\infty$

  有了分布列就来求X的期望吧——

$$E(X)=1×\frac{1}{n!}+2×\left(1-\frac{1}{n!}\right)^{2-1}×\frac{1}{n!}+3×\left(1-\frac{1}{n!}\right)^{3-1}×\frac{1}{n!}+\cdots+k×\left(1-\frac{1}{n!}\right)^{k-1}×\frac{1}{n!}+\cdots$$

$$=\frac{1}{n!}×\left[1×\left(1-\frac{1}{n!}\right)^{0}+2×\left(1-\frac{1}{n!}\right)^{1}+3×\left(1-\frac{1}{n!}\right)^{2}+\cdots+k×\left(1-\frac{1}{n!}\right)^{k-1}+\cdots\right]$$

$$=\frac{1}{n!}×\sum_{i=1}^{\infty}\left[{i×\left(1-\frac{1}{n!}\right)^{i-1}}\right]$$

  嗯……这个级数怎么求和啊?

  写个程序跑一下吧,求和求到二百万应该够了,再往上long double的精度也不资磁了……

#include<stdio.h>
#include<math.h>
int main()
{
    double fac=1;//n!
    for(int n=1;n<=10;n++)
    {
        long double E=0;
        fac*=n;
        for(int i=1;i<=2000000;i++)
        {
            E+=i*pow((fac-1.0)/fac,i-1);
        }
        E/=fac;
        printf("E(X)=%Lf    (n=%d)\n",E,n);        
    }
    return 0;
}

 

  运行结果——

 

  n大于8以后,long double都爆了……忽略它们!(观众:你……)

  于是我们猜想——$E(X)=n!$。

  上网一查,猴子排序复杂度果然是$O(n×n!)$,于是,猜想成立,推导完毕……(博主已被打死)

   

  留坑,等我会求那坨级数求和再来填坑吧(逃)大家别学我

   

目录
相关文章
|
搜索推荐 开发者
动态绑定的优缺点是什么?
【10月更文挑战第14天】总的来说,动态绑定是一种非常有用的编程机制,它为程序的灵活性、扩展性和多态性提供了重要的支持。然而,它也带来了一些性能开销、运行时错误风险和代码理解难度等问题。在实际编程中,我们需要根据具体的情况权衡利弊,合理地使用动态绑定,以达到最佳的编程效
441 138
|
3月前
|
Web App开发
Win10 Chrome认不出新Emoji?两个扩展搞定显示与输入
Win10系统在Chrome中显示部分新Emoji为方框?只需安装「Emoji Swap」和「Emoji Keyboard」两个扩展,即可让旧系统正常显示并输入新Emoji,轻松解决表情显示问题,无需更换设备或升级系统。
419 1
|
9月前
|
安全 网络安全 数据安全/隐私保护
Debian 12系统中允许Root远程SSH登录解决方法!
在 Debian 12 系统中开启 SSH 远程 Root 登录需修改 SSH 配置文件 (`sshd_config`),将 `PermitRootLogin` 设置为 `yes` 并确保密码认证启用。完成后重启 SSH 服务并验证连接。若防火墙启用,需放行端口 22。注意,直接开放 Root 登录可能带来安全风险,建议使用普通用户登录后切换至 Root。
1093 1
|
存储 Unix Linux
哪些工具可以烧录树莓派的操作系统镜像
除了常见的烧录工具,树莓派操作系统镜像还可以通过以下工具烧录: 1. **Etcher**:树莓派官方推荐的图形界面工具,支持多操作系统,使用简单,具备严格的设备验证和校验机制。 2. **dd 命令**:适用于 Linux 和类 Unix 系统,功能强大但需谨慎使用,适合熟悉命令行的用户。 3. **BalenaEtcher**:与 Etcher 类似,跨平台且操作简单,确保烧录过程的准确性和安全性。 初学者建议使用 Etcher 或 BalenaEtcher,熟悉命令行的用户可以选择 dd 命令。
|
Linux Shell 异构计算
在linux上部署yolov5和安装miniconda3
这篇文章介绍了在Linux系统上部署YOLOv5并安装Miniconda3的步骤,包括使用wget命令下载Miniconda安装脚本、安装Miniconda、初始化Conda环境、添加镜像源等。
849 3
在linux上部署yolov5和安装miniconda3
|
PHP 数据安全/隐私保护
*CTF 2023 web jwt2struts 题解wp
*CTF 2023 web jwt2struts 题解wp
291 4
|
安全 编译器 开发者
Python打包成.exe文件直接运行
Python打包成.exe文件直接运行
2075 1
|
传感器 算法 数据可视化
ROS2教程04 ROS2话题
这篇文章是关于ROS2(Robot Operating System 2)的教程,主要介绍了ROS2中话题的概念、特性、使用方式,以及如何编写发布者和订阅者的代码。
712 3
ROS2教程04 ROS2话题
|
小程序 数据挖掘 UED
餐饮店小程序开发定制桌边二维码点餐系统
随着技术不断进步,各行各业都在使用新工具来提高效率和服务质量。餐饮业也不例外。餐饮点餐小程序系统是基于微信公众平台开发的在线点餐方式。顾客可以通过手机微信扫描餐桌上的二维码,进入餐厅的点餐小程序,选择菜品、数量和口味,直接完成点餐。点餐系统会自动保存并发送给厨房,避免了传统手工点餐容易出错的问题。
|
开发框架 JavaScript .NET
阿里云轻量应用服务器可选应用镜像及使用应用镜可搭建应用介绍
很多用户选择轻量应用服务器的原因除了价格要比云服务器ECS更低之外,更重要的是轻量应用服务器有多种应用镜像可选,使用这些应用镜像可以帮助我们快速搭建各种环境。本文为大家介绍一下阿里云轻量应用服务器具体有哪些应用镜像以及使用应用镜可搭建的相关应用介绍。
阿里云轻量应用服务器可选应用镜像及使用应用镜可搭建应用介绍