当前位置: 首页 > news >正文

逆序数及其应用

刷手机的时候看到一个逆序数的算法题,刚好又在复习矩阵论,行列式里也有用到逆序数,想到大二时学的逆序数计算算法,回顾了一下,并写下这篇文章记录。

1. 定义

假设有一个排列\(a_1,a_2,\dots,a_n\),如果下标对\(\langle i,j \rangle\)满足\(i \lt j\)\(a_i > a_j\),就称有序对\(\langle a_i, a_j \rangle\)是一个逆序对。排列中,所有逆序对的数量称为逆序数。

例如:排列\(3,1,2\)中的逆序对为\(\langle 3, 1 \rangle\)\(\langle 3, 2 \rangle\),逆序数为\(2\)

可以看出,逆序数为\(0\)的排列是单调递增的,单调递减排列的逆序数最大。

2. 逆序数的计算

逆序数一般通过归并排序(即分治算法)或树状数组计算,此处只讲解归并排序解法。

将问题进行分解:将数组从中点划分为左右两个子数组,求数组的逆序数就转换为求左子数组的逆序数\(i_l\)、右子数组的逆序数\(i_r\)以及左子数组相对右子数组的逆序数\(i_{lr}\)(即逆序对第一个元素来自左子数组,第二个来自右子数组)。求左右子数组的逆序数均可再次进行分解,直至子数组仅包含\(1\)个或\(2\)个元素。子数组仅包含\(1\)个元素时,逆序数为\(0\);子数组仅包含\(2\)个元素\(a,b\)时,\(a \le b\)时逆序数为\(0\),否则为\(1\)。因此重点在于求解左子数组相对右子数组的逆序数\(i_{lr}\)

可以发现,任意改变左子数组的元素顺序,以及任意改变右子数组的元素顺序,都不会影响\(i_{lr}\)。假设左右子数组都是单调递增的,那么对于左子数组中的元素\(a_i\)以及右子数组中的元素\(b_j\),如果\(a_i\)\(b_j\)构成逆序对,那么\(a_i\)之后的元素\(a_{i+1}, a_{i+2}, \dots, a_{l}\)都能和\(b_j\)构成逆序对。

证明:\(a_i\)\(b_j\)构成逆序对,说明\(a_i \gt b_j\)。而左子数组单调递增,即\(\forall k \gt 0, a_{i+k} \ge a_i\),因此有\(a_{i+k} \gt b_j\)

由此,可以得到以下计算\(i_{lr}\)的算法:

Algorithm CountCrossInversions(left[0..l-1], right[0..r-1]):Input: left: 左子数组,长度为l,单调递增right: 右子数组,长度为r,单调递增Output:左子数组相对右子数组的逆序数i ← 0j ← 0result ← 0while i < l and j < r doif left[i] > right[j] thenresult ← result + (l - i)j ← j + 1elsei ← i + 1end ifend whilereturn result

归并排序将数组从中点划分为两个子数组,分别对子数组再次进行归并排序,再合并两个有序数组,实现排序。以上计算\(i_{lr}\)的算法和归并排序合并有序子数组的过程高度相似,并且左右子数组都需要提前进行排序,因此只需对归并排序合并有序子数组的操作稍作修改即可计算数组的逆序数。

力扣LCR 170. 交易逆序对的总数即为逆序数计算的题目,具体的C++实现如下:

class Solution {
private:int mergeSort(vector<int>& record, int l, int r) {// 边界,子数组仅有1个元素if (l == r - 1)return 0;// 边界,子数组仅有2个元素if (l == r - 2) {if (record[l] > record[l + 1]) {swap(record[l], record[l + 1]);return 1;}return 0;}// 拆分为两个子问题int mid = l + (r - l) / 2;int i_l = mergeSort(record, l, mid);int i_r = mergeSort(record, mid, r);// 合并两个有序子数组,并计算左子数组相对右子数组的逆序数vector<int> temp(r - l);int i = 0, j = l, k = mid;int i_lr = 0;while (j < mid && k < r) {if (record[j] > record[k]) {i_lr += mid - j; // record[j]及之后的元素,均能和record[k]构成逆序对temp[i++] = record[k++];} else {temp[i++] = record[j++];}}while (j < mid)temp[i++] = record[j++];while (k < r)temp[i++] = record[k++];copy(temp.begin(), temp.end(), record.begin() + l);return i_l + i_r + i_lr;}
public:int reversePairs(vector<int>& record) {if (record.empty())return 0;return mergeSort(record, 0, static_cast<int>(record.size()));}
};

3. 逆序数的应用

3.1 最小相邻交换次数

算法题除了直接指明要计算逆序数外,还会以等价的问题——排序时最少需要多少次相邻交换的形式考察。该类问题的定义如下:

给定数组A,要将它变成单调递增序列,限制每次只能交换相邻的两个元素,至少需要多少次交换?(插入排序、冒泡排序等“邻近交换”的排序算法,都是这样操作的。)

最小的交换次数即为排列的逆序数。单调递增序列的逆序数为\(0\),对于给定的排列,每次相邻交换最多减少\(1\)个逆序对,且在逆序数不为\(0\)时,总能进行一次相邻交换,使得逆序对减少。

单调递增序列的逆序数为\(0\),由逆序对定义可以得到该结论。

对于给定的排列,每次相邻交换最多减少\(1\)个逆序对。因为是相邻交换,每次只能改变操作的两个元素之间的相对顺序,而其他元素相对这两个元素的顺序不会改变,因此只能使得逆序数加\(1\)(交换前不构成逆序对,且两个元素不断)、减\(1\)(交换前构成逆序对)或不变(两个元素相等)。

在逆序数不为\(0\)时,总能进行一次相邻交换,使得逆序对减少。假如不能通过相邻交换使逆序对减少,说明\(\forall a_i, a_i \le a_{i+1}\),即排列单调递增,逆序数必为\(0\)

3.2 Kendall tau距离

两个序列\(\tau _{1},\tau _{2}\),长度相等,含有的元素相同但顺序不同,它们之间的Kendall tau距离定义如下:

\({\displaystyle K_{d}(\tau _{1},\tau _{2})=|\{(i,j):i<j,[\tau _{1}(i)<\tau _{1}(j)\wedge \tau _{2}(i)>\tau _{2}(j)]\vee [\tau _{1}(i)>\tau _{1}(j)\wedge \tau _{2}(i)<\tau _{2}(j)]\}|}\)

Kendall tau距离可以通过逆序数计算。

3.3 数学中的应用

逆序数为奇数的排列称为奇排列,为偶数则为偶排列。奇偶排列可用于计算n阶行列式:

\[\det(A) = \sum_{\pi \in S_n}(-1)^{\mathrm{inv}(\pi)} \prod_{i=1}^n a_{i,\pi(i)} \]

其中,\(S_n\)表示所有\(n\)元排列的集合,\(\pi\)为一个\(n\)元排列,\(\mathrm{inv}(\pi)\)表示排列的逆序数。

奇偶排列还可用于判断15数码游戏(15-puzzle)是否可解。

相关文章:

逆序数及其应用

刷手机的时候看到一个逆序数的算法题,刚好又在复习矩阵论,行列式里也有用到逆序数,想到大二时学的逆序数计算算法,回顾了一下,并写下这篇文章记录。 1. 定义 假设有一个排列\(a_1,a_2,\dots,a_n\),如果下标对\(\langle i,j \rangle\)满足\(i \lt j\)而\(a_i > a_j\),…...

豆豆守护如何下载?

豆豆守护是一款保护隐私数据工具软件,为开发者提供完善的测试环境。其每个安卓版本都会进行适配,作为开发者的我们如何对豆豆守护进行下载呢? 传送门:豆豆守护助手...

Java运行时jar时终端输出的中文日志是乱码

运行Jar时在控制台输出的中文日志全是乱码,这是因为cmd/bash默认的编码是GBK,只要把cmd的编码改成UTF-8即可两种方式修改:临时修改和注册表永久修改 临时修改 只对当前的cmd页面有效,关闭后重新打开都会恢复成GBK, 打开cmd,输入以下命令 chcp 65001AI写代码这样既可以更改…...

ZK2真空发生器日常清理

“过滤器”的拆卸方法 1.手拧或者内六角塞进去(不要用圆头,会打滑),顺着箭头方向顺时针旋转90,即可将连接器抽出2.更换滤芯 确保严丝合缝真空发生器滤芯 ZK2-FE1-3-A(1套10个) 产线零件盒3.装回时,逆着箭头旋转至横线与“LOCK”标记重合...

Nacos服务注册与发现

一、前提条件 你已经安装好Nacos客户端 二、添加对于的依赖到pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.…...

马的遍历

2025.9.14 曹立 题目内容 有一个 \(n \times m\) 的棋盘,在某个点 \((x,y)\) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入描述 输入只有一行四个整数,分别为 \(n,m,x,y\) 输出描述 一个 \(n \times m\) 的矩阵,代表马到达某个点最少要走几步(不能到达…...

20231310王宏邦《密码系统设计》第1周

20231310王宏邦《密码系统设计》第1周 学习内容《Windows C/C++加密解密实战》第 1,2 章:1、第⼀章概念复习; 2、第⼆章主要在 Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上)。bang@LAPTOP-74GS6JSR:~$ openssl version OpenSSL 3.0.2 15 Mar 2022 (Library: …...

新学期第一次随笔:慢慢学,总会有进步

一、关于我:爱游戏也想学好知识的普通学生 大家好,我是一名大三学生,平时最大的爱好是打《CS:GO》,空闲时也会玩《我的世界》(MC)。打《CS:GO》时喜欢和队友配合冲锋,既是无畏的冲锋手也是冷静的狙击手,每次赢下对局都特别有成就感;玩MC时总爱研究怎么用指令搭一些自动…...

详细介绍:【C语言】第四课 指针与内存管理

详细介绍:【C语言】第四课 指针与内存管理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

知识点错题整理

1:【子串里面包含空串】12+1=13【一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串 abcab 有(13 )个内容互不相同的子串】...

202311_陇剑杯预赛_tcpdump

流量分析,应急响应Tags:流量分析,应急响应 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202311_陇剑杯预赛_tcpdump.zip题目描述:攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接…...

Linux学习记录(六):添加/删除用户

添加/删除用户 sudo useradd -m -d /home/newuser -s /bin/bash newusersudo passwd newuser新建/删除用户su: Super User即系统管理员 useradd: 新建用户 userdel: 删除用户 passwd : 修改密码...

python 链式调用 合并 __setattr__ __getattribute__ in nested object()

使用场景:bpy.types.Scene与bpy.context.scene部分功能重叠。 def Get(obj, attr: str | Sequence[str], root=False):"""injected recursive getattr, could pollute objects on chain in whole session"""IS_STR = isinstance(attr, str)if I…...

分享一个稳定好用的免费云服务——阿贝云体验

最近在搭建个人小项目,一直在寻找稳定的免费云服务器资源,偶然发现了「阿贝云」,用了几天感觉非常不错,特地来分享一下使用体验。 阿贝云提供了免费虚拟主机和免费云服务器,对于像我这样刚开始学习建站或者想做点小实验的用户来说非常友好。注册流程简单,开通也很快,控制…...

年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解

年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Couri…...

接口测试---PyMysql

PyMysql数据库操作代码安装 : pip install PyMySQL数据库应用场景校验测试数据 :http请求发送后,明确会修改表中的数据,但响应结果中没体现如删除员工(is_delete字段)构造测试数据 :测试数据使用一次就失效,不能重复使用 : 添加员工(手机号码字段)测试数据在展开测试前无法确定…...

My First Blog

被你发现啦~...

设置基础软件仓库时出错

1.安装源报设置基础软件仓库时出错2.点击【网络和主机名】,把网络设置成静态网络,能够访问外网3.点击【安装源】,在网络上这块输入这个网址 https://update.cs2c.com.cn/NS/V10/V10SP3-2403/os/adv/lic/base/x86_64/ ,之后点【完成】...

linux c应用性能与内存泄露问题排查工具

GCC内置的内存检测工具在 GCC 中,对 -fsanitize=address(AddressSanitizer, ASan)、-fsanitize=leak(LeakSanitizer, LSan) 和 -fsanitize=memory(MemorySanitizer, MSan) 的支持情况如下:​​-fsanitize=address(AddressSanitizer - ASan)​​​​支持:是​​​​可用版本:…...

深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略

深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

VS Code快捷键

VS Code 1.通用操作快捷键快捷键 功能Ctrl+Shift+P 打开命令面板Ctrl+Shift+N 新建窗口Ctrl+S 保存Ctrl+P 搜索打开文件2.代码编辑快捷键快捷键 功能Ctrl+Z 撤销Ctrl+Shift+Z 反撤销Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+F 查找Ctrl+H 替换Ctrl+A 全选Shift+Alt+F 格式化代码…...

API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南

API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南基于IDC 2024年度报告,推荐全知科技、奇安信、腾讯云、华为、保旺达,启明星辰、安恒信息,安华金和、美创科技等API安全厂商,适用于金融、政务、运营商等行业客户,支持AI赋能运营提效70%、资产发现纯净度95%…...

基于FPGA的8PSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=10db设置SNR=30db仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要随着通信技术的不断发展,相位调制技术因其高频谱效率和抗干扰能力而广泛应用于无线通信系统中。其中,8PSK(8相位…...

去去就来

一脚踢开也许从来没有面临过 看着天空就要泪流下 不是为了具体的人 不是为了具体的事 或者说 每个人都是凶手 下雨这天好安静 也不再盼望放晴 扭转时空又如何挽回 时差 禀赋没有破土 在一切都爆发之前 万物缄默 不甘与嫉恨 人性共扭曲 下位者的祈愿 愿你跌入深渊 所谓的思维 究…...

高三试卷

福建省2024-2025学年高三年级下学期模拟(一模&二模&三模)物理试题试卷汇总 https://www.zxxk.com/docpack/3497855.html...

豆包生成C#即梦API HTTP调用实例代码

最近玩即梦AI,文生图,文生视频等等很多玩法都很强大。即梦本身页提供了API。官方文档里有Java, Golang, Python, PHP的SDK,官方也推荐使用SDK,调用SDK会比较省事儿。官方也提供了HTTP请求示例代码,但是也只包括Java, Golang, Python, PHP,没有C#。所以就尝试写个C#调用即…...

解析几何笔记

记号约定:\(\displaystyle {x \brack y}\):向量 \((x, y)\)。1. 直线 一些定义:方向向量:与直线 \(l\) 平行的向量。 倾斜角:直线 \(l\) 与 \(y\) 轴正方向同向的方向向量,与 \(x\) 轴正方向的夹角。形式化的,设直线 \(l\) 的方向向量 \(\bold{v}\) 满足 \(\displaystyl…...

基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真

1.课题概述 基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真,通过SOA优化PID的kp,ki,kd三组参数,对比普通的PID控制器的控制效果。 2.系统仿真结果 3.核心程序与模型版本:MATLAB2022a%使用优化后的参数控制PID控制器 for k=1:10000time(k) = k*ts;%设定…...

使用 CUDA 12.9 编译 PyTorch 2.4.0

最近跑的一个项目需要 torch==2.4.0,但是 GPU(NVIDIA RTX PRO 6000)需要 CUDA 12.9,PyTorch 官方这个配置的预编译包,因此需要手动编译。获取源码: git clone -b v2.4.0 --depth 1 https://github.com/pytorch/pytorch cd pytorch git submodule sync git submodule upda…...

详细介绍:boost::circular_buffer的使用方法简介

详细介绍:boost::circular_buffer的使用方法简介pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真

1.程序功能描述 基于禁忌搜索算法的TSP问题最优路径搜索,旅行商问题(TSP)是一个经典的组合优化问题。其起源可以追溯到 19 世纪初,最初是在物流配送、线路规划等实际场景中被提出。简单来说,给定一组城市和城市之间的距离,旅行商需要从一个城市出发,访问每个城市恰好…...

PDD9.14 笔试 - 浪矢

目录Day1 T1Day1 T4 Day1 T1 简单的模拟: 题目内容大概是给一个字符串a,a的子串拼成字符串b。 例如abcd -> abbccd 给你b字符串,要求给出a字符串。 思路:b字符串中除了第一个字符和最后一个字符串外,其他的都是重复字符,隔一个选一个就好。点击查看代码 import java.u…...

增肌,减脂,变瘦的联系和区别

首先,健身的目的基本都是为了好看的体型,肌肉和脂肪匀称的占比,力量和丝滑的结合。如果是运动员或需要针对性训练肌肉的话,那另说。 其次,这里说一下饮食和训练的关系。 俗话说,三分练七分吃。很多人不理解,为什么吃这么重要,但是我各种营养餐,减脂餐,轻食,没少吃,…...

(eval):1: _python-argcomplete: function definition file not found

(eval):1: _python-argcomplete: function definition file not found 我在使用kali的时候每次想使用table键补全命令就会报错,很烦人就是 去网上搜了一下,终于找到了解决方法argcomplete是一个用于Python的命令行参数自动补全工具。它通过与argparse库结合,为Python应用程序…...

详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.

详细介绍:【Spring Boot 报错已解决】Web server failed to start. Port 8080 was already in use.pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…...

Nordic Neuton.AI 技术优势;

Nordic Neuton.AI 技术的主要优势包括: 极小模型体积 Neuton.AI 能自动生成极小的机器学习模型,通常仅需几 KB(平均小于 5 KB),比传统框架(如 TensorFlow Lite for Microcontrollers)小 10 倍以上。 自动化建模,无需 ML 专业知识 Neuton.AI 平台无需开发者具备神经网络…...

channel Sounding 工作流程

1、必须要建立连接,并且配对绑定模式; 2、通过发送LL_CS_CONFIG_REQ PDU Select “启动器(Initiator) 或 反射器Reflector; 3、LL_CS_CONFIG_RSP PDU Select “与 DEVICE A 相反的角色 ” 4、启动器( Initiator )和反射器都可以发起channel sounding的流程; 如果对这个…...

基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序

1.算法运行效果图预览 (完整程序运行后无水印)将数据导入到matlab中显示图片:可以看到,图3,通过FPGA细化之后,可以获得和MATLAB一样的效果(图2),两者相对于原图(图1)都实现了图像的细化处理。2.算法运行软件版本 vivado2019.2matlab2024b/matlab2022a3.部分核心程序 (…...

channel Sounding RTT和PBR 属性总结

1、蓝牙联盟规定了有72个信道可以使用,每个信道带宽1M; 2、跳频模式和普通ble 跳频方式是不一样的; 3、channel Sounding 必须要是建立连接的; 4、角色分为启动器和反射器; 6、启动器:计算自身到另一个设备的距离 7、反射器:对启动器进行响应的设备; 8、跳频机制和我们普…...

二分查找方法

/*二分查找方法,前提是这个数组是有序的,无序的先排序 1-100; 50 25 判断结构,循环结构(比较),区间为零时找完,则没有找到 / //public static boolean binarySearch(int[]array,int target) //{//定义左右坐标 // int left=0; // int right=array.length-1; /因为…...

复制一个数组的方法

public class DemoArray { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5}; int[] array1 = new int[array.length]; // for(int i:array){//特殊方法(遍历数据的时候),只需要输出数据的时候使用 // System.out.println(i); //…...

判断目标是否在数组里面

public static boolean fiandTarget(int[] array,int target){ // boolean flag = false; for (int i = 0; i < array.length; i++) { if (array[i] == target){ return true; //flag = true; } } // return flag; return false; }...

选择排序方法

public static void chooseSort(int[] array){for (int i = 0; i < array.length - 1; i++){//记住索引位置int min = array[i];int minIndex = i;//开始内存比较for (int j = i+1; j < array.length; j++) {// 如果发现比标志的小的,就将赋值给标志位if (array[j] <…...

ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程

ArcGIS Pro 遇到严重的应用程序错误而无法启动 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...

第一次作业

大家好我日常有三个常做的事:刷视频、玩游戏、偶尔画画。刷视频时,我不只是看娱乐内容,遇到 “Python 基础操作”“PS 简单修图” 这类实用知识,会随手存到收藏夹,每周还会抽 1 小时把零散知识点整理成笔记,现在已经攒了厚厚一本,之前帮同学修图时,还从笔记里找到过调整…...

markdown文件上传到博客园教程

如何将Markdown文件上传到博客园文本内容 图片资源前期准备 vscode软件下载并安装vscode软件安装博客园插件并登录账号在vscode中,通过搜索栏搜索并安装博客园插件,插件名称为:博客园cnblogs客户端,安装后重启vscode软件。登录账号登录成功后可以上传到博客园markdown文件上…...

自我介绍

大家好,我是 谢燚欣 一名来自数据科学与大数据技术专业的学生,很高兴加入博客园以及接下来对我的学习过程进行记录。在学习之外,我还有一颗好奇和勇于尝试的心。当我对滑滑板和滑雪很好奇时,我就会去尝试它们,尽管每一次的摔跤都伴随着剧烈的疼痛,那是也阻挡不了我对它的…...

【展厅多媒体】从技术到体验,AR在展厅中的一体化整合 - 指南

【展厅多媒体】从技术到体验,AR在展厅中的一体化整合 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...

LilCTF 2025

Qt_Creator Solve 通过字符串找到槽函数sub_410100()发现判断点为this == v21,直接动调(附加)到这个地方取值就行(跳过下面部分)根据字符串找到注册信号的位置向上翻找到该类的this指针What I have learned此题不止在demo_code_editor.exe执行过程中存在反调试,在加载库时应该也…...

AES算法原理与举例说明

AES算法原理与举例说明AES( Advanced Encryption Standard,高级加密标准 )是当前全球主流的对称分组密码,用于替代安全性不足的 DES,广泛应用于 HTTPS、文件加密、物联网通信等场景。其核心特点是分组长度固定为 128 位,密钥长度支持 128 位、192 位、256 位(对应算法称…...