【算法问题】错排问题

目录

  • 1.概述
  • 2.代码实现
    • 2.1.获取错排情况总数
    • 2.2.获取每种错排情况
  • 3.应用

1.概述

(1)n 个有序的元素有 n! 个不同的排列,如果一个排列使得所有的元素不在原来的位置上,则称这个排列为错排(也称重排)。例如,[1, 2] 的错排是唯一的,只有 1 个,即 [2, 1]。[1, 2, 3] 的错排有 2 个,即 [3, 1, 2],[2, 3, 1]。

(2)设 i 个有序元素的错排有 Ai 个,则 n 个有序的元素的错排个数为:An = (n - 1) * (An-1 + An-2),具体推导过程如下:

  • 设共有 n 个有序元素,考虑第 n 个元素,如果将其放在某一个位置,一共有 n - 1 种情况;
  • 然后再考虑第 i (1 ≤ i < n) 个元素,这时有两种情况:
    • 如果将其放到位置 n,那么对于除 n 以外的 n - 1 个元素,由于第 i 个元素放到了位置 n,所以剩下的 n - 2 个元素进行错排即可,故有 An-2 种情况;
    • 如果第 i 个元素不放到位置 n,这时对于这 n - 1 个元素的错排,有 An-1 种放法。
  • 又根据乘法和加法法则,综上得到 An = (n - 1) * (An-1 + An-2),并且 A1 = 0, A2 = 1;

2.代码实现

2.1.获取错排情况总数

(1)获取错排情况总数的代码实现如下:

class Solution {public int countDerangements(int n) {if (n == 1) {return 0;} else if (n == 2) {return 1;} else {int prev = 0;int curr = 1;for (int i = 3; i <= n; i++) {int temp = (i - 1) * (prev + curr);prev = curr;curr = temp;}return curr;}}
}

(2)测试代码如下:

class Test {public static void main(String[] args) {Solution solution = new Solution();int n = 4;System.out.println(n + " 个有序元素的错排情况有 " + solution.countDerangements(n) + " 种");}
}

输出结果如下:

4 个有序元素的错排情况有 9

2.2.获取每种错排情况

(1)获取每种错排情况的代码实现如下:

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> nums = new ArrayList<>();public List<List<Integer>> findDerangements(int n) {for (int i = 1; i <= n; i++) {nums.add(i);}derangementHelper(0);return res;}private void derangementHelper(int start) {//递归到最后一个位置if (start == nums.size()) {//将当前排列添加到结果列表中res.add(new ArrayList<>(nums));return;}for (int i = start; i < nums.size(); i++) {//如果当前位置的元素不等于 start + 1,则交换位置if (nums.get(i) != start + 1) {swap(i, start);//递归处理剩下的元素derangementHelper(start + 1);//回溯,恢复原始位置swap(i, start);}}}private void swap(int i, int j) {int temp = nums.get(i);nums.set(i, nums.get(j));nums.set(j, temp);}
}

需要注意的是,上面的代码是用于理解错排问题和递归解法的示例,对于较大的 n,递归可能会导致性能问题,实际生产环境中可能需要考虑使用其他方法来解决错排问题。

(2)测试代码如下:

class Test {public static void main(String[] args) {Solution derangement = new Solution();int n = 4;List<List<Integer>> derangements = derangement.findDerangements(n);System.out.println(n + " 个有序元素的错排情况有 " + derangements.size() + " 种,分别如下:");for (List<Integer> derangementList : derangements) {System.out.println(derangementList);}}
}

输出结果如下:

4 个有序元素的错排情况有 9 种,分别如下:
[2, 1, 4, 3]
[2, 3, 4, 1]
[2, 4, 1, 3]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 2, 3]

3.应用

错排问题是一个经典的组合数学问题,也称为“卡塔兰数”问题。它的应用场景有很多,下面列举几个常见的应用场景:

  • 密码学:错排问题可以用于密码学中的置换密码算法。通过将明文中的字符进行错排,即改变它们的位置,可以增加密码算法的安全性和随机性。
  • 计算机网络:在计算机网络中,错排问题可以用于调度算法和路由算法的设计。通过对数据包进行错排,可以避免数据包之间的冲突和重复,提高网络传输效率。
  • 排序算法:错排问题可以用于改进排序算法的稳定性和性能。通过对元素进行错排,可以减少相等元素之间的交换和比较次数,从而提高排序算法的效率。
  • 组合优化:错排问题在组合优化领域有广泛的应用。例如,在任务调度、资源分配和作业调度等问题中,通过错排的方式可以有效地避免冲突和重复,优化任务或资源的分配方案。
  • 硬币排列问题:在硬币排列问题中,错排问题可以用于计算硬币的不重叠排列方式。通过错排的方法,可以得到硬币排列的可能性,用于解决硬币组合和排列问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动开发 问题随笔

1、内核空间与用户空间数据交换方式 分两种情况&#xff1a; 1> 需要交换的数据量较大时&#xff1b; 2> 需要交换的数据量较小时&#xff1b; 第一种情况使用以下的函数&#xff1a; unsigned long copy_to_user(void __user* to, const void* from, unsigned long n)…

提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript

几种流行的 Python 性能加速方案对比&#xff1a;https://zhuanlan.zhihu.com/p/604519817 对于一般通用场景用户&#xff0c;对性能没有那么强烈的诉求&#xff0c;紧跟官方步伐&#xff0c;升级到最新版本的 Python 既可&#xff0c;或者使用 PyPy。Numba、Codon、Taichi 等这…

【蓝桥杯选拔赛真题23】C++计算24 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

C/C++计算24 第十二届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 “计算 24”是一个流传已久的数字游戏,小蓝最近对此痴迷不已 游戏规则是:从 1~10 之间的自然数任意拿出 4 个数(4 个数各不相同,顺序随机),进行加、减、乘三种运算(使用某种运算…

汇编-MOVSXD64位带符号扩展传送

允许源操作数为32位的寄存器或内存操作数 ExitProcess PROTO .code main PROCmov ebx, 0FFFFFFFFh movsxd rax, ebx ;RAX FFFFFFFFFFFFFFFFhmov ebx, 01FFFFFFFh movsxd rdx, ebx ;RDX 000000001FFFFFFFhmov ecx,0 ;结束程序call ExitProcess main ENDP E…

Spring学习之注解@Autowired、@Qualifier、@Resource

Spring学习之注解Autowired、Qualifier、Resource 在Spring框架中&#xff0c;注解&#xff08;Annotation&#xff09;是一种用于依赖注入&#xff08;DI&#xff09;的机制。 Autowired: Autowired 是Spring提供的注解&#xff0c;用于自动注入依赖。当Spring创建一个bean时…

【前端知识】Node——文件流的读写操作

四种基本流类型: 1.Writable: 可以向其写入数据的流 2.Readable: 可以从中读取数据的流 3.Duplex&#xff1a;同时为Readable 和 Writable 4.Transform: Duplex可以在写入和读取数据时修改或转换数据的流 一、Readable const fs require(fs);// 创建文件的Readable const rea…

ADB安装及使用介绍

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Android …

CRM系统的客户细分有什么作用?

我们常常说&#xff0c;企业想要开展有针对性的营销活动&#xff0c;就需要进行客户细分。通过特定条件&#xff0c;将客户分为几类&#xff0c;从而对不同类型的客户提供不同的产品和服务。下面我们就针对这里来详细说说&#xff0c;CRM中客户细分是什么&#xff1f;如何细分客…

微信小程序如何使用scss,less

搜到很多都是先VSCode安装好…插件…。这都是很久之前的方法了&#xff0c;所以想写这篇文章 一、修改project.config.json配置文件 "setting": {"useCompilerPlugins": ["sass"]},二、然后就可以删除 .wxss 文件了&#xff0c;就用 .scss 文件…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

算法设计与分析算法实现——删数问题

通过棋盘输入一个高精度的正整数n(n的有效位数<=240)去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。变成对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。 输入:n,s 输出:最后剩下的最小数 输入实例: 178543 4 输出示例: 13 首先…

Java stream流 常用记录

根据列表中的某个字段进行去重 // 根据roleKey对列表去重return roleList.stream().map(AccountRole::getRoleKey).distinct().map(roleKey -> roleList.stream().filter(role -> role.getRoleKey().equals(roleKey)).findFirst().orElse(null)).filter(Objects::nonNul…

重建大师跑图瓦片失败,一般是什么原因?

答&#xff1a;一般是边缘瓦块失败比较多的情况会出现&#xff0c;其他一些正常瓦块失败&#xff0c;重新提交基本上也都可以解决。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像…

为什么我学了 6 个月 Python,还是找不到工作?

在知乎上有一个特别火的问题&#xff1a; 为什么学了Python&#xff0c;我还是找不到工作&#xff1f; 有人说Python语言不行&#xff0c;有人说中国Python根本就没公司用。在大家群嘲的背后&#xff0c;我们来分析一下&#xff1a; 为什么大家都不看好Python&#xff1f; 学…

申请注册苹果iOS企业级开发者证书需要公司拥有什么规模条件

在全球范围内&#xff0c;iOS应用市场的规模和影响力不断增长&#xff0c;企业级应用在其中扮演着重要角色。为了在苹果设备上开发和发布内部应用&#xff0c;企业需要获取苹果的iOS企业级开发者证书。文章旨在探讨企业在申请此证书时需要满足的条件、注册流程&#xff0c;以及…

车载毫米波雷达行业发展2——产业

2.1 车载毫米波雷达产业链结构 2.1.1 毫米波雷达系统结构 毫米波雷达主要包括雷达射频前端、数字信号处理器、后端算法三部分。其中&#xff0c;射频前端由天线、射频前端 MMIC 芯片构成。射频前端 MMIC 芯片和数字信号处理芯片是毫米波雷达 的两大功能性器件。此外&#xff0…

全国见!飞桨星河社区五周年,邀你共赴大模型盛宴!

自2018年对外发布以来&#xff0c;飞桨星河社区已汇集660万AI开发者。感谢大家一路见证了飞桨星河社区的成长&#xff0c; 也很荣幸飞桨星河社区陪伴了大家的AI开发旅程。 在这个大模型时代&#xff0c; 飞桨星河社区期待可以帮助开发者们实现自我价值&#xff0c; 获得更多成长…

滴滴组建大模型团队;生成式AI没有第二幕;给编程新手的4个锦囊;AI高手成长路线图(2023);Stanford CS224S 课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 滴滴组建大模型团队&#xff0c;将落地部分个人出行和企业差旅场景 https://www.36kr.com/p/2519217183041289 11月15日&#xff0c;3…

【快应用】快应用学习之兄弟组件通信

【关键词】 兄弟组件通信、Publish/Subscribe模式 【实现方案】 这里介绍利用框架本身提供的事件绑定接口来模拟Publish/Subscribe模式实现兄弟组件通信的方法。 一、实现步骤及代码 1、一个子组件定义Sub 端的逻辑处理&#xff0c;有processMessage、customEventInVm2&…

【CLion】CLion的cmake-build-release/debug位置变更

[CLion] CLion的cmake-build-debug和cmake-build-release位置变更 CLion IDE的cmake-build-release/debug位置是根目录下&#xff0c;虽然可以ignore这个文件&#xff0c;但是还是有点看起来不爽&#xff0c;按照这个方式就可以&#xff0c;干掉他&#xff0c;更改方式如下。 …