错位排序算法

首先,让我们理解什么是错位排列:

错位排列是指在排列中,任何一个元素都不在自己原来的位置上。比如,对于序列 {1,2,3}{1,2,3},一个错位排列可能是 {3,1,2}{3,1,2},因为 11 不在位置 11 上,22 不在位置 22 上,33 不在位置 33 上。

  1. 基本概念
  • 对于 nn 个元素,每个元素都不能放在原来的位置上
  • 记录 nn 个元素的错排数量为 D(n)D(n)
  1. 简单推导
  • n=1n=1 时:没有错排可能,D(1)=0D(1)=0
  • n=2n=2 时:只有一种错排方式 (1,2)→(2,1)(1,2)→(2,1),D(2)=1D(2)=1
  • n=3n=3 时:有两种错排方式 (1,2,3)→(2,3,1),(3,1,2)(1,2,3)→(2,3,1),(3,1,2) ,D(3)=2D(3)=2

递推公式推导 假设我们要计算nn个元素的错排数量,我们可以这样思考:

  • 先把第 nn 个元素放到某个位置 ii 上( ii 可以是 11 到 n−1n−1 中的任何位置)

  • 对于位置 ii 原来的元素,我们有两种选择:

    • 把 ii 放到位置nn:剩下 n−2n−2 个元素的错排问题

    • 不把 ii 放到位置 nn:剩下 n−1n−1个元素的错排问题

因此得到递推公式: D(n)=(n−1)×D(n−2)+D(n−1)D(n)=(n−1)×D(n−2)+D(n−1)

边界条件: D(1)=0D(1)=0 D(2)=1D(2)=1

递推公式的实际意义

  • (n−1)(n−1):表示第 nn 个元素可以放的位置数量
  • D(n−2)D(n−2):表示把 ii 放到 nn 的位置后,剩余元素的错排数量
  • D(n−1)D(n−1):表示不把 ii 放到 nn 的位置,剩余元素的错排数量

错位排列在实际生活中有很多应用,比如:

  • 帽子问题:n个人参加晚会,他们的帽子被服务员打乱,求没有人能拿到自己帽子的情况数
  • 信件投递问题:n封信装入n个信封,求没有一封信装入正确信封的情况数
相关推荐
xys_67838 分钟前
JavaEE通关手册:初识Java
java·开发语言
ShineWinsu2 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu3 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.3 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
lisw054 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
瑞雪兆丰年兮4 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客4 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
阿卡好可爱4 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
一起学安全技术4 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
三雷科技4 小时前
第6章第4节:自定义分词器
开发语言·c#